Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 36 additions & 36 deletions coverage_point_calculator/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -313,9 +313,9 @@ impl RadioType {
other => return Err(Error::InvalidSignalLevel(*other, *self)),
},
RadioType::OutdoorWifi => match signal_level {
SignalLevel::High => dec!(16),
SignalLevel::Medium => dec!(8),
SignalLevel::Low => dec!(4),
SignalLevel::High => dec!(120),
SignalLevel::Medium => dec!(60),
SignalLevel::Low => dec!(0),
SignalLevel::None => dec!(0),
Comment on lines +318 to 319
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These two lines could be simplified to one
_ => dec!(0),

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

understood, I like it this way though, being very explicit and obvious that low signal strength is now worth 0 points

},
};
Expand Down Expand Up @@ -624,35 +624,35 @@ mod tests {
location_trust_maximum(),
vec![
// yellow - POI ≥ 1 Urbanized, no SP override
ranked_coverage(A, A, A, C), // 16
ranked_coverage(A, B, A, C), // 16
ranked_coverage(A, C, A, C), // 16
// 48
ranked_coverage(A, A, A, C), // 120
ranked_coverage(A, B, A, C), // 120
ranked_coverage(A, C, A, C), // 120
// 360
// orange - POI ≥ 1 Not Urbanized, no SP override
ranked_coverage(A, A, B, C), // 16
ranked_coverage(A, B, B, C), // 16
ranked_coverage(A, C, B, C), // 16
// 48
ranked_coverage(A, A, B, C), // 120
ranked_coverage(A, B, B, C), // 120
ranked_coverage(A, C, B, C), // 120
// 360
// light green - Point of Interest Urbanized, no SP override
ranked_coverage(B, A, A, C), // 11.2
ranked_coverage(B, B, A, C), // 11.2
ranked_coverage(B, C, A, C), // 11.2
ranked_coverage(B, C, A, C), // 11.2
ranked_coverage(B, C, A, C), // 11.2
// 56
ranked_coverage(B, A, A, C), // 84
ranked_coverage(B, B, A, C), // 84
ranked_coverage(B, C, A, C), // 84
ranked_coverage(B, C, A, C), // 84
ranked_coverage(B, C, A, C), // 84
// 420
// dark green - Point of Interest Not Urbanized, no SP override
ranked_coverage(B, A, B, C), // 8
ranked_coverage(B, B, B, C), // 8
ranked_coverage(B, C, B, C), // 8
// 24
ranked_coverage(B, A, B, C), // 60
ranked_coverage(B, B, B, C), // 60
ranked_coverage(B, C, B, C), // 60
// 180
// HRP-20250409 - footfall C
ranked_coverage(C, A, A, C), // 0.48
ranked_coverage(C, B, A, C), // 0.48
ranked_coverage(C, C, A, C), // 0.48
ranked_coverage(C, A, B, C), // 0.48
ranked_coverage(C, B, B, C), // 0.48
ranked_coverage(C, C, B, C), // 0.48
// 2.88
ranked_coverage(C, A, A, C), // 3.60
ranked_coverage(C, B, A, C), // 3.60
ranked_coverage(C, C, A, C), // 3.60
ranked_coverage(C, A, B, C), // 3.60
ranked_coverage(C, B, B, C), // 3.60
ranked_coverage(C, C, B, C), // 3.60
// 21.60
// gray - Outside of USA, no SP override
ranked_coverage(A, A, C, C), // 0
ranked_coverage(A, B, C, C), // 0
Expand All @@ -668,14 +668,14 @@ mod tests {
)
.expect("outdoor wifi");

// 48 + 48 + 56 + 24 + 2.88 = 178.88
assert_eq!(dec!(178.88), outdoor_wifi.coverage_points_v1());
// 360 + 360 + 420 + 180 + 21.60 = 1341.60
assert_eq!(dec!(1341.60), outdoor_wifi.coverage_points_v1());
}

#[rstest]
#[case(RadioType::OutdoorWifi, 1, dec!(16))]
#[case(RadioType::OutdoorWifi, 2, dec!(8))]
#[case(RadioType::OutdoorWifi, 3, dec!(4))]
#[case(RadioType::OutdoorWifi, 1, dec!(120))]
#[case(RadioType::OutdoorWifi, 2, dec!(60))]
#[case(RadioType::OutdoorWifi, 3, dec!(30))]
#[case(RadioType::OutdoorWifi, 42, dec!(0))]
fn outdoor_radios_consider_top_3_ranked_hexes(
#[case] radio_type: RadioType,
Expand Down Expand Up @@ -810,9 +810,9 @@ mod tests {
}

#[rstest]
#[case(SignalLevel::High, dec!(16))]
#[case(SignalLevel::Medium, dec!(8))]
#[case(SignalLevel::Low, dec!(4))]
#[case(SignalLevel::High, dec!(120))]
#[case(SignalLevel::Medium, dec!(60))]
#[case(SignalLevel::Low, dec!(0))]
#[case(SignalLevel::None, dec!(0))]
fn outdoor_wifi_base_coverage_points(
#[case] signal_level: SignalLevel,
Expand Down
93 changes: 50 additions & 43 deletions coverage_point_calculator/tests/coverage_point_calculator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ fn base_radio_coverage_points() {

for (radio_type, expected_base_coverage_point) in [
(RadioType::IndoorWifi, dec!(400)),
(RadioType::OutdoorWifi, dec!(16)),
(RadioType::OutdoorWifi, dec!(120)),
] {
let coverage_points = CoveragePoints::new(
radio_type,
Expand Down Expand Up @@ -116,7 +116,14 @@ fn radios_with_coverage() {
)
.unwrap();

assert_eq!(dec!(400), coverage_points.coverage_points_v1());
assert_eq!(
if radio_type == RadioType::IndoorWifi {
dec!(400)
} else {
dec!(3000)
},
coverage_points.coverage_points_v1()
);
}
}

Expand All @@ -126,15 +133,15 @@ fn outdoor_wifi_with_mixed_signal_level_coverage() -> Result {
let coverage_points = outdoor_wifi_radio(
SpeedtestTier::Good,
&[
top_ranked_coverage(0x8c2681a3064d9ff, SignalLevel::High), // 16
top_ranked_coverage(0x8c2681a3065d3ff, SignalLevel::Medium), // 8
top_ranked_coverage(0x8c2681a306635ff, SignalLevel::Medium), // 8
top_ranked_coverage(0x8c2681a3066e7ff, SignalLevel::Low), // 4
top_ranked_coverage(0x8c2681a3065adff, SignalLevel::Low), // 4
top_ranked_coverage(0x8c2681a3064d9ff, SignalLevel::High), // 120
top_ranked_coverage(0x8c2681a3065d3ff, SignalLevel::Medium), // 60
top_ranked_coverage(0x8c2681a306635ff, SignalLevel::Medium), // 60
top_ranked_coverage(0x8c2681a3066e7ff, SignalLevel::Low), // 0
top_ranked_coverage(0x8c2681a3065adff, SignalLevel::Low), // 0
],
)?;

assert_eq!(dec!(40), coverage_points.total_shares());
assert_eq!(dec!(240), coverage_points.total_shares());

Ok(())
}
Expand All @@ -146,28 +153,28 @@ fn outdoor_wifi_with_partially_overlapping_coverage_and_differing_speedtests() -
let radio_1 = outdoor_wifi_radio(
SpeedtestTier::Degraded, // multiplier 0.5 on all hexes
&[
top_ranked_coverage(0x8c2681a3064d9ff, SignalLevel::High), // 16
top_ranked_coverage(0x8c2681a3064d9ff, SignalLevel::High), // 120
// This hex is shared (0.5 multiplier)
second_ranked_coverage(0x8c2681a3065d3ff, SignalLevel::Medium), // 8 * 0.5 = 4
top_ranked_coverage(0x8c2681a306635ff, SignalLevel::Medium), // 8
top_ranked_coverage(0x8c2681a3066e7ff, SignalLevel::Low), // 4
top_ranked_coverage(0x8c2681a3065d7ff, SignalLevel::Low), // 4
second_ranked_coverage(0x8c2681a3065d3ff, SignalLevel::Medium), // 60 * 0.5 = 30
top_ranked_coverage(0x8c2681a306635ff, SignalLevel::Medium), // 60
top_ranked_coverage(0x8c2681a3066e7ff, SignalLevel::Low), // 0
top_ranked_coverage(0x8c2681a3065d7ff, SignalLevel::Low), // 0
],
)?;

let radio_2 = outdoor_wifi_radio(
SpeedtestTier::Good,
&[
top_ranked_coverage(0x8c2681a30641dff, SignalLevel::High), // 16
top_ranked_coverage(0x8c2681a3065d3ff, SignalLevel::Medium), // 8
top_ranked_coverage(0x8c2681a3066a9ff, SignalLevel::Medium), // 8
top_ranked_coverage(0x8c2681a306481ff, SignalLevel::Low), // 4
top_ranked_coverage(0x8c2681a302991ff, SignalLevel::Low), // 4
top_ranked_coverage(0x8c2681a30641dff, SignalLevel::High), // 120
top_ranked_coverage(0x8c2681a3065d3ff, SignalLevel::Medium), // 60
top_ranked_coverage(0x8c2681a3066a9ff, SignalLevel::Medium), // 60
top_ranked_coverage(0x8c2681a306481ff, SignalLevel::Low), // 0
top_ranked_coverage(0x8c2681a302991ff, SignalLevel::Low), // 0
],
)?;

assert_eq!(dec!(18), radio_1.total_shares());
assert_eq!(dec!(40), radio_2.total_shares());
assert_eq!(dec!(105), radio_1.total_shares());
assert_eq!(dec!(240), radio_2.total_shares());

Ok(())
}
Expand All @@ -186,10 +193,10 @@ fn outdoor_wifi_with_wholly_overlapping_coverage_and_differing_speedtests() -> R
hotspot_key,
seniority_timestamp: timestamp.parse().expect("valid timestamp"),
coverage: vec![
unranked_coverage(0x8c2681a3064d9ff, SignalLevel::High), // 16
unranked_coverage(0x8c2681a3065d3ff, SignalLevel::High), // 16
unranked_coverage(0x8c2681a306635ff, SignalLevel::Medium), // 8
unranked_coverage(0x8c2681a3066e7ff, SignalLevel::Low), // 4
unranked_coverage(0x8c2681a3064d9ff, SignalLevel::High), // 120
unranked_coverage(0x8c2681a3065d3ff, SignalLevel::High), // 120
unranked_coverage(0x8c2681a306635ff, SignalLevel::Medium), // 60
unranked_coverage(0x8c2681a3066e7ff, SignalLevel::Low), // 0
],
})
};
Expand All @@ -210,9 +217,9 @@ fn outdoor_wifi_with_wholly_overlapping_coverage_and_differing_speedtests() -> R
let radio_5 = outdoor_wifi_radio(SpeedtestTier::Fail, map.get_wifi_coverage(&[5]))?;
let radio_6 = outdoor_wifi_radio(SpeedtestTier::Good, map.get_wifi_coverage(&[6]))?;

