#可微 #表达式 #自动微分 #自动梯度 #泛型 #表达式模板

nightly no-std dxpr

编译时、无依赖、no_std Rust 中的可微表达式模板

5 个版本

0.2.3 2023年3月30日
0.2.2 2023年3月29日
0.2.1 2023年3月29日
0.2.0 2023年3月28日
0.1.0 2023年3月28日

#757 in 数学

Download history 17/week @ 2024-03-28 17/week @ 2024-04-04

每月 67 次下载

Zlib 许可证

43KB
722

dxpr

编译时、无依赖、no_std Rust 中的可微表达式模板。

示例

基础

use dxpr::prelude::*;
let x = 4; // Any type works; no special wrappers
let expr = -var(&x); // Unevaluated expression
assert_eq!(-4, expr.eval()); // Evaluated (expr moved)
let dvdx = (-var(&x)).grad(&x); // Automatic differentiation!
// ...into another differentiable expression!
assert_eq!(-1, (&dvdx).eval()); // dvdx NOT moved yet: reusable
assert_eq!(0, dvdx.grad(&x).grad(&x).grad(&x).grad(&x).eval());

想要为自己的类型和函数实现可微表达式吗?

#![feature(const_trait_impl)]
use dxpr::{prelude::*, eval::Eval};
struct Teleport { arg: u8 }; // Unevaluated Teleport operation
const fn tp(x: u8) -> Teleport { Teleport { arg: x } } // Not yet!
dxpr::implement_eval!( // Now define what the operation does:
  Teleport >-> u16: // Op type >-> output type
  |self| (self.arg as u16) << 8); // Function definition
let _ = tp(1); // Unevaluated expression
assert_eq!(256, tp(1).eval()); // Done!

编译时

#![feature(const_trait_impl)]
use dxpr::{expr::Expr, ops::Neg, prelude::*};
const X: i32 = 4;
const A: Expr<&i32> = var(&X);
const EXPRESSION: Expr<Neg<Neg<Neg<&i32>>>> = ---A;
const VALUE: i32 = EXPRESSION.eval();
assert_eq!(-4, VALUE);
// Rust currently can't compare pointers to constants at compile time, so no compile-time autodiff at the moment
// Plans in the works to fix this with the ability to manually specify a "variable ID."
// Either way, your `build.rs` could easily evaluate an arbitrary expression and write it, unevaluated, to a file.

待办事项

  • 找出为什么 Rust 不喜欢宏 +:path 参数中的使用
  • 与内置常量的互操作性
  • IndexRangeBound 操作符(即 a[b]a..b

无运行时依赖

特性