lumen-core 0.6.1

A tiny ML framework
Documentation
use std::cell::Cell;

#[macro_export]
macro_rules! no_grad {
    () => {
        let _guard = lumen_core::NoGradGuard::new();
    };
}

thread_local! {
    static GRAD_ENABLED: Cell<bool> = Cell::new(true);
}

pub fn set_grad_enabled(enabled: bool) {
    GRAD_ENABLED.with(|c| c.set(enabled));
}

pub fn is_grad_enabled() -> bool {
    GRAD_ENABLED.with(|c| c.get())
}

pub struct NoGradGuard {
    prev: bool,
}

impl NoGradGuard {
    pub fn new() -> Self {
        let prev = is_grad_enabled();
        set_grad_enabled(false);
        Self { prev }
    }
}

impl Drop for NoGradGuard {
    fn drop(&mut self) {
        set_grad_enabled(self.prev);
    }
}