assert_eq!(dec!(44), radio_1.total_shares());
assert_eq!(dec!(16.5), radio_2.total_shares());
assert_eq!(dec!(5.5), radio_3.total_shares());
assert_eq!(dec!(300), radio_1.total_shares());
assert_eq!(dec!(112.5), radio_2.total_shares());
assert_eq!(dec!(37.5), radio_3.total_shares());
assert_eq!(dec!(0), radio_4.total_shares());
assert_eq!(dec!(0), radio_5.total_shares());
assert_eq!(dec!(0), radio_6.total_shares());
Expand All @@ -231,20 +238,20 @@ fn wifi_outdoor_with_mixed_signal_level_coverage() -> Result {
trust_score: Decimal::from_u8(1).unwrap(),
}],
vec![
top_ranked_coverage(0x8c2681a3064d9ff, SignalLevel::High), // 16
top_ranked_coverage(0x8c2681a3065d3ff, SignalLevel::High), // 16
top_ranked_coverage(0x8c2681a306635ff, SignalLevel::Medium), // 8
top_ranked_coverage(0x8c2681a3066e7ff, SignalLevel::Medium), // 8
top_ranked_coverage(0x8c2681a3065adff, SignalLevel::Medium), // 8
top_ranked_coverage(0x8c2681a339a4bff, SignalLevel::Low), // 4
top_ranked_coverage(0x8c2681a3065d7ff, SignalLevel::Low), // 4
top_ranked_coverage(0x8c2681a3064d9ff, SignalLevel::High), // 120
top_ranked_coverage(0x8c2681a3065d3ff, SignalLevel::High), // 120
top_ranked_coverage(0x8c2681a306635ff, SignalLevel::Medium), // 60
top_ranked_coverage(0x8c2681a3066e7ff, SignalLevel::Medium), // 60
top_ranked_coverage(0x8c2681a3065adff, SignalLevel::Medium), // 60
top_ranked_coverage(0x8c2681a339a4bff, SignalLevel::Low), // 0
top_ranked_coverage(0x8c2681a3065d7ff, SignalLevel::Low), // 0
],
OracleBoostingStatus::Eligible,
)
.unwrap();

