1use crate::*;
2use mech_core::*;
3#[cfg(feature = "matrix")]
4use mech_core::matrix::Matrix;
5
6macro_rules! mul_op {
9 ($lhs:expr, $rhs:expr, $out:expr) => {
10 unsafe { *$out = *$lhs * *$rhs; }
11 };}
12
13macro_rules! matmul_op {
14 ($lhs:expr, $rhs:expr, $out:expr) => {
15 unsafe { (*$lhs).mul_to(&*$rhs,&mut *$out); }
16 };}
17
18macro_rules! impl_matmul {
19 ($name:ident, $type1:ty, $type2:ty, $out_type:ty) => {
20 impl_binop!($name, $type1, $type2, $out_type, matmul_op, FeatureFlag::Builtin(FeatureKind::MatMul));
21 register_fxn_descriptor!($name, u8, "u8", u16, "u16", u32, "u32", u64, "u64", u128, "u128", i8, "i8", i16, "i16", i32, "i32", i64, "i64", i128, "i128", F32, "f32", F64, "f64");
22 };
23}
24
25impl_binop!(MatMulScalar, T,T,T,mul_op, FeatureFlag::Builtin(FeatureKind::MatMul));
26register_fxn_descriptor!(MatMulScalar, u8, "u8", u16, "u16", u32, "u32", u64, "u64", u128, "u128", i8, "i8", i16, "i16", i32, "i32", i64, "i64", i128, "i128", F32, "f32", F64, "f64");
27
28#[cfg(all(feature = "row_vector4", feature = "vector4", feature = "matrix1"))]
29impl_matmul!(MatMulR4V4, RowVector4<T>, Vector4<T>, Matrix1<T>);
30#[cfg(all(feature = "row_vector4", feature = "matrix4"))]
31impl_matmul!(MatMulR4M4, RowVector4<T>, Matrix4<T>, RowVector4<T>);
32#[cfg(all(feature = "row_vector4", feature = "matrixd", feature = "row_vectord"))]
33impl_matmul!(MatMulR4MD, RowVector4<T>, DMatrix<T>, RowDVector<T>);
34
35#[cfg(all(feature = "row_vector3", feature = "vector3", feature = "matrix1"))]
36impl_matmul!(MatMulR3V3, RowVector3<T>, Vector3<T>, Matrix1<T>);
37#[cfg(all(feature = "row_vector3", feature = "matrix3"))]
38impl_matmul!(MatMulR3M3, RowVector3<T>, Matrix3<T>, RowVector3<T>);
39#[cfg(all(feature = "row_vector3", feature = "matrix3x2"))]
40impl_matmul!(MatMulR3M3x2, RowVector3<T>, Matrix3x2<T>, RowVector2<T>);
41#[cfg(all(feature = "row_vector3", feature = "matrixd", feature = "row_vectord"))]
42impl_matmul!(MatMulR3MD, RowVector3<T>, DMatrix<T>, RowDVector<T>);
43
44#[cfg(all(feature = "row_vector2", feature = "vector2", feature = "matrix1"))]
45impl_matmul!(MatMulR2V2, RowVector2<T>, Vector2<T>, Matrix1<T>);
46#[cfg(all(feature = "row_vector2", feature = "matrix2", feature = "row_vector2"))]
47impl_matmul!(MatMulR2M2, RowVector2<T>, Matrix2<T>, RowVector2<T>);
48#[cfg(all(feature = "row_vector2", feature = "matrix2x3", feature = "row_vector3"))]
49impl_matmul!(MatMulR2M2x3, RowVector2<T>, Matrix2x3<T>, RowVector3<T>);
50#[cfg(all(feature = "row_vector2", feature = "matrixd", feature = "row_vectord"))]
51impl_matmul!(MatMulR2MD, RowVector2<T>, DMatrix<T>, RowDVector<T>);
52
53#[cfg(all(feature = "row_vectord", feature = "vectord", feature = "matrix1"))]
54impl_matmul!(MatMulRDVD, RowDVector<T>, DVector<T>, Matrix1<T>);
55#[cfg(all(feature = "row_vectord", feature = "vectord", feature = "matrixd", not(feature = "matrix1")))]
56impl_matmul!(MatMulRDVD, RowDVector<T>, DVector<T>, DMatrix<T>);
57#[cfg(all(feature = "row_vectord", feature = "matrixd"))]
58impl_matmul!(MatMulRDMD, RowDVector<T>, DMatrix<T>, RowDVector<T>);
59
60#[cfg(all(feature = "vector4", feature = "row_vector4", feature = "matrix4"))]
61impl_matmul!(MatMulV4R4, Vector4<T>, RowVector4<T>, Matrix4<T>);
62#[cfg(all(feature = "vector3", feature = "row_vector3", feature = "matrix3"))]
63impl_matmul!(MatMulV3R3, Vector3<T>, RowVector3<T>, Matrix3<T>);
64#[cfg(all(feature = "vector2", feature = "row_vector2", feature = "matrix2"))]
65impl_matmul!(MatMulV2R2, Vector2<T>, RowVector2<T>, Matrix2<T>);
66
67#[cfg(all(feature = "vectord", feature = "row_vectord", feature = "matrixd"))]
68impl_matmul!(MatMulVDRD, DVector<T>,RowDVector<T>,DMatrix<T>);
69
70#[cfg(all(feature = "matrix4", feature = "vector4"))]
71impl_matmul!(MatMulM4V4, Matrix4<T>, Vector4<T>, Vector4<T>);
72#[cfg(all(feature = "matrix4"))]
73impl_matmul!(MatMulM4M4, Matrix4<T>, Matrix4<T>, Matrix4<T>);
74#[cfg(all(feature = "matrix4", feature = "matrixd"))]
75impl_matmul!(MatMulM4MD, Matrix4<T>, DMatrix<T>, DMatrix<T>);
76
77#[cfg(all(feature = "matrix2", feature = "matrix2x3"))]
78impl_matmul!(MatMulM2M2x3, Matrix2<T>, Matrix2x3<T>, Matrix2x3<T>);
79#[cfg(all(feature = "matrix2", feature = "matrix2"))]
80impl_matmul!(MatMulM2M2, Matrix2<T>, Matrix2<T>, Matrix2<T>);
81#[cfg(all(feature = "matrix2", feature = "vector2"))]
82impl_matmul!(MatMulM2V2, Matrix2<T>, Vector2<T>, Vector2<T>);
83#[cfg(all(feature = "matrix2", feature = "matrixd"))]
84impl_matmul!(MatMulM2MD, Matrix2<T>, DMatrix<T>, DMatrix<T>);
85
86#[cfg(feature = "matrix3")]
87impl_matmul!(MatMulM3M3, Matrix3<T>, Matrix3<T>, Matrix3<T>);
88#[cfg(all(feature = "matrix3", feature = "matrix3x2"))]
89impl_matmul!(MatMulM2M3x2, Matrix3<T>, Matrix3x2<T>, Matrix3x2<T>);
90#[cfg(all(feature = "matrix3", feature = "vector3"))]
91impl_matmul!(MatMulM3V3, Matrix3<T>, Vector3<T>, Vector3<T>);
92#[cfg(all(feature = "matrix3", feature = "matrixd"))]
93impl_matmul!(MatMulM3MD, Matrix3<T>, DMatrix<T>, DMatrix<T>);
94
95#[cfg(all(feature = "matrix1"))]
96impl_matmul!(MatMulM1M1, Matrix1<T>, Matrix1<T>, Matrix1<T>);
97
98#[cfg(all(feature = "matrix2x3", feature = "vector3", feature = "vector2"))]
99impl_matmul!(MatMulM2x3V2, Matrix2x3<T>, Vector3<T>, Vector2<T>);
100#[cfg(all(feature = "matrix2x3", feature = "matrix3"))]
101impl_matmul!(MatMulM2x3M3, Matrix2x3<T>, Matrix3<T>, Matrix2x3<T>);
102#[cfg(all(feature = "matrix2x3", feature = "matrix3x2", feature = "matrix2"))]
103impl_matmul!(MatMulM2x3M3x2, Matrix2x3<T>, Matrix3x2<T>, Matrix2<T>);
104#[cfg(all(feature = "matrix2x3", feature = "matrixd"))]
105impl_matmul!(MatMulM2x3MD, Matrix2x3<T>, DMatrix<T>, DMatrix<T>);
106
107#[cfg(all(feature = "matrix3x2", feature = "vector2", feature = "vector3"))]
108impl_matmul!(MatMulM3x2V2, Matrix3x2<T>, Vector2<T>, Vector3<T>);
109#[cfg(all(feature = "matrix3x2", feature = "matrix2"))]
110impl_matmul!(MatMulM3x2M2, Matrix3x2<T>, Matrix2<T>, Matrix3x2<T>);
111#[cfg(all(feature = "matrix3x2", feature = "matrix2x3", feature = "matrix3"))]
112impl_matmul!(MatMulM3x2M2x3, Matrix3x2<T>, Matrix2x3<T>, Matrix3<T>);
113#[cfg(all(feature = "matrix3x2", feature = "matrixd"))]
114impl_matmul!(MatMulM3x2MD, Matrix3x2<T>, DMatrix<T>, DMatrix<T>);
115
116#[cfg(feature = "matrixd")]
117impl_matmul!(MatMulMDMD, DMatrix<T>,DMatrix<T>,DMatrix<T>);
118#[cfg(all(feature = "matrixd", feature = "matrix3x2"))]
119impl_matmul!(MatMulMDM3x2, DMatrix<T>,Matrix3x2<T>,DMatrix<T>);
120#[cfg(all(feature = "matrixd", feature = "vectord"))]
121impl_matmul!(MatMulMDVD, DMatrix<T>,DVector<T>,DVector<T>);
122#[cfg(all(feature = "matrixd", feature = "row_vectord"))]
123impl_matmul!(MatMulMDRD, DMatrix<T>,RowDVector<T>,DMatrix<T>);
124
125macro_rules! impl_matmul_match_arms {
126 ($arg:expr, $($lhs_type:tt, $($matrix_kind:tt, $target_type:tt, $value_string:tt),+);+ $(;)?) => {
127 match $arg {
128 $(
129 $(
130 #[cfg(feature = $value_string)]
132 (Value::$lhs_type(lhs), Value::$lhs_type(rhs)) => Ok(Box::new(MatMulScalar { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new($target_type::zero()) })),
133
134 #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "vector4"))]
136 (Value::$matrix_kind(Matrix::RowVector4(lhs)), Value::$matrix_kind(Matrix::Vector4(rhs))) => Ok(Box::new(MatMulR4V4 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix1::from_element($target_type::zero())) })),
137 #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrix4"))]
138 (Value::$matrix_kind(Matrix::RowVector4(lhs)), Value::$matrix_kind(Matrix::Matrix4(rhs))) => Ok(Box::new(MatMulR4M4 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector4::from_element($target_type::zero())) })),
139 #[cfg(all(feature = $value_string, feature = "row_vector4", feature = "matrixd"))]
140 (Value::$matrix_kind(Matrix::RowVector4(lhs)), Value::$matrix_kind(Matrix::DMatrix(rhs))) => Ok(Box::new(MatMulR4MD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowDVector::from_element(rhs.borrow().ncols(),$target_type::zero())) })),
141
142 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "vector3", feature = "matrix1"))]
144 (Value::$matrix_kind(Matrix::RowVector3(lhs)), Value::$matrix_kind(Matrix::Vector3(rhs))) => Ok(Box::new(MatMulR3V3 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix1::from_element($target_type::zero())) })),
145 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix3", feature = "row_vector3"))]
146 (Value::$matrix_kind(Matrix::RowVector3(lhs)), Value::$matrix_kind(Matrix::Matrix3(rhs))) => Ok(Box::new(MatMulR3M3 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector3::from_element($target_type::zero())) })),
147 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrix3x2", feature = "row_vector2"))]
148 (Value::$matrix_kind(Matrix::RowVector3(lhs)), Value::$matrix_kind(Matrix::Matrix3x2(rhs))) => Ok(Box::new(MatMulR3M3x2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector2::from_element($target_type::zero())) })),
149 #[cfg(all(feature = $value_string, feature = "row_vector3", feature = "matrixd", feature = "row_vectord"))]
150 (Value::$matrix_kind(Matrix::RowVector3(lhs)), Value::$matrix_kind(Matrix::DMatrix(rhs))) => Ok(Box::new(MatMulR3MD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowDVector::from_element(rhs.borrow().ncols(), $target_type::zero())) })),
151
152 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "vector2", feature = "matrix1"))]
154 (Value::$matrix_kind(Matrix::RowVector2(lhs)), Value::$matrix_kind(Matrix::Vector2(rhs))) => Ok(Box::new(MatMulR2V2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix1::from_element($target_type::zero())) })),
155 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix2", feature = "row_vector2"))]
156 (Value::$matrix_kind(Matrix::RowVector2(lhs)), Value::$matrix_kind(Matrix::Matrix2(rhs))) => Ok(Box::new(MatMulR2M2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector2::from_element($target_type::zero())) })),
157 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrix2x3", feature = "row_vector3"))]
158 (Value::$matrix_kind(Matrix::RowVector2(lhs)), Value::$matrix_kind(Matrix::Matrix2x3(rhs))) => Ok(Box::new(MatMulR2M2x3 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowVector3::from_element($target_type::zero())) })),
159 #[cfg(all(feature = $value_string, feature = "row_vector2", feature = "matrixd", feature = "row_vectord"))]
160 (Value::$matrix_kind(Matrix::RowVector2(lhs)), Value::$matrix_kind(Matrix::DMatrix(rhs))) => Ok(Box::new(MatMulR2MD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowDVector::from_element(rhs.borrow().ncols(), $target_type::zero())) })),
161
162 #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "vectord", feature = "matrix1"))]
164 (Value::$matrix_kind(Matrix::RowDVector(lhs)), Value::$matrix_kind(Matrix::DVector(rhs))) => Ok(Box::new(MatMulRDVD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix1::from_element($target_type::zero())) })),
165 #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "vectord", feature = "matrixd", not(feature = "matrix1")))]
166 (Value::$matrix_kind(Matrix::RowDVector(lhs)), Value::$matrix_kind(Matrix::DVector(rhs))) => Ok(Box::new(MatMulRDVD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DMatrix::from_element(1,1,$target_type::zero())) })),
167 #[cfg(all(feature = $value_string, feature = "row_vectord", feature = "matrixd"))]
168 (Value::$matrix_kind(Matrix::RowDVector(lhs)), Value::$matrix_kind(Matrix::DMatrix(rhs))) => Ok(Box::new(MatMulRDMD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(RowDVector::from_element(rhs.borrow().ncols(), $target_type::zero())) })),
169
170 #[cfg(all(feature = $value_string, feature = "vector4", feature = "row_vector4", feature = "matrix4"))]
172 (Value::$matrix_kind(Matrix::Vector4(lhs)), Value::$matrix_kind(Matrix::RowVector4(rhs))) => Ok(Box::new(MatMulV4R4 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix4::from_element($target_type::zero())) })),
173 #[cfg(all(feature = $value_string, feature = "vector3", feature = "row_vector3", feature = "matrix3"))]
174 (Value::$matrix_kind(Matrix::Vector3(lhs)), Value::$matrix_kind(Matrix::RowVector3(rhs))) => Ok(Box::new(MatMulV3R3 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix3::from_element($target_type::zero())) })),
175 #[cfg(all(feature = $value_string, feature = "vector2", feature = "row_vector2", feature = "matrix2"))]
176 (Value::$matrix_kind(Matrix::Vector2(lhs)), Value::$matrix_kind(Matrix::RowVector2(rhs))) => Ok(Box::new(MatMulV2R2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix2::from_element($target_type::zero())) })),
177
178 #[cfg(all(feature = $value_string, feature = "vectord", feature = "row_vectord", feature = "matrixd"))]
180 (Value::$matrix_kind(Matrix::DVector(lhs)), Value::$matrix_kind(Matrix::RowDVector(rhs))) => Ok(Box::new(MatMulVDRD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DMatrix::from_element(lhs.borrow().nrows(), rhs.borrow().ncols(), $target_type::zero())) })),
181
182 #[cfg(all(feature = $value_string, feature = "matrix4", feature = "vector4"))]
184 (Value::$matrix_kind(Matrix::Matrix4(lhs)), Value::$matrix_kind(Matrix::Vector4(rhs))) => Ok(Box::new(MatMulM4V4 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector4::from_element($target_type::zero())) })),
185 #[cfg(all(feature = $value_string, feature = "matrix4"))]
186 (Value::$matrix_kind(Matrix::Matrix4(lhs)), Value::$matrix_kind(Matrix::Matrix4(rhs))) => Ok(Box::new(MatMulM4M4 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix4::from_element($target_type::zero())) })),
187 #[cfg(all(feature = $value_string, feature = "matrix4", feature = "matrixd"))]
188 (Value::$matrix_kind(Matrix::Matrix4(lhs)), Value::$matrix_kind(Matrix::DMatrix(rhs))) => Ok(Box::new(MatMulM4MD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DMatrix::from_element(lhs.borrow().nrows(), rhs.borrow().ncols(), $target_type::zero())) })),
189
190 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "matrix2x3"))]
192 (Value::$matrix_kind(Matrix::Matrix2(lhs)), Value::$matrix_kind(Matrix::Matrix2x3(rhs))) => Ok(Box::new(MatMulM2M2x3 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix2x3::from_element($target_type::zero())) })),
193 #[cfg(all(feature = $value_string, feature = "matrix2"))]
194 (Value::$matrix_kind(Matrix::Matrix2(lhs)), Value::$matrix_kind(Matrix::Matrix2(rhs))) => Ok(Box::new(MatMulM2M2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix2::from_element($target_type::zero())) })),
195 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "vector2"))]
196 (Value::$matrix_kind(Matrix::Matrix2(lhs)), Value::$matrix_kind(Matrix::Vector2(rhs))) => Ok(Box::new(MatMulM2V2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector2::from_element($target_type::zero())) })),
197 #[cfg(all(feature = $value_string, feature = "matrix2", feature = "matrixd"))]
198 (Value::$matrix_kind(Matrix::Matrix2(lhs)), Value::$matrix_kind(Matrix::DMatrix(rhs))) => Ok(Box::new(MatMulM2MD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DMatrix::from_element(lhs.borrow().nrows(), rhs.borrow().ncols(), $target_type::zero())) })),
199
200 #[cfg(all(feature = $value_string, feature = "matrix3"))]
202 (Value::$matrix_kind(Matrix::Matrix3(lhs)), Value::$matrix_kind(Matrix::Matrix3(rhs))) => Ok(Box::new(MatMulM3M3 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix3::from_element($target_type::zero())) })),
203 #[cfg(all(feature = $value_string, feature = "matrix3", feature = "matrix3x2"))]
204 (Value::$matrix_kind(Matrix::Matrix3(lhs)), Value::$matrix_kind(Matrix::Matrix3x2(rhs))) => Ok(Box::new(MatMulM2M3x2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix3x2::from_element($target_type::zero())) })),
205 #[cfg(all(feature = $value_string, feature = "matrix3", feature = "vector3"))]
206 (Value::$matrix_kind(Matrix::Matrix3(lhs)), Value::$matrix_kind(Matrix::Vector3(rhs))) => Ok(Box::new(MatMulM3V3 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector3::from_element($target_type::zero())) })),
207 #[cfg(all(feature = $value_string, feature = "matrix3", feature = "matrixd"))]
208 (Value::$matrix_kind(Matrix::Matrix3(lhs)), Value::$matrix_kind(Matrix::DMatrix(rhs))) => Ok(Box::new(MatMulM3MD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DMatrix::from_element(lhs.borrow().nrows(), rhs.borrow().ncols(), $target_type::zero())) })),
209
210 #[cfg(all(feature = $value_string, feature = "matrix1"))]
212 (Value::$matrix_kind(Matrix::Matrix1(lhs)), Value::$matrix_kind(Matrix::Matrix1(rhs))) => Ok(Box::new(MatMulM1M1 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix1::from_element($target_type::zero())) })),
213
214 #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "vector3"))]
216 (Value::$matrix_kind(Matrix::Matrix2x3(lhs)), Value::$matrix_kind(Matrix::Vector3(rhs))) => Ok(Box::new(MatMulM2x3V2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector2::from_element($target_type::zero())) })),
217 #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "matrix3"))]
218 (Value::$matrix_kind(Matrix::Matrix2x3(lhs)), Value::$matrix_kind(Matrix::Matrix3(rhs))) => Ok(Box::new(MatMulM2x3M3 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix2x3::from_element($target_type::zero())) })),
219 #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "matrix3x2"))]
220 (Value::$matrix_kind(Matrix::Matrix2x3(lhs)), Value::$matrix_kind(Matrix::Matrix3x2(rhs))) => Ok(Box::new(MatMulM2x3M3x2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix2::from_element($target_type::zero())) })),
221 #[cfg(all(feature = $value_string, feature = "matrix2x3", feature = "matrixd"))]
222 (Value::$matrix_kind(Matrix::Matrix2x3(lhs)), Value::$matrix_kind(Matrix::DMatrix(rhs))) => Ok(Box::new(MatMulM2x3MD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DMatrix::from_element(lhs.borrow().nrows(), rhs.borrow().ncols(), $target_type::zero())) })),
223
224 #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "vector2"))]
226 (Value::$matrix_kind(Matrix::Matrix3x2(lhs)), Value::$matrix_kind(Matrix::Vector2(rhs))) => Ok(Box::new(MatMulM3x2V2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Vector3::from_element($target_type::zero())) })),
227 #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "matrix2"))]
228 (Value::$matrix_kind(Matrix::Matrix3x2(lhs)), Value::$matrix_kind(Matrix::Matrix2(rhs))) => Ok(Box::new(MatMulM3x2M2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix3x2::from_element($target_type::zero())) })),
229 #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "matrix2x3"))]
230 (Value::$matrix_kind(Matrix::Matrix3x2(lhs)), Value::$matrix_kind(Matrix::Matrix2x3(rhs))) => Ok(Box::new(MatMulM3x2M2x3 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(Matrix3::from_element($target_type::zero())) })),
231 #[cfg(all(feature = $value_string, feature = "matrix3x2", feature = "matrixd"))]
232 (Value::$matrix_kind(Matrix::Matrix3x2(lhs)), Value::$matrix_kind(Matrix::DMatrix(rhs))) => Ok(Box::new(MatMulM3x2MD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DMatrix::from_element(lhs.borrow().nrows(), rhs.borrow().ncols(), $target_type::zero())) })),
233
234 #[cfg(all(feature = $value_string, feature = "matrixd"))]
236 (Value::$matrix_kind(Matrix::DMatrix(lhs)), Value::$matrix_kind(Matrix::DMatrix(rhs))) => {
237 let (lhs_rows,lhs_cols) = {lhs.borrow().shape()};
238 let (rhs_rows,rhs_cols) = {rhs.borrow().shape()};
239 if lhs_cols != rhs_rows {
240 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::DimensionMismatch(vec![]) });
241 }
242 Ok(Box::new(MatMulMDMD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DMatrix::from_element(lhs_rows, rhs_cols, $target_type::zero())) }))
243 },
244 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "vectord"))]
245 (Value::$matrix_kind(Matrix::DMatrix(lhs)), Value::$matrix_kind(Matrix::DVector(rhs))) => {
246 let (lhs_rows,lhs_cols) = {lhs.borrow().shape()};
247 let (rhs_rows,rhs_cols) = {rhs.borrow().shape()};
248 if lhs_cols != rhs_rows {
249 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::DimensionMismatch(vec![]) });
250 }
251 Ok(Box::new(MatMulMDVD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DVector::from_element(lhs_rows, $target_type::zero())) }))
252 },
253 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "row_vectord"))]
254 (Value::$matrix_kind(Matrix::DMatrix(lhs)), Value::$matrix_kind(Matrix::RowDVector(rhs))) => {
255 let (lhs_rows,lhs_cols) = {lhs.borrow().shape()};
256 let (rhs_rows,rhs_cols) = {rhs.borrow().shape()};
257 if lhs_cols != rhs_rows {
258 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::DimensionMismatch(vec![]) });
259 }
260 Ok(Box::new(MatMulMDRD { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DMatrix::from_element(lhs_rows, rhs_cols, $target_type::zero())) }))
261 },
262 #[cfg(all(feature = $value_string, feature = "matrixd", feature = "matrix3x2"))]
263 (Value::$matrix_kind(Matrix::DMatrix(lhs)), Value::$matrix_kind(Matrix::Matrix3x2(rhs))) => {
264 let (lhs_rows,lhs_cols) = {lhs.borrow().shape()};
265 let (rhs_rows,rhs_cols) = {rhs.borrow().shape()};
266 if lhs_cols != rhs_rows {
267 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::DimensionMismatch(vec![]) });
268 }
269 Ok(Box::new(MatMulMDM3x2 { lhs: lhs.clone(), rhs: rhs.clone(), out: Ref::new(DMatrix::from_element(lhs_rows, rhs_cols, $target_type::zero())) }))
270 },
271 #[cfg(feature = $value_string)]
272 (Value::$matrix_kind(lhs), Value::$matrix_kind(rhs)) => {
273 let lhs_shape = lhs.shape();
274 let rhs_shape = rhs.shape();
275 return Err(MechError{file: file!().to_string(), tokens: vec![], msg: "".to_string(), id: line!(), kind: MechErrorKind::DimensionMismatch(vec![]) });
276 }
277 )+
278 )+
279 x => Err(MechError{file: file!().to_string(), tokens: vec![], msg: format!("{:?}",x), id: line!(), kind: MechErrorKind::UnhandledFunctionArgumentKind }),
280 }
281 }
282}
283
284fn impl_matmul_fxn(lhs_value: Value, rhs_value: Value) -> Result<Box<dyn MechFunction>, MechError> {
285 impl_matmul_match_arms!(
286 (lhs_value, rhs_value),
287 I8, MatrixI8, i8, "i8";
288 I16, MatrixI16, i16, "i16";
289 I32, MatrixI32, i32, "i32";
290 I64, MatrixI64, i64, "i64";
291 I128, MatrixI128, i128, "i128";
292 U8, MatrixU8, u8, "u8";
293 U16, MatrixU16, u16, "u16";
294 U32, MatrixU32, u32, "u32";
295 U64, MatrixU64, u64, "u64";
296 U128, MatrixU128, u128, "u128";
297 F32, MatrixF32, F32, "f32";
298 F64, MatrixF64, F64, "f64";
299 R64, MatrixR64, R64, "rational";
300 C64, MatrixC64, C64, "complex";
301 )
302}
303
304impl_mech_binop_fxn!(MatrixMatMul,impl_matmul_fxn,"matrix/matmul");