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 virtual void convert(double* v) const;
00141 virtual void convert(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 virtual void convert(double*) const;
00238 virtual void convert(double**) const;
00241 virtual void convert(SCMatrix*);
00242 virtual void convert_accumulate(SCMatrix*);
00244 virtual void scale(double val);
00246 virtual void scale_diagonal(double val);
00248 virtual void shift_diagonal(double val);
00250 virtual void unit();
00252 virtual SCMatrix* copy();
00254 virtual SCMatrix* clone();
00255
00256
00258 RefSCDimension rowdim() const { return d1; }
00259 RefSCDimension coldim() const { return d2; }
00261 virtual double get_element(int,int) const = 0;
00262 virtual void set_element(int,int,double) = 0;
00263 virtual void accumulate_element(int,int,double) = 0;
00264
00268 virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0;
00269
00271 virtual void assign_subblock(SCMatrix *m, int, int, int, int, int=0, int=0) =0;
00272
00274 virtual void accumulate_subblock(SCMatrix *m, int, int, int, int, int=0,int=0) =0;
00275
00277 virtual SCVector * get_row(int i) =0;
00278 virtual SCVector * get_column(int i) =0;
00279
00281 virtual void assign_row(SCVector *v, int i) =0;
00282 virtual void assign_column(SCVector *v, int i) =0;
00283
00285 virtual void accumulate_row(SCVector *v, int i) =0;
00286 virtual void accumulate_column(SCVector *v, int i) =0;
00287
00289 virtual void accumulate(const SCMatrix* m) = 0;
00290 virtual void accumulate(const SymmSCMatrix* m) = 0;
00291 virtual void accumulate(const DiagSCMatrix* m) = 0;
00292 virtual void accumulate(const SCVector*) = 0;
00294 virtual void accumulate_outer_product(SCVector*,SCVector*) = 0;
00295 void accumulate_product(SCMatrix*m1,SCMatrix*m2)
00296 { accumulate_product_rr(m1,m2); }
00297 void accumulate_product(SCMatrix*m1,SymmSCMatrix*m2)
00298 { accumulate_product_rs(m1,m2); }
00299 void accumulate_product(SCMatrix*m1,DiagSCMatrix*m2)
00300 { accumulate_product_rd(m1,m2); }
00301 void accumulate_product(SymmSCMatrix*m1,SCMatrix*m2)
00302 { accumulate_product_sr(m1,m2); }
00303 void accumulate_product(DiagSCMatrix*m1,SCMatrix*m2)
00304 { accumulate_product_dr(m1,m2); }
00305 void accumulate_product(SymmSCMatrix*m1,SymmSCMatrix*m2)
00306 { accumulate_product_ss(m1,m2); }
00307 virtual void accumulate_product_rr(SCMatrix*,SCMatrix*) = 0;
00308 virtual void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
00309 virtual void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
00310 virtual void accumulate_product_sr(SymmSCMatrix*,SCMatrix*);
00311 virtual void accumulate_product_dr(DiagSCMatrix*,SCMatrix*);
00312 virtual void accumulate_product_ss(SymmSCMatrix*,SymmSCMatrix*);
00314 virtual void transpose_this() = 0;
00316 virtual double trace() =0;
00318 virtual double invert_this() = 0;
00320 virtual double determ_this() = 0;
00321
00324 virtual void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
00325 virtual double solve_this(SCVector*) = 0;
00326 virtual void gen_invert_this();
00327
00330 virtual void schmidt_orthog(SymmSCMatrix*, int n) =0;
00331
00335 virtual int schmidt_orthog_tol(SymmSCMatrix*, double tol, double*res=0)=0;
00336
00338 virtual void element_op(const Ref<SCElementOp>&) = 0;
00339 virtual void element_op(const Ref<SCElementOp2>&,
00340 SCMatrix*) = 0;
00341 virtual void element_op(const Ref<SCElementOp3>&,
00342 SCMatrix*,SCMatrix*) = 0;
00344 void print(std::ostream&o=ExEnv::out0()) const;
00345 void print(const char* title=0,std::ostream& out=ExEnv::out0(),
00346 int =10) const;
00347 virtual void vprint(const char*title=0,
00348 std::ostream&out=ExEnv::out0(),int =10) const = 0;
00349
00351 Ref<MessageGrp> messagegrp() const;
00352
00355 virtual Ref<SCMatrixSubblockIter> local_blocks(
00356 SCMatrixSubblockIter::Access) = 0;
00358 virtual Ref<SCMatrixSubblockIter> all_blocks(
00359 SCMatrixSubblockIter::Access) = 0;
00360 };
00361
00364 class SymmSCMatrix: public DescribedClass {
00365 protected:
00366 RefSCDimension d;
00367 Ref<SCMatrixKit> kit_;
00368 public:
00369 SymmSCMatrix(const RefSCDimension&, SCMatrixKit *);
00370
00372 Ref<SCMatrixKit> kit() const { return kit_; }
00373
00375 virtual void save(StateOut&);
00376 virtual void restore(StateIn&);
00378 virtual double maxabs() const;
00380 virtual void randomize();
00382 void assign(double val) { assign_val(val); }
00384 void assign(const double* m) { assign_p(m); }
00386 void assign(const double** m) { assign_pp(m); }
00389 void assign(SymmSCMatrix* m) { assign_s(m); }
00391 virtual void assign_val(double val);
00392 virtual void assign_p(const double* m);
00393 virtual void assign_pp(const double** m);
00394 virtual void assign_s(SymmSCMatrix* m);
00396 virtual void convert(double*) const;
00397 virtual void convert(double**) const;
00400 virtual void convert(SymmSCMatrix*);
00401 virtual void convert_accumulate(SymmSCMatrix*);
00403 virtual void scale(double);
00405 virtual void scale_diagonal(double);
00407 virtual void shift_diagonal(double);
00409 virtual void unit();
00411 int n() const { return d->n(); }
00413 virtual SymmSCMatrix* copy();
00415 virtual SymmSCMatrix* clone();
00416
00417
00419 RefSCDimension dim() const { return d; }
00421 virtual double get_element(int,int) const = 0;
00422 virtual void set_element(int,int,double) = 0;
00423 virtual void accumulate_element(int,int,double) = 0;
00424
00428 virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0;
00429 virtual SymmSCMatrix * get_subblock(int br, int er) =0;
00430
00432 virtual void assign_subblock(SCMatrix *m, int, int, int, int) =0;
00433 virtual void assign_subblock(SymmSCMatrix *m, int, int) =0;
00434
00436 virtual void accumulate_subblock(SCMatrix *m, int, int, int, int) =0;
00437 virtual void accumulate_subblock(SymmSCMatrix *m, int, int) =0;
00438
00440 virtual SCVector * get_row(int i) =0;
00441
00443 virtual void assign_row(SCVector *v, int i) =0;
00444
00446 virtual void accumulate_row(SCVector *v, int i) =0;
00447
00450 virtual void diagonalize(DiagSCMatrix*d,SCMatrix*m) = 0;
00452 virtual void accumulate(const SymmSCMatrix* m) = 0;
00454 virtual void accumulate_symmetric_sum(SCMatrix*) = 0;
00455 virtual void accumulate_symmetric_product(SCMatrix*);
00456 virtual void accumulate_transform(SCMatrix*,SymmSCMatrix*,
00457 SCMatrix::Transform = SCMatrix::NormalTransform);
00458 virtual void accumulate_transform(SCMatrix*,DiagSCMatrix*,
00459 SCMatrix::Transform = SCMatrix::NormalTransform);
00460 virtual void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
00461 virtual void accumulate_symmetric_outer_product(SCVector*);
00464 virtual double scalar_product(SCVector* v);
00466 virtual double trace() = 0;
00468 virtual double invert_this() = 0;
00470 virtual double determ_this() = 0;
00471
00472 virtual double solve_this(SCVector*) = 0;
00473 virtual void gen_invert_this() = 0;
00474
00476 virtual void element_op(const Ref<SCElementOp>&) = 0;
00477 virtual void element_op(const Ref<SCElementOp2>&,
00478 SymmSCMatrix*) = 0;
00479 virtual void element_op(const Ref<SCElementOp3>&,
00480 SymmSCMatrix*,SymmSCMatrix*) = 0;
00482 void print(std::ostream&o=ExEnv::out0()) const;
00483 void print(const char* title=0,std::ostream& out=ExEnv::out0(),
00484 int =10) const;
00485 virtual void vprint(const char* title=0,
00486 std::ostream& out=ExEnv::out0(), int =10) const;
00487
00489 Ref<MessageGrp> messagegrp() const;
00490
00493 virtual Ref<SCMatrixSubblockIter> local_blocks(
00494 SCMatrixSubblockIter::Access) = 0;
00496 virtual Ref<SCMatrixSubblockIter> all_blocks(
00497 SCMatrixSubblockIter::Access) = 0;
00498 };
00499
00502 class DiagSCMatrix: public DescribedClass {
00503 protected:
00504 RefSCDimension d;
00505 Ref<SCMatrixKit> kit_;
00506 public:
00507 DiagSCMatrix(const RefSCDimension&, SCMatrixKit *);
00508
00510 Ref<SCMatrixKit> kit() const { return kit_; }
00511
00513 virtual void save(StateOut&);
00514 virtual void restore(StateIn&);
00515
00517 virtual double maxabs() const;
00519 virtual void randomize();
00521 void assign(double val) { assign_val(val); }
00523 void assign(const double*p) { assign_p(p); }
00526 void assign(DiagSCMatrix*d_a) { assign_d(d_a); }
00528 virtual void assign_val(double val);
00529 virtual void assign_p(const double*);
00530 virtual void assign_d(DiagSCMatrix*);
00532 virtual void convert(double*) const;
00535 virtual void convert(DiagSCMatrix*);
00536 virtual void convert_accumulate(DiagSCMatrix*);
00538 virtual void scale(double);
00540 int n() const { return d->n(); }
00542 virtual DiagSCMatrix* copy();
00544 virtual DiagSCMatrix* clone();
00545
00546
00548 RefSCDimension dim() const { return d; }
00550 virtual double get_element(int) const = 0;
00551 virtual void set_element(int,double) = 0;
00552 virtual void accumulate_element(int,double) = 0;
00554 virtual void accumulate(const DiagSCMatrix* m) = 0;
00556 virtual double trace() = 0;
00558 virtual double determ_this() = 0;
00560 virtual double invert_this() = 0;
00562 virtual void gen_invert_this() = 0;
00564 virtual void element_op(const Ref<SCElementOp>&) = 0;
00565 virtual void element_op(const Ref<SCElementOp2>&,
00566 DiagSCMatrix*) = 0;
00567 virtual void element_op(const Ref<SCElementOp3>&,
00568 DiagSCMatrix*,DiagSCMatrix*) = 0;
00570 void print(std::ostream&o=ExEnv::out0()) const;
00571 void print(const char* title=0,
00572 std::ostream& out=ExEnv::out0(), int =10) const;
00573 virtual void vprint(const char* title=0,
00574 std::ostream& out=ExEnv::out0(), int =10) const;
00575
00577 Ref<MessageGrp> messagegrp() const;
00578
00581 virtual Ref<SCMatrixSubblockIter> local_blocks(
00582 SCMatrixSubblockIter::Access) = 0;
00584 virtual Ref<SCMatrixSubblockIter> all_blocks(
00585 SCMatrixSubblockIter::Access) = 0;
00586 };
00587
00588 }
00589
00590 #endif
00591
00592
00593
00594
00595