use mlx_rs::transforms::grad;
use mlx_rs::{Array, Dtype};
fn scalar_basics() {
let x: Array = 1.0.into();
let dtype = x.dtype();
assert_eq!(dtype, Dtype::Float32);
let s = x.item_exact::<f32>();
assert_eq!(s, 1.0);
let size = x.size();
assert_eq!(size, 1);
let ndim = x.ndim();
assert_eq!(ndim, 0);
let shape = x.shape();
assert!(shape.is_empty());
}
#[allow(unused_variables)]
fn array_basics() {
let x: Array = Array::from_slice(&[1.0, 2.0, 3.0, 4.0], &[2, 2]);
let y = Array::ones::<f32>(&[2, 2]).unwrap();
let z = x.add(&y);
let mut z = &x + &y;
assert_eq!(z.dtype(), Dtype::Float32);
assert_eq!(z.shape(), vec![2, 2]);
z.eval().unwrap();
z.eval().unwrap();
z = Array::ones::<f32>(&[1]).unwrap();
z.item_exact::<f32>();
z = Array::ones::<f32>(&[2, 2]).unwrap();
println!("{z}"); }
fn automatic_differentiation() {
use mlx_rs::error::Result;
fn f(x: &Array) -> Result<Array> {
x.square()
}
fn calculate_grad(func: impl Fn(&Array) -> Result<Array>, arg: &Array) -> Result<Array> {
grad(&func)(arg)
}
let x = Array::from(1.5);
let dfdx = calculate_grad(f, &x).unwrap();
assert_eq!(dfdx.item_exact::<f32>(), 2.0 * 1.5);
let dfdx2 = calculate_grad(|args| calculate_grad(f, args), &x).unwrap();
assert_eq!(dfdx2.item_exact::<f32>(), 2.0);
}
fn main() {
scalar_basics();
array_basics();
automatic_differentiation();
}