use crate::op::binary;
use crate::tape::sealed::ThisThreadTape;
use crate::IndexT;
use crate::ad::AD;
use crate::op::info::OpInfo;
use crate::op::info::panic_one;
use crate::op::id::{
SUB_CV_OP,
SUB_VC_OP,
SUB_VV_OP,
};
binary::binary_rust_src!(Sub, -);
binary::eval_binary_forward_0!(Sub, -);
pub fn set_op_info<V>( op_info_vec : &mut Vec< OpInfo<V> > )
where
for<'a> &'a V : std::ops::Sub<&'a AD<V>, Output = AD<V> > ,
for<'a> &'a V : std::ops::Sub<&'a V, Output = V> ,
V : Clone + ThisThreadTape ,
{
op_info_vec[SUB_CV_OP as usize] = OpInfo{
name : "sub_cv",
forward_0_value : sub_cv_forward_0::<V, V>,
forward_0_ad : sub_cv_forward_0::<V, AD<V> >,
forward_1_value : panic_one::<V, V>,
forward_1_ad : panic_one::<V, AD<V> >,
reverse_1_value : panic_one::<V, V>,
reverse_1_ad : panic_one::<V, AD<V> >,
arg_var_index : binary::binary_cv_arg_var_index,
rust_src : sub_cv_rust_src,
};
op_info_vec[SUB_VC_OP as usize] = OpInfo{
name : "sub_vc",
forward_0_value : sub_vc_forward_0::<V, V>,
forward_0_ad : sub_vc_forward_0::<V, AD<V> >,
forward_1_value : panic_one::<V, V>,
forward_1_ad : panic_one::<V, AD<V> >,
reverse_1_value : panic_one::<V, V>,
reverse_1_ad : panic_one::<V, AD<V> >,
arg_var_index : binary::binary_vc_arg_var_index,
rust_src : sub_vc_rust_src,
};
op_info_vec[SUB_VV_OP as usize] = OpInfo{
name : "sub_vv",
forward_0_value : sub_vv_forward_0::<V, V>,
forward_0_ad : sub_vv_forward_0::<V, AD<V> >,
forward_1_value : panic_one::<V, V>,
forward_1_ad : panic_one::<V, AD<V> >,
reverse_1_value : panic_one::<V, V>,
reverse_1_ad : panic_one::<V, AD<V> >,
arg_var_index : binary::binary_vv_arg_var_index,
rust_src : sub_vv_rust_src,
};
}