1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//! Symbolic differentiation and integration over the `numbers/cas` expression
//! tree: the `diff` and `integrate-sym` functions plus an extensible registry
//! of per-operator differentiation rules.
//!
//! # Examples
//!
//! Teach the differentiator a new operator through the extensible rule
//! registry, then look the rule up. Rules map an operator's arguments and the
//! variable of differentiation to a derivative
//! [`CasExpr`](sim_lib_numbers_cas::CasExpr):
//!
//! ```
//! use sim_kernel::Symbol;
//! use sim_lib_numbers_cas::CasExpr;
//! use sim_lib_numbers_cas_diff::{global_diff_registry, register_diff_rule};
//!
//! // d/dx ln(x) = 1/x, expressed structurally as (/ 1 x).
//! register_diff_rule(
//! Symbol::new("ln-doctest"),
//! Box::new(|args: &[CasExpr], _var: &Symbol| {
//! let [arg] = args else { return None };
//! Some(CasExpr::Op(
//! Symbol::qualified("math", "div"),
//! vec![CasExpr::Var(Symbol::new("1")), arg.clone()],
//! ))
//! }),
//! );
//!
//! let registry = global_diff_registry().read().unwrap();
//! let derivative = registry.apply(
//! &Symbol::new("ln-doctest"),
//! &[CasExpr::Var(Symbol::new("x"))],
//! &Symbol::new("x"),
//! );
//! assert!(matches!(derivative, Some(CasExpr::Op(_, _))));
//! ```
pub use ;