00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _math_scmat_abstract_h
00029 #define _math_scmat_abstract_h
00030
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034
00035 #include <util/group/message.h>
00036
00037 #include <util/state/state.h>
00038 #include <math/scmat/dim.h>
00039 #include <math/scmat/block.h>
00040 #include <iostream>
00041
00042 namespace sc {
00043
00044 class SCMatrix;
00045 class SymmSCMatrix;
00046 class DiagSCMatrix;
00047 class SCVector;
00048
00049 class SCElementOp;
00050 class SCElementOp2;
00051 class SCElementOp3;
00052
00053 class RefSCDimension;
00054
00058 class SCMatrixKit: public DescribedClass {
00059 protected:
00060 Ref<MessageGrp> grp_;
00061
00062 public:
00063 SCMatrixKit();
00064 SCMatrixKit(const Ref<KeyVal>&);
00065 ~SCMatrixKit();
00066
00067
00070 static SCMatrixKit* default_matrixkit();
00071 static void set_default_matrixkit(const Ref<SCMatrixKit> &);
00072
00073 Ref<MessageGrp> messagegrp() const;
00074
00076 virtual SCMatrix* matrix(const RefSCDimension&,const RefSCDimension&) = 0;
00077 virtual SymmSCMatrix* symmmatrix(const RefSCDimension&) = 0;
00078 virtual DiagSCMatrix* diagmatrix(const RefSCDimension&) = 0;
00079 virtual SCVector* vector(const RefSCDimension&) = 0;
00080
00083 SCMatrix* restore_matrix(StateIn&,
00084 const RefSCDimension&,
00085 const RefSCDimension&);
00086 SymmSCMatrix* restore_symmmatrix(StateIn&,
00087 const RefSCDimension&);
00088 DiagSCMatrix* restore_diagmatrix(StateIn&,
00089 const RefSCDimension&);
00090 SCVector* restore_vector(StateIn&,
00091 const RefSCDimension&);
00092 };
00093
00094
00097 class SCVector: public DescribedClass {
00098 protected:
00099 RefSCDimension d;
00100 Ref<SCMatrixKit> kit_;
00101 public:
00102 SCVector(const RefSCDimension&, SCMatrixKit *);
00103
00105 virtual void save(StateOut&);
00106 virtual void restore(StateIn&);
00107
00109 Ref<SCMatrixKit> kit() const { return kit_; }
00110
00111
00113 virtual SCVector* copy();
00115 virtual SCVector* clone();
00116
00117 virtual ~SCVector();
00119 int n() const { return d->n(); }
00121 virtual double maxabs() const;
00123 virtual void normalize();
00125 virtual void randomize();
00127 void assign(double val) { assign_val(val); }
00129 void assign(const double* v) { assign_p(v); }
00132 void assign(SCVector* v) { assign_v(v); }
00134 virtual void assign_val(double val);
00135 virtual void assign_p(const double* v);
00136 virtual void assign_v(SCVector *v);
00138 void convert(double* v) const { convert_p(v); }
00139 void convert(SCVector*v) { convert_v(v); }
00140 virtual void convert_p(double* v) const;
00141 virtual void convert_v(SCVector*);
00142 virtual void convert_accumulate(SCVector*);
00144 virtual void scale(double val);
00145
00147 RefSCDimension dim() const { return d; }
00149 virtual void set_element(int i,double val) = 0;
00151 virtual void accumulate_element(int,double) = 0;
00153 virtual double get_element(int i) const = 0;
00155 void accumulate_product(SymmSCMatrix* m, SCVector* v)
00156 { accumulate_product_sv(m,v); }
00157 void accumulate_product(SCMatrix* m, SCVector* v)
00158 { accumulate_product_rv(m,v); }
00159 virtual void accumulate_product_sv(SymmSCMatrix* m, SCVector* v);
00160 virtual void accumulate_product_rv(SCMatrix* m, SCVector* v) = 0;
00162 virtual void accumulate(const SCVector*v) = 0;
00164 virtual void accumulate(const SCMatrix*m) = 0;
00166 virtual double scalar_product(SCVector*) = 0;
00168 virtual void element_op(const Ref<SCElementOp>&) = 0;
00169 virtual void element_op(const Ref<SCElementOp2>&,
00170 SCVector*) = 0;
00171 virtual void element_op(const Ref<SCElementOp3>&,
00172 SCVector*,SCVector*) = 0;
00174 void print(std::ostream&o=ExEnv::out0()) const;
00175 void print(const char* title=0,std::ostream&out=ExEnv::out0(),int=10) const;
00176 virtual void vprint(const char*title=0,std::ostream&out=ExEnv::out0(),
00177 int=10) const = 0;
00178
00180 Ref<MessageGrp> messagegrp() const;
00181
00186 virtual Ref<SCMatrixSubblockIter> local_blocks(
00187 SCMatrixSubblockIter::Access) = 0;
00189 virtual Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access) = 0;
00190 };
00191
00195 class SCMatrix: public DescribedClass {
00196 protected:
00197 RefSCDimension d1,d2;
00198 Ref<SCMatrixKit> kit_;
00199 public:
00200
00201 enum Transform { NormalTransform = 0, TransposeTransform = 1 };
00202
00203
00204 SCMatrix(const RefSCDimension&, const RefSCDimension&, SCMatrixKit *);
00205 virtual ~SCMatrix();
00206
00208 virtual void save(StateOut&);
00209 virtual void restore(StateIn&);
00210
00212 Ref<SCMatrixKit> kit() const { return kit_; }
00213
00215 int nrow() const { return d1->n(); }
00217 int ncol() const { return d2->n(); }
00219 virtual double maxabs() const;
00221 virtual void randomize();
00223 void assign(double val) { assign_val(val); }
00225 void assign(const double* m) { assign_p(m); }
00227 void assign(const double** m) { assign_pp(m); }
00229 void assign(SCMatrix* m) { assign_r(m); }
00231 virtual void assign_val(double val);
00232 virtual void assign_p(const double* m);
00233 virtual void assign_pp(const double** m);
00234 virtual void assign_r(SCMatrix* m);
00237 void convert(double*a) const { convert_p(a); }
00238 void convert(double**a) const { convert_pp(a); }
00239 void convert(SCMatrix*a) { convert_r(a); }
00240 virtual void convert_p(double*) const;
00241 virtual void convert_pp(double**) const;
00242 virtual void convert_r(SCMatrix*a);
00243 virtual void convert_accumulate(SCMatrix*);
00245 virtual void scale(double val);
00247 virtual void scale_diagonal(double val);
00249 virtual void shift_diagonal(double val);
00251 virtual void unit();
00253 virtual SCMatrix* copy();
00255 virtual SCMatrix* clone();
00256
00257
00259 RefSCDimension rowdim() const { return d1; }
00260 RefSCDimension coldim() const { return d2; }
00262 virtual double get_element(int,int) const = 0;
00263 virtual void set_element(int,int,double) = 0;
00264 virtual void accumulate_element(int,int,double) = 0;
00265
00269 virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0;
00270
00272 virtual void assign_subblock(SCMatrix *m, int, int, int, int, int=0, int=0) =0;
00273
00275 virtual void accumulate_subblock(SCMatrix *m, int, int, int, int, int=0,int=0) =0;
00276
00278 virtual SCVector * get_row(int i) =0;
00279 virtual SCVector * get_column(int i) =0;
00280
00282 virtual void assign_row(SCVector *v, int i) =0;
00283 virtual void assign_column(SCVector *v, int i) =0;
00284
00286 virtual void accumulate_row(SCVector *v, int i) =0;
00287 virtual void accumulate_column(SCVector *v, int i) =0;
00288
00290 virtual void accumulate(const SCMatrix* m) = 0;
00291 virtual void accumulate(const SymmSCMatrix* m) = 0;
00292 virtual void accumulate(const DiagSCMatrix* m) = 0;
00293 virtual void accumulate(const SCVector*) = 0;
00295 virtual void accumulate_outer_product(SCVector*,SCVector*) = 0;
00296 void accumulate_product(SCMatrix*m1,SCMatrix*m2)
00297 { accumulate_product_rr(m1,m2); }
00298 void accumulate_product(SCMatrix*m1,SymmSCMatrix*m2)
00299 { accumulate_product_rs(m1,m2); }
00300 void accumulate_product(SCMatrix*m1,DiagSCMatrix*m2)
00301 { accumulate_product_rd(m1,m2); }
00302 void accumulate_product(SymmSCMatrix*m1,SCMatrix*m2)
00303 { accumulate_product_sr(m1,m2); }
00304 void accumulate_product(DiagSCMatrix*m1,SCMatrix*m2)
00305 { accumulate_product_dr(m1,m2); }
00306 void accumulate_product(SymmSCMatrix*m1,SymmSCMatrix*m2)
00307 { accumulate_product_ss(m1,m2); }
00308 void accumulate_product(SymmSCMatrix*m1,DiagSCMatrix*m2)
00309 { accumulate_product_sd(m1,m2); }
00310 void accumulate_product(DiagSCMatrix*m1,SymmSCMatrix*m2)
00311 { accumulate_product_ds(m1,m2); }
00312 virtual void accumulate_product_rr(SCMatrix*,SCMatrix*) = 0;
00313 virtual void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
00314 virtual void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
00315 virtual void accumulate_product_sr(SymmSCMatrix*,SCMatrix*);
00316 virtual void accumulate_product_dr(DiagSCMatrix*,SCMatrix*);
00317 virtual void accumulate_product_ss(SymmSCMatrix*,SymmSCMatrix*);
00318 virtual void accumulate_product_sd(SymmSCMatrix*,DiagSCMatrix*);
00319 virtual void accumulate_product_ds(DiagSCMatrix*,SymmSCMatrix*);
00321 virtual void transpose_this() = 0;
00323 virtual double trace() =0;
00325 virtual double invert_this() = 0;
00327 virtual double determ_this() = 0;
00328
00331 virtual void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
00332 virtual double solve_this(SCVector*) = 0;
00333 virtual void gen_invert_this();
00334
00337 virtual void schmidt_orthog(SymmSCMatrix*, int n) =0;
00338
00342 virtual int schmidt_orthog_tol(SymmSCMatrix*, double tol, double*res=0)=0;
00343
00345 virtual void element_op(const Ref<SCElementOp>&) = 0;
00346 virtual void element_op(const Ref<SCElementOp2>&,
00347 SCMatrix*) = 0;
00348 virtual void element_op(const Ref<SCElementOp3>&,
00349 SCMatrix*,SCMatrix*) = 0;
00351 void print(std::ostream&o=ExEnv::out0()) const;
00352 void print(const char* title=0,std::ostream& out=ExEnv::out0(),
00353 int =10) const;
00354 virtual void vprint(const char*title=0,
00355 std::ostream&out=ExEnv::out0(),int =10) const = 0;
00356
00358 Ref<MessageGrp> messagegrp() const;
00359
00362 virtual Ref<SCMatrixSubblockIter> local_blocks(
00363 SCMatrixSubblockIter::Access) = 0;
00365 virtual Ref<SCMatrixSubblockIter> all_blocks(
00366 SCMatrixSubblockIter::Access) = 0;
00367 };
00368
00371 class SymmSCMatrix: public DescribedClass {
00372 protected:
00373 RefSCDimension d;
00374 Ref<SCMatrixKit> kit_;
00375 public:
00376 SymmSCMatrix(const RefSCDimension&, SCMatrixKit *);
00377 ~SymmSCMatrix();
00378
00380 Ref<SCMatrixKit> kit() const { return kit_; }
00381
00383 virtual void save(StateOut&);
00384 virtual void restore(StateIn&);
00386 virtual double maxabs() const;
00388 virtual void randomize();
00390 void assign(double val) { assign_val(val); }
00392 void assign(const double* m) { assign_p(m); }
00394 void assign(const double** m) { assign_pp(m); }
00397 void assign(SymmSCMatrix* m) { assign_s(m); }
00399 virtual void assign_val(double val);
00400 virtual void assign_p(const double* m);
00401 virtual void assign_pp(const double** m);
00402 virtual void assign_s(SymmSCMatrix* m);
00404 void convert(double*a) const { convert_p(a); }
00405 void convert(double**a) const { convert_pp(a); }
00406 void convert(SymmSCMatrix*a) { convert_s(a); }
00407 virtual void convert_p(double*) const;
00408 virtual void convert_pp(double**) const;
00409 virtual void convert_s(SymmSCMatrix*);
00410 virtual void convert_accumulate(SymmSCMatrix*);
00412 virtual void scale(double);
00414 virtual void scale_diagonal(double);
00416 virtual void shift_diagonal(double);
00418 virtual void unit();
00420 int n() const { return d->n(); }
00422 virtual SymmSCMatrix* copy();
00424 virtual SymmSCMatrix* clone();
00425
00426
00428 RefSCDimension dim() const { return d; }
00430 virtual double get_element(int,int) const = 0;
00431 virtual void set_element(int,int,double) = 0;
00432 virtual void accumulate_element(int,int,double) = 0;
00433
00437 virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0;
00438 virtual SymmSCMatrix * get_subblock(int br, int er) =0;
00439
00441 virtual void assign_subblock(SCMatrix *m, int, int, int, int) =0;
00442 virtual void assign_subblock(SymmSCMatrix *m, int, int) =0;
00443
00445 virtual void accumulate_subblock(SCMatrix *m, int, int, int, int) =0;
00446 virtual void accumulate_subblock(SymmSCMatrix *m, int, int) =0;
00447
00449 virtual SCVector * get_row(int i) =0;
00450
00452 virtual void assign_row(SCVector *v, int i) =0;
00453
00455 virtual void accumulate_row(SCVector *v, int i) =0;
00456
00459 virtual void diagonalize(DiagSCMatrix*d,SCMatrix*m) = 0;
00461 virtual void accumulate(const SymmSCMatrix* m) = 0;
00463 virtual void accumulate_symmetric_sum(SCMatrix*) = 0;
00464 virtual void accumulate_symmetric_product(SCMatrix*);
00465 virtual void accumulate_transform(SCMatrix*,SymmSCMatrix*,
00466 SCMatrix::Transform = SCMatrix::NormalTransform);
00467 virtual void accumulate_transform(SCMatrix*,DiagSCMatrix*,
00468 SCMatrix::Transform = SCMatrix::NormalTransform);
00469 virtual void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
00470 virtual void accumulate_symmetric_outer_product(SCVector*);
00473 virtual double scalar_product(SCVector* v);
00475 virtual double trace() = 0;
00477 virtual double invert_this() = 0;
00479 virtual double determ_this() = 0;
00480
00481 virtual double solve_this(SCVector*) = 0;
00482 virtual void gen_invert_this() = 0;
00483
00485 virtual void element_op(const Ref<SCElementOp>&) = 0;
00486 virtual void element_op(const Ref<SCElementOp2>&,
00487 SymmSCMatrix*) = 0;
00488 virtual void element_op(const Ref<SCElementOp3>&,
00489 SymmSCMatrix*,SymmSCMatrix*) = 0;
00491 void print(std::ostream&o=ExEnv::out0()) const;
00492 void print(const char* title=0,std::ostream& out=ExEnv::out0(),
00493 int =10) const;
00494 virtual void vprint(const char* title=0,
00495 std::ostream& out=ExEnv::out0(), int =10) const;
00496
00498 Ref<MessageGrp> messagegrp() const;
00499
00502 virtual Ref<SCMatrixSubblockIter> local_blocks(
00503 SCMatrixSubblockIter::Access) = 0;
00505 virtual Ref<SCMatrixSubblockIter> all_blocks(
00506 SCMatrixSubblockIter::Access) = 0;
00507 };
00508
00511 class DiagSCMatrix: public DescribedClass {
00512 protected:
00513 RefSCDimension d;
00514 Ref<SCMatrixKit> kit_;
00515 public:
00516 DiagSCMatrix(const RefSCDimension&, SCMatrixKit *);
00517 ~DiagSCMatrix();
00518
00520 Ref<SCMatrixKit> kit() const { return kit_; }
00521
00523 virtual void save(StateOut&);
00524 virtual void restore(StateIn&);
00525
00527 virtual double maxabs() const;
00529 virtual void randomize();
00531 void assign(double val) { assign_val(val); }
00533 void assign(const double*p) { assign_p(p); }
00536 void assign(DiagSCMatrix*d_a) { assign_d(d_a); }
00538 virtual void assign_val(double val);
00539 virtual void assign_p(const double*);
00540 virtual void assign_d(DiagSCMatrix*);
00542 void convert(double*a) const { convert_p(a); }
00543 void convert(DiagSCMatrix*a) { convert_d(a); }
00544 virtual void convert_p(double*) const;
00545 virtual void convert_d(DiagSCMatrix*);
00546 virtual void convert_accumulate(DiagSCMatrix*);
00548 virtual void scale(double);
00550 int n() const { return d->n(); }
00552 virtual DiagSCMatrix* copy();
00554 virtual DiagSCMatrix* clone();
00555
00556
00558 RefSCDimension dim() const { return d; }
00560 virtual double get_element(int) const = 0;
00561 virtual void set_element(int,double) = 0;
00562 virtual void accumulate_element(int,double) = 0;
00564 virtual void accumulate(const DiagSCMatrix* m) = 0;
00566 virtual double trace() = 0;
00568 virtual double determ_this() = 0;
00570 virtual double invert_this() = 0;
00572 virtual void gen_invert_this() = 0;
00574 virtual void element_op(const Ref<SCElementOp>&) = 0;
00575 virtual void element_op(const Ref<SCElementOp2>&,
00576 DiagSCMatrix*) = 0;
00577 virtual void element_op(const Ref<SCElementOp3>&,
00578 DiagSCMatrix*,DiagSCMatrix*) = 0;
00580 void print(std::ostream&o=ExEnv::out0()) const;
00581 void print(const char* title=0,
00582 std::ostream& out=ExEnv::out0(), int =10) const;
00583 virtual void vprint(const char* title=0,
00584 std::ostream& out=ExEnv::out0(), int =10) const;
00585
00587 Ref<MessageGrp> messagegrp() const;
00588
00591 virtual Ref<SCMatrixSubblockIter> local_blocks(
00592 SCMatrixSubblockIter::Access) = 0;
00594 virtual Ref<SCMatrixSubblockIter> all_blocks(
00595 SCMatrixSubblockIter::Access) = 0;
00596 };
00597
00598 }
00599
00600 #endif
00601
00602
00603
00604
00605