28 #ifndef _math_scmat_abstract_h
29 #define _math_scmat_abstract_h
35 #include <util/group/message.h>
37 #include <util/state/state.h>
38 #include <math/scmat/dim.h>
39 #include <math/scmat/block.h>
106 virtual void restore(
StateIn&);
119 int n()
const {
return d->n(); }
121 virtual double maxabs()
const;
129 void assign(
const double* v) { assign_p(v); }
135 virtual void assign_p(
const double* v);
138 virtual void convert(
double* v)
const;
142 virtual void convert_accumulate(
SCVector*);
144 virtual void scale(
double val);
156 { accumulate_product_sv(m,v); }
158 { accumulate_product_rv(m,v); }
159 virtual void accumulate_product_sv(SymmSCMatrix* m, SCVector* v);
160 virtual void accumulate_product_rv(SCMatrix* m, SCVector* v) = 0;
162 virtual void accumulate(
const SCVector*v) = 0;
164 virtual void accumulate(
const SCMatrix*m) = 0;
168 virtual void element_op(
const Ref<SCElementOp>&) = 0;
169 virtual void element_op(
const Ref<SCElementOp2>&,
171 virtual void element_op(
const Ref<SCElementOp3>&,
172 SCVector*,SCVector*) = 0;
175 void print(
const char* title=0,std::ostream&out=
ExEnv::out0(),
int=10)
const;
176 virtual void vprint(
const char*title=0,std::ostream&out=
ExEnv::out0(),
187 SCMatrixSubblockIter::Access) = 0;
189 virtual Ref<SCMatrixSubblockIter>
all_blocks(SCMatrixSubblockIter::Access) = 0;
201 enum Transform { NormalTransform = 0, TransposeTransform = 1 };
209 virtual void restore(
StateIn&);
215 int nrow()
const {
return d1->n(); }
217 int ncol()
const {
return d2->n(); }
219 virtual double maxabs()
const;
225 void assign(
const double* m) { assign_p(m); }
227 void assign(
const double** m) { assign_pp(m); }
232 virtual void assign_p(
const double* m);
233 virtual void assign_pp(
const double** m);
237 virtual void convert(
double*)
const;
238 virtual void convert(
double**)
const;
242 virtual void convert_accumulate(
SCMatrix*);
244 virtual void scale(
double val);
262 virtual void set_element(
int,
int,
double) = 0;
263 virtual void accumulate_element(
int,
int,
double) = 0;
268 virtual SCMatrix *
get_subblock(
int br,
int er,
int bc,
int ec) =0;
271 virtual void assign_subblock(SCMatrix *m,
int,
int,
int,
int,
int=0,
int=0) =0;
277 virtual SCVector *
get_row(
int i) =0;
278 virtual SCVector * get_column(
int i) =0;
281 virtual void assign_row(SCVector *v,
int i) =0;
282 virtual void assign_column(SCVector *v,
int i) =0;
286 virtual void accumulate_column(SCVector *v,
int i) =0;
289 virtual void accumulate(
const SCMatrix* m) = 0;
290 virtual void accumulate(
const SymmSCMatrix* m) = 0;
291 virtual void accumulate(
const DiagSCMatrix* m) = 0;
295 void accumulate_product(SCMatrix*m1,SCMatrix*m2)
296 { accumulate_product_rr(m1,m2); }
297 void accumulate_product(SCMatrix*m1,SymmSCMatrix*m2)
298 { accumulate_product_rs(m1,m2); }
299 void accumulate_product(SCMatrix*m1,DiagSCMatrix*m2)
300 { accumulate_product_rd(m1,m2); }
301 void accumulate_product(SymmSCMatrix*m1,SCMatrix*m2)
302 { accumulate_product_sr(m1,m2); }
303 void accumulate_product(DiagSCMatrix*m1,SCMatrix*m2)
304 { accumulate_product_dr(m1,m2); }
305 void accumulate_product(SymmSCMatrix*m1,SymmSCMatrix*m2)
306 { accumulate_product_ss(m1,m2); }
307 virtual void accumulate_product_rr(SCMatrix*,SCMatrix*) = 0;
308 virtual void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
309 virtual void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
310 virtual void accumulate_product_sr(SymmSCMatrix*,SCMatrix*);
311 virtual void accumulate_product_dr(DiagSCMatrix*,SCMatrix*);
312 virtual void accumulate_product_ss(SymmSCMatrix*,SymmSCMatrix*);
316 virtual double trace() =0;
324 virtual void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
325 virtual double solve_this(SCVector*) = 0;
326 virtual void gen_invert_this();
338 virtual void element_op(
const Ref<SCElementOp>&) = 0;
339 virtual void element_op(
const Ref<SCElementOp2>&,
341 virtual void element_op(
const Ref<SCElementOp3>&,
342 SCMatrix*,SCMatrix*) = 0;
347 virtual void vprint(
const char*title=0,
356 SCMatrixSubblockIter::Access) = 0;
359 SCMatrixSubblockIter::Access) = 0;
377 virtual void restore(
StateIn&);
379 virtual double maxabs()
const;
385 void assign(
const double* m) { assign_p(m); }
387 void assign(
const double** m) { assign_pp(m); }
393 virtual void assign_p(
const double* m);
394 virtual void assign_pp(
const double** m);
397 virtual void convert(
double*)
const;
398 virtual void convert(
double**)
const;
404 virtual void scale(
double);
412 int n()
const {
return d->n(); }
423 virtual void set_element(
int,
int,
double) = 0;
424 virtual void accumulate_element(
int,
int,
double) = 0;
456 virtual void accumulate_symmetric_product(
SCMatrix*);
458 SCMatrix::Transform = SCMatrix::NormalTransform);
460 SCMatrix::Transform = SCMatrix::NormalTransform);
462 virtual void accumulate_symmetric_outer_product(
SCVector*);
467 virtual double trace() = 0;
473 virtual double solve_this(
SCVector*) = 0;
474 virtual void gen_invert_this() = 0;
486 virtual void vprint(
const char* title=0,
495 SCMatrixSubblockIter::Access) = 0;
498 SCMatrixSubblockIter::Access) = 0;
516 virtual void restore(
StateIn&);
519 virtual double maxabs()
const;
525 void assign(
const double*p) { assign_p(p); }
531 virtual void assign_p(
const double*);
534 virtual void convert(
double*)
const;
540 virtual void scale(
double);
542 int n()
const {
return d->n(); }
553 virtual void set_element(
int,
double) = 0;
554 virtual void accumulate_element(
int,
double) = 0;
558 virtual double trace() = 0;
573 void print(
const char* title=0,
575 virtual void vprint(
const char* title=0,
584 SCMatrixSubblockIter::Access) = 0;
587 SCMatrixSubblockIter::Access) = 0;