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 #ifdef __GNUC__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _math_scmat_blocked_h
00033 #define _math_scmat_blocked_h
00034
00035 #include <math/scmat/block.h>
00036 #include <math/scmat/elemop.h>
00037 #include <math/scmat/matrix.h>
00038 #include <math/scmat/abstract.h>
00039
00040 namespace sc {
00041
00042 class BlockedSCMatrixKit;
00043 class BlockedSCVector;
00044 class BlockedSCMatrix;
00045 class BlockedSymmSCMatrix;
00046 class BlockedDiagSCMatrix;
00047
00048 class BlockedSCMatrixKit: public SCMatrixKit {
00049 private:
00050 Ref<SCMatrixKit> subkit_;
00051 public:
00052 BlockedSCMatrixKit(const Ref<SCMatrixKit>& subkit);
00053 BlockedSCMatrixKit(const Ref<KeyVal>&);
00054 ~BlockedSCMatrixKit();
00055 SCMatrix* matrix(const RefSCDimension&,const RefSCDimension&);
00056 SymmSCMatrix* symmmatrix(const RefSCDimension&);
00057 DiagSCMatrix* diagmatrix(const RefSCDimension&);
00058 SCVector* vector(const RefSCDimension&);
00059
00060 Ref<SCMatrixKit> subkit() { return subkit_; }
00061 };
00062
00063
00064 class BlockedSCVector: public SCVector {
00065 friend class BlockedSCMatrix;
00066 friend class BlockedSymmSCMatrix;
00067 friend class BlockedDiagSCMatrix;
00068 private:
00069 Ref<SCMatrixKit> subkit;
00070 RefSCVector *vecs_;
00071
00072 void resize(SCDimension*);
00073
00074 public:
00075 BlockedSCVector(const RefSCDimension&, BlockedSCMatrixKit*);
00076 ~BlockedSCVector();
00077
00078
00079 void save(StateOut&);
00080 void restore(StateIn&);
00081
00082 void assign_val(double);
00083 void assign_v(SCVector*);
00084 void assign_p(const double*);
00085
00086 double get_element(int) const;
00087 void set_element(int,double);
00088 void accumulate_element(int,double);
00089
00090 void accumulate_product_rv(SCMatrix*,SCVector*);
00091 void accumulate_product_sv(SymmSCMatrix*,SCVector*);
00092
00093 void accumulate(const SCVector*);
00094 void accumulate(const SCMatrix*);
00095 double scalar_product(SCVector*);
00096
00097 void element_op(const Ref<SCElementOp>&);
00098 void element_op(const Ref<SCElementOp2>&,
00099 SCVector*);
00100 void element_op(const Ref<SCElementOp3>&,
00101 SCVector*,SCVector*);
00102 void vprint(const char* title=0,
00103 std::ostream& out=ExEnv::out0(), int =10) const;
00104
00105
00106 RefSCDimension dim() const { return d; }
00107 RefSCDimension dim(int) const;
00108 int nblocks() const;
00109 RefSCVector block(int);
00110
00111 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00112 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00113 };
00114
00115 class BlockedSCMatrix: public SCMatrix {
00116 friend class BlockedSymmSCMatrix;
00117 friend class BlockedDiagSCMatrix;
00118 friend class BlockedSCVector;
00119 private:
00120 Ref<SCMatrixKit> subkit;
00121 RefSCMatrix *mats_;
00122 int nblocks_;
00123
00124 void resize(SCDimension*, SCDimension*);
00125
00126 public:
00127 BlockedSCMatrix(const RefSCDimension&, const RefSCDimension&,
00128 BlockedSCMatrixKit*);
00129 ~BlockedSCMatrix();
00130
00131
00132 void save(StateOut&);
00133 void restore(StateIn&);
00134
00135 void assign_val(double);
00136 double get_element(int,int) const;
00137 void set_element(int,int,double);
00138 void accumulate_element(int,int,double);
00139
00140 void assign_p(const double*);
00141 void assign_pp(const double**);
00142 void convert_p(double*) const;
00143 void convert_pp(double**) const;
00144
00145 SCMatrix * get_subblock(int,int,int,int);
00146 void assign_subblock(SCMatrix*, int,int,int,int,int=0,int=0);
00147 void accumulate_subblock(SCMatrix*, int,int,int,int,int=0,int=0);
00148
00149 SCVector * get_row(int i);
00150 SCVector * get_column(int i);
00151 void assign_row(SCVector *v, int i);
00152 void assign_column(SCVector *v, int i);
00153 void accumulate_row(SCVector *v, int i);
00154 void accumulate_column(SCVector *v, int i);
00155
00156 void accumulate_outer_product(SCVector*,SCVector*);
00157 void accumulate_product_rr(SCMatrix*,SCMatrix*);
00158 void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
00159 void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
00160 void accumulate(const SCMatrix*);
00161 void accumulate(const SymmSCMatrix*);
00162 void accumulate(const DiagSCMatrix*);
00163 void accumulate(const SCVector*);
00164
00165 void transpose_this();
00166 double invert_this();
00167 void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
00168 double solve_this(SCVector*);
00169 double determ_this();
00170 double trace();
00171 void gen_invert_this();
00172 void schmidt_orthog(SymmSCMatrix*,int);
00173 int schmidt_orthog_tol(SymmSCMatrix*, double tol, double *res=0);
00174
00175 void element_op(const Ref<SCElementOp>&);
00176 void element_op(const Ref<SCElementOp2>&,
00177 SCMatrix*);
00178 void element_op(const Ref<SCElementOp3>&,
00179 SCMatrix*,SCMatrix*);
00180
00181 void vprint(const char* title=0,
00182 std::ostream& out=ExEnv::out0(), int =10) const;
00183
00184
00185 RefSCDimension rowdim() const { return d1; }
00186 RefSCDimension coldim() const { return d2; }
00187 RefSCDimension rowdim(int) const;
00188 RefSCDimension coldim(int) const;
00189 int nblocks() const;
00190 RefSCMatrix block(int);
00191
00192 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00193 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00194 };
00195
00196 class BlockedSymmSCMatrix: public SymmSCMatrix {
00197 friend class BlockedSCMatrix;
00198 friend class BlockedDiagSCMatrix;
00199 friend class BlockedSCVector;
00200 private:
00201 Ref<SCMatrixKit> subkit;
00202 RefSymmSCMatrix *mats_;
00203
00204 void resize(SCDimension*);
00205
00206 public:
00207 BlockedSymmSCMatrix(const RefSCDimension&,BlockedSCMatrixKit*);
00208 ~BlockedSymmSCMatrix();
00209
00210
00211 void save(StateOut&);
00212 void restore(StateIn&);
00213
00214 double get_element(int,int) const;
00215 void set_element(int,int,double);
00216 void accumulate_element(int,int,double);
00217 void scale(double);
00218 void assign_val(double);
00219 void assign_s(SymmSCMatrix*m);
00220
00221 void assign_p(const double*);
00222 void assign_pp(const double**);
00223 void convert_p(double*) const;
00224 void convert_pp(double**) const;
00225
00226 SCMatrix * get_subblock(int,int,int,int);
00227 SymmSCMatrix * get_subblock(int,int);
00228 void assign_subblock(SCMatrix*, int,int,int,int);
00229 void assign_subblock(SymmSCMatrix*, int,int);
00230 void accumulate_subblock(SCMatrix*, int,int,int,int);
00231 void accumulate_subblock(SymmSCMatrix*, int,int);
00232 SCVector * get_row(int i);
00233 void assign_row(SCVector *v, int i);
00234 void accumulate_row(SCVector *v, int i);
00235
00236 double invert_this();
00237 double determ_this();
00238 double trace();
00239 double solve_this(SCVector*);
00240 void gen_invert_this();
00241
00242 double scalar_product(SCVector*);
00243 void diagonalize(DiagSCMatrix*,SCMatrix*);
00244
00245 void accumulate(const SymmSCMatrix*);
00246 void accumulate_symmetric_outer_product(SCVector*);
00247 void accumulate_symmetric_product(SCMatrix*);
00248 void accumulate_symmetric_sum(SCMatrix*);
00249 void accumulate_transform(SCMatrix*,SymmSCMatrix*,
00250 SCMatrix::Transform = SCMatrix::NormalTransform);
00251 void accumulate_transform(SCMatrix*,DiagSCMatrix*,
00252 SCMatrix::Transform = SCMatrix::NormalTransform);
00253 void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
00254
00255 void convert_accumulate(SymmSCMatrix*a);
00256
00257 void element_op(const Ref<SCElementOp>&);
00258 void element_op(const Ref<SCElementOp2>&,
00259 SymmSCMatrix*);
00260 void element_op(const Ref<SCElementOp3>&,
00261 SymmSCMatrix*,SymmSCMatrix*);
00262
00263 void vprint(const char* title=0,
00264 std::ostream& out=ExEnv::out0(), int =10) const;
00265
00266
00267 RefSCDimension dim() const { return d; }
00268 RefSCDimension dim(int) const;
00269 int nblocks() const;
00270 RefSymmSCMatrix block(int);
00271
00272 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00273 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00274 };
00275
00276 class BlockedDiagSCMatrix: public DiagSCMatrix {
00277 friend class BlockedSCMatrix;
00278 friend class BlockedSymmSCMatrix;
00279 friend class BlockedSCVector;
00280 private:
00281 Ref<SCMatrixKit> subkit;
00282 RefDiagSCMatrix *mats_;
00283
00284 void resize(SCDimension*);
00285
00286 public:
00287 BlockedDiagSCMatrix(const RefSCDimension&,BlockedSCMatrixKit*);
00288 ~BlockedDiagSCMatrix();
00289
00290
00291 void save(StateOut&);
00292 void restore(StateIn&);
00293
00294 double get_element(int) const;
00295 void set_element(int,double);
00296 void accumulate_element(int,double);
00297 void accumulate(const DiagSCMatrix*);
00298
00299 double invert_this();
00300 double determ_this();
00301 double trace();
00302 void gen_invert_this();
00303
00304 void element_op(const Ref<SCElementOp>&);
00305 void element_op(const Ref<SCElementOp2>&,
00306 DiagSCMatrix*);
00307 void element_op(const Ref<SCElementOp3>&,
00308 DiagSCMatrix*,DiagSCMatrix*);
00309 void vprint(const char* title=0,
00310 std::ostream& out=ExEnv::out0(), int =10) const;
00311
00312
00313 RefSCDimension dim() const { return d; }
00314 RefSCDimension dim(int) const;
00315 int nblocks() const;
00316 RefDiagSCMatrix block(int);
00317
00318 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00319 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00320 };
00321
00322 class BlockedSCElementOp : public SCElementOp {
00323 private:
00324 int current_block_;
00325
00326 public:
00327 BlockedSCElementOp();
00328 void working_on(int);
00329 int current_block() const;
00330 };
00331
00332 class BlockedSCElementOp2 : public SCElementOp2 {
00333 private:
00334 int current_block_;
00335
00336 public:
00337 BlockedSCElementOp2();
00338 void working_on(int);
00339 int current_block() const;
00340 };
00341
00342 class BlockedSCElementOp3 : public SCElementOp3 {
00343 private:
00344 int current_block_;
00345
00346 public:
00347 BlockedSCElementOp3();
00348 void working_on(int);
00349 int current_block() const;
00350 };
00351
00352 }
00353
00354 #endif
00355
00356
00357
00358
00359