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,