assert_eq!(
Decimal::from_i32(16 * 2 + 8 * 3 + 4 * 2).unwrap(),
Decimal::from_i32(120 * 2 + 60 * 3).unwrap(),
radio.total_shares()
);

Expand All @@ -266,9 +273,9 @@ fn wifi_outdoor_with_single_overlapping_coverage() -> Result {
.parse()
.expect("valid timestamp"),
coverage: vec![
unranked_coverage(0x8c2681a302991ff, SignalLevel::High), // 16
unranked_coverage(0x8c2681a3028a7ff, SignalLevel::Medium), // 8. This hex is shared
unranked_coverage(0x8c2681a30659dff, SignalLevel::Low), // 4
unranked_coverage(0x8c2681a302991ff, SignalLevel::High), // 120
unranked_coverage(0x8c2681a3028a7ff, SignalLevel::Medium), // 60. This hex is shared
unranked_coverage(0x8c2681a30659dff, SignalLevel::Low), // 0
],
});
coverage_map_builder.insert_coverage_object(coverage_map::CoverageObject {
Expand All @@ -278,9 +285,9 @@ fn wifi_outdoor_with_single_overlapping_coverage() -> Result {
.parse()
.expect("valid timestamp"),
coverage: vec![
unranked_coverage(0x8c2681a3066abff, SignalLevel::High), // 16
unranked_coverage(0x8c2681a3028a7ff, SignalLevel::Medium), // 8 * 0.5 = 4(This hex is shared)
unranked_coverage(0x8c2681a3066a9ff, SignalLevel::Low), // 4
unranked_coverage(0x8c2681a3066abff, SignalLevel::High), // 120
unranked_coverage(0x8c2681a3028a7ff, SignalLevel::Medium), // 60 * 0.5 = 30(This hex is shared)
unranked_coverage(0x8c2681a3066a9ff, SignalLevel::Low), // 0
],
});

Expand All @@ -289,8 +296,8 @@ fn wifi_outdoor_with_single_overlapping_coverage() -> Result {
let radio_1 = outdoor_wifi_radio(SpeedtestTier::Degraded, map.get_wifi_coverage(&[1]))?;
let radio_2 = outdoor_wifi_radio(SpeedtestTier::Good, map.get_wifi_coverage(&[2]))?;

assert_eq!(dec!(28) * dec!(0.50), radio_1.total_shares());
assert_eq!(dec!(24), radio_2.total_shares());
assert_eq!(dec!(180) * dec!(0.50), radio_1.total_shares());
assert_eq!(dec!(150), radio_2.total_shares());

Ok(())
}
Expand Down
14 changes: 7 additions & 7 deletions mobile_verifier/tests/integrations/hex_boosting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -978,22 +978,22 @@ async fn test_poc_with_wifi_and_multi_coverage_boosted_hexes(pool: PgPool) -> an
// Here's how we get the regular shares per coverage points
// | base coverage point | speedtest | location | total |
// |---------------------|-----------|----------|-------|
// | 16 x 2 | 0.75 | 1.00 | 24 |
// | 120 x 2 | 0.75 | 1.00 | 180 |
// | 400 | 0.75 | 1.00 | 300 |
// | 400 | 0.75 | 1.00 | 300 |
// |---------------------|-----------|----------|-------|
// | 624 |
// | 780 |

// Boosted hexes are 1 at 10x and 1 at 20x.
// Only wifi is targeted with Boosts.
// (24 * 9) + (300 * 19) == 5916
// (180 * 9) + (300 * 19) == 7320
// To get points _only_ from boosting.

// combined points are 6540
let share = regular_poc / dec!(6540);
//
// combined points is 8100
let share = regular_poc / dec!(8100);

let exp_reward_1 =
rounded(share * (dec!(24) * dec!(1))) + rounded(share * (dec!(24) * dec!(9)));
rounded(share * (dec!(180) * dec!(1))) + rounded(share * (dec!(180) * dec!(9)));
let exp_reward_2 = rounded(share * dec!(300) * dec!(1)) + rounded(share * dec!(300) * dec!(19));
let exp_reward_3 = rounded(share * dec!(300) * dec!(1)) + rounded(share * dec!(300) * dec!(0));

Expand Down
Loading