Dump (benchmarking wip)
This commit is contained in:
		
							parent
							
								
									f569f213b2
								
							
						
					
					
						commit
						e97e85a272
					
				| 
						 | 
				
			
			@ -435,6 +435,37 @@ impl PropertyTest {
 | 
			
		|||
            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 -----------------------------------------------------------------
 | 
			
		||||
| 
						 | 
				
			
			@ -941,10 +972,11 @@ where
 | 
			
		|||
//
 | 
			
		||||
// ----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[derive(Debug, Clone)]
 | 
			
		||||
pub enum TestResult<U, T> {
 | 
			
		||||
    UnitTestResult(UnitTestResult<U>),
 | 
			
		||||
    PropertyTestResult(PropertyTestResult<T>),
 | 
			
		||||
    Benchmark(BenchmarkResult),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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.reify(data_types))
 | 
			
		||||
            }
 | 
			
		||||
            TestResult::Benchmark(result) => TestResult::Benchmark(result),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -981,6 +1014,7 @@ impl<U, T> TestResult<U, T> {
 | 
			
		|||
                }
 | 
			
		||||
                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, .. }) => {
 | 
			
		||||
                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, .. }) => {
 | 
			
		||||
                test.name.as_str()
 | 
			
		||||
            }
 | 
			
		||||
            TestResult::Benchmark(BenchmarkResult { ref test, .. }) => test.name.as_str(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn traces(&self) -> &[String] {
 | 
			
		||||
        match self {
 | 
			
		||||
            TestResult::UnitTestResult(UnitTestResult { ref traces, .. })
 | 
			
		||||
            | TestResult::PropertyTestResult(PropertyTestResult { ref traces, .. }) => {
 | 
			
		||||
                traces.as_slice()
 | 
			
		||||
            }
 | 
			
		||||
            TestResult::UnitTestResult(UnitTestResult { traces, .. })
 | 
			
		||||
            | TestResult::PropertyTestResult(PropertyTestResult { traces, .. }) => traces,
 | 
			
		||||
            TestResult::Benchmark(BenchmarkResult { traces, .. }) => traces,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[derive(Debug, Clone)]
 | 
			
		||||
pub struct UnitTestResult<T> {
 | 
			
		||||
    pub success: bool,
 | 
			
		||||
    pub spent_budget: ExBudget,
 | 
			
		||||
| 
						 | 
				
			
			@ -1058,7 +1093,7 @@ impl UnitTestResult<(Constant, Rc<Type>)> {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[derive(Debug, Clone)]
 | 
			
		||||
pub struct PropertyTestResult<T> {
 | 
			
		||||
    pub test: PropertyTest,
 | 
			
		||||
    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)]
 | 
			
		||||
mod test {
 | 
			
		||||
    use super::*;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -193,6 +193,11 @@ impl Error {
 | 
			
		|||
                test.input_path.to_path_buf(),
 | 
			
		||||
                test.program.to_pretty(),
 | 
			
		||||
            ),
 | 
			
		||||
            TestResult::Benchmark(_) => (
 | 
			
		||||
                "benchmark".to_string(),
 | 
			
		||||
                PathBuf::new(),
 | 
			
		||||
                String::new(),
 | 
			
		||||
            ),
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        Error::TestFailure {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ use aiken_lang::{
 | 
			
		|||
    format::{Formatter, MAX_COLUMNS},
 | 
			
		||||
    gen_uplc::CodeGenerator,
 | 
			
		||||
    line_numbers::LineNumbers,
 | 
			
		||||
    test_framework::{Test, TestResult},
 | 
			
		||||
    test_framework::{Test, TestResult, BenchmarkResult},
 | 
			
		||||
    tipo::{Type, TypeInfo},
 | 
			
		||||
    utils, IdGenerator,
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -61,7 +61,7 @@ use std::{
 | 
			
		|||
use telemetry::EventListener;
 | 
			
		||||
use uplc::{
 | 
			
		||||
    ast::{Constant, Name, Program},
 | 
			
		||||
    PlutusData,
 | 
			
		||||
    PlutusData
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
| 
						 | 
				
			
			@ -303,15 +303,20 @@ where
 | 
			
		|||
        exact_match: bool,
 | 
			
		||||
        seed: u32,
 | 
			
		||||
        property_max_success: usize,
 | 
			
		||||
        env: Option<String>,
 | 
			
		||||
        output: PathBuf,
 | 
			
		||||
    ) -> Result<(), Vec<Error>> {
 | 
			
		||||
        let options = Options {
 | 
			
		||||
            tracing: Tracing::silent(),
 | 
			
		||||
            env,
 | 
			
		||||
            code_gen_mode: CodeGenMode::Benchmark {
 | 
			
		||||
                match_tests,
 | 
			
		||||
                exact_match,
 | 
			
		||||
                seed,
 | 
			
		||||
                property_max_success,
 | 
			
		||||
                output,
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        self.compile(options)
 | 
			
		||||
| 
						 | 
				
			
			@ -412,8 +417,9 @@ where
 | 
			
		|||
                        error,
 | 
			
		||||
                        path: options.blueprint_path,
 | 
			
		||||
                    }
 | 
			
		||||
                    .into()
 | 
			
		||||
                })
 | 
			
		||||
                })?;
 | 
			
		||||
                
 | 
			
		||||
                Ok(())
 | 
			
		||||
            }
 | 
			
		||||
            CodeGenMode::Test {
 | 
			
		||||
                match_tests,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue