Skip to content

Commit 9b275ef

Browse files
hyperpolymathclaude
andcommitted
chore: fix, Rust, lint/fmt, issues
Batch Justfile audit: standardised naming (lowercase→Justfile), fixed parse errors, removed useless build-riscv from non-Rust repos, added missing assail recipe, and fixed code quality issues. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7945fea commit 9b275ef

9 files changed

Lines changed: 354 additions & 143 deletions

File tree

src/abi/mod.rs

Lines changed: 86 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ impl TernaryBool {
208208
/// Ternary NOT (Kleene strong negation).
209209
///
210210
/// NOT True = False, NOT False = True, NOT Unknown = Unknown.
211+
#[allow(clippy::should_implement_trait)]
211212
pub fn not(self) -> TernaryBool {
212213
match self {
213214
TernaryBool::True => TernaryBool::False,
@@ -448,7 +449,13 @@ mod tests {
448449
fn test_normal_distribution_valid() {
449450
let d = Distribution::new_normal(0.0, 1.0).unwrap();
450451
assert_eq!(d.kind(), "normal");
451-
assert_eq!(d, Distribution::Normal { mean: 0.0, std_dev: 1.0 });
452+
assert_eq!(
453+
d,
454+
Distribution::Normal {
455+
mean: 0.0,
456+
std_dev: 1.0
457+
}
458+
);
452459
}
453460

454461
#[test]
@@ -499,8 +506,8 @@ mod tests {
499506

500507
#[test]
501508
fn test_custom_distribution_valid() {
502-
let d = Distribution::new_custom("mixture(0.5, normal(0,1), normal(5,2))".to_string())
503-
.unwrap();
509+
let d =
510+
Distribution::new_custom("mixture(0.5, normal(0,1), normal(5,2))".to_string()).unwrap();
504511
assert_eq!(d.kind(), "custom");
505512
}
506513

@@ -515,32 +522,74 @@ mod tests {
515522
fn test_ternary_and() {
516523
// True AND x
517524
assert_eq!(TernaryBool::True.and(TernaryBool::True), TernaryBool::True);
518-
assert_eq!(TernaryBool::True.and(TernaryBool::False), TernaryBool::False);
519-
assert_eq!(TernaryBool::True.and(TernaryBool::Unknown), TernaryBool::Unknown);
525+
assert_eq!(
526+
TernaryBool::True.and(TernaryBool::False),
527+
TernaryBool::False
528+
);
529+
assert_eq!(
530+
TernaryBool::True.and(TernaryBool::Unknown),
531+
TernaryBool::Unknown
532+
);
520533
// False AND x (short-circuits to False)
521-
assert_eq!(TernaryBool::False.and(TernaryBool::True), TernaryBool::False);
522-
assert_eq!(TernaryBool::False.and(TernaryBool::False), TernaryBool::False);
523-
assert_eq!(TernaryBool::False.and(TernaryBool::Unknown), TernaryBool::False);
534+
assert_eq!(
535+
TernaryBool::False.and(TernaryBool::True),
536+
TernaryBool::False
537+
);
538+
assert_eq!(
539+
TernaryBool::False.and(TernaryBool::False),
540+
TernaryBool::False
541+
);
542+
assert_eq!(
543+
TernaryBool::False.and(TernaryBool::Unknown),
544+
TernaryBool::False
545+
);
524546
// Unknown AND x
525-
assert_eq!(TernaryBool::Unknown.and(TernaryBool::True), TernaryBool::Unknown);
526-
assert_eq!(TernaryBool::Unknown.and(TernaryBool::False), TernaryBool::False);
527-
assert_eq!(TernaryBool::Unknown.and(TernaryBool::Unknown), TernaryBool::Unknown);
547+
assert_eq!(
548+
TernaryBool::Unknown.and(TernaryBool::True),
549+
TernaryBool::Unknown
550+
);
551+
assert_eq!(
552+
TernaryBool::Unknown.and(TernaryBool::False),
553+
TernaryBool::False
554+
);
555+
assert_eq!(
556+
TernaryBool::Unknown.and(TernaryBool::Unknown),
557+
TernaryBool::Unknown
558+
);
528559
}
529560

530561
#[test]
531562
fn test_ternary_or() {
532563
// True OR x (short-circuits to True)
533564
assert_eq!(TernaryBool::True.or(TernaryBool::True), TernaryBool::True);
534565
assert_eq!(TernaryBool::True.or(TernaryBool::False), TernaryBool::True);
535-
assert_eq!(TernaryBool::True.or(TernaryBool::Unknown), TernaryBool::True);
566+
assert_eq!(
567+
TernaryBool::True.or(TernaryBool::Unknown),
568+
TernaryBool::True
569+
);
536570
// False OR x
537571
assert_eq!(TernaryBool::False.or(TernaryBool::True), TernaryBool::True);
538-
assert_eq!(TernaryBool::False.or(TernaryBool::False), TernaryBool::False);
539-
assert_eq!(TernaryBool::False.or(TernaryBool::Unknown), TernaryBool::Unknown);
572+
assert_eq!(
573+
TernaryBool::False.or(TernaryBool::False),
574+
TernaryBool::False
575+
);
576+
assert_eq!(
577+
TernaryBool::False.or(TernaryBool::Unknown),
578+
TernaryBool::Unknown
579+
);
540580
// Unknown OR x
541-
assert_eq!(TernaryBool::Unknown.or(TernaryBool::True), TernaryBool::True);
542-
assert_eq!(TernaryBool::Unknown.or(TernaryBool::False), TernaryBool::Unknown);
543-
assert_eq!(TernaryBool::Unknown.or(TernaryBool::Unknown), TernaryBool::Unknown);
581+
assert_eq!(
582+
TernaryBool::Unknown.or(TernaryBool::True),
583+
TernaryBool::True
584+
);
585+
assert_eq!(
586+
TernaryBool::Unknown.or(TernaryBool::False),
587+
TernaryBool::Unknown
588+
);
589+
assert_eq!(
590+
TernaryBool::Unknown.or(TernaryBool::Unknown),
591+
TernaryBool::Unknown
592+
);
544593
}
545594

546595
#[test]
@@ -553,13 +602,28 @@ mod tests {
553602
#[test]
554603
fn test_ternary_implies() {
555604
// True -> True = True
556-
assert_eq!(TernaryBool::True.implies(TernaryBool::True), TernaryBool::True);
605+
assert_eq!(
606+
TernaryBool::True.implies(TernaryBool::True),
607+
TernaryBool::True
608+
);
557609
// True -> False = False
558-
assert_eq!(TernaryBool::True.implies(TernaryBool::False), TernaryBool::False);
610+
assert_eq!(
611+
TernaryBool::True.implies(TernaryBool::False),
612+
TernaryBool::False
613+
);
559614
// False -> anything = True (ex falso quodlibet)
560-
assert_eq!(TernaryBool::False.implies(TernaryBool::True), TernaryBool::True);
561-
assert_eq!(TernaryBool::False.implies(TernaryBool::False), TernaryBool::True);
562-
assert_eq!(TernaryBool::False.implies(TernaryBool::Unknown), TernaryBool::True);
615+
assert_eq!(
616+
TernaryBool::False.implies(TernaryBool::True),
617+
TernaryBool::True
618+
);
619+
assert_eq!(
620+
TernaryBool::False.implies(TernaryBool::False),
621+
TernaryBool::True
622+
);
623+
assert_eq!(
624+
TernaryBool::False.implies(TernaryBool::Unknown),
625+
TernaryBool::True
626+
);
563627
}
564628

565629
#[test]

src/codegen/codegen.rs

Lines changed: 93 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
5557
fn 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

Comments
 (0)