use crate::passive::Passive;
use std::fmt;
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
#[derive(Clone)]
pub struct Jet1<T: Passive> {
value: T,
derivative: T,
}
impl<T: Passive> Jet1<T> {
pub fn new(value: T, derivative: T) -> Self {
Jet1 { value, derivative }
}
pub fn constant(value: T) -> Self {
Jet1 {
value,
derivative: T::zero(),
}
}
#[inline]
pub fn value(&self) -> T {
self.value
}
#[inline]
pub fn set_value(&mut self, v: T) {
self.value = v;
}
#[inline]
pub fn derivative(&self) -> T {
self.derivative
}
#[inline]
pub fn set_derivative(&mut self, d: T) {
self.derivative = d;
}
}
impl<T: Passive> From<T> for Jet1<T> {
fn from(value: T) -> Self {
Jet1::constant(value)
}
}
impl From<i32> for Jet1<f64> {
fn from(value: i32) -> Self {
Jet1::constant(value as f64)
}
}
impl From<i32> for Jet1<f32> {
fn from(value: i32) -> Self {
Jet1::constant(value as f32)
}
}
impl<T: Passive> Add for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn add(self, rhs: Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value + rhs.value,
derivative: self.derivative + rhs.derivative,
}
}
}
impl<T: Passive> Add for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn add(self, rhs: &Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value + rhs.value,
derivative: self.derivative + rhs.derivative,
}
}
}
impl<T: Passive> Add<&Jet1<T>> for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn add(self, rhs: &Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value + rhs.value,
derivative: self.derivative + rhs.derivative,
}
}
}
impl<T: Passive> Add<Jet1<T>> for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn add(self, rhs: Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value + rhs.value,
derivative: self.derivative + rhs.derivative,
}
}
}
impl<T: Passive> Add<T> for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn add(self, rhs: T) -> Jet1<T> {
Jet1 {
value: self.value + rhs,
derivative: self.derivative,
}
}
}
impl<T: Passive> Add<T> for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn add(self, rhs: T) -> Jet1<T> {
Jet1 {
value: self.value + rhs,
derivative: self.derivative,
}
}
}
impl Add<Jet1<f64>> for f64 {
type Output = Jet1<f64>;
#[inline]
fn add(self, rhs: Jet1<f64>) -> Jet1<f64> {
Jet1 {
value: self + rhs.value,
derivative: rhs.derivative,
}
}
}
impl Add<&Jet1<f64>> for f64 {
type Output = Jet1<f64>;
#[inline]
fn add(self, rhs: &Jet1<f64>) -> Jet1<f64> {
Jet1 {
value: self + rhs.value,
derivative: rhs.derivative,
}
}
}
impl Add<Jet1<f32>> for f32 {
type Output = Jet1<f32>;
#[inline]
fn add(self, rhs: Jet1<f32>) -> Jet1<f32> {
Jet1 {
value: self + rhs.value,
derivative: rhs.derivative,
}
}
}
impl Add<&Jet1<f32>> for f32 {
type Output = Jet1<f32>;
#[inline]
fn add(self, rhs: &Jet1<f32>) -> Jet1<f32> {
Jet1 {
value: self + rhs.value,
derivative: rhs.derivative,
}
}
}
impl<T: Passive> Sub for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn sub(self, rhs: Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value - rhs.value,
derivative: self.derivative - rhs.derivative,
}
}
}
impl<T: Passive> Sub for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn sub(self, rhs: &Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value - rhs.value,
derivative: self.derivative - rhs.derivative,
}
}
}
impl<T: Passive> Sub<&Jet1<T>> for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn sub(self, rhs: &Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value - rhs.value,
derivative: self.derivative - rhs.derivative,
}
}
}
impl<T: Passive> Sub<Jet1<T>> for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn sub(self, rhs: Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value - rhs.value,
derivative: self.derivative - rhs.derivative,
}
}
}
impl<T: Passive> Sub<T> for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn sub(self, rhs: T) -> Jet1<T> {
Jet1 {
value: self.value - rhs,
derivative: self.derivative,
}
}
}
impl<T: Passive> Sub<T> for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn sub(self, rhs: T) -> Jet1<T> {
Jet1 {
value: self.value - rhs,
derivative: self.derivative,
}
}
}
impl Sub<Jet1<f64>> for f64 {
type Output = Jet1<f64>;
#[inline]
fn sub(self, rhs: Jet1<f64>) -> Jet1<f64> {
Jet1 {
value: self - rhs.value,
derivative: -rhs.derivative,
}
}
}
impl Sub<&Jet1<f64>> for f64 {
type Output = Jet1<f64>;
#[inline]
fn sub(self, rhs: &Jet1<f64>) -> Jet1<f64> {
Jet1 {
value: self - rhs.value,
derivative: -rhs.derivative,
}
}
}
impl Sub<Jet1<f32>> for f32 {
type Output = Jet1<f32>;
#[inline]
fn sub(self, rhs: Jet1<f32>) -> Jet1<f32> {
Jet1 {
value: self - rhs.value,
derivative: -rhs.derivative,
}
}
}
impl Sub<&Jet1<f32>> for f32 {
type Output = Jet1<f32>;
#[inline]
fn sub(self, rhs: &Jet1<f32>) -> Jet1<f32> {
Jet1 {
value: self - rhs.value,
derivative: -rhs.derivative,
}
}
}
impl<T: Passive> Mul for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn mul(self, rhs: Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value * rhs.value,
derivative: self.derivative * rhs.value + self.value * rhs.derivative,
}
}
}
impl<T: Passive> Mul for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn mul(self, rhs: &Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value * rhs.value,
derivative: self.derivative * rhs.value + self.value * rhs.derivative,
}
}
}
impl<T: Passive> Mul<&Jet1<T>> for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn mul(self, rhs: &Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value * rhs.value,
derivative: self.derivative * rhs.value + self.value * rhs.derivative,
}
}
}
impl<T: Passive> Mul<Jet1<T>> for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn mul(self, rhs: Jet1<T>) -> Jet1<T> {
Jet1 {
value: self.value * rhs.value,
derivative: self.derivative * rhs.value + self.value * rhs.derivative,
}
}
}
impl<T: Passive> Mul<T> for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn mul(self, rhs: T) -> Jet1<T> {
Jet1 {
value: self.value * rhs,
derivative: self.derivative * rhs,
}
}
}
impl<T: Passive> Mul<T> for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn mul(self, rhs: T) -> Jet1<T> {
Jet1 {
value: self.value * rhs,
derivative: self.derivative * rhs,
}
}
}
impl Mul<Jet1<f64>> for f64 {
type Output = Jet1<f64>;
#[inline]
fn mul(self, rhs: Jet1<f64>) -> Jet1<f64> {
Jet1 {
value: self * rhs.value,
derivative: self * rhs.derivative,
}
}
}
impl Mul<&Jet1<f64>> for f64 {
type Output = Jet1<f64>;
#[inline]
fn mul(self, rhs: &Jet1<f64>) -> Jet1<f64> {
Jet1 {
value: self * rhs.value,
derivative: self * rhs.derivative,
}
}
}
impl Mul<Jet1<f32>> for f32 {
type Output = Jet1<f32>;
#[inline]
fn mul(self, rhs: Jet1<f32>) -> Jet1<f32> {
Jet1 {
value: self * rhs.value,
derivative: self * rhs.derivative,
}
}
}
impl Mul<&Jet1<f32>> for f32 {
type Output = Jet1<f32>;
#[inline]
fn mul(self, rhs: &Jet1<f32>) -> Jet1<f32> {
Jet1 {
value: self * rhs.value,
derivative: self * rhs.derivative,
}
}
}
impl<T: Passive> Div for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn div(self, rhs: Jet1<T>) -> Jet1<T> {
let inv_b = T::one() / rhs.value;
Jet1 {
value: self.value * inv_b,
derivative: (self.derivative * rhs.value - self.value * rhs.derivative) * inv_b * inv_b,
}
}
}
impl<T: Passive> Div for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn div(self, rhs: &Jet1<T>) -> Jet1<T> {
let inv_b = T::one() / rhs.value;
Jet1 {
value: self.value * inv_b,
derivative: (self.derivative * rhs.value - self.value * rhs.derivative) * inv_b * inv_b,
}
}
}
impl<T: Passive> Div<&Jet1<T>> for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn div(self, rhs: &Jet1<T>) -> Jet1<T> {
let inv_b = T::one() / rhs.value;
Jet1 {
value: self.value * inv_b,
derivative: (self.derivative * rhs.value - self.value * rhs.derivative) * inv_b * inv_b,
}
}
}
impl<T: Passive> Div<Jet1<T>> for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn div(self, rhs: Jet1<T>) -> Jet1<T> {
let inv_b = T::one() / rhs.value;
Jet1 {
value: self.value * inv_b,
derivative: (self.derivative * rhs.value - self.value * rhs.derivative) * inv_b * inv_b,
}
}
}
impl<T: Passive> Div<T> for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn div(self, rhs: T) -> Jet1<T> {
let inv = T::one() / rhs;
Jet1 {
value: self.value * inv,
derivative: self.derivative * inv,
}
}
}
impl<T: Passive> Div<T> for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn div(self, rhs: T) -> Jet1<T> {
let inv = T::one() / rhs;
Jet1 {
value: self.value * inv,
derivative: self.derivative * inv,
}
}
}
impl Div<Jet1<f64>> for f64 {
type Output = Jet1<f64>;
#[inline]
fn div(self, rhs: Jet1<f64>) -> Jet1<f64> {
let inv = 1.0 / rhs.value;
Jet1 {
value: self * inv,
derivative: -self * rhs.derivative * inv * inv,
}
}
}
impl Div<&Jet1<f64>> for f64 {
type Output = Jet1<f64>;
#[inline]
fn div(self, rhs: &Jet1<f64>) -> Jet1<f64> {
let inv = 1.0 / rhs.value;
Jet1 {
value: self * inv,
derivative: -self * rhs.derivative * inv * inv,
}
}
}
impl Div<Jet1<f32>> for f32 {
type Output = Jet1<f32>;
#[inline]
fn div(self, rhs: Jet1<f32>) -> Jet1<f32> {
let inv = 1.0 / rhs.value;
Jet1 {
value: self * inv,
derivative: -self * rhs.derivative * inv * inv,
}
}
}
impl Div<&Jet1<f32>> for f32 {
type Output = Jet1<f32>;
#[inline]
fn div(self, rhs: &Jet1<f32>) -> Jet1<f32> {
let inv = 1.0 / rhs.value;
Jet1 {
value: self * inv,
derivative: -self * rhs.derivative * inv * inv,
}
}
}
impl<T: Passive> Neg for Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn neg(self) -> Jet1<T> {
Jet1 {
value: -self.value,
derivative: -self.derivative,
}
}
}
impl<T: Passive> Neg for &Jet1<T> {
type Output = Jet1<T>;
#[inline]
fn neg(self) -> Jet1<T> {
Jet1 {
value: -self.value,
derivative: -self.derivative,
}
}
}
impl<T: Passive> AddAssign for Jet1<T> {
fn add_assign(&mut self, rhs: Jet1<T>) {
self.value = self.value + rhs.value;
self.derivative = self.derivative + rhs.derivative;
}
}
impl<T: Passive> AddAssign<&Jet1<T>> for Jet1<T> {
fn add_assign(&mut self, rhs: &Jet1<T>) {
self.value = self.value + rhs.value;
self.derivative = self.derivative + rhs.derivative;
}
}
impl<T: Passive> AddAssign<T> for Jet1<T> {
fn add_assign(&mut self, rhs: T) {
self.value = self.value + rhs;
}
}
impl<T: Passive> SubAssign for Jet1<T> {
fn sub_assign(&mut self, rhs: Jet1<T>) {
self.value = self.value - rhs.value;
self.derivative = self.derivative - rhs.derivative;
}
}
impl<T: Passive> SubAssign<&Jet1<T>> for Jet1<T> {
fn sub_assign(&mut self, rhs: &Jet1<T>) {
self.value = self.value - rhs.value;
self.derivative = self.derivative - rhs.derivative;
}
}
impl<T: Passive> SubAssign<T> for Jet1<T> {
fn sub_assign(&mut self, rhs: T) {
self.value = self.value - rhs;
}
}
impl<T: Passive> MulAssign for Jet1<T> {
fn mul_assign(&mut self, rhs: Jet1<T>) {
let new_deriv = self.derivative * rhs.value + self.value * rhs.derivative;
self.value = self.value * rhs.value;
self.derivative = new_deriv;
}
}
impl<T: Passive> MulAssign<&Jet1<T>> for Jet1<T> {
fn mul_assign(&mut self, rhs: &Jet1<T>) {
let new_deriv = self.derivative * rhs.value + self.value * rhs.derivative;
self.value = self.value * rhs.value;
self.derivative = new_deriv;
}
}
impl<T: Passive> MulAssign<T> for Jet1<T> {
fn mul_assign(&mut self, rhs: T) {
self.value = self.value * rhs;
self.derivative = self.derivative * rhs;
}
}
impl<T: Passive> DivAssign for Jet1<T> {
fn div_assign(&mut self, rhs: Jet1<T>) {
let inv_b = T::one() / rhs.value;
self.derivative =
(self.derivative * rhs.value - self.value * rhs.derivative) * inv_b * inv_b;
self.value *= inv_b;
}
}
impl<T: Passive> DivAssign<&Jet1<T>> for Jet1<T> {
fn div_assign(&mut self, rhs: &Jet1<T>) {
let inv_b = T::one() / rhs.value;
self.derivative =
(self.derivative * rhs.value - self.value * rhs.derivative) * inv_b * inv_b;
self.value *= inv_b;
}
}
impl<T: Passive> DivAssign<T> for Jet1<T> {
fn div_assign(&mut self, rhs: T) {
let inv = T::one() / rhs;
self.value *= inv;
self.derivative *= inv;
}
}
impl<T: Passive> PartialEq for Jet1<T> {
fn eq(&self, other: &Self) -> bool {
self.value == other.value
}
}
impl<T: Passive> PartialEq<T> for Jet1<T> {
fn eq(&self, other: &T) -> bool {
self.value == *other
}
}
impl<T: Passive> PartialOrd for Jet1<T> {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
self.value.partial_cmp(&other.value)
}
}
impl<T: Passive> PartialOrd<T> for Jet1<T> {
fn partial_cmp(&self, other: &T) -> Option<std::cmp::Ordering> {
self.value.partial_cmp(other)
}
}
impl<T: Passive> fmt::Display for Jet1<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.value)
}
}
impl<T: Passive> fmt::Debug for Jet1<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Jet1({}, deriv={})", self.value, self.derivative)
}
}
impl<T: Passive> Default for Jet1<T> {
fn default() -> Self {
Jet1::constant(T::zero())
}
}
use crate::math;
#[derive(Clone)]
pub struct NamedJet1<T: Passive> {
pub(crate) inner: Jet1<T>,
#[cfg(debug_assertions)]
pub(crate) gen_id: u64,
}
impl<T: Passive> NamedJet1<T> {
#[inline]
pub(crate) fn __from_inner(inner: Jet1<T>) -> Self {
Self {
inner,
#[cfg(debug_assertions)]
gen_id: crate::forward_tape::current_gen(),
}
}
#[inline]
pub fn value(&self) -> T {
self.inner.value()
}
#[inline]
pub fn derivative(&self, _name: &str) -> T {
self.inner.derivative()
}
#[inline]
pub fn inner(&self) -> &Jet1<T> {
&self.inner
}
#[inline]
pub fn exp(&self) -> Self {
Self {
inner: math::fwd::exp(&self.inner),
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
#[inline]
pub fn ln(&self) -> Self {
Self {
inner: math::fwd::ln(&self.inner),
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
#[inline]
pub fn sqrt(&self) -> Self {
Self {
inner: math::fwd::sqrt(&self.inner),
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
#[inline]
pub fn sin(&self) -> Self {
Self {
inner: math::fwd::sin(&self.inner),
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
#[inline]
pub fn cos(&self) -> Self {
Self {
inner: math::fwd::cos(&self.inner),
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
#[inline]
pub fn tan(&self) -> Self {
Self {
inner: math::fwd::tan(&self.inner),
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
#[inline]
pub fn norm_cdf(&self) -> Self {
Self {
inner: math::fwd::norm_cdf(&self.inner),
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
#[inline]
pub fn inv_norm_cdf(&self) -> Self {
Self {
inner: math::fwd::inv_norm_cdf(&self.inner),
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
}
impl<T: Passive> fmt::Debug for NamedJet1<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("NamedJet1")
.field("value", &self.inner.value())
.field("derivative", &self.inner.derivative())
.finish()
}
}
impl<T: Passive> fmt::Display for NamedJet1<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "NamedJet1({})", self.inner.value())
}
}
macro_rules! __named_freal_binop {
($trait:ident, $method:ident, $op:tt) => {
impl<T: Passive> ::core::ops::$trait<NamedJet1<T>> for NamedJet1<T> {
type Output = NamedJet1<T>;
#[inline]
fn $method(self, rhs: NamedJet1<T>) -> NamedJet1<T> {
#[cfg(debug_assertions)]
crate::forward_tape::check_gen(self.gen_id, rhs.gen_id);
NamedJet1 {
inner: self.inner $op rhs.inner,
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
}
impl<T: Passive> ::core::ops::$trait<&NamedJet1<T>> for &NamedJet1<T> {
type Output = NamedJet1<T>;
#[inline]
fn $method(self, rhs: &NamedJet1<T>) -> NamedJet1<T> {
#[cfg(debug_assertions)]
crate::forward_tape::check_gen(self.gen_id, rhs.gen_id);
NamedJet1 {
inner: &self.inner $op &rhs.inner,
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
}
impl<T: Passive> ::core::ops::$trait<&NamedJet1<T>> for NamedJet1<T> {
type Output = NamedJet1<T>;
#[inline]
fn $method(self, rhs: &NamedJet1<T>) -> NamedJet1<T> {
#[cfg(debug_assertions)]
crate::forward_tape::check_gen(self.gen_id, rhs.gen_id);
NamedJet1 {
inner: self.inner $op &rhs.inner,
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
}
impl<T: Passive> ::core::ops::$trait<NamedJet1<T>> for &NamedJet1<T> {
type Output = NamedJet1<T>;
#[inline]
fn $method(self, rhs: NamedJet1<T>) -> NamedJet1<T> {
#[cfg(debug_assertions)]
crate::forward_tape::check_gen(self.gen_id, rhs.gen_id);
NamedJet1 {
inner: &self.inner $op rhs.inner,
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
}
impl<T: Passive> ::core::ops::$trait<T> for NamedJet1<T> {
type Output = NamedJet1<T>;
#[inline]
fn $method(self, rhs: T) -> NamedJet1<T> {
NamedJet1 {
inner: self.inner $op rhs,
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
}
impl<T: Passive> ::core::ops::$trait<T> for &NamedJet1<T> {
type Output = NamedJet1<T>;
#[inline]
fn $method(self, rhs: T) -> NamedJet1<T> {
NamedJet1 {
inner: &self.inner $op rhs,
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
}
};
}
__named_freal_binop!(Add, add, +);
__named_freal_binop!(Sub, sub, -);
__named_freal_binop!(Mul, mul, *);
__named_freal_binop!(Div, div, /);
impl<T: Passive> ::core::ops::Neg for NamedJet1<T> {
type Output = NamedJet1<T>;
#[inline]
fn neg(self) -> NamedJet1<T> {
NamedJet1 {
inner: -self.inner,
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
}
impl<T: Passive> ::core::ops::Neg for &NamedJet1<T> {
type Output = NamedJet1<T>;
#[inline]
fn neg(self) -> NamedJet1<T> {
NamedJet1 {
inner: -&self.inner,
#[cfg(debug_assertions)]
gen_id: self.gen_id,
}
}
}
macro_rules! __named_freal_scalar_lhs {
($scalar:ty) => {
impl ::core::ops::Add<NamedJet1<$scalar>> for $scalar {
type Output = NamedJet1<$scalar>;
#[inline]
fn add(self, rhs: NamedJet1<$scalar>) -> NamedJet1<$scalar> {
NamedJet1 {
inner: self + rhs.inner,
#[cfg(debug_assertions)]
gen_id: rhs.gen_id,
}
}
}
impl ::core::ops::Add<&NamedJet1<$scalar>> for $scalar {
type Output = NamedJet1<$scalar>;
#[inline]
fn add(self, rhs: &NamedJet1<$scalar>) -> NamedJet1<$scalar> {
NamedJet1 {
inner: self + &rhs.inner,
#[cfg(debug_assertions)]
gen_id: rhs.gen_id,
}
}
}
impl ::core::ops::Sub<NamedJet1<$scalar>> for $scalar {
type Output = NamedJet1<$scalar>;
#[inline]
fn sub(self, rhs: NamedJet1<$scalar>) -> NamedJet1<$scalar> {
NamedJet1 {
inner: self - rhs.inner,
#[cfg(debug_assertions)]
gen_id: rhs.gen_id,
}
}
}
impl ::core::ops::Sub<&NamedJet1<$scalar>> for $scalar {
type Output = NamedJet1<$scalar>;
#[inline]
fn sub(self, rhs: &NamedJet1<$scalar>) -> NamedJet1<$scalar> {
NamedJet1 {
inner: self - &rhs.inner,
#[cfg(debug_assertions)]
gen_id: rhs.gen_id,
}
}
}
impl ::core::ops::Mul<NamedJet1<$scalar>> for $scalar {
type Output = NamedJet1<$scalar>;
#[inline]
fn mul(self, rhs: NamedJet1<$scalar>) -> NamedJet1<$scalar> {
NamedJet1 {
inner: self * rhs.inner,
#[cfg(debug_assertions)]
gen_id: rhs.gen_id,
}
}
}
impl ::core::ops::Mul<&NamedJet1<$scalar>> for $scalar {
type Output = NamedJet1<$scalar>;
#[inline]
fn mul(self, rhs: &NamedJet1<$scalar>) -> NamedJet1<$scalar> {
NamedJet1 {
inner: self * &rhs.inner,
#[cfg(debug_assertions)]
gen_id: rhs.gen_id,
}
}
}
impl ::core::ops::Div<NamedJet1<$scalar>> for $scalar {
type Output = NamedJet1<$scalar>;
#[inline]
fn div(self, rhs: NamedJet1<$scalar>) -> NamedJet1<$scalar> {
NamedJet1 {
inner: self / rhs.inner,
#[cfg(debug_assertions)]
gen_id: rhs.gen_id,
}
}
}
impl ::core::ops::Div<&NamedJet1<$scalar>> for $scalar {
type Output = NamedJet1<$scalar>;
#[inline]
fn div(self, rhs: &NamedJet1<$scalar>) -> NamedJet1<$scalar> {
NamedJet1 {
inner: self / &rhs.inner,
#[cfg(debug_assertions)]
gen_id: rhs.gen_id,
}
}
}
};
}
__named_freal_scalar_lhs!(f64);
__named_freal_scalar_lhs!(f32);
impl crate::real::Real for Jet1<f64> {
type Passive = f64;
#[inline]
fn value(&self) -> f64 {
self.value
}
#[inline]
fn ln(&self) -> Self {
crate::math::fwd::ln(self)
}
#[inline]
fn exp(&self) -> Self {
crate::math::fwd::exp(self)
}
#[inline]
fn sqrt(&self) -> Self {
crate::math::fwd::sqrt(self)
}
#[inline]
fn powf(&self, exponent: Self) -> Self {
crate::math::fwd::pow(self, &exponent)
}
#[inline]
fn powi(&self, exponent: i32) -> Self {
crate::math::fwd::powi(self, exponent)
}
#[inline]
fn sin(&self) -> Self {
crate::math::fwd::sin(self)
}
#[inline]
fn cos(&self) -> Self {
crate::math::fwd::cos(self)
}
}