]> Repositorios git - scryer-prolog.git/commitdiff
Expose inference counts on Machine; publish to CI
authorinfogulch <[email protected]>
Wed, 22 Nov 2023 00:12:26 +0000 (18:12 -0600)
committerinfogulch <[email protected]>
Wed, 22 Nov 2023 03:53:29 +0000 (21:53 -0600)
.github/workflows/ci.yml
benches/setup.rs
src/machine/mod.rs

index b887d1407880d42e503792c74b6c7c4e03bf52ef..9fa463a404759a30cbab06c699d8c836ea4566ae 100644 (file)
@@ -175,6 +175,7 @@ jobs:
           path: |
             target/criterion/*
             target/iai/*
+            target/benchmark_inference_counts.json
 
   # Publish binaries when building for a tag
   release:
index 3102b8c8a4f99f19f5fb76bddb74022259c18dd7..5e1fea7cb4855e77a0e773a08a248bcfae53573c 100644 (file)
@@ -86,14 +86,47 @@ mod test {
     #[test]
     fn validate_benchmarks() {
         use super::prolog_benches;
-        use scryer_prolog::machine::parsed_results::QueryResolution;
+        use scryer_prolog::machine::parsed_results::{QueryMatch, QueryResolution};
+        use std::{fmt::Write, fs};
+
+        struct BenchResult {
+            pub name: &'static str,
+            pub setup_inference_count: u64,
+            pub query_inference_count: u64,
+        }
+
+        let mut results: Vec<BenchResult> = vec![];
 
-        use scryer_prolog::machine::parsed_results::QueryMatch;
         for (_, r) in prolog_benches() {
             let mut machine = r.make_machine();
+            let setup_inference_count = machine.get_inference_count();
+
             let result = machine.run_query(r.query.to_string()).unwrap();
+            let query_inference_count = machine.get_inference_count() - setup_inference_count;
+
             let expected = QueryResolution::Matches(vec![QueryMatch::from(r.bindings.clone())]);
             assert_eq!(result, expected, "validating benchmark {}", r.name);
+
+            results.push(BenchResult {
+                name: r.name,
+                setup_inference_count,
+                query_inference_count,
+            })
+        }
+
+        let mut json: String = Default::default();
+        json.push('[');
+        for r in results {
+            json.push('\n');
+            write!(
+                json,
+                r#"{{"name":"{}","setup_inference_count":{},"query_inference_count":{}}},"#,
+                r.name, r.setup_inference_count, r.query_inference_count
+            )
+            .unwrap();
         }
+        json.pop(); // trailing comma
+        json.push_str("\n]");
+        fs::write("target/benchmark_inference_counts.json", json).expect("Unable to write file");
     }
 }
index 6801575dff26675794c98be4e4b07489c19c4ed1..b25627db0da2a675871603369ae7ffe515855e63 100644 (file)
@@ -211,6 +211,15 @@ impl Machine {
         )
     }
 
+    pub fn get_inference_count(&mut self) -> u64 {
+        self.machine_st
+            .cwil
+            .global_count
+            .clone()
+            .try_into()
+            .unwrap()
+    }
+
     pub fn throw_session_error(&mut self, err: SessionError, key: PredicateKey) {
         let err = self.machine_st.session_error(err);
         let stub = functor_stub(key.0, key.1);