Skip to main content

13_resource_limits/
13_resource_limits.rs

1//! Demonstrating `MattenLimits` and boundary-safe constructors.
2//!
3//! Run: cargo run --example 13_resource_limits
4//!
5//! `matten` uses `MattenLimits` as the single source of truth for allocation
6//! budgets. The `try_zeros`, `try_ones`, and `try_full` constructors return
7//! `Result` instead of panicking, enabling safe use at data boundaries.
8
9use matten::{MattenError, MattenLimits, Tensor};
10
11fn main() {
12    // ── Default limits ────────────────────────────────────────────────────
13    let limits = MattenLimits::default();
14    println!("Default max_dimensions: {}", limits.max_dimensions);
15    println!(
16        "Default max_elements:   {} (~{} MiB f64)",
17        limits.max_elements,
18        limits.max_elements * 8 / 1_048_576
19    );
20
21    // ── Boundary-safe constructors ────────────────────────────────────────
22    let t = Tensor::try_zeros(&[100, 100]).unwrap();
23    assert_eq!(t.shape(), &[100, 100]);
24    assert_eq!(t.len(), 10_000);
25    println!("try_zeros([100, 100]): OK, {} elements", t.len());
26
27    let t = Tensor::try_ones(&[50, 20]).unwrap();
28    assert_eq!(t.as_slice().iter().sum::<f64>(), 1000.0);
29    println!("try_ones([50, 20]):    OK, sum = {}", t.sum());
30
31    let t = Tensor::try_full(&[10, 10], -1.0).unwrap();
32    assert_eq!(t.as_slice()[0], -1.0);
33    println!("try_full([10, 10], -1.0): OK");
34
35    // ── Custom limits ─────────────────────────────────────────────────────
36    let tight = MattenLimits {
37        max_elements: 10,
38        ..MattenLimits::default()
39    };
40    let err = Tensor::try_zeros_with_limits(&[100], &tight).unwrap_err();
41    assert!(matches!(err, MattenError::Allocation { .. }));
42    println!("Custom limit (max=10): correctly rejected [100]");
43
44    // ── Panicking variants respect limits too ─────────────────────────────
45    // These delegate to try_zeros/try_ones/try_full internally:
46    let _t = Tensor::zeros(&[10, 10]); // fine — 100 elements
47    println!("zeros([10, 10]):        OK (panicking form, within limit)");
48
49    println!("done.");
50}