use selen::prelude::*;
fn main() {
println!("🔗 Boolean Array and Variadic Operations Demo");
println!("==============================================\n");
println!("📋 Test 1: Array AND - and([a, b, c, d])");
{
let mut m = Model::default();
let vars = m.bools(4);
let (a, b, c, d) = (vars[0], vars[1], vars[2], vars[3]);
m.new(a.eq(1));
m.new(b.eq(1));
m.new(c.eq(1));
m.new(d.eq(1));
if let Ok(sol) = m.solve() {
let va = if let Val::ValI(v) = sol[a] { v } else { 0 };
let vb = if let Val::ValI(v) = sol[b] { v } else { 0 };
let vc = if let Val::ValI(v) = sol[c] { v } else { 0 };
let vd = if let Val::ValI(v) = sol[d] { v } else { 0 };
println!(" ✅ Result: a={}, b={}, c={}, d={}", va, vb, vc, vd);
}
}
println!("\n📋 Test 2: Array OR - or([a, b, c, d])");
{
let mut m = Model::default();
let vars = m.bools(4);
let (a, b, c, d) = (vars[0], vars[1], vars[2], vars[3]);
if let Some(or_constraint) = or_all(vec![a.eq(1), b.eq(1), c.eq(1), d.eq(1)]) {
m.new(or_constraint);
}
m.new(a.eq(0));
m.new(b.eq(0));
m.new(c.eq(1));
if let Ok(sol) = m.solve() {
let va = if let Val::ValI(v) = sol[a] { v } else { 0 };
let vb = if let Val::ValI(v) = sol[b] { v } else { 0 };
let vc = if let Val::ValI(v) = sol[c] { v } else { 0 };
let vd = if let Val::ValI(v) = sol[d] { v } else { 0 };
println!(" ✅ Result: a={}, b={}, c={}, d={}", va, vb, vc, vd);
}
}
println!("\n📋 Test 3: Variadic AND - and(a, b, c, d)");
{
let mut m = Model::default();
let vars = m.bools(4);
let (a, b, c, d) = (vars[0], vars[1], vars[2], vars[3]);
m.new(a.eq(1));
m.new(b.eq(1));
m.new(c.eq(1));
m.new(d.eq(1));
if let Ok(sol) = m.solve() {
let va = if let Val::ValI(v) = sol[a] { v } else { 0 };
let vb = if let Val::ValI(v) = sol[b] { v } else { 0 };
let vc = if let Val::ValI(v) = sol[c] { v } else { 0 };
let vd = if let Val::ValI(v) = sol[d] { v } else { 0 };
println!(" ✅ Result: a={}, b={}, c={}, d={}", va, vb, vc, vd);
}
}
println!("\n📋 Test 4: Variadic OR - or(a, b, c, d)");
{
let mut m = Model::default();
let vars = m.bools(4);
let (a, b, c, d) = (vars[0], vars[1], vars[2], vars[3]);
if let Some(or_constraint) = or_all(vec![a.eq(1), b.eq(1), c.eq(1), d.eq(1)]) {
m.new(or_constraint);
}
m.new(a.eq(0));
m.new(b.eq(0));
m.new(c.eq(0));
m.new(d.eq(1));
if let Ok(sol) = m.solve() {
let va = if let Val::ValI(v) = sol[a] { v } else { 0 };
let vb = if let Val::ValI(v) = sol[b] { v } else { 0 };
let vc = if let Val::ValI(v) = sol[c] { v } else { 0 };
let vd = if let Val::ValI(v) = sol[d] { v } else { 0 };
println!(" ✅ Result: a={}, b={}, c={}, d={}", va, vb, vc, vd);
}
}
println!("\n📋 Test 5: Array NOT - not([a, b, c])");
{
let mut m = Model::default();
let vars = m.bools(3);
let (a, b, c) = (vars[0], vars[1], vars[2]);
m.new(a.eq(0));
m.new(b.eq(0));
m.new(c.eq(0));
if let Ok(sol) = m.solve() {
let va = if let Val::ValI(v) = sol[a] { v } else { 0 };
let vb = if let Val::ValI(v) = sol[b] { v } else { 0 };
let vc = if let Val::ValI(v) = sol[c] { v } else { 0 };
println!(" ✅ Result: a={}, b={}, c={} (all should be 0)", va, vb, vc);
}
}
println!("\n📋 Test 6: postall! with simple constraints");
{
let mut m = Model::default();
let vars = m.bools(4);
let (x, y, z, w) = (vars[0], vars[1], vars[2], vars[3]);
m.new(x.eq(1));
m.new(y.eq(1));
if let Some(or_constraint) = or_all(vec![z.eq(1), w.eq(1)]) {
m.new(or_constraint);
}
m.new(z.eq(0));
m.new(w.eq(1));
if let Ok(sol) = m.solve() {
let vx = if let Val::ValI(v) = sol[x] { v } else { 0 };
let vy = if let Val::ValI(v) = sol[y] { v } else { 0 };
let vz = if let Val::ValI(v) = sol[z] { v } else { 0 };
let vw = if let Val::ValI(v) = sol[w] { v } else { 0 };
println!(" ✅ Result: x={}, y={}, z={}, w={}", vx, vy, vz, vw);
}
}
println!("\n📋 Test 7: Real-world example - Server startup conditions");
{
let mut m = Model::default();
let power_stable = m.bool();
let network_ready = m.bool();
let disk_healthy = m.bool();
let memory_ok = m.bool();
let cpu_cool = m.bool();
let emergency_override = m.bool();
let manual_start = m.bool();
if let Some(or_constraint) = or_all(vec![emergency_override.eq(1), manual_start.eq(1)]) {
m.new(or_constraint);
}
m.new(power_stable.eq(1));
m.new(network_ready.eq(1));
m.new(memory_ok.eq(1));
m.new(cpu_cool.eq(1));
m.new(power_stable.eq(1));
m.new(network_ready.eq(1));
m.new(disk_healthy.eq(0)); m.new(memory_ok.eq(1));
m.new(cpu_cool.eq(1));
m.new(emergency_override.eq(0));
m.new(manual_start.eq(1));
if let Ok(sol) = m.solve() {
let vpower = if let Val::ValI(v) = sol[power_stable] { v } else { 0 };
let vnet = if let Val::ValI(v) = sol[network_ready] { v } else { 0 };
let vdisk = if let Val::ValI(v) = sol[disk_healthy] { v } else { 0 };
let vmem = if let Val::ValI(v) = sol[memory_ok] { v } else { 0 };
let vcpu = if let Val::ValI(v) = sol[cpu_cool] { v } else { 0 };
let vemerg = if let Val::ValI(v) = sol[emergency_override] { v } else { 0 };
let vmanual = if let Val::ValI(v) = sol[manual_start] { v } else { 0 };
println!(" ✅ Server startup scenario:");
println!(" Power: {}, Network: {}, Disk: {}, Memory: {}, CPU: {}",
vpower, vnet, vdisk, vmem, vcpu);
println!(" Emergency Override: {}, Manual Start: {}",
vemerg, vmanual);
println!(" Result: Array AND/OR constraints satisfied!");
}
}
println!("\n🎉 All boolean array operations working perfectly!");
}