use candela::skeleton::SkeletonSlot;
use candela::{Layout, Tensor};
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
let slot = SkeletonSlot::new(Layout::new(&[4]));
let skeleton = (&slot * 2.0 + 1.0).into_skeleton(std::slice::from_ref(&slot))?;
let a = skeleton.run(&[&Tensor::from_slice(&[0.0, 1.0, 2.0, 3.0], &[4])])?;
let b = skeleton.run(&[&Tensor::from_scalar(5.0, &[4])])?;
println!("a: {a}");
println!("b: {b}");
assert!(skeleton.run(&[&Tensor::from_scalar(1.0, &[8])]).is_err());
let x = SkeletonSlot::new(Layout::new(&[4]));
let y = x.deep_clone();
let sum = (&x + &y).into_skeleton(&[x, y])?;
let baked = sum.compose(&[
&Tensor::from_scalar(1.0, &[4]),
&Tensor::from_scalar(10.0, &[4]),
])?;
let result = (baked * 2.0).materialize();
println!("composed: {result}");
Ok(())
}