mech_math/ops/
mul.rs

1#[macro_use]
2use crate::*;
3use num_traits::*;
4#[cfg(feature = "matrix")]
5use mech_core::matrix::Matrix;
6
7// Mul ------------------------------------------------------------------------
8
9macro_rules! mul_op {
10  ($lhs:expr, $rhs:expr, $out:expr) => {
11    unsafe { *$out = *$lhs * *$rhs; }};}
12  
13macro_rules! mul_vec_op {
14  ($lhs:expr, $rhs:expr, $out:expr) => {
15    unsafe {
16      let mut out_deref = &mut (*$out);
17      let lhs_deref = &(*$lhs);
18      let rhs_deref = &(*$rhs);
19      for (o,(l,r)) in out_deref.iter_mut().zip(lhs_deref.iter().zip(rhs_deref.iter())) {
20        *o = *l * *r;
21      }
22    }};}
23
24macro_rules! mul_scalar_lhs_op {
25  ($lhs:expr, $rhs:expr, $out:expr) => {
26    unsafe { 
27      let mut out_deref = &mut (*$out);
28      let lhs_deref = &(*$lhs);
29      let rhs_deref = (*$rhs);
30      for (o,l) in out_deref.iter_mut().zip(lhs_deref.iter()) {
31        *o = *l * rhs_deref;
32      }
33    }};}
34
35macro_rules! mul_scalar_rhs_op {
36  ($lhs:expr, $rhs:expr, $out:expr) => {
37    unsafe {
38      let mut out_deref = &mut (*$out);
39      let lhs_deref = (*$lhs);
40      let rhs_deref = &(*$rhs);
41      for (o,r) in out_deref.iter_mut().zip(rhs_deref.iter()) {
42        *o = lhs_deref * *r;
43      }
44    }};}
45
46macro_rules! mul_mat_vec_op {
47  ($lhs:expr, $rhs:expr, $out:expr) => {
48    unsafe {
49      let mut out_deref = &mut (*$out);
50      let lhs_deref = &(*$lhs);
51      let rhs_deref = &(*$rhs);
52      for (mut col, lhs_col) in out_deref.column_iter_mut().zip(lhs_deref.column_iter()) {
53        for i in 0..col.len() {
54          col[i] = lhs_col[i] * rhs_deref[i];
55        }
56      }
57    }
58  };}
59
60macro_rules! mul_vec_mat_op {
61  ($lhs:expr, $rhs:expr, $out:expr) => {
62    unsafe {
63      let mut out_deref = &mut (*$out);
64      let lhs_deref = &(*$lhs);
65      let rhs_deref = &(*$rhs);
66      for (mut col, rhs_col) in out_deref.column_iter_mut().zip(rhs_deref.column_iter()) {
67        for i in 0..col.len() {
68          col[i] = lhs_deref[i] * rhs_col[i];
69        }
70      }
71    }
72  };}
73
74macro_rules! mul_mat_row_op {
75  ($lhs:expr, $rhs:expr, $out:expr) => {
76    unsafe {
77      let mut out_deref = &mut (*$out);
78      let lhs_deref = &(*$lhs);
79      let rhs_deref = &(*$rhs);
80      for (mut row, lhs_row) in out_deref.row_iter_mut().zip(lhs_deref.row_iter()) {
81        for i in 0..row.len() {
82          row[i] = lhs_row[i] * rhs_deref[i];
83        }
84      }
85    }
86  };}
87
88macro_rules! mul_row_mat_op {
89  ($lhs:expr, $rhs:expr, $out:expr) => {
90    unsafe {
91      let mut out_deref = &mut (*$out);
92      let lhs_deref = &(*$lhs);
93      let rhs_deref = &(*$rhs);
94      for (mut row, rhs_row) in out_deref.row_iter_mut().zip(rhs_deref.row_iter()) {
95        for i in 0..row.len() {
96          row[i] = lhs_deref[i] * rhs_row[i];
97        }
98      }
99    }
100  };}  
101
102impl_math_fxns!(Mul);
103
104fn impl_mul_fxn(lhs_value: Value, rhs_value: Value) -> MResult<Box<dyn MechFunction>> {
105  impl_binop_match_arms!(
106    Mul,
107    register_fxn_descriptor_inner,
108    (lhs_value, rhs_value),
109    I8,   i8,   "i8";
110    I16,  i16,  "i16";
111    I32,  i32,  "i32";
112    I64,  i64,  "i64";
113    I128, i128, "i128";
114    U8,   u8,   "u8";
115    U16,  u16,  "u16";
116    U32,  u32,  "u32";
117    U64,  u64,  "u64";
118    U128, u128, "u128";
119    F32,  f32,  "f32";
120    F64,  f64,  "f64";
121    R64, R64, "rational";
122    C64, C64, "complex";
123  )
124}
125
126impl_mech_binop_fxn!(MathMul,impl_mul_fxn,"math/mul");