Dump (benchmarking wip)
This commit is contained in:
		
							parent
							
								
									f569f213b2
								
							
						
					
					
						commit
						e97e85a272
					
				| 
						 | 
					@ -435,6 +435,37 @@ impl PropertyTest {
 | 
				
			||||||
            None
 | 
					            None
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn benchmark(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        seed: u32,
 | 
				
			||||||
 | 
					        n: usize,
 | 
				
			||||||
 | 
					        plutus_version: &PlutusVersion,
 | 
				
			||||||
 | 
					    ) -> Vec<BenchmarkResult> {
 | 
				
			||||||
 | 
					        let mut results = Vec::with_capacity(n);
 | 
				
			||||||
 | 
					        let mut remaining = n;
 | 
				
			||||||
 | 
					        let mut prng = Prng::from_seed(seed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while remaining > 0 {
 | 
				
			||||||
 | 
					            match prng.sample(&self.fuzzer.program) {
 | 
				
			||||||
 | 
					                Ok(Some((new_prng, value))) => {
 | 
				
			||||||
 | 
					                    prng = new_prng;
 | 
				
			||||||
 | 
					                    let mut eval_result = self.eval(&value, plutus_version);
 | 
				
			||||||
 | 
					                    results.push(BenchmarkResult {
 | 
				
			||||||
 | 
					                        test: self.clone(),
 | 
				
			||||||
 | 
					                        cost: eval_result.cost(),
 | 
				
			||||||
 | 
					                        success: !eval_result.failed(false),
 | 
				
			||||||
 | 
					                        traces: eval_result.logs().to_vec(),
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Ok(None) => {}
 | 
				
			||||||
 | 
					                Err(_) => break,
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            remaining -= 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        results
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// ----- PRNG -----------------------------------------------------------------
 | 
					/// ----- PRNG -----------------------------------------------------------------
 | 
				
			||||||
| 
						 | 
					@ -941,10 +972,11 @@ where
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// ----------------------------------------------------------------------------
 | 
					// ----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug)]
 | 
					#[derive(Debug, Clone)]
 | 
				
			||||||
pub enum TestResult<U, T> {
 | 
					pub enum TestResult<U, T> {
 | 
				
			||||||
    UnitTestResult(UnitTestResult<U>),
 | 
					    UnitTestResult(UnitTestResult<U>),
 | 
				
			||||||
    PropertyTestResult(PropertyTestResult<T>),
 | 
					    PropertyTestResult(PropertyTestResult<T>),
 | 
				
			||||||
 | 
					    Benchmark(BenchmarkResult),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsafe impl<U, T> Send for TestResult<U, T> {}
 | 
					unsafe impl<U, T> Send for TestResult<U, T> {}
 | 
				
			||||||
| 
						 | 
					@ -959,6 +991,7 @@ impl TestResult<(Constant, Rc<Type>), PlutusData> {
 | 
				
			||||||
            TestResult::PropertyTestResult(test) => {
 | 
					            TestResult::PropertyTestResult(test) => {
 | 
				
			||||||
                TestResult::PropertyTestResult(test.reify(data_types))
 | 
					                TestResult::PropertyTestResult(test.reify(data_types))
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            TestResult::Benchmark(result) => TestResult::Benchmark(result),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -981,6 +1014,7 @@ impl<U, T> TestResult<U, T> {
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                OnTestFailure::SucceedImmediately => counterexample.is_some(),
 | 
					                OnTestFailure::SucceedImmediately => counterexample.is_some(),
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
					            TestResult::Benchmark(BenchmarkResult { success, .. }) => *success,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -990,6 +1024,7 @@ impl<U, T> TestResult<U, T> {
 | 
				
			||||||
            TestResult::PropertyTestResult(PropertyTestResult { ref test, .. }) => {
 | 
					            TestResult::PropertyTestResult(PropertyTestResult { ref test, .. }) => {
 | 
				
			||||||
                test.module.as_str()
 | 
					                test.module.as_str()
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            TestResult::Benchmark(BenchmarkResult { ref test, .. }) => test.module.as_str(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -999,20 +1034,20 @@ impl<U, T> TestResult<U, T> {
 | 
				
			||||||
            TestResult::PropertyTestResult(PropertyTestResult { ref test, .. }) => {
 | 
					            TestResult::PropertyTestResult(PropertyTestResult { ref test, .. }) => {
 | 
				
			||||||
                test.name.as_str()
 | 
					                test.name.as_str()
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            TestResult::Benchmark(BenchmarkResult { ref test, .. }) => test.name.as_str(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn traces(&self) -> &[String] {
 | 
					    pub fn traces(&self) -> &[String] {
 | 
				
			||||||
        match self {
 | 
					        match self {
 | 
				
			||||||
            TestResult::UnitTestResult(UnitTestResult { ref traces, .. })
 | 
					            TestResult::UnitTestResult(UnitTestResult { traces, .. })
 | 
				
			||||||
            | TestResult::PropertyTestResult(PropertyTestResult { ref traces, .. }) => {
 | 
					            | TestResult::PropertyTestResult(PropertyTestResult { traces, .. }) => traces,
 | 
				
			||||||
                traces.as_slice()
 | 
					            TestResult::Benchmark(BenchmarkResult { traces, .. }) => traces,
 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug)]
 | 
					#[derive(Debug, Clone)]
 | 
				
			||||||
pub struct UnitTestResult<T> {
 | 
					pub struct UnitTestResult<T> {
 | 
				
			||||||
    pub success: bool,
 | 
					    pub success: bool,
 | 
				
			||||||
    pub spent_budget: ExBudget,
 | 
					    pub spent_budget: ExBudget,
 | 
				
			||||||
| 
						 | 
					@ -1058,7 +1093,7 @@ impl UnitTestResult<(Constant, Rc<Type>)> {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug)]
 | 
					#[derive(Debug, Clone)]
 | 
				
			||||||
pub struct PropertyTestResult<T> {
 | 
					pub struct PropertyTestResult<T> {
 | 
				
			||||||
    pub test: PropertyTest,
 | 
					    pub test: PropertyTest,
 | 
				
			||||||
    pub counterexample: Result<Option<T>, uplc::machine::Error>,
 | 
					    pub counterexample: Result<Option<T>, uplc::machine::Error>,
 | 
				
			||||||
| 
						 | 
					@ -1343,6 +1378,17 @@ impl Assertion<UntypedExpr> {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug, Clone)]
 | 
				
			||||||
 | 
					pub struct BenchmarkResult {
 | 
				
			||||||
 | 
					    pub test: PropertyTest,
 | 
				
			||||||
 | 
					    pub cost: ExBudget,
 | 
				
			||||||
 | 
					    pub success: bool,
 | 
				
			||||||
 | 
					    pub traces: Vec<String>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsafe impl Send for BenchmarkResult {}
 | 
				
			||||||
 | 
					unsafe impl Sync for BenchmarkResult {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(test)]
 | 
					#[cfg(test)]
 | 
				
			||||||
mod test {
 | 
					mod test {
 | 
				
			||||||
    use super::*;
 | 
					    use super::*;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -193,6 +193,11 @@ impl Error {
 | 
				
			||||||
                test.input_path.to_path_buf(),
 | 
					                test.input_path.to_path_buf(),
 | 
				
			||||||
                test.program.to_pretty(),
 | 
					                test.program.to_pretty(),
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
 | 
					            TestResult::Benchmark(_) => (
 | 
				
			||||||
 | 
					                "benchmark".to_string(),
 | 
				
			||||||
 | 
					                PathBuf::new(),
 | 
				
			||||||
 | 
					                String::new(),
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Error::TestFailure {
 | 
					        Error::TestFailure {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,7 +40,7 @@ use aiken_lang::{
 | 
				
			||||||
    format::{Formatter, MAX_COLUMNS},
 | 
					    format::{Formatter, MAX_COLUMNS},
 | 
				
			||||||
    gen_uplc::CodeGenerator,
 | 
					    gen_uplc::CodeGenerator,
 | 
				
			||||||
    line_numbers::LineNumbers,
 | 
					    line_numbers::LineNumbers,
 | 
				
			||||||
    test_framework::{Test, TestResult},
 | 
					    test_framework::{Test, TestResult, BenchmarkResult},
 | 
				
			||||||
    tipo::{Type, TypeInfo},
 | 
					    tipo::{Type, TypeInfo},
 | 
				
			||||||
    utils, IdGenerator,
 | 
					    utils, IdGenerator,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -61,7 +61,7 @@ use std::{
 | 
				
			||||||
use telemetry::EventListener;
 | 
					use telemetry::EventListener;
 | 
				
			||||||
use uplc::{
 | 
					use uplc::{
 | 
				
			||||||
    ast::{Constant, Name, Program},
 | 
					    ast::{Constant, Name, Program},
 | 
				
			||||||
    PlutusData,
 | 
					    PlutusData
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug)]
 | 
					#[derive(Debug)]
 | 
				
			||||||
| 
						 | 
					@ -303,15 +303,20 @@ where
 | 
				
			||||||
        exact_match: bool,
 | 
					        exact_match: bool,
 | 
				
			||||||
        seed: u32,
 | 
					        seed: u32,
 | 
				
			||||||
        property_max_success: usize,
 | 
					        property_max_success: usize,
 | 
				
			||||||
 | 
					        env: Option<String>,
 | 
				
			||||||
 | 
					        output: PathBuf,
 | 
				
			||||||
    ) -> Result<(), Vec<Error>> {
 | 
					    ) -> Result<(), Vec<Error>> {
 | 
				
			||||||
        let options = Options {
 | 
					        let options = Options {
 | 
				
			||||||
            tracing: Tracing::silent(),
 | 
					            tracing: Tracing::silent(),
 | 
				
			||||||
 | 
					            env,
 | 
				
			||||||
            code_gen_mode: CodeGenMode::Benchmark {
 | 
					            code_gen_mode: CodeGenMode::Benchmark {
 | 
				
			||||||
                match_tests,
 | 
					                match_tests,
 | 
				
			||||||
                exact_match,
 | 
					                exact_match,
 | 
				
			||||||
                seed,
 | 
					                seed,
 | 
				
			||||||
                property_max_success,
 | 
					                property_max_success,
 | 
				
			||||||
 | 
					                output,
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.compile(options)
 | 
					        self.compile(options)
 | 
				
			||||||
| 
						 | 
					@ -412,8 +417,9 @@ where
 | 
				
			||||||
                        error,
 | 
					                        error,
 | 
				
			||||||
                        path: options.blueprint_path,
 | 
					                        path: options.blueprint_path,
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    .into()
 | 
					                })?;
 | 
				
			||||||
                })
 | 
					                
 | 
				
			||||||
 | 
					                Ok(())
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            CodeGenMode::Test {
 | 
					            CodeGenMode::Test {
 | 
				
			||||||
                match_tests,
 | 
					                match_tests,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue