Crates.io | aegir_compile |
lib.rs | aegir_compile |
version | 0.2.0 |
source | src |
created_at | 2022-09-19 22:12:55.627382 |
updated_at | 2022-12-29 19:21:02.056395 |
description | DSL for aegir |
homepage | |
repository | |
max_upload_size | |
id | 669389 |
size | 13,132 |
Strongly-typed, compile-time autodifferentiation in Rust.
aegir
is an experimental autodifferentiation framework designed to leverage
the powerful type-system in Rust and avoid runtime as much as humanly
possible. The approach taken resembles that of expression templates, as
commonly used in linear-algebra libraries written in C++.
[dependencies]
aegir = "1.0"
#[macro_use]
extern crate aegir;
extern crate rand;
use aegir::{Differentiable, Function, Identifier, Node, ids::{X, Y, W}};
db!(Database { x: X, y: Y, w: W });
fn main() {
let mut weights = [0.0, 0.0];
let x = X.into_var();
let y = Y.into_var();
let w = W.into_var();
let model = x.dot(w);
// Using standard method calls...
let sse = model.sub(y).squared();
let adj = sse.adjoint(W);
// ...or using aegir! macro
let sse = aegir!((model - y) ^ 2);
let adj = sse.adjoint(W);
for _ in 0..100000 {
let [x1, x2] = [rand::random::<f64>(), rand::random::<f64>()];
let g = adj.evaluate(Database {
// Independent variables:
x: [x1, x2],
// Dependent variable:
y: x1 * 2.0 - x2 * 4.0,
// Model weights:
w: &weights,
}).unwrap();
weights[0] -= 0.01 * g[0][0];
weights[1] -= 0.01 * g[0][1];
}
println!("{:?}", weights.to_vec());
}