use tensorlogic_ir::TLExpr;
use super::diff_core::diff_expr;
use super::helpers::simplify_derivative;
use super::types::{DiffConfig, DiffContext, DiffError, DiffResult};
pub fn differentiate(
expr: &TLExpr,
var: &str,
config: &DiffConfig,
) -> Result<DiffResult, DiffError> {
let mut ctx = DiffContext {
var: var.to_string(),
config,
depth: 0,
unsupported_nodes: Vec::new(),
};
let derivative = diff_expr(expr, &mut ctx)?;
let (final_expr, simplified) = if config.simplify_result {
(simplify_derivative(derivative), true)
} else {
(derivative, false)
};
Ok(DiffResult {
derivative: final_expr,
simplified,
unsupported_nodes: ctx.unsupported_nodes,
})
}
pub fn jacobian(
expr: &TLExpr,
vars: &[&str],
config: &DiffConfig,
) -> Result<Vec<(String, DiffResult)>, DiffError> {
let mut results = Vec::with_capacity(vars.len());
for &v in vars {
let result = differentiate(expr, v, config)?;
results.push((v.to_string(), result));
}
Ok(results)
}