41 bool factored =
false;
43 double tolerance = 1
E-13;
47 unsigned refinement = 10;
63 void set_tolerance(
double);
65 void set_refinement(
unsigned);
66 void set_factored(
bool);
68 [[nodiscard]] virtual
bool is_empty() const = 0;
69 virtual
void zeros() = 0;
73 virtual
void unify(uword) = 0;
74 virtual
void nullify(uword) = 0;
76 [[nodiscard]] virtual
T max() const = 0;
78 virtual const
T& operator()(uword, uword) const = 0;
79 virtual
T& at(uword, uword) = 0;
81 [[nodiscard]] virtual const
T* memptr() const = 0;
82 virtual
T* memptr() = 0;
84 virtual
void operator+=(const shared_ptr<
MetaMat>&) = 0;
85 virtual
void operator-=(const shared_ptr<MetaMat>&) = 0;
88 virtual
void operator-=(const
triplet_form<T, uword>&) = 0;
90 virtual Mat<T> operator*(const Mat<T>&) = 0;
92 virtual
void operator*=(T) = 0;
94 Mat<T> solve(const Mat<T>&);
95 Mat<T> solve(const SpMat<T>&);
96 Mat<T> solve(Mat<T>&&);
97 Mat<T> solve(SpMat<T>&&);
99 virtual
int solve(Mat<T>&, const Mat<T>&) = 0;
100 virtual
int solve(Mat<T>&, const SpMat<T>&);
101 virtual
int solve(Mat<T>&, Mat<T>&&);
102 virtual
int solve(Mat<T>&, SpMat<T>&&);
104 [[nodiscard]] virtual
int sign_det() const = 0;
106 void save(const
char*);
108 virtual
void csc_condense();
109 virtual
void csr_condense();
112 template<
sp_d T> MetaMat<T>::MetaMat(const uword in_rows, const uword in_cols, const uword in_elem)
113 : triplet_mat(in_rows, in_cols)
128 if(0 != this->solve(X, B)) X.reset();
134 if(0 != this->solve(X, B)) X.reset();
140 if(0 != this->solve(X, std::forward<Mat<T>>(B))) X.reset();
146 if(0 != this->solve(X, std::forward<SpMat<T>>(B))) X.reset();
150 template<sp_d T>
int MetaMat<T>::solve(Mat<T>& X,
const SpMat<T>& B) {
return this->solve(X, Mat<T>(B)); }
164 for(uword J = 0; J < in_mat.
n_cols; ++J)
for(uword I = 0; I < in_mat.
n_rows; ++I) out_mat(I, J) = in_mat(I, J);
171 Mat<data_t> out_mat(in_mat.
n_rows, in_mat.
n_cols, fill::zeros);
172 for(index_t I = 0; I < in_mat.
n_elem; ++I) out_mat(in_mat.
row(I), in_mat.
col(I)) += in_mat.
val(I);
177 Mat<data_t> out_mat(in_mat.
n_rows, in_mat.
n_cols, fill::zeros);
180 for(index_t I = 0; I < in_mat.
n_elem; ++I) {
181 if(I >= in_mat.
row_mem()[c_idx]) ++c_idx;
189 Mat<data_t> out_mat(in_mat.
n_rows, in_mat.
n_cols, fill::zeros);
192 for(index_t I = 0; I < in_mat.
n_elem; ++I) {
193 if(I >= in_mat.
col_mem()[c_idx]) ++c_idx;
203 const sp_i auto n_rows = index_t(in_mat->n_rows);
204 const sp_i auto n_cols = index_t(in_mat->n_cols);
205 const sp_i auto n_elem = index_t(in_mat->n_elem);
208 for(index_t J = 0; J < n_cols; ++J)
for(index_t I = 0; I < n_rows; ++I) out_mat.
at(I, J) = in_mat->operator()(I, J);
void suanpan_error(const char *M,...)
Definition: print.cpp:116
concept sp_i
Definition: suanPan.h:232
unique_ptr< Material > make_copy(const shared_ptr< Material > &)
Definition: Material.cpp:359
concept sp_d
Definition: suanPan.h:231