diff --git a/distance-oracle/src/bin/distance_precompute.rs b/distance-oracle/src/bin/distance_precompute.rs index 1ffb8727cd8eb183020ce786060e226e76b738e9..d57e71bea87d61a7726468e2b49ffa34a5296465 100644 --- a/distance-oracle/src/bin/distance_precompute.rs +++ b/distance-oracle/src/bin/distance_precompute.rs @@ -1,6 +1,6 @@ use api::IdtyIndex; use distance_oracle::api; -use fnv::FnvHashMap; +use fnv::{FnvHashMap, FnvHashSet}; use log::debug; use std::{io::Write, path::PathBuf}; @@ -24,7 +24,8 @@ struct Cli { #[derive(serde::Serialize)] struct PrecomputationResult { block: sp_core::H256, - results: FnvHashMap<IdtyIndex, sp_runtime::Perbill>, + results: FnvHashMap<IdtyIndex, u32>, + referees: u32, } #[tokio::main] @@ -95,16 +96,23 @@ async fn main() { let referees = members; // initialize map of distance results - let mut results = FnvHashMap::<IdtyIndex, sp_runtime::Perbill>::default(); + let mut results = FnvHashMap::<IdtyIndex, u32>::default(); // compute all distances received_certs.keys().into_iter().for_each(|idty| { results.insert( *idty, - distance_oracle::distance_rule(&received_certs, &referees, max_depth, *idty), + distance_rule(&received_certs, &referees, max_depth, *idty) as u32, ); }); + // structure + let precomputation_result = PrecomputationResult { + block: evaluation_block, + results: results, + referees: referees.len() as u32, + }; + // ---- SAVE let evaluation_result_path = Into::<PathBuf>::into(cli.evaluation_result_dir).join("todo-block-number".to_string()); @@ -120,10 +128,7 @@ async fn main() { }); evaluation_result_file .write_all( - &serde_json::to_vec( &PrecomputationResult { - block: evaluation_block, - results: results, - }).expect("Cannot serialize result"), + &serde_json::to_vec( &precomputation_result).expect("Cannot serialize result"), ) .unwrap_or_else(|e| { panic!( @@ -131,3 +136,25 @@ async fn main() { ) }); } + +// alternative function which returns number of reached referees +fn distance_rule( + received_certs: &FnvHashMap<IdtyIndex, Vec<IdtyIndex>>, + referees: &FnvHashMap<IdtyIndex, u32>, + depth: u32, + idty: IdtyIndex, +) -> usize { + let mut accessible_referees = + FnvHashSet::<IdtyIndex>::with_capacity_and_hasher(referees.len(), Default::default()); + let mut known_idties = + FnvHashMap::<IdtyIndex, u32>::with_capacity_and_hasher(referees.len(), Default::default()); + distance_oracle::distance_rule_recursive( + received_certs, + referees, + idty, + &mut accessible_referees, + &mut known_idties, + depth, + ); + accessible_referees.len() +} diff --git a/distance-oracle/src/lib.rs b/distance-oracle/src/lib.rs index 855e1fea9e3a81b98719b6024b62063cf9b0021e..b3a6c3702ce96aeb6cb803c782ba0d7db40a5258 100644 --- a/distance-oracle/src/lib.rs +++ b/distance-oracle/src/lib.rs @@ -248,7 +248,7 @@ pub async fn run( Some((evaluation, current_pool_index, evaluation_result_path)) } -fn distance_rule_recursive( +pub fn distance_rule_recursive( received_certs: &FnvHashMap<IdtyIndex, Vec<IdtyIndex>>, referees: &FnvHashMap<IdtyIndex, u32>, idty: IdtyIndex, @@ -294,7 +294,7 @@ fn distance_rule_recursive( } /// Returns the fraction `nb_accessible_referees / nb_referees` -pub fn distance_rule( +fn distance_rule( received_certs: &FnvHashMap<IdtyIndex, Vec<IdtyIndex>>, referees: &FnvHashMap<IdtyIndex, u32>, depth: u32,