MPQC 2.3.1
|
00001 // 00002 // abstract.h 00003 // 00004 // Copyright (C) 1996 Limit Point Systems, Inc. 00005 // 00006 // Author: Curtis Janssen <cljanss@limitpt.com> 00007 // Maintainer: LPS 00008 // 00009 // This file is part of the SC Toolkit. 00010 // 00011 // The SC Toolkit is free software; you can redistribute it and/or modify 00012 // it under the terms of the GNU Library General Public License as published by 00013 // the Free Software Foundation; either version 2, or (at your option) 00014 // any later version. 00015 // 00016 // The SC Toolkit is distributed in the hope that it will be useful, 00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 // GNU Library General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU Library General Public License 00022 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to 00023 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 00024 // 00025 // The U.S. Government is granted a limited license as per AL 91-7. 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 // these members are default in local.cc 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 // concrete functions (some can be overridden) 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 // used to control transformations 00201 enum Transform { NormalTransform = 0, TransposeTransform = 1 }; 00202 00203 // concrete functions (some can be overridden) 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 // pure virtual functions 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 ~SymmSCMatrix(); 00371 00373 Ref<SCMatrixKit> kit() const { return kit_; } 00374 00376 virtual void save(StateOut&); 00377 virtual void restore(StateIn&); 00379 virtual double maxabs() const; 00381 virtual void randomize(); 00383 void assign(double val) { assign_val(val); } 00385 void assign(const double* m) { assign_p(m); } 00387 void assign(const double** m) { assign_pp(m); } 00390 void assign(SymmSCMatrix* m) { assign_s(m); } 00392 virtual void assign_val(double val); 00393 virtual void assign_p(const double* m); 00394 virtual void assign_pp(const double** m); 00395 virtual void assign_s(SymmSCMatrix* m); 00397 virtual void convert(double*) const; 00398 virtual void convert(double**) const; 00401 virtual void convert(SymmSCMatrix*); 00402 virtual void convert_accumulate(SymmSCMatrix*); 00404 virtual void scale(double); 00406 virtual void scale_diagonal(double); 00408 virtual void shift_diagonal(double); 00410 virtual void unit(); 00412 int n() const { return d->n(); } 00414 virtual SymmSCMatrix* copy(); 00416 virtual SymmSCMatrix* clone(); 00417 00418 // pure virtual functions 00420 RefSCDimension dim() const { return d; } 00422 virtual double get_element(int,int) const = 0; 00423 virtual void set_element(int,int,double) = 0; 00424 virtual void accumulate_element(int,int,double) = 0; 00425 00429 virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0; 00430 virtual SymmSCMatrix * get_subblock(int br, int er) =0; 00431 00433 virtual void assign_subblock(SCMatrix *m, int, int, int, int) =0; 00434 virtual void assign_subblock(SymmSCMatrix *m, int, int) =0; 00435 00437 virtual void accumulate_subblock(SCMatrix *m, int, int, int, int) =0; 00438 virtual void accumulate_subblock(SymmSCMatrix *m, int, int) =0; 00439 00441 virtual SCVector * get_row(int i) =0; 00442 00444 virtual void assign_row(SCVector *v, int i) =0; 00445 00447 virtual void accumulate_row(SCVector *v, int i) =0; 00448 00451 virtual void diagonalize(DiagSCMatrix*d,SCMatrix*m) = 0; 00453 virtual void accumulate(const SymmSCMatrix* m) = 0; 00455 virtual void accumulate_symmetric_sum(SCMatrix*) = 0; 00456 virtual void accumulate_symmetric_product(SCMatrix*); 00457 virtual void accumulate_transform(SCMatrix*,SymmSCMatrix*, 00458 SCMatrix::Transform = SCMatrix::NormalTransform); 00459 virtual void accumulate_transform(SCMatrix*,DiagSCMatrix*, 00460 SCMatrix::Transform = SCMatrix::NormalTransform); 00461 virtual void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*); 00462 virtual void accumulate_symmetric_outer_product(SCVector*); 00465 virtual double scalar_product(SCVector* v); 00467 virtual double trace() = 0; 00469 virtual double invert_this() = 0; 00471 virtual double determ_this() = 0; 00472 00473 virtual double solve_this(SCVector*) = 0; 00474 virtual void gen_invert_this() = 0; 00475 00477 virtual void element_op(const Ref<SCElementOp>&) = 0; 00478 virtual void element_op(const Ref<SCElementOp2>&, 00479 SymmSCMatrix*) = 0; 00480 virtual void element_op(const Ref<SCElementOp3>&, 00481 SymmSCMatrix*,SymmSCMatrix*) = 0; 00483 void print(std::ostream&o=ExEnv::out0()) const; 00484 void print(const char* title=0,std::ostream& out=ExEnv::out0(), 00485 int =10) const; 00486 virtual void vprint(const char* title=0, 00487 std::ostream& out=ExEnv::out0(), int =10) const; 00488 00490 Ref<MessageGrp> messagegrp() const; 00491 00494 virtual Ref<SCMatrixSubblockIter> local_blocks( 00495 SCMatrixSubblockIter::Access) = 0; 00497 virtual Ref<SCMatrixSubblockIter> all_blocks( 00498 SCMatrixSubblockIter::Access) = 0; 00499 }; 00500 00503 class DiagSCMatrix: public DescribedClass { 00504 protected: 00505 RefSCDimension d; 00506 Ref<SCMatrixKit> kit_; 00507 public: 00508 DiagSCMatrix(const RefSCDimension&, SCMatrixKit *); 00509 ~DiagSCMatrix(); 00510 00512 Ref<SCMatrixKit> kit() const { return kit_; } 00513 00515 virtual void save(StateOut&); 00516 virtual void restore(StateIn&); 00517 00519 virtual double maxabs() const; 00521 virtual void randomize(); 00523 void assign(double val) { assign_val(val); } 00525 void assign(const double*p) { assign_p(p); } 00528 void assign(DiagSCMatrix*d_a) { assign_d(d_a); } 00530 virtual void assign_val(double val); 00531 virtual void assign_p(const double*); 00532 virtual void assign_d(DiagSCMatrix*); 00534 virtual void convert(double*) const; 00537 virtual void convert(DiagSCMatrix*); 00538 virtual void convert_accumulate(DiagSCMatrix*); 00540 virtual void scale(double); 00542 int n() const { return d->n(); } 00544 virtual DiagSCMatrix* copy(); 00546 virtual DiagSCMatrix* clone(); 00547 00548 // pure virtual functions 00550 RefSCDimension dim() const { return d; } 00552 virtual double get_element(int) const = 0; 00553 virtual void set_element(int,double) = 0; 00554 virtual void accumulate_element(int,double) = 0; 00556 virtual void accumulate(const DiagSCMatrix* m) = 0; 00558 virtual double trace() = 0; 00560 virtual double determ_this() = 0; 00562 virtual double invert_this() = 0; 00564 virtual void gen_invert_this() = 0; 00566 virtual void element_op(const Ref<SCElementOp>&) = 0; 00567 virtual void element_op(const Ref<SCElementOp2>&, 00568 DiagSCMatrix*) = 0; 00569 virtual void element_op(const Ref<SCElementOp3>&, 00570 DiagSCMatrix*,DiagSCMatrix*) = 0; 00572 void print(std::ostream&o=ExEnv::out0()) const; 00573 void print(const char* title=0, 00574 std::ostream& out=ExEnv::out0(), int =10) const; 00575 virtual void vprint(const char* title=0, 00576 std::ostream& out=ExEnv::out0(), int =10) const; 00577 00579 Ref<MessageGrp> messagegrp() const; 00580 00583 virtual Ref<SCMatrixSubblockIter> local_blocks( 00584 SCMatrixSubblockIter::Access) = 0; 00586 virtual Ref<SCMatrixSubblockIter> all_blocks( 00587 SCMatrixSubblockIter::Access) = 0; 00588 }; 00589 00590 } 00591 00592 #endif 00593 00594 // Local Variables: 00595 // mode: c++ 00596 // c-file-style: "CLJ" 00597 // End: