@@ -37,7 +37,9 @@ pub fn generate_betlang_code(manifest: &Manifest) -> Result<String, String> {
3737 emit_propagation_rules ( & mut code, & variables) ;
3838
3939 // --- Ternary logic helpers (only if Bernoulli variables exist) ---
40- let has_bernoulli = variables. iter ( ) . any ( |v| v. distribution . kind ( ) == "bernoulli" ) ;
40+ let has_bernoulli = variables
41+ . iter ( )
42+ . any ( |v| v. distribution . kind ( ) == "bernoulli" ) ;
4143 if has_bernoulli {
4244 emit_ternary_helpers ( & mut code, & variables) ;
4345 }
@@ -53,7 +55,11 @@ pub fn generate_betlang_code(manifest: &Manifest) -> Result<String, String> {
5355
5456/// Emit the Betlang file header with project metadata.
5557fn emit_header ( code : & mut String , project_name : & str ) {
56- writeln ! ( code, "// Generated by betlangiser — ternary probabilistic modelling" ) . unwrap ( ) ;
58+ writeln ! (
59+ code,
60+ "// Generated by betlangiser — ternary probabilistic modelling"
61+ )
62+ . unwrap ( ) ;
5763 writeln ! ( code, "// Project: {}" , project_name) . unwrap ( ) ;
5864 writeln ! ( code, "// SPDX-License-Identifier: PMPL-1.0-or-later" ) . unwrap ( ) ;
5965 writeln ! ( code) . unwrap ( ) ;
@@ -92,12 +98,7 @@ fn emit_propagation_rules(code: &mut String, variables: &[ParsedVariable]) {
9298
9399 for var in variables {
94100 let rule = propagation_rule ( & var. distribution ) ;
95- writeln ! (
96- code,
97- "@propagation({}, \" {}\" )" ,
98- var. name, rule
99- )
100- . unwrap ( ) ;
101+ writeln ! ( code, "@propagation({}, \" {}\" )" , var. name, rule) . unwrap ( ) ;
101102 }
102103 writeln ! ( code) . unwrap ( ) ;
103104}
@@ -172,19 +173,11 @@ fn emit_simulation_config(code: &mut String, config: &AbiSimConfig) {
172173}
173174
174175/// Emit the main `simulate` entry point that runs the Monte Carlo simulation.
175- fn emit_entry_point (
176- code : & mut String ,
177- variables : & [ ParsedVariable ] ,
178- config : & AbiSimConfig ,
179- ) {
176+ fn emit_entry_point ( code : & mut String , variables : & [ ParsedVariable ] , config : & AbiSimConfig ) {
180177 writeln ! ( code, "// --- Entry Point ---" ) . unwrap ( ) ;
181178 writeln ! ( code) . unwrap ( ) ;
182179 writeln ! ( code, "/// Run the Monte Carlo simulation." ) . unwrap ( ) ;
183- writeln ! (
184- code,
185- "let simulate() -> SimulationResults ="
186- )
187- . unwrap ( ) ;
180+ writeln ! ( code, "let simulate() -> SimulationResults =" ) . unwrap ( ) ;
188181 writeln ! ( code, " let results = {{" ) . unwrap ( ) ;
189182
190183 for var in variables {
@@ -252,15 +245,24 @@ mod tests {
252245 distribution: "normal" . to_string( ) ,
253246 mean: Some ( 100.0 ) ,
254247 std_dev: Some ( 5.0 ) ,
255- min: None , max: None , alpha: None , beta_param: None ,
256- probability: None , expression: None ,
248+ min: None ,
249+ max: None ,
250+ alpha: None ,
251+ beta_param: None ,
252+ probability: None ,
253+ expression: None ,
257254 } ,
258255 VariableDecl {
259256 name: "will_buy" . to_string( ) ,
260257 distribution: "bernoulli" . to_string( ) ,
261- mean: None , std_dev: None , min: None , max: None ,
262- alpha: None , beta_param: None ,
263- probability: Some ( 0.7 ) , expression: None ,
258+ mean: None ,
259+ std_dev: None ,
260+ min: None ,
261+ max: None ,
262+ alpha: None ,
263+ beta_param: None ,
264+ probability: Some ( 0.7 ) ,
265+ expression: None ,
264266 } ,
265267 ] ;
266268 let m = make_manifest ( "risk-model" , vars) ;
@@ -297,9 +299,14 @@ mod tests {
297299 let vars = vec ! [ VariableDecl {
298300 name: "x" . to_string( ) ,
299301 distribution: "normal" . to_string( ) ,
300- mean: Some ( 0.0 ) , std_dev: Some ( 1.0 ) ,
301- min: None , max: None , alpha: None , beta_param: None ,
302- probability: None , expression: None ,
302+ mean: Some ( 0.0 ) ,
303+ std_dev: Some ( 1.0 ) ,
304+ min: None ,
305+ max: None ,
306+ alpha: None ,
307+ beta_param: None ,
308+ probability: None ,
309+ expression: None ,
303310 } ] ;
304311 let m = make_manifest ( "no-bernoulli" , vars) ;
305312 let code = generate_betlang_code ( & m) . unwrap ( ) ;
@@ -322,34 +329,64 @@ mod tests {
322329 fn test_generate_all_distributions ( ) {
323330 let vars = vec ! [
324331 VariableDecl {
325- name: "a" . to_string( ) , distribution: "normal" . to_string( ) ,
326- mean: Some ( 0.0 ) , std_dev: Some ( 1.0 ) ,
327- min: None , max: None , alpha: None , beta_param: None ,
328- probability: None , expression: None ,
332+ name: "a" . to_string( ) ,
333+ distribution: "normal" . to_string( ) ,
334+ mean: Some ( 0.0 ) ,
335+ std_dev: Some ( 1.0 ) ,
336+ min: None ,
337+ max: None ,
338+ alpha: None ,
339+ beta_param: None ,
340+ probability: None ,
341+ expression: None ,
329342 } ,
330343 VariableDecl {
331- name: "b" . to_string( ) , distribution: "uniform" . to_string( ) ,
332- mean: None , std_dev: None , min: Some ( 0.0 ) , max: Some ( 10.0 ) ,
333- alpha: None , beta_param: None ,
334- probability: None , expression: None ,
344+ name: "b" . to_string( ) ,
345+ distribution: "uniform" . to_string( ) ,
346+ mean: None ,
347+ std_dev: None ,
348+ min: Some ( 0.0 ) ,
349+ max: Some ( 10.0 ) ,
350+ alpha: None ,
351+ beta_param: None ,
352+ probability: None ,
353+ expression: None ,
335354 } ,
336355 VariableDecl {
337- name: "c" . to_string( ) , distribution: "beta" . to_string( ) ,
338- mean: None , std_dev: None , min: None , max: None ,
339- alpha: Some ( 2.0 ) , beta_param: Some ( 5.0 ) ,
340- probability: None , expression: None ,
356+ name: "c" . to_string( ) ,
357+ distribution: "beta" . to_string( ) ,
358+ mean: None ,
359+ std_dev: None ,
360+ min: None ,
361+ max: None ,
362+ alpha: Some ( 2.0 ) ,
363+ beta_param: Some ( 5.0 ) ,
364+ probability: None ,
365+ expression: None ,
341366 } ,
342367 VariableDecl {
343- name: "d" . to_string( ) , distribution: "bernoulli" . to_string( ) ,
344- mean: None , std_dev: None , min: None , max: None ,
345- alpha: None , beta_param: None ,
346- probability: Some ( 0.5 ) , expression: None ,
368+ name: "d" . to_string( ) ,
369+ distribution: "bernoulli" . to_string( ) ,
370+ mean: None ,
371+ std_dev: None ,
372+ min: None ,
373+ max: None ,
374+ alpha: None ,
375+ beta_param: None ,
376+ probability: Some ( 0.5 ) ,
377+ expression: None ,
347378 } ,
348379 VariableDecl {
349- name: "e" . to_string( ) , distribution: "custom" . to_string( ) ,
350- mean: None , std_dev: None , min: None , max: None ,
351- alpha: None , beta_param: None ,
352- probability: None , expression: Some ( "test()" . to_string( ) ) ,
380+ name: "e" . to_string( ) ,
381+ distribution: "custom" . to_string( ) ,
382+ mean: None ,
383+ std_dev: None ,
384+ min: None ,
385+ max: None ,
386+ alpha: None ,
387+ beta_param: None ,
388+ probability: None ,
389+ expression: Some ( "test()" . to_string( ) ) ,
353390 } ,
354391 ] ;
355392 let m = make_manifest ( "all-dists" , vars) ;
@@ -366,10 +403,16 @@ mod tests {
366403 #[ test]
367404 fn test_generate_with_seed ( ) {
368405 let vars = vec ! [ VariableDecl {
369- name: "x" . to_string( ) , distribution: "normal" . to_string( ) ,
370- mean: Some ( 0.0 ) , std_dev: Some ( 1.0 ) ,
371- min: None , max: None , alpha: None , beta_param: None ,
372- probability: None , expression: None ,
406+ name: "x" . to_string( ) ,
407+ distribution: "normal" . to_string( ) ,
408+ mean: Some ( 0.0 ) ,
409+ std_dev: Some ( 1.0 ) ,
410+ min: None ,
411+ max: None ,
412+ alpha: None ,
413+ beta_param: None ,
414+ probability: None ,
415+ expression: None ,
373416 } ] ;
374417 let mut m = make_manifest ( "seeded" , vars) ;
375418 m. simulation . seed = Some ( 42 ) ;
0 commit comments