Skip to main content

compiler_demo/
compiler_demo.rs

1//! Translation demonstration - shows MiniZinc → Selen Model → Solve
2//!
3//! This replaces the old compiler demo which generated string code.
4//! The new architecture builds Selen Model objects directly for execution.
5
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7    println!("=== MiniZinc Translation & Solving Demo ===\n");
8
9    // Example 1: Simple variable with literal domain
10    let simple_var_source = r#"
11var 1..10: x;
12var 1..10: y;
13constraint x < y;
14solve satisfy;
15"#;
16
17    println!("Example 1: Simple Variables with Constraint");
18    println!("MiniZinc Source:");
19    println!("{}", simple_var_source);
20    
21    let ast = zelen::parse(simple_var_source)?;
22    let translated = zelen::Translator::translate_with_vars(&ast)?;
23    
24    println!("✓ Translated to Selen Model");
25    println!("  Variables: {:?}", translated.int_vars.keys().collect::<Vec<_>>());
26    
27    match translated.model.solve() {
28        Ok(solution) => {
29            println!("✓ Solution found!");
30            if let Some(&x) = translated.int_vars.get("x") {
31                if let Some(&y) = translated.int_vars.get("y") {
32                    if let selen::variables::Val::ValI(x_val) = solution[x] {
33                        if let selen::variables::Val::ValI(y_val) = solution[y] {
34                            println!("  x = {}, y = {}", x_val, y_val);
35                        }
36                    }
37                }
38            }
39        }
40        Err(e) => {
41            println!("✗ No solution: {:?}", e);
42        }
43    }
44
45    println!("\n{}\n", "=".repeat(60));
46
47    // Example 2: Parameter and variable
48    let param_source = r#"
49int: n = 5;
50var 1..n: x;
51solve satisfy;
52"#;
53
54    println!("Example 2: Parameter with Expression");
55    println!("MiniZinc Source:");
56    println!("{}", param_source);
57    
58    let ast = zelen::parse(param_source)?;
59    let translated = zelen::Translator::translate_with_vars(&ast)?;
60    
61    println!("✓ Translated to Selen Model");
62    println!("  Parameters: n = 5");
63    println!("  Variables: {:?}", translated.int_vars.keys().collect::<Vec<_>>());
64    
65    match translated.model.solve() {
66        Ok(solution) => {
67            println!("✓ Solution found!");
68            if let Some(&x) = translated.int_vars.get("x") {
69                if let selen::variables::Val::ValI(x_val) = solution[x] {
70                    println!("  x = {} (domain was 1..5)", x_val);
71                }
72            }
73        }
74        Err(e) => {
75            println!("✗ No solution: {:?}", e);
76        }
77    }
78
79    println!("\n{}\n", "=".repeat(60));
80
81    // Example 3: Array with constraint
82    let array_source = r#"
83array[1..4] of var 1..4: queens;
84constraint alldifferent(queens);
85solve satisfy;
86"#;
87
88    println!("Example 3: N-Queens Array with Alldifferent");
89    println!("MiniZinc Source:");
90    println!("{}", array_source);
91    
92    let ast = zelen::parse(array_source)?;
93    let translated = zelen::Translator::translate_with_vars(&ast)?;
94    
95    println!("✓ Translated to Selen Model");
96    println!("  Variable arrays: {:?}", translated.int_var_arrays.keys().collect::<Vec<_>>());
97    
98    match translated.model.solve() {
99        Ok(solution) => {
100            println!("✓ Solution found!");
101            if let Some(queens) = translated.int_var_arrays.get("queens") {
102                print!("  queens = [");
103                for (i, var_id) in queens.iter().enumerate() {
104                    if i > 0 { print!(", "); }
105                    if let selen::variables::Val::ValI(val) = solution[*var_id] {
106                        print!("{}", val);
107                    }
108                }
109                println!("]");
110            }
111        }
112        Err(e) => {
113            println!("✗ No solution: {:?}", e);
114        }
115    }
116
117    println!("\n=== Translation & Solving Complete ===");
118    
119    Ok(())
120}