1use crate::*;
2use crate::types::Ref;
3use na::{Vector3, DVector, Vector2, Vector4, RowDVector, Matrix1, Matrix3, Matrix4, RowVector3, RowVector4, RowVector2, DMatrix, Rotation3, Matrix2x3, Matrix3x2, Matrix6, Matrix2};
4use tabled::{
5 builder::Builder,
6 settings::{object::Rows,Panel, Span, Alignment, Modify, Style},
7 Tabled,
8 };
9use std::fmt::{Debug, Display};
10use std::hash::{Hash, Hasher};
11use std::slice::Iter;
12use std::iter::Peekable;
13use serde::ser::{Serialize, Serializer, SerializeStruct};
14use std::any::Any;
15
16pub trait ToMatrix: Clone {
19 fn to_matrix(elements: Vec<Self>, rows: usize, cols: usize) -> Matrix<Self>;
20 fn to_matrixd(elements: Vec<Self>, rows: usize, cols: usize) -> Matrix<Self>;
21}
22
23macro_rules! impl_to_matrix {
24 ($t:ty) => {
25 impl ToMatrix for $t {
26 fn to_matrix(elements: Vec<Self>, rows: usize, cols: usize) -> Matrix<Self> {
27 match (rows,cols) {
28 #[cfg(feature = "Matrix1")]
29 (1,1) => Matrix::Matrix1(new_ref(Matrix1::from_element(elements[0].clone()))),
30 #[cfg(feature = "Matrix2")]
31 (2,2) => Matrix::Matrix2(new_ref(Matrix2::from_vec(elements))),
32 #[cfg(feature = "Matrix3")]
33 (3,3) => Matrix::Matrix3(new_ref(Matrix3::from_vec(elements))),
34 #[cfg(feature = "Matrix4")]
35 (4,4) => Matrix::Matrix4(new_ref(Matrix4::from_vec(elements))),
36 #[cfg(feature = "Matrix2x3")]
37 (2,3) => Matrix::Matrix2x3(new_ref(Matrix2x3::from_vec(elements))),
38 #[cfg(feature = "Matrix3x2")]
39 (3,2) => Matrix::Matrix3x2(new_ref(Matrix3x2::from_vec(elements))),
40 #[cfg(feature = "RowVector2")]
41 (1,2) => Matrix::RowVector2(new_ref(RowVector2::from_vec(elements))),
42 #[cfg(feature = "RowVector3")]
43 (1,3) => Matrix::RowVector3(new_ref(RowVector3::from_vec(elements))),
44 #[cfg(feature = "RowVector4")]
45 (1,4) => Matrix::RowVector4(new_ref(RowVector4::from_vec(elements))),
46 #[cfg(feature = "Vector2")]
47 (2,1) => Matrix::Vector2(new_ref(Vector2::from_vec(elements))),
48 #[cfg(feature = "Vector2")]
49 (3,1) => Matrix::Vector3(new_ref(Vector3::from_vec(elements))),
50 #[cfg(feature = "Vector2")]
51 (4,1) => Matrix::Vector4(new_ref(Vector4::from_vec(elements))),
52 #[cfg(feature = "RowVectorD")]
53 (1,n) => Matrix::RowDVector(new_ref(RowDVector::from_vec(elements))),
54 #[cfg(feature = "VectorD")]
55 (m,1) => Matrix::DVector(new_ref(DVector::from_vec(elements))),
56 #[cfg(feature = "MatrixD")]
57 (m,n) => Matrix::DMatrix(new_ref(DMatrix::from_vec(m,n,elements))),
58 }
59 }
60 fn to_matrixd(elements: Vec<Self>, rows: usize, cols: usize) -> Matrix<Self> {
61 match (rows,cols) {
62 #[cfg(feature = "RowVectorD")]
63 (1,n) => Matrix::RowDVector(new_ref(RowDVector::from_vec(elements))),
64 #[cfg(feature = "VectorD")]
65 (m,1) => Matrix::DVector(new_ref(DVector::from_vec(elements))),
66 #[cfg(feature = "MatrixD")]
67 (m,n) => Matrix::DMatrix(new_ref(DMatrix::from_vec(m,n,elements))),
68 }
69 }
70 }
71 };
72}
73
74impl ToMatrix for usize {
75 fn to_matrix(elements: Vec<Self>, rows: usize, cols: usize) -> Matrix<Self> {
76 match (rows,cols) {
77 #[cfg(feature = "RowVectorD")]
78 (1,n) => Matrix::RowDVector(new_ref(RowDVector::from_vec(elements))),
79 #[cfg(feature = "VectorD")]
80 (m,1) => Matrix::DVector(new_ref(DVector::from_vec(elements))),
81 #[cfg(feature = "MatrixD")]
82 (m,n) => Matrix::DMatrix(new_ref(DMatrix::from_vec(m,n,elements))),
83 }
84 }
85 fn to_matrixd(elements: Vec<Self>, rows: usize, cols: usize) -> Matrix<Self> {
86 match (rows,cols) {
87 #[cfg(feature = "RowVectorD")]
88 (1,n) => Matrix::RowDVector(new_ref(RowDVector::from_vec(elements))),
89 #[cfg(feature = "VectorD")]
90 (m,1) => Matrix::DVector(new_ref(DVector::from_vec(elements))),
91 #[cfg(feature = "MatrixD")]
92 (m,n) => Matrix::DMatrix(new_ref(DMatrix::from_vec(m,n,elements))),
93 }
94 }
95}
96
97impl_to_matrix!(Value);
98#[cfg(feature = "Bool")]
99impl_to_matrix!(bool);
100#[cfg(feature = "U8")]
101impl_to_matrix!(u8);
102#[cfg(feature = "U16")]
103impl_to_matrix!(u16);
104#[cfg(feature = "U32")]
105impl_to_matrix!(u32);
106#[cfg(feature = "U64")]
107impl_to_matrix!(u64);
108#[cfg(feature = "U128")]
109impl_to_matrix!(u128);
110#[cfg(feature = "I8")]
111impl_to_matrix!(i8);
112#[cfg(feature = "I16")]
113impl_to_matrix!(i16);
114#[cfg(feature = "I32")]
115impl_to_matrix!(i32);
116#[cfg(feature = "I64")]
117impl_to_matrix!(i64);
118#[cfg(feature = "I128")]
119impl_to_matrix!(i128);
120#[cfg(feature = "F32")]
121impl_to_matrix!(F32);
122#[cfg(feature = "F64")]
123impl_to_matrix!(F64);
124
125pub trait ToIndex: Clone {
126 fn to_index(elements: Vec<Self>) -> Matrix<Self>;
127}
128
129#[derive(Clone, Debug, PartialEq, Eq)]
130pub enum Matrix<T> {
131 #[cfg(feature = "RowVector4")]
132 RowVector4(Ref<RowVector4<T>>),
133 #[cfg(feature = "RowVector3")]
134 RowVector3(Ref<RowVector3<T>>),
135 #[cfg(feature = "RowVector2")]
136 RowVector2(Ref<RowVector2<T>>),
137 #[cfg(feature = "RowVectorD")]
138 RowDVector(Ref<RowDVector<T>>),
139 #[cfg(feature = "Vector4")]
140 Vector4(Ref<Vector4<T>>),
141 #[cfg(feature = "Vector3")]
142 Vector3(Ref<Vector3<T>>),
143 #[cfg(feature = "Vector2")]
144 Vector2(Ref<Vector2<T>>),
145 #[cfg(feature = "VectorD")]
146 DVector(Ref<DVector<T>>),
147 #[cfg(feature = "Matrix4")]
148 Matrix4(Ref<Matrix4<T>>),
149 #[cfg(feature = "Matrix3")]
150 Matrix3(Ref<Matrix3<T>>),
151 #[cfg(feature = "Matrix2")]
152 Matrix2(Ref<Matrix2<T>>),
153 #[cfg(feature = "Matrix1")]
154 Matrix1(Ref<Matrix1<T>>),
155 #[cfg(feature = "Matrix3x2")]
156 Matrix3x2(Ref<Matrix3x2<T>>),
157 #[cfg(feature = "Matrix2x3")]
158 Matrix2x3(Ref<Matrix2x3<T>>),
159 #[cfg(feature = "MatrixD")]
160 DMatrix(Ref<DMatrix<T>>),
161}
162
163pub trait CopyMat<T> {
164 fn copy_into(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize;
165 fn copy_into_v(&self, dst: &Ref<DVector<T>>, offset: usize) -> usize;
166 fn copy_into_r(&self, dst: &Ref<RowDVector<T>>, offset: usize) -> usize;
167 fn copy_into_row_major(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize;
168}
169
170macro_rules! copy_mat {
171 ($matsize:ident) => {
172 impl<T> CopyMat<T> for Ref<$matsize<T>>
173 where T: Clone
174 {
175 fn copy_into(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize {
176 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
177 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
178 for i in 0..src_ptr.len() {
179 dst_ptr[i + offset] = src_ptr[i].clone();
180 }
181 src_ptr.len()
182 }
183 fn copy_into_v(&self, dst: &Ref<DVector<T>>, offset: usize) -> usize {
184 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
185 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
186 for i in 0..src_ptr.len() {
187 dst_ptr[i + offset] = src_ptr[i].clone();
188 }
189 src_ptr.len()
190 }
191 fn copy_into_r(&self, dst: &Ref<RowDVector<T>>, offset: usize) -> usize {
192 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
193 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
194 for i in 0..src_ptr.len() {
195 dst_ptr[i + offset] = src_ptr[i].clone();
196 }
197 src_ptr.len()
198 }
199 fn copy_into_row_major(&self, dst: &Ref<DMatrix<T>>, offset: usize) -> usize {
200 let src_ptr = unsafe { (*(self.as_ptr())).clone() };
201 let mut dst_ptr = unsafe { &mut *(dst.as_ptr()) };
202 let src_rows = src_ptr.nrows();
203 let dest_rows = dst_ptr.nrows();
204
205 let stride = dest_rows - src_rows;
206 let mut offset = offset;
207 for ix in 0..src_ptr.len() {
208 dst_ptr[offset] = src_ptr[ix].clone();
209 offset += ((ix + 1) % src_rows == 0) as usize * stride + 1;
210 }
211 src_rows
212 }}};}
213
214#[cfg(feature = "MatrixD")]
215copy_mat!(DMatrix);
216#[cfg(feature = "Matrix1")]
217copy_mat!(Matrix1);
218#[cfg(feature = "Matrix2")]
219copy_mat!(Matrix2);
220#[cfg(feature = "Matrix3")]
221copy_mat!(Matrix3);
222#[cfg(feature = "Matrix4")]
223copy_mat!(Matrix4);
224#[cfg(feature = "Matrix2x3")]
225copy_mat!(Matrix2x3);
226#[cfg(feature = "Matrix3x2")]
227copy_mat!(Matrix3x2);
228#[cfg(feature = "Vector2")]
229copy_mat!(Vector2);
230#[cfg(feature = "Vector3")]
231copy_mat!(Vector3);
232#[cfg(feature = "Vector4")]
233copy_mat!(Vector4);
234#[cfg(feature = "VectorD")]
235copy_mat!(DVector);
236#[cfg(feature = "RowVector2")]
237copy_mat!(RowVector2);
238#[cfg(feature = "RowVector3")]
239copy_mat!(RowVector3);
240#[cfg(feature = "RowVector4")]
241copy_mat!(RowVector4);
242#[cfg(feature = "RowVectorD")]
243copy_mat!(RowDVector);
244
245impl<T> Hash for Matrix<T>
246where T: Hash + na::Scalar
247{
248 fn hash<H: Hasher>(&self, state: &mut H) {
249 match self {
250 #[cfg(feature = "RowVector4")]
251 Matrix::RowVector4(x) => x.borrow().hash(state),
252 #[cfg(feature = "RowVector3")]
253 Matrix::RowVector3(x) => x.borrow().hash(state),
254 #[cfg(feature = "RowVector2")]
255 Matrix::RowVector2(x) => x.borrow().hash(state),
256 #[cfg(feature = "RowVectorD")]
257 Matrix::RowDVector(x) => x.borrow().hash(state),
258 #[cfg(feature = "Vector4")]
259 Matrix::Vector4(x) => x.borrow().hash(state),
260 #[cfg(feature = "Vector3")]
261 Matrix::Vector3(x) => x.borrow().hash(state),
262 #[cfg(feature = "Vector2")]
263 Matrix::Vector2(x) => x.borrow().hash(state),
264 #[cfg(feature = "VectorD")]
265 Matrix::DVector(x) => x.borrow().hash(state),
266 #[cfg(feature = "Matrix4")]
267 Matrix::Matrix4(x) => x.borrow().hash(state),
268 #[cfg(feature = "Matrix3")]
269 Matrix::Matrix3(x) => x.borrow().hash(state),
270 #[cfg(feature = "Matrix2")]
271 Matrix::Matrix2(x) => x.borrow().hash(state),
272 #[cfg(feature = "Matrix1")]
273 Matrix::Matrix1(x) => x.borrow().hash(state),
274 #[cfg(feature = "Matrix3x2")]
275 Matrix::Matrix3x2(x) => x.borrow().hash(state),
276 #[cfg(feature = "Matrix2x3")]
277 Matrix::Matrix2x3(x) => x.borrow().hash(state),
278 #[cfg(feature = "MatrixD")]
279 Matrix::DMatrix(x) => x.borrow().hash(state),
280 }
281 }
282}
283
284
285pub trait PrettyPrint {
286 fn pretty_print(&self) -> String;
287}
288
289impl PrettyPrint for String {
290 fn pretty_print(&self) -> String {
291 format!("\"{}\"", self)
292 }
293}
294
295impl PrettyPrint for Value {
296 fn pretty_print(&self) -> String {
297 self.pretty_print()
298 }
299}
300
301macro_rules! impl_pretty_print {
302 ($t:ty) => {
303 impl PrettyPrint for $t {
304 fn pretty_print(&self) -> String {
305 format!("{}", self)
306 }
307 }
308 };
309}
310
311impl_pretty_print!(bool);
312impl_pretty_print!(i8);
313impl_pretty_print!(i16);
314impl_pretty_print!(i32);
315impl_pretty_print!(i64);
316impl_pretty_print!(i128);
317impl_pretty_print!(u8);
318impl_pretty_print!(u16);
319impl_pretty_print!(u32);
320impl_pretty_print!(u64);
321impl_pretty_print!(u128);
322impl_pretty_print!(F32);
323impl_pretty_print!(F64);
324impl_pretty_print!(usize);
325
326impl<T> PrettyPrint for Matrix<T>
327where T: Debug + Display + Clone + PartialEq + 'static + PrettyPrint
328{
329 fn pretty_print(&self) -> String {
330 let mut builder = Builder::default();
331 match self {
332 #[cfg(feature = "RowVector4")]
333 Matrix::RowVector4(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
334 #[cfg(feature = "RowVector3")]
335 Matrix::RowVector3(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
336 #[cfg(feature = "RowVector2")]
337 Matrix::RowVector2(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
338 #[cfg(feature = "RowVectorD")]
339 Matrix::RowDVector(vec) => {
340 let vec_brrw = vec.borrow();
341 let vec_str = if vec_brrw.ncols() > 20 {
342 let mut vec_str = vec_brrw.row(0).iter().take(10).chain(vec_brrw.row(0).iter().rev().take(9).rev()).map(|x| x.pretty_print()).collect::<Vec<_>>();
343 vec_str.insert(10,"...".to_string());
344 vec_str
345 } else {
346 vec_brrw.row(0).iter().map(|x| format!("{:?}", x)).collect::<Vec<_>>()
347 };
348 builder.push_record(vec_str);
349 }
350 #[cfg(feature = "Vector4")]
351 Matrix::Vector4(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
352 #[cfg(feature = "Vector3")]
353 Matrix::Vector3(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
354 #[cfg(feature = "Vector2")]
355 Matrix::Vector2(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
356 #[cfg(feature = "VectorD")]
357 Matrix::DVector(vec) => {
358 let vec_brrw = vec.borrow();
359 let vec_str = if vec_brrw.nrows() > 20 {
360 let mut vec_str = vec_brrw.column(0).iter().take(10).chain(vec_brrw.column(0).iter().rev().take(9).rev()).map(|x| x.pretty_print()).collect::<Vec<_>>();
361 vec_str.insert(10,"...".to_string());
362 vec_str
363 } else {
364 vec_brrw.column(0).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()
365 };
366 for r in vec_str {
367 builder.push_record(vec![r]);
368 }
369 }
370 #[cfg(feature = "Matrix4")]
371 Matrix::Matrix4(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
372 #[cfg(feature = "Matrix3")]
373 Matrix::Matrix3(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
374 #[cfg(feature = "Matrix2")]
375 Matrix::Matrix2(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
376 #[cfg(feature = "Matrix1")]
377 Matrix::Matrix1(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
378 #[cfg(feature = "Matrix3x2")]
379 Matrix::Matrix3x2(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
380 #[cfg(feature = "Matrix2x3")]
381 Matrix::Matrix2x3(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
382 #[cfg(feature = "MatrixD")]
383 Matrix::DMatrix(vec) => {let vec_brrw = vec.borrow();(0..vec_brrw.nrows()).for_each(|i| builder.push_record(vec_brrw.row(i).iter().map(|x| x.pretty_print()).collect::<Vec<_>>()));}
384 _ => todo!(),
385 };
386 let matrix_style = Style::empty()
387 .top(' ')
388 .left('┃')
389 .right('┃')
390 .bottom(' ')
391 .vertical(' ')
392 .intersection_bottom(' ')
393 .corner_top_left('┏')
394 .corner_top_right('┓')
395 .corner_bottom_left('┗')
396 .corner_bottom_right('┛');
397 let mut table = builder.build();
398 table.with(matrix_style);
399 format!("{table}")
400 }
401}
402
403fn quoted<T: Display + Any>(val: &T) -> String {
404 if let Some(s) = (val as &dyn Any).downcast_ref::<String>() {
405 format!("<div class='mech-string'>\"{}\"</div>", s)
406 } else if let Some(s) = (val as &dyn Any).downcast_ref::<bool>() {
407 format!("<div class='mech-boolean'>{}</div<", s)
408 } else {
409 format!("<div class='mech-number'>{}</div>", val)
410 }
411}
412
413impl<T> Matrix<T>
414where T: Debug + Display + Clone + PartialEq + 'static + PrettyPrint
415{
416
417 pub fn to_html(&self) -> String {
418 let size = self.shape();
419 let mut html = String::new();
420 html.push_str("<table class='mech-matrix'>");
421 for i in 0..size[0] {
422 html.push_str("<tr>");
423 for j in 0..size[1] {
424 let value = self.index2d(i+1, j+1);
425 html.push_str(&format!("<td>{}</td>", quoted(&value)));
426 }
427 html.push_str("</tr>");
428 }
429 format!("<div class='mech-matrix-outer'><div class='mech-matrix-inner'></div>{}</div>", html)
430 }
431
432}
433
434impl<T> Matrix<T>
435where T: Debug + Clone + PartialEq + 'static
436{
437
438 pub fn append(&mut self, other: &Matrix<T>) -> MResult<()> {
439 match (self, other) {
440 #[cfg(feature = "VectorD")]
441 (Matrix::DVector(lhs), Matrix::DVector(rhs)) => {
442 let mut lhs = lhs.borrow_mut();
443 let rhs = rhs.borrow();
444 let old_len = lhs.len();
445 lhs.resize_vertically_mut(old_len + rhs.len(), rhs[0].clone());
446 for (i, val) in rhs.iter().enumerate() {
447 lhs[old_len + i] = val.clone();
448 }
449 Ok(())
450 }
451 #[cfg(feature = "RowVectorD")]
452 (Matrix::RowDVector(lhs), Matrix::RowDVector(rhs)) => {
453 let mut lhs = lhs.borrow_mut();
454 let rhs = rhs.borrow();
455 let old_len = lhs.len();
456 lhs.resize_horizontally_mut(old_len + rhs.len(), rhs[0].clone());
457 for (i, val) in rhs.iter().enumerate() {
458 lhs[old_len + i] = val.clone();
459 }
460 Ok(())
461 }
462 _ => {
463 return Err(MechError{
464 id: line!(),
465 file: file!().to_string(),
466 tokens: vec![],
467 msg: "".to_string(),
468 kind: MechErrorKind::None,
469 });
470 }
471 }
472 }
473
474 pub fn push(&mut self, value: T) -> MResult<()> {
475 match self {
476 #[cfg(feature = "RowVectorD")]
477 Matrix::RowDVector(vec) => {
478 let mut vec = vec.borrow_mut();
479 let new_len = vec.ncols() + 1;
480 vec.resize_horizontally_mut(new_len, value.clone()); Ok(())
482 }
483 #[cfg(feature = "VectorD")]
484 Matrix::DVector(vec) => {
485 let mut vec = vec.borrow_mut();
486 let new_len = vec.nrows() + 1;
487 vec.resize_vertically_mut(new_len, value.clone()); Ok(())
489 }
490 _ => {
491 return Err(MechError{
492 id: line!(),
493 file: file!().to_string(),
494 tokens: vec![],
495 msg: "".to_string(),
496 kind: MechErrorKind::None,
497 });
498 }
499 }
500 }
501
502 pub fn rows(&self) -> usize {
503 let size = self.shape();
504 size[0]
505 }
506
507 pub fn cols(&self) -> usize {
508 let size = self.shape();
509 size[1]
510 }
511
512 pub fn size_of(&self) -> usize {
513 let vec = self.as_vec();
514 vec.capacity() * size_of::<T>()
515 }
516
517 pub fn resize_vertically(&mut self, new_size: usize, fill_value: T) -> MResult<()> {
518 match self {
519 #[cfg(feature = "RowVectorD")]
520 Matrix::RowDVector(vec) => {
521 let mut vec = vec.borrow_mut();
522 vec.resize_horizontally_mut(new_size, fill_value);
523 Ok(())
524 }
525 #[cfg(feature = "VectorD")]
526 Matrix::DVector(vec) => {
527 let mut vec = vec.borrow_mut();
528 vec.resize_vertically_mut(new_size, fill_value);
529 Ok(())
530 }
531 _ => {
532 return Err(MechError{
533 id: line!(),
534 file: file!().to_string(),
535 tokens: vec![],
536 msg: "".to_string(),
537 kind: MechErrorKind::None,
538 });
539 }
540 }
541 }
542
543 pub fn get_copyable_matrix(&self) -> Box<dyn CopyMat<T>> {
544 match self {
545 #[cfg(feature = "RowVector4")]
546 Matrix::RowVector4(ref x) => Box::new(x.clone()),
547 #[cfg(feature = "RowVector3")]
548 Matrix::RowVector3(ref x) => Box::new(x.clone()),
549 #[cfg(feature = "RowVector2")]
550 Matrix::RowVector2(ref x) => Box::new(x.clone()),
551 #[cfg(feature = "RowVectorD")]
552 Matrix::RowDVector(ref x) => Box::new(x.clone()),
553 #[cfg(feature = "Vector4")]
554 Matrix::Vector4(ref x) => Box::new(x.clone()),
555 #[cfg(feature = "Vector3")]
556 Matrix::Vector3(ref x) => Box::new(x.clone()),
557 #[cfg(feature = "Vector2")]
558 Matrix::Vector2(ref x) => Box::new(x.clone()),
559 #[cfg(feature = "VectorD")]
560 Matrix::DVector(ref x) => Box::new(x.clone()),
561 #[cfg(feature = "Matrix4")]
562 Matrix::Matrix4(ref x) => Box::new(x.clone()),
563 #[cfg(feature = "Matrix3")]
564 Matrix::Matrix3(ref x) => Box::new(x.clone()),
565 #[cfg(feature = "Matrix2")]
566 Matrix::Matrix2(ref x) => Box::new(x.clone()),
567 #[cfg(feature = "Matrix1")]
568 Matrix::Matrix1(ref x) => Box::new(x.clone()),
569 #[cfg(feature = "Matrix3x2")]
570 Matrix::Matrix3x2(ref x) => Box::new(x.clone()),
571 #[cfg(feature = "Matrix2x3")]
572 Matrix::Matrix2x3(ref x) => Box::new(x.clone()),
573 #[cfg(feature = "MatrixD")]
574 Matrix::DMatrix(ref x) => Box::new(x.clone()),
575 }
576 }
577
578 pub fn shape(&self) -> Vec<usize> {
579 let shape = match self {
580 #[cfg(feature = "RowVector4")]
581 Matrix::RowVector4(x) => x.borrow().shape(),
582 #[cfg(feature = "RowVector3")]
583 Matrix::RowVector3(x) => x.borrow().shape(),
584 #[cfg(feature = "RowVector2")]
585 Matrix::RowVector2(x) => x.borrow().shape(),
586 #[cfg(feature = "RowVectorD")]
587 Matrix::RowDVector(x) => x.borrow().shape(),
588 #[cfg(feature = "Vector4")]
589 Matrix::Vector4(x) => x.borrow().shape(),
590 #[cfg(feature = "Vector3")]
591 Matrix::Vector3(x) => x.borrow().shape(),
592 #[cfg(feature = "Vector2")]
593 Matrix::Vector2(x) => x.borrow().shape(),
594 #[cfg(feature = "VectorD")]
595 Matrix::DVector(x) => x.borrow().shape(),
596 #[cfg(feature = "Matrix4")]
597 Matrix::Matrix4(x) => x.borrow().shape(),
598 #[cfg(feature = "Matrix3")]
599 Matrix::Matrix3(x) => x.borrow().shape(),
600 #[cfg(feature = "Matrix2")]
601 Matrix::Matrix2(x) => x.borrow().shape(),
602 #[cfg(feature = "Matrix1")]
603 Matrix::Matrix1(x) => x.borrow().shape(),
604 #[cfg(feature = "Matrix3x2")]
605 Matrix::Matrix3x2(x) => x.borrow().shape(),
606 #[cfg(feature = "Matrix2x3")]
607 Matrix::Matrix2x3(x) => x.borrow().shape(),
608 #[cfg(feature = "MatrixD")]
609 Matrix::DMatrix(x) => x.borrow().shape(),
610 };
611 vec![shape.0, shape.1]
612 }
613
614 pub fn index1d(&self, ix: usize) -> T {
615 match self {
616 #[cfg(feature = "RowVector4")]
617 Matrix::RowVector4(x) => (*x.borrow().index(ix-1)).clone(),
618 #[cfg(feature = "RowVector3")]
619 Matrix::RowVector3(x) => (*x.borrow().index(ix-1)).clone(),
620 #[cfg(feature = "RowVector2")]
621 Matrix::RowVector2(x) => (*x.borrow().index(ix-1)).clone(),
622 #[cfg(feature = "RowVectorD")]
623 Matrix::RowDVector(x) => (*x.borrow().index(ix-1)).clone(),
624 #[cfg(feature = "Vector4")]
625 Matrix::Vector4(x) => (*x.borrow().index(ix-1)).clone(),
626 #[cfg(feature = "Vector3")]
627 Matrix::Vector3(x) => (*x.borrow().index(ix-1)).clone(),
628 #[cfg(feature = "Vector2")]
629 Matrix::Vector2(x) => (*x.borrow().index(ix-1)).clone(),
630 #[cfg(feature = "VectorD")]
631 Matrix::DVector(x) => (*x.borrow().index(ix-1)).clone(),
632 #[cfg(feature = "Matrix4")]
633 Matrix::Matrix4(x) => (*x.borrow().index(ix-1)).clone(),
634 #[cfg(feature = "Matrix3")]
635 Matrix::Matrix3(x) => (*x.borrow().index(ix-1)).clone(),
636 #[cfg(feature = "Matrix2")]
637 Matrix::Matrix2(x) => (*x.borrow().index(ix-1)).clone(),
638 #[cfg(feature = "Matrix1")]
639 Matrix::Matrix1(x) => (*x.borrow().index(ix-1)).clone(),
640 #[cfg(feature = "Matrix3x2")]
641 Matrix::Matrix3x2(x) => (*x.borrow().index(ix-1)).clone(),
642 #[cfg(feature = "Matrix2x3")]
643 Matrix::Matrix2x3(x) => (*x.borrow().index(ix-1)).clone(),
644 #[cfg(feature = "MatrixD")]
645 Matrix::DMatrix(x) => (*x.borrow().index(ix-1)).clone(),
646 }
647 }
648
649 pub fn set_index1d(&self, index: usize, value: T) {
650 match self {
651 #[cfg(feature = "RowVector4")]
652 Matrix::RowVector4(v) => v.borrow_mut()[index] = value,
653 #[cfg(feature = "RowVector3")]
654 Matrix::RowVector3(v) => v.borrow_mut()[index] = value,
655 #[cfg(feature = "RowVector2")]
656 Matrix::RowVector2(v) => v.borrow_mut()[index] = value,
657 #[cfg(feature = "RowVectorD")]
658 Matrix::RowDVector(v) => v.borrow_mut()[index] = value,
659 #[cfg(feature = "Vector4")]
660 Matrix::Vector4(v) => v.borrow_mut()[index] = value,
661 #[cfg(feature = "Vector3")]
662 Matrix::Vector3(v) => v.borrow_mut()[index] = value,
663 #[cfg(feature = "Vector2")]
664 Matrix::Vector2(v) => v.borrow_mut()[index] = value,
665 #[cfg(feature = "VectorD")]
666 Matrix::DVector(v) => v.borrow_mut()[index] = value,
667 #[cfg(feature = "Matrix1")]
668 Matrix::Matrix1(m) => m.borrow_mut()[index] = value,
669 #[cfg(feature = "Matrix2")]
670 Matrix::Matrix2(m) => m.borrow_mut()[index] = value,
671 #[cfg(feature = "Matrix3")]
672 Matrix::Matrix3(m) => m.borrow_mut()[index] = value,
673 #[cfg(feature = "Matrix4")]
674 Matrix::Matrix4(m) => m.borrow_mut()[index] = value,
675 #[cfg(feature = "Matrix2x3")]
676 Matrix::Matrix2x3(m) => m.borrow_mut()[index] = value,
677 #[cfg(feature = "Matrix3x2")]
678 Matrix::Matrix3x2(m) => m.borrow_mut()[index] = value,
679 #[cfg(feature = "MatrixD")]
680 Matrix::DMatrix(m) => m.borrow_mut()[index] = value,
681 }
682 }
683
684 pub fn set(&self, elements: Vec<T>) {
685 match self {
686 #[cfg(feature = "RowVector4")]
687 Matrix::RowVector4(x) => {
688 let mut x = x.borrow_mut();
689 x[0] = elements[0].clone();
690 x[1] = elements[1].clone();
691 x[2] = elements[2].clone();
692 x[3] = elements[3].clone();
693 }
694 #[cfg(feature = "RowVector3")]
695 Matrix::RowVector3(x) => {
696 let mut x = x.borrow_mut();
697 x[0] = elements[0].clone();
698 x[1] = elements[1].clone();
699 x[2] = elements[2].clone();
700 }
701 #[cfg(feature = "RowVector2")]
702 Matrix::RowVector2(x) => {
703 let mut x = x.borrow_mut();
704 x[0] = elements[0].clone();
705 x[1] = elements[1].clone();
706 }
707 #[cfg(feature = "RowVectorD")]
708 Matrix::RowDVector(x) => {let mut x = x.borrow_mut();for i in 0..elements.len() {x[i] = elements[i].clone();}},
709 #[cfg(feature = "Vector4")]
710 Matrix::Vector4(x) => {
711 let mut x = x.borrow_mut();
712 x[0] = elements[0].clone();
713 x[1] = elements[1].clone();
714 x[2] = elements[2].clone();
715 x[3] = elements[3].clone();
716 }
717 #[cfg(feature = "Vector3")]
718 Matrix::Vector3(x) => {
719 let mut x = x.borrow_mut();
720 x[0] = elements[0].clone();
721 x[1] = elements[1].clone();
722 x[2] = elements[2].clone();
723 }
724 #[cfg(feature = "Vector2")]
725 Matrix::Vector2(x) => {
726 let mut x = x.borrow_mut();
727 x[0] = elements[0].clone();
728 x[1] = elements[1].clone();
729 }
730 #[cfg(feature = "VectorD")]
731 Matrix::DVector(x) => {let mut x = x.borrow_mut();for i in 0..elements.len() {x[i] = elements[i].clone();}},
732 #[cfg(feature = "Matrix4")]
733 Matrix::Matrix4(x) => {
734 let mut x = x.borrow_mut();
735 x[0] = elements[0].clone();
736 x[1] = elements[1].clone();
737 x[2] = elements[2].clone();
738 x[3] = elements[3].clone();
739 x[4] = elements[4].clone();
740 x[5] = elements[5].clone();
741 x[6] = elements[6].clone();
742 x[7] = elements[7].clone();
743 x[8] = elements[8].clone();
744 x[9] = elements[9].clone();
745 x[10] = elements[10].clone();
746 x[11] = elements[11].clone();
747 x[12] = elements[12].clone();
748 x[13] = elements[13].clone();
749 x[14] = elements[14].clone();
750 x[15] = elements[15].clone();
751 }
752 #[cfg(feature = "Matrix3")]
753 Matrix::Matrix3(x) => {
754 let mut x = x.borrow_mut();
755 x[0] = elements[0].clone();
756 x[1] = elements[1].clone();
757 x[2] = elements[2].clone();
758 x[3] = elements[3].clone();
759 x[4] = elements[4].clone();
760 x[5] = elements[5].clone();
761 x[6] = elements[6].clone();
762 x[7] = elements[7].clone();
763 x[8] = elements[8].clone();
764 }
765 #[cfg(feature = "Matrix2")]
766 Matrix::Matrix2(x) => {
767 let mut x = x.borrow_mut();
768 x[0] = elements[0].clone();
769 x[1] = elements[1].clone();
770 x[2] = elements[2].clone();
771 x[3] = elements[3].clone();
772 }
773 #[cfg(feature = "Matrix1")]
774 Matrix::Matrix1(x) => {let mut x = x.borrow_mut();x[0] = elements[0].clone();},
775 #[cfg(feature = "Matrix3x2")]
776 Matrix::Matrix3x2(x) => {
777 let mut x = x.borrow_mut();
778 x[0] = elements[0].clone();
779 x[1] = elements[1].clone();
780 x[2] = elements[2].clone();
781 x[3] = elements[3].clone();
782 x[4] = elements[4].clone();
783 x[5] = elements[5].clone();
784 }
785 #[cfg(feature = "Matrix2x3")]
786 Matrix::Matrix2x3(x) => {
787 let mut x = x.borrow_mut();
788 x[0] = elements[0].clone();
789 x[1] = elements[1].clone();
790 x[2] = elements[2].clone();
791 x[3] = elements[3].clone();
792 x[4] = elements[4].clone();
793 x[5] = elements[5].clone();
794 }
795 #[cfg(feature = "MatrixD")]
796 Matrix::DMatrix(x) => {let mut x = x.borrow_mut();for i in 0..elements.len() {x[i] = elements[i].clone();}},
797 }
798 }
799
800 pub fn index2d(&self, row: usize, col: usize) -> T {
801 match self {
802 #[cfg(feature = "RowVector4")]
803 Matrix::RowVector4(x) => (*x.borrow().index((row-1,col-1))).clone(),
804 #[cfg(feature = "RowVector3")]
805 Matrix::RowVector3(x) => (*x.borrow().index((row-1,col-1))).clone(),
806 #[cfg(feature = "RowVector2")]
807 Matrix::RowVector2(x) => (*x.borrow().index((row-1,col-1))).clone(),
808 #[cfg(feature = "RowVectorD")]
809 Matrix::RowDVector(x) => (*x.borrow().index((row-1,col-1))).clone(),
810 #[cfg(feature = "Vector4")]
811 Matrix::Vector4(x) => (*x.borrow().index((row-1,col-1))).clone(),
812 #[cfg(feature = "Vector3")]
813 Matrix::Vector3(x) => (*x.borrow().index((row-1,col-1))).clone(),
814 #[cfg(feature = "Vector2")]
815 Matrix::Vector2(x) => (*x.borrow().index((row-1,col-1))).clone(),
816 #[cfg(feature = "VectorD")]
817 Matrix::DVector(x) => (*x.borrow().index((row-1,col-1))).clone(),
818 #[cfg(feature = "Matrix4")]
819 Matrix::Matrix4(x) => (*x.borrow().index((row-1,col-1))).clone(),
820 #[cfg(feature = "Matrix3")]
821 Matrix::Matrix3(x) => (*x.borrow().index((row-1,col-1))).clone(),
822 #[cfg(feature = "Matrix2")]
823 Matrix::Matrix2(x) => (*x.borrow().index((row-1,col-1))).clone(),
824 #[cfg(feature = "Matrix1")]
825 Matrix::Matrix1(x) => (*x.borrow().index((row-1,col-1))).clone(),
826 #[cfg(feature = "Matrix3x2")]
827 Matrix::Matrix3x2(x) => (*x.borrow().index((row-1,col-1))).clone(),
828 #[cfg(feature = "Matrix2x3")]
829 Matrix::Matrix2x3(x) => (*x.borrow().index((row-1,col-1))).clone(),
830 #[cfg(feature = "MatrixD")]
831 Matrix::DMatrix(x) => (*x.borrow().index((row-1,col-1))).clone(),
832 }
833 }
834
835 pub fn as_vec(&self) -> Vec<T> {
836 match self {
837 #[cfg(feature = "RowVector4")]
838 Matrix::RowVector4(x) => x.borrow().as_slice().to_vec(),
839 #[cfg(feature = "RowVector3")]
840 Matrix::RowVector3(x) => x.borrow().as_slice().to_vec(),
841 #[cfg(feature = "RowVector2")]
842 Matrix::RowVector2(x) => x.borrow().as_slice().to_vec(),
843 #[cfg(feature = "RowVectorD")]
844 Matrix::RowDVector(x) => x.borrow().as_slice().to_vec(),
845 #[cfg(feature = "Vector4")]
846 Matrix::Vector4(x) => x.borrow().as_slice().to_vec(),
847 #[cfg(feature = "Vector3")]
848 Matrix::Vector3(x) => x.borrow().as_slice().to_vec(),
849 #[cfg(feature = "Vector2")]
850 Matrix::Vector2(x) => x.borrow().as_slice().to_vec(),
851 #[cfg(feature = "VectorD")]
852 Matrix::DVector(x) => x.borrow().as_slice().to_vec(),
853 #[cfg(feature = "Matrix4")]
854 Matrix::Matrix4(x) => x.borrow().as_slice().to_vec(),
855 #[cfg(feature = "Matrix3")]
856 Matrix::Matrix3(x) => x.borrow().as_slice().to_vec(),
857 #[cfg(feature = "Matrix2")]
858 Matrix::Matrix2(x) => x.borrow().as_slice().to_vec(),
859 #[cfg(feature = "Matrix1")]
860 Matrix::Matrix1(x) => x.borrow().as_slice().to_vec(),
861 #[cfg(feature = "Matrix3x2")]
862 Matrix::Matrix3x2(x) => x.borrow().as_slice().to_vec(),
863 #[cfg(feature = "Matrix2x3")]
864 Matrix::Matrix2x3(x) => x.borrow().as_slice().to_vec(),
865 #[cfg(feature = "MatrixD")]
866 Matrix::DMatrix(x) => x.borrow().as_slice().to_vec(),
867 }
868 }
869
870}
871
872macro_rules! impl_to_value_for_matrix {
873 ($t:ty, $variant:ident) => {
874 impl ToValue for Matrix<$t> {
875 fn to_value(&self) -> Value {
876 Value::$variant(self.clone())
877 }
878 }
879 };
880}
881
882impl_to_value_for_matrix!(Value, MatrixValue);
883impl_to_value_for_matrix!(F64, MatrixF64);
884impl_to_value_for_matrix!(F32, MatrixF32);
885impl_to_value_for_matrix!(i8, MatrixI8);
886impl_to_value_for_matrix!(i16, MatrixI16);
887impl_to_value_for_matrix!(i32, MatrixI32);
888impl_to_value_for_matrix!(i64, MatrixI64);
889impl_to_value_for_matrix!(i128, MatrixI128);
890impl_to_value_for_matrix!(u8, MatrixU8);
891impl_to_value_for_matrix!(u16, MatrixU16);
892impl_to_value_for_matrix!(u32, MatrixU32);
893impl_to_value_for_matrix!(u64, MatrixU64);
894impl_to_value_for_matrix!(u128, MatrixU128);
895impl_to_value_for_matrix!(bool, MatrixBool);
896impl_to_value_for_matrix!(String, MatrixString);