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_local_h
00033 #define _math_scmat_local_h
00034
00035 #include <math/scmat/block.h>
00036 #include <math/scmat/matrix.h>
00037 #include <math/scmat/abstract.h>
00038
00039 namespace sc {
00040
00041 class LocalSCMatrixKit;
00042 class LocalSCVector;
00043 class LocalSCMatrix;
00044 class LocalSymmSCMatrix;
00045 class LocalDiagSCMatrix;
00046
00049 class LocalSCMatrixKit: public SCMatrixKit {
00050 public:
00051 LocalSCMatrixKit();
00052 LocalSCMatrixKit(const Ref<KeyVal>&);
00053 ~LocalSCMatrixKit();
00054 SCMatrix* matrix(const RefSCDimension&,const RefSCDimension&);
00055 SymmSCMatrix* symmmatrix(const RefSCDimension&);
00056 DiagSCMatrix* diagmatrix(const RefSCDimension&);
00057 SCVector* vector(const RefSCDimension&);
00058 };
00059
00060 class LocalSCVector: public SCVector {
00061 friend class LocalSCMatrix;
00062 friend class LocalSymmSCMatrix;
00063 friend class LocalDiagSCMatrix;
00064 private:
00065 Ref<SCVectorSimpleBlock> block;
00066
00067 void resize(int);
00068 public:
00069 LocalSCVector();
00070 LocalSCVector(const RefSCDimension&,LocalSCMatrixKit*);
00071 ~LocalSCVector();
00072 void assign_val(double);
00073 void assign_v(SCVector*);
00074 void assign_p(const double*);
00075
00076 void set_element(int,double);
00077 void accumulate_element(int,double);
00078 double get_element(int) const;
00079 void accumulate_product_sv(SymmSCMatrix*,SCVector*);
00080 void accumulate_product_rv(SCMatrix*,SCVector*);
00081 void accumulate(const SCVector*);
00082 void accumulate(const SCMatrix*);
00083 double scalar_product(SCVector*);
00084 void element_op(const Ref<SCElementOp>&);
00085 void element_op(const Ref<SCElementOp2>&,
00086 SCVector*);
00087 void element_op(const Ref<SCElementOp3>&,
00088 SCVector*,SCVector*);
00089 void vprint(const char* title=0,
00090 std::ostream& out=ExEnv::out0(), int =10) const;
00091
00092
00093 double *get_data();
00094
00095 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00096 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00097 };
00098
00099 class LocalSCMatrix: public SCMatrix {
00100 friend class LocalSymmSCMatrix;
00101 friend class LocalDiagSCMatrix;
00102 friend class LocalSCVector;
00103 private:
00104 Ref<SCMatrixRectBlock> block;
00105 double** rows;
00106 private:
00107
00108 int compute_offset(int,int) const;
00109 void resize(int,int);
00110 public:
00111 LocalSCMatrix(const RefSCDimension&,const RefSCDimension&,
00112 LocalSCMatrixKit*);
00113 ~LocalSCMatrix();
00114
00115
00116 void assign_val(double);
00117 double get_element(int,int) const;
00118 void set_element(int,int,double);
00119 void accumulate_element(int,int,double);
00120 SCMatrix * get_subblock(int,int,int,int);
00121 void assign_subblock(SCMatrix*, int,int,int,int,int=0,int=0);
00122 void accumulate_subblock(SCMatrix*, int,int,int,int,int=0,int=0);
00123 SCVector * get_row(int i);
00124 SCVector * get_column(int i);
00125 void assign_row(SCVector *v, int i);
00126 void assign_column(SCVector *v, int i);
00127 void accumulate_row(SCVector *v, int i);
00128 void accumulate_column(SCVector *v, int i);
00129 void accumulate_outer_product(SCVector*,SCVector*);
00130 void accumulate_product_rr(SCMatrix*,SCMatrix*);
00131 void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
00132 void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
00133 void accumulate(const SCMatrix*);
00134 void accumulate(const SymmSCMatrix*);
00135 void accumulate(const DiagSCMatrix*);
00136 void accumulate(const SCVector*);
00137 void transpose_this();
00138 double invert_this();
00139 void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
00140 double solve_this(SCVector*);
00141 double determ_this();
00142 double trace();
00143 void schmidt_orthog(SymmSCMatrix*,int);
00144 int schmidt_orthog_tol(SymmSCMatrix*, double tol, double *res=0);
00145 void element_op(const Ref<SCElementOp>&);
00146 void element_op(const Ref<SCElementOp2>&,
00147 SCMatrix*);
00148 void element_op(const Ref<SCElementOp3>&,
00149 SCMatrix*,SCMatrix*);
00150 void vprint(const char* title=0,
00151 std::ostream& out=ExEnv::out0(), int =10) const;
00152
00153
00154 double *get_data();
00155 double **get_rows();
00156
00157 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00158 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00159 };
00160
00161 class LocalSymmSCMatrix: public SymmSCMatrix {
00162 friend class LocalSCMatrix;
00163 friend class LocalDiagSCMatrix;
00164 friend class LocalSCVector;
00165 private:
00166 Ref<SCMatrixLTriBlock> block;
00167 double** rows;
00168 private:
00169
00170 int compute_offset(int,int) const;
00171 void resize(int n);
00172 public:
00173 LocalSymmSCMatrix(const RefSCDimension&, LocalSCMatrixKit*);
00174 ~LocalSymmSCMatrix();
00175
00176
00177 double get_element(int,int) const;
00178 void set_element(int,int,double);
00179 void accumulate_element(int,int,double);
00180
00181 SCMatrix * get_subblock(int,int,int,int);
00182 SymmSCMatrix * get_subblock(int,int);
00183 void assign_subblock(SCMatrix*, int,int,int,int);
00184 void assign_subblock(SymmSCMatrix*, int,int);
00185 void accumulate_subblock(SCMatrix*, int,int,int,int);
00186 void accumulate_subblock(SymmSCMatrix*, int,int);
00187 SCVector * get_row(int i);
00188 void assign_row(SCVector *v, int i);
00189 void accumulate_row(SCVector *v, int i);
00190
00191 void accumulate_product_rr(SCMatrix*,SCMatrix*);
00192 void accumulate(const SymmSCMatrix*);
00193 double invert_this();
00194 double solve_this(SCVector*);
00195 double trace();
00196 double determ_this();
00197 void gen_invert_this();
00198
00199 double scalar_product(SCVector*);
00200 void diagonalize(DiagSCMatrix*,SCMatrix*);
00201 void accumulate_symmetric_outer_product(SCVector*);
00202 void accumulate_symmetric_product(SCMatrix*);
00203 void accumulate_symmetric_sum(SCMatrix*);
00204 void accumulate_transform(SCMatrix*,SymmSCMatrix*,
00205 SCMatrix::Transform = SCMatrix::NormalTransform);
00206 void accumulate_transform(SCMatrix*,DiagSCMatrix*,
00207 SCMatrix::Transform = SCMatrix::NormalTransform);
00208 void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
00209 void element_op(const Ref<SCElementOp>&);
00210 void element_op(const Ref<SCElementOp2>&,
00211 SymmSCMatrix*);
00212 void element_op(const Ref<SCElementOp3>&,
00213 SymmSCMatrix*,SymmSCMatrix*);
00214 void vprint(const char* title=0,
00215 std::ostream& out=ExEnv::out0(), int =10) const;
00216
00217
00218 double *get_data();
00219 double **get_rows();
00220
00221 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00222 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00223 };
00224
00225 class LocalDiagSCMatrix: public DiagSCMatrix {
00226 friend class LocalSCMatrix;
00227 friend class LocalSymmSCMatrix;
00228 friend class LocalSCVector;
00229 private:
00230 Ref<SCMatrixDiagBlock> block;
00231 void resize(int n);
00232 public:
00233 LocalDiagSCMatrix(const RefSCDimension&, LocalSCMatrixKit*);
00234 ~LocalDiagSCMatrix();
00235
00236
00237 void save_data_state(StateOut&);
00238 double get_element(int) const;
00239 void set_element(int,double);
00240 void accumulate_element(int,double);
00241 void accumulate(const DiagSCMatrix*);
00242 double invert_this();
00243 double determ_this();
00244 double trace();
00245 void gen_invert_this();
00246
00247 void element_op(const Ref<SCElementOp>&);
00248 void element_op(const Ref<SCElementOp2>&,
00249 DiagSCMatrix*);
00250 void element_op(const Ref<SCElementOp3>&,
00251 DiagSCMatrix*,DiagSCMatrix*);
00252 void vprint(const char* title=0,
00253 std::ostream& out=ExEnv::out0(), int =10) const;
00254
00255
00256 double *get_data();
00257
00258 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00259 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00260 };
00261
00262 }
00263
00264 #endif
00265
00266
00267
00268
00269