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;
123 virtual void normalize();
125 virtual void randomize();
127 void assign(
double val) { assign_val(val); }
129 void assign(
const double* v) { assign_p(v); }
134 virtual void assign_val(
double val);
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);
149 virtual void set_element(
int i,
double val) = 0;
151 virtual void accumulate_element(
int,
double) = 0;
153 virtual double get_element(
int i)
const = 0;
156 { accumulate_product_sv(m,v); }
158 { accumulate_product_rv(m,v); }
162 virtual void accumulate(
const SCVector*v) = 0;
164 virtual void accumulate(
const SCMatrix*m) = 0;
166 virtual double scalar_product(
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;
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;
221 virtual void randomize();
223 void assign(
double val) { assign_val(val); }
225 void assign(
const double* m) { assign_p(m); }
227 void assign(
const double** m) { assign_pp(m); }
231 virtual void assign_val(
double val);
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);
246 virtual void scale_diagonal(
double val);
248 virtual void shift_diagonal(
double val);
261 virtual double get_element(
int,
int)
const = 0;
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;
274 virtual void accumulate_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;
285 virtual void accumulate_row(
SCVector *v,
int i) =0;
286 virtual void accumulate_column(
SCVector *v,
int i) =0;
289 virtual void accumulate(
const SCMatrix* m) = 0;
292 virtual void accumulate(
const SCVector*) = 0;
296 { accumulate_product_rr(m1,m2); }
298 { accumulate_product_rs(m1,m2); }
300 { accumulate_product_rd(m1,m2); }
302 { accumulate_product_sr(m1,m2); }
304 { accumulate_product_dr(m1,m2); }
306 { accumulate_product_ss(m1,m2); }
314 virtual void transpose_this() = 0;
316 virtual double trace() =0;
318 virtual double invert_this() = 0;
320 virtual double determ_this() = 0;
325 virtual double solve_this(
SCVector*) = 0;
326 virtual void gen_invert_this();
335 virtual int schmidt_orthog_tol(
SymmSCMatrix*,
double tol,
double*res=0)=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;
381 virtual void randomize();
383 void assign(
double val) { assign_val(val); }
385 void assign(
const double* m) { assign_p(m); }
387 void assign(
const double** m) { assign_pp(m); }
392 virtual void assign_val(
double val);
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);
406 virtual void scale_diagonal(
double);
408 virtual void shift_diagonal(
double);
412 int n()
const {
return d->n(); }
422 virtual double get_element(
int,
int)
const = 0;
423 virtual void set_element(
int,
int,
double) = 0;
424 virtual void accumulate_element(
int,
int,
double) = 0;
429 virtual SCMatrix * get_subblock(
int br,
int er,
int bc,
int ec) =0;
433 virtual void assign_subblock(
SCMatrix *m,
int,
int,
int,
int) =0;
434 virtual void assign_subblock(
SymmSCMatrix *m,
int,
int) =0;
437 virtual void accumulate_subblock(
SCMatrix *m,
int,
int,
int,
int) =0;
438 virtual void accumulate_subblock(
SymmSCMatrix *m,
int,
int) =0;
441 virtual SCVector * get_row(
int i) =0;
444 virtual void assign_row(
SCVector *v,
int i) =0;
447 virtual void accumulate_row(
SCVector *v,
int i) =0;
455 virtual void accumulate_symmetric_sum(
SCMatrix*) = 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*);
465 virtual double scalar_product(
SCVector* v);
467 virtual double trace() = 0;
469 virtual double invert_this() = 0;
471 virtual double determ_this() = 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;
521 virtual void randomize();
523 void assign(
double val) { assign_val(val); }
525 void assign(
const double*p) { assign_p(p); }
530 virtual void assign_val(
double val);
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(); }
552 virtual double get_element(
int)
const = 0;
553 virtual void set_element(
int,
double) = 0;
554 virtual void accumulate_element(
int,
double) = 0;
558 virtual double trace() = 0;
560 virtual double determ_this() = 0;
562 virtual double invert_this() = 0;
564 virtual void gen_invert_this() = 0;
573 void print(
const char* title=0,
575 virtual void vprint(
const char* title=0,
584 SCMatrixSubblockIter::Access) = 0;
587 SCMatrixSubblockIter::Access) = 0;
virtual void print(std::ostream &=ExEnv::out0()) const
Print the object.
Ref< SCMatrixKit > kit() const
Return the SCMatrixKit used to create this object.
Definition: abstract.h:109
void assign(SymmSCMatrix *m)
Make this have the same elements as m.
Definition: abstract.h:390
void assign(double val)
Set all elements to val.
Definition: abstract.h:383
int n() const
Return the dimension.
Definition: abstract.h:412
virtual SCMatrix * matrix(const RefSCDimension &, const RefSCDimension &)=0
Given the dimensions, create matrices or vectors.
Ref< SCMatrixKit > kit() const
Return the SCMatrixKit used to create this object.
Definition: abstract.h:212
Serializes objects that derive from SavableState.
Definition: stateout.h:61
void assign(const double **m)
Assign element i, j to m[i][j].
Definition: abstract.h:387
void assign(double val)
Set all elements to val.
Definition: abstract.h:223
void accumulate_product(SymmSCMatrix *m, SCVector *v)
Sum the result of m times v into this.
Definition: abstract.h:155
int nrow() const
Return the number of rows.
Definition: abstract.h:215
int ncol() const
Return the number of columns.
Definition: abstract.h:217
The SCMatrix class is the abstract base class for general double valued n by m matrices.
Definition: abstract.h:195
RefSCDimension dim() const
Return the RefSCDimension corresponding to this vector.
Definition: abstract.h:147
Classes which need runtime information about themselves and their relationship to other classes can v...
Definition: class.h:244
RefSCDimension dim() const
Return the dimension.
Definition: abstract.h:550
A template class that maintains references counts.
Definition: ref.h:332
The SCMatrixKit abstract class acts as a factory for producing matrices.
Definition: abstract.h:58
int n() const
Return the dimension.
Definition: abstract.h:542
Ref< SCMatrixKit > kit() const
Return the SCMatrixKit object that created this object.
Definition: abstract.h:373
void assign(const double **m)
Assign element i, j to m[i][j].
Definition: abstract.h:227
The SymmSCMatrix class is the abstract base class for diagonal double valued matrices.
Definition: abstract.h:503
void assign(DiagSCMatrix *d_a)
Make this have the same elements as m.
Definition: abstract.h:528
void assign(double val)
Set all elements to val.
Definition: abstract.h:523
The RefSCDimension class is a smart pointer to an SCDimension specialization.
Definition: dim.h:156
Restores objects that derive from SavableState.
Definition: statein.h:70
The SCVector class is the abstract base class for double valued vectors.
Definition: abstract.h:97
static SCMatrixKit * default_matrixkit()
This returns a LocalSCMatrixKit, unless the default has been changed with set_default_matrixkit.
void assign(SCMatrix *m)
Make this have the same elements as m. The dimensions must match.
Definition: abstract.h:229
void assign(const double *m)
Assign element i, j to m[i*(i+1)/2+j].
Definition: abstract.h:385
static std::ostream & out0()
Return an ostream that writes from node 0.
void assign(SCVector *v)
Make this have the same elements as v.
Definition: abstract.h:132
The SymmSCMatrix class is the abstract base class for symmetric double valued matrices.
Definition: abstract.h:364
void assign(double val)
Assign all elements of this to val.
Definition: abstract.h:127
void assign(const double *v)
Assign element i to v[i] for all i.
Definition: abstract.h:129
SCMatrix * restore_matrix(StateIn &, const RefSCDimension &, const RefSCDimension &)
Given the dimensions and a StateIn object, restore matrices or vectors.
RefSCDimension dim() const
Return the dimension.
Definition: abstract.h:420
Ref< SCMatrixKit > kit() const
Return the SCMatrixKit used to create this object.
Definition: abstract.h:512
RefSCDimension rowdim() const
Return the row or column dimension.
Definition: abstract.h:258
void assign(const double *m)
Assign element i, j to m[ir*nrow()+j].
Definition: abstract.h:225
void assign(const double *p)
Assign element i, i to m[i].
Definition: abstract.h:525
int n() const
Return the length of the vector.
Definition: abstract.h:119