use tokitai_operator::backend::TensorStore;
use tokitai_operator::backend::hardware::DeviceKind;
use tokitai_operator::domain::Domain;
use tokitai_operator::facade::{AuditExportFormat, Tokitai};
use tokitai_operator::object::Shape;
use tokitai_operator::object::Tensor;
use tokitai_operator::object::sheaf::{Cover, FiniteSite, Inclusion, OpenId, SectionTable};
fn main() -> tokitai_operator::Result<()> {
let cpu = Tokitai::cpu_only();
let q5 = cpu.padic_domain(5, 3)?;
let padic_plan = cpu.plan_padic_sum_products(&q5, 0, 1, 2)?;
let mut store = TensorStore::new();
store.insert(
0,
Tensor::dense_cpu(
q5.id(),
Shape::from(vec![4]),
vec![q5.element(1), q5.element(25), q5.element(5), q5.element(2)],
),
);
store.insert(
1,
Tensor::dense_cpu(
q5.id(),
Shape::from(vec![4]),
vec![q5.element(2), q5.element(5), q5.element(25), q5.element(3)],
),
);
let report = cpu.execute_padic_sum_products(&padic_plan, &mut store)?;
println!(
"padic selected={:?} skipped={} evaluated={}",
padic_plan.selected_target.kind, report.skipped_terms, report.evaluated_terms
);
let prefer_gpu = Tokitai::prefer_gpu_with_cpu_fallback();
let fallback_plan = prefer_gpu.plan_padic_sum_products(&q5, 0, 1, 2)?;
println!(
"prefer-gpu requested={:?} selected={:?} fallback={}",
fallback_plan.requested_target.kind,
fallback_plan.selected_target.kind,
fallback_plan.fallback_reason.as_deref().unwrap_or("none")
);
let strict_gpu = Tokitai::strict_gpu();
let strict_error = strict_gpu
.plan_padic_sum_products(&q5, 0, 1, 2)
.unwrap_err();
println!("strict-gpu rejected={strict_error}");
let cover = Cover::new("U", ["A", "B"]);
let sheaf_plan = cpu.plan_sheaf_glue_check(&cover)?;
let site = FiniteSite::new(
vec![open("U"), open("A"), open("B"), open("A_cap_B")],
vec![
Inclusion::new("A", "U"),
Inclusion::new("B", "U"),
Inclusion::new("A_cap_B", "A"),
Inclusion::new("A_cap_B", "B"),
Inclusion::new("A_cap_B", "U"),
],
)
.with_intersection(open("A"), open("B"), open("A_cap_B"));
let mut sections = SectionTable::new();
sections.insert(open("A"), 7);
sections.insert(open("B"), 7);
sections.insert(open("A_cap_B"), 7);
let glued = cpu.verify_sheaf_glue(&sheaf_plan, &site, &cover, §ions, 42)?;
println!(
"sheaf selected={:?} glued_open={} glued_value={}",
sheaf_plan.selected_target.kind, glued.open.0, glued.value
);
let audit_json = cpu.export_audit(&padic_plan.plan, AuditExportFormat::Json);
println!(
"audit_json_contains_math_bound={}",
audit_json.contains("math_bound")
);
assert_eq!(fallback_plan.selected_target.kind, DeviceKind::Cpu);
Ok(())
}
fn open(id: &str) -> OpenId {
OpenId(id.to_string())
}