|
dist.h00001 // 00002 // dist.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 #ifdef __GNUC__ 00029 #pragma interface 00030 #endif 00031 00032 #ifndef _math_scmat_dist_h 00033 #define _math_scmat_dist_h 00034 00035 #include <util/group/message.h> 00036 #include <util/group/mstate.h> 00037 00038 #include <math/scmat/block.h> 00039 #include <math/scmat/matrix.h> 00040 #include <math/scmat/abstract.h> 00041 00042 namespace sc { 00043 00046 class DistSCMatrixKit: public SCMatrixKit { 00047 public: 00048 DistSCMatrixKit(const Ref<MessageGrp> &grp = 0); 00049 DistSCMatrixKit(const Ref<KeyVal>&); 00050 ~DistSCMatrixKit(); 00051 SCMatrix* matrix(const RefSCDimension&,const RefSCDimension&); 00052 SymmSCMatrix* symmmatrix(const RefSCDimension&); 00053 DiagSCMatrix* diagmatrix(const RefSCDimension&); 00054 SCVector* vector(const RefSCDimension&); 00055 }; 00056 00057 00058 class DistSCVector: public SCVector { 00059 friend class DistSCMatrix; 00060 friend class DistSymmSCMatrix; 00061 friend class DistDiagSCMatrix; 00062 protected: 00063 Ref<SCMatrixBlockList> blocklist; 00064 00065 void init_blocklist(); 00066 double *find_element(int i) const; 00067 int element_to_node(int i) const; 00068 int block_to_node(int) const; 00069 Ref<SCMatrixBlock> block_to_block(int) const; 00070 void error(const char *); 00071 public: 00072 DistSCVector(const RefSCDimension&, DistSCMatrixKit*); 00073 ~DistSCVector(); 00074 void assign_p(const double*); 00075 void assign_v(SCVector*a); 00076 void convert(double* v) const; 00077 void convert(SCVector *); 00078 00079 void set_element(int,double); 00080 void accumulate_element(int,double); 00081 double get_element(int) const; 00082 void accumulate(const SCVector*); 00083 void accumulate(const SCMatrix*m); 00084 double scalar_product(SCVector*); 00085 void accumulate_product_rv(SCMatrix *, SCVector *); 00086 void element_op(const Ref<SCElementOp>&); 00087 void element_op(const Ref<SCElementOp2>&, 00088 SCVector*); 00089 void element_op(const Ref<SCElementOp3>&, 00090 SCVector*,SCVector*); 00091 void vprint(const char* title=0, 00092 std::ostream& out=ExEnv::out0(), int =10) const; 00093 00094 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access); 00095 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access); 00096 00097 Ref<DistSCMatrixKit> skit(); 00098 }; 00099 00100 class DistSCMatrix: public SCMatrix { 00101 friend class DistSymmSCMatrix; 00102 friend class DistDiagSCMatrix; 00103 friend class DistSCVector; 00104 protected: 00105 Ref<SCMatrixBlockList> blocklist; 00106 00107 int vecoff; 00108 int nvec; 00109 double **vec; 00110 protected: 00111 // utility functions 00112 void init_blocklist(); 00113 void error(const char *); 00114 double *find_element(int i, int j) const; 00115 int element_to_node(int i, int j) const; 00116 int block_to_node(int,int) const; 00117 Ref<SCMatrixBlock> block_to_block(int, int) const; 00118 Ref<SCBlockInfo> rowblocks() const { return d1->blocks(); } 00119 Ref<SCBlockInfo> colblocks() const { return d2->blocks(); } 00120 00121 enum VecOp {CopyFromVec, CopyToVec, AccumFromVec, AccumToVec}; 00122 enum Form { Row, Col } form; 00123 void create_vecform(Form, int nvec = -1); 00124 void delete_vecform(); 00125 void vecform_op(VecOp op, int *ivec = 0); 00126 void vecform_zero(); 00127 public: 00128 DistSCMatrix(const RefSCDimension&, const RefSCDimension&, 00129 DistSCMatrixKit*); 00130 ~DistSCMatrix(); 00131 00132 // implementations and overrides of virtual functions 00133 double get_element(int,int) const; 00134 void set_element(int,int,double); 00135 void accumulate_element(int,int,double); 00136 SCMatrix * get_subblock(int,int,int,int); 00137 void assign_subblock(SCMatrix*, int,int,int,int,int=0,int=0); 00138 void accumulate_subblock(SCMatrix*, int,int,int,int,int=0,int=0); 00139 SCVector * get_row(int i); 00140 SCVector * get_column(int i); 00141 void assign_row(SCVector *v, int i); 00142 void assign_column(SCVector *v, int i); 00143 void accumulate_row(SCVector *v, int i); 00144 void accumulate_column(SCVector *v, int i); 00145 00146 void accumulate_outer_product(SCVector*,SCVector*); 00147 void accumulate_product_rr(SCMatrix*,SCMatrix*); 00148 void accumulate(const SCMatrix*); 00149 void accumulate(const SymmSCMatrix*); 00150 void accumulate(const DiagSCMatrix*); 00151 void accumulate(const SCVector*); 00152 void transpose_this(); 00153 double invert_this(); 00154 double solve_this(SCVector*); 00155 double determ_this(); 00156 double trace(); 00157 void gen_invert_this(); 00158 void schmidt_orthog(SymmSCMatrix*,int); 00159 int schmidt_orthog_tol(SymmSCMatrix*, double tol, double *res=0); 00160 void element_op(const Ref<SCElementOp>&); 00161 void element_op(const Ref<SCElementOp2>&, 00162 SCMatrix*); 00163 void element_op(const Ref<SCElementOp3>&, 00164 SCMatrix*,SCMatrix*); 00165 void vprint(const char* title=0, 00166 std::ostream& out=ExEnv::out0(), int =10); 00167 void vprint(const char* title=0, 00168 std::ostream& out=ExEnv::out0(), int =10) const; 00169 00170 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access); 00171 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access); 00172 00173 Ref<DistSCMatrixKit> skit(); 00174 }; 00175 00176 class DistSymmSCMatrix: public SymmSCMatrix { 00177 friend class DistSCMatrix; 00178 friend class DistDiagSCMatrix; 00179 friend class DistSCVector; 00180 protected: 00181 Ref<SCMatrixBlockList> blocklist; 00182 protected: 00183 // utility functions 00184 void init_blocklist(); 00185 double *find_element(int i, int j) const; 00186 int element_to_node(int i, int j) const; 00187 int block_to_node(int,int) const; 00188 Ref<SCMatrixBlock> block_to_block(int, int) const; 00189 00190 void error(const char *msg); 00191 public: 00192 DistSymmSCMatrix(const RefSCDimension&, DistSCMatrixKit*); 00193 ~DistSymmSCMatrix(); 00194 00195 // implementations and overrides of virtual functions 00196 double get_element(int,int) const; 00197 void set_element(int,int,double); 00198 void accumulate_element(int,int,double); 00199 00200 SCMatrix * get_subblock(int,int,int,int); 00201 SymmSCMatrix * get_subblock(int,int); 00202 void assign_subblock(SCMatrix*, int,int,int,int); 00203 void assign_subblock(SymmSCMatrix*, int,int); 00204 void accumulate_subblock(SCMatrix*, int,int,int,int); 00205 void accumulate_subblock(SymmSCMatrix*, int,int); 00206 SCVector * get_row(int i); 00207 void assign_row(SCVector *v, int i); 00208 void accumulate_row(SCVector *v, int i); 00209 00210 void accumulate_product_rr(SCMatrix*,SCMatrix*); 00211 void accumulate(const SymmSCMatrix*); 00212 double invert_this(); 00213 double solve_this(SCVector*); 00214 double trace(); 00215 double determ_this(); 00216 void gen_invert_this(); 00217 00218 void diagonalize(DiagSCMatrix*,SCMatrix*); 00219 void accumulate_symmetric_sum(SCMatrix*); 00220 void element_op(const Ref<SCElementOp>&); 00221 void element_op(const Ref<SCElementOp2>&, 00222 SymmSCMatrix*); 00223 void element_op(const Ref<SCElementOp3>&, 00224 SymmSCMatrix*,SymmSCMatrix*); 00225 00226 virtual void convert_accumulate(SymmSCMatrix*); 00227 00228 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access); 00229 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access); 00230 00231 Ref<DistSCMatrixKit> skit(); 00232 }; 00233 00234 class DistDiagSCMatrix: public DiagSCMatrix { 00235 friend class DistSCMatrix; 00236 friend class DistSymmSCMatrix; 00237 friend class DistSCVector; 00238 protected: 00239 Ref<SCMatrixBlockList> blocklist; 00240 00241 void init_blocklist(); 00242 double *find_element(int i) const; 00243 int element_to_node(int i) const; 00244 int block_to_node(int) const; 00245 Ref<SCMatrixBlock> block_to_block(int) const; 00246 void error(const char *msg); 00247 public: 00248 DistDiagSCMatrix(const RefSCDimension&, DistSCMatrixKit*); 00249 ~DistDiagSCMatrix(); 00250 00251 // implementations and overrides of virtual functions 00252 double get_element(int) const; 00253 void set_element(int,double); 00254 void accumulate_element(int,double); 00255 void accumulate(const DiagSCMatrix*); 00256 double invert_this(); 00257 double determ_this(); 00258 double trace(); 00259 void gen_invert_this(); 00260 00261 void element_op(const Ref<SCElementOp>&); 00262 void element_op(const Ref<SCElementOp2>&, 00263 DiagSCMatrix*); 00264 void element_op(const Ref<SCElementOp3>&, 00265 DiagSCMatrix*,DiagSCMatrix*); 00266 00267 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access); 00268 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access); 00269 00270 Ref<DistSCMatrixKit> skit(); 00271 }; 00272 00273 class DistSCMatrixListSubblockIter: public SCMatrixListSubblockIter { 00274 protected: 00275 Ref<MessageGrp> grp_; 00276 StateSend out_; 00277 StateRecv in_; 00278 int step_; 00279 Ref<SCMatrixBlockList> locallist_; 00280 00281 void maybe_advance_list(); 00282 void advance_list(); 00283 public: 00284 DistSCMatrixListSubblockIter(Access, 00285 const Ref<SCMatrixBlockList> &locallist, 00286 const Ref<MessageGrp> &grp); 00287 void begin(); 00288 void next(); 00289 ~DistSCMatrixListSubblockIter(); 00290 }; 00291 00292 } 00293 00294 #endif 00295 00296 // Local Variables: 00297 // mode: c++ 00298 // c-file-style: "CLJ" 00299 // End: Generated at Fri Jan 10 08:14:08 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14. |