diff --git a/tig-protocol/src/contracts/benchmarks.rs b/tig-protocol/src/contracts/benchmarks.rs index a182e61d..ce2fd21f 100644 --- a/tig-protocol/src/contracts/benchmarks.rs +++ b/tig-protocol/src/contracts/benchmarks.rs @@ -169,23 +169,28 @@ pub async fn submit_benchmark( } // random sample nonces + let median_idx = (solution_quality.len() / 2) as u64; + let config = ctx.get_config().await; let mut rng = StdRng::seed_from_u64(seed); let max_samples = config.challenges[&settings.challenge_id].max_samples; let mut sampled_nonces = HashSet::new(); + sampled_nonces.insert(median_idx as u64); for _ in 0..25 { if sampled_nonces.len() == max_samples { break; } - let nonce = rng.gen_range(0..precommit_details.num_nonces); + let nonce = rng.gen_range(median_idx..precommit_details.num_nonces); if sampled_nonces.contains(&nonce) { continue; } sampled_nonces.insert(nonce); } - let average_solution_quality = - solution_quality.iter().sum::() / (solution_quality.len() as i32); + // Calculate median solution quality + let mut sorted_quality = solution_quality.clone(); + sorted_quality.sort_unstable(); + let average_solution_quality = sorted_quality[median_idx as usize]; ctx.add_benchmark_to_mempool( benchmark_id, diff --git a/tig-protocol/src/contracts/opow.rs b/tig-protocol/src/contracts/opow.rs index 91388e74..898eca17 100644 --- a/tig-protocol/src/contracts/opow.rs +++ b/tig-protocol/src/contracts/opow.rs @@ -114,6 +114,7 @@ pub(crate) async fn update(cache: &mut AddBlockCache) { let challenge_data = active_challenges_block_data.get_mut(challenge_id).unwrap(); let mut player_code_nonces = HashMap::>::new(); let mut player_nonces = HashMap::::new(); + let mut qualifier_qualities = HashMap::>::new(); for frontier_idx in 0..max_frontier_idx { for (settings, &quality, &num_nonces) in @@ -133,11 +134,10 @@ pub(crate) async fn update(cache: &mut AddBlockCache) { .or_default() += num_nonces; *player_nonces.entry(player_id.clone()).or_default() += num_nonces; - challenge_data - .qualifier_qualities + qualifier_qualities .entry(race_id.clone()) .or_default() - .push(quality); + .insert(quality); } // check if we have enough qualifiers @@ -182,6 +182,15 @@ pub(crate) async fn update(cache: &mut AddBlockCache) { break; } } + + challenge_data.qualifier_qualities = qualifier_qualities + .into_iter() + .map(|(race_id, qualifier_qualities)| { + let mut qualifier_qualities = qualifier_qualities.into_iter().collect::>(); + qualifier_qualities.sort_by(|a, b| b.cmp(a)); + (race_id, qualifier_qualities) + }) + .collect(); } // update influence