extern crate proc_macro as pm;
pub(crate) mod ast;
pub(crate) mod cmp;
pub(crate) mod diff;
pub(crate) mod grad;
pub(crate) mod ops;
pub(crate) mod gradient;
use ast::gradient::GradientAst;
use ast::partials::PartialAst;
use pm::TokenStream;
use syn::{parse_macro_input, Expr};
#[proc_macro_attribute]
pub fn partial(_attr: TokenStream, item: TokenStream) -> TokenStream {
let ast = parse_macro_input!(item as GradientAst);
let result = grad::gradient(&ast);
TokenStream::from(result)
}
#[proc_macro]
pub fn autodiff(input: TokenStream) -> TokenStream {
let expr = parse_macro_input!(input as PartialAst);
let result = diff::generate_autodiff(&expr);
TokenStream::from(result)
}
#[proc_macro]
pub fn gradient(input: TokenStream) -> TokenStream {
let expr = parse_macro_input!(input as Expr);
let result = gradient::compute_grad(&expr);
TokenStream::from(result)
}
pub(crate) mod kw {
syn::custom_keyword!(eval);
syn::custom_keyword!(grad);
syn::custom_keyword!(cos);
syn::custom_keyword!(e);
syn::custom_keyword!(ln);
syn::custom_keyword!(sin);
syn::custom_keyword!(tan);
}