Google

Main Page   Class Hierarchy   Compound List   File List   Compound Members   Related Pages  

repl.h

00001 //
00002 // repl.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_repl_h
00033 #define _math_scmat_repl_h
00034 
00035 #include <util/group/message.h>
00036 
00037 #include <math/scmat/block.h>
00038 #include <math/scmat/matrix.h>
00039 #include <math/scmat/abstract.h>
00040 
00041 namespace sc {
00042 
00046 class ReplSCMatrixKit: public SCMatrixKit {
00047   public:
00048     ReplSCMatrixKit();
00049     ReplSCMatrixKit(const Ref<KeyVal>&);
00050     ~ReplSCMatrixKit();
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 ReplSCMatrixListSubblockIter: public SCMatrixListSubblockIter {
00059   protected:
00060     Ref<MessageGrp> grp_;
00061     double *data_;
00062     int ndata_;
00063   public:
00064     ReplSCMatrixListSubblockIter(Access,
00065                              const Ref<SCMatrixBlockList> &list,
00066                              const Ref<MessageGrp> &grp,
00067                              double *data, int ndata);
00068     ~ReplSCMatrixListSubblockIter();
00069 };
00070 
00071 class ReplSCVector: public SCVector {
00072     friend class ReplSCMatrix;
00073     friend class ReplSymmSCMatrix;
00074     friend class ReplDiagSCMatrix;
00075   protected:
00076     Ref<SCMatrixBlockList> blocklist;
00077     double* vector;
00078     void init_blocklist();
00079     void before_elemop();
00080     void after_elemop();
00081   public:
00082     ReplSCVector(const RefSCDimension&,ReplSCMatrixKit*);
00083     ~ReplSCVector();
00084     void assign_val(double);
00085     void assign_v(SCVector*);
00086     void assign_p(const double*);
00087 
00088     void set_element(int,double);
00089     void accumulate_element(int,double);
00090     double get_element(int) const;
00091     void accumulate_product_sv(SymmSCMatrix*,SCVector*);
00092     void accumulate_product_rv(SCMatrix*,SCVector*);
00093     void accumulate(const SCVector*);
00094     void accumulate(const SCMatrix*);
00095     double scalar_product(SCVector*);
00096     void element_op(const Ref<SCElementOp>&);
00097     void element_op(const Ref<SCElementOp2>&,
00098                     SCVector*);
00099     void element_op(const Ref<SCElementOp3>&,
00100                     SCVector*,SCVector*);
00101     void vprint(const char* title=0,
00102                 std::ostream& out=ExEnv::out0(), int =10) const;
00103 
00104     // return a pointer to the data for fast access
00105     double *get_data() { return vector; }
00106 
00107     Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00108     Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00109 
00110     Ref<ReplSCMatrixKit> skit();
00111 };
00112 
00113 class ReplSCMatrix: public SCMatrix {
00114     friend class ReplSymmSCMatrix;
00115     friend class ReplDiagSCMatrix;
00116     friend class ReplSCVector;
00117   protected:
00118     Ref<SCMatrixBlockList> blocklist;
00119     double* matrix;
00120     double** rows;
00121   protected:
00122     // utility functions
00123     int compute_offset(int,int) const;
00124     void init_blocklist();
00125 
00126     void before_elemop();
00127     void after_elemop();
00128   public:
00129     ReplSCMatrix(const RefSCDimension&,const RefSCDimension&,
00130                  ReplSCMatrixKit*);
00131     ~ReplSCMatrix();
00132 
00133     // implementations and overrides of virtual functions
00134     void assign_val(double);
00135     double get_element(int,int) const;
00136     void set_element(int,int,double);
00137     void accumulate_element(int,int,double);
00138     SCMatrix * get_subblock(int,int,int,int);
00139     void assign_subblock(SCMatrix*, int,int,int,int,int=0,int=0);
00140     void accumulate_subblock(SCMatrix*, int,int,int,int,int=0,int=0);
00141     SCVector * get_row(int i);
00142     SCVector * get_column(int i);
00143     void assign_row(SCVector *v, int i);
00144     void assign_column(SCVector *v, int i);
00145     void accumulate_row(SCVector *v, int i);
00146     void accumulate_column(SCVector *v, int i);
00147 
00148     void accumulate_outer_product(SCVector*,SCVector*);
00149     void accumulate_product_rr(SCMatrix*,SCMatrix*);
00150     void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
00151     void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
00152     void accumulate(const SCMatrix*);
00153     void accumulate(const SymmSCMatrix*);
00154     void accumulate(const DiagSCMatrix*);
00155     void accumulate(const SCVector*);
00156     void transpose_this();
00157     double invert_this();
00158     void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
00159     double solve_this(SCVector*);
00160     double determ_this();
00161     double trace();
00162     void schmidt_orthog(SymmSCMatrix*,int);
00163     int schmidt_orthog_tol(SymmSCMatrix*, double tol, double *res=0);
00164     void element_op(const Ref<SCElementOp>&);
00165     void element_op(const Ref<SCElementOp2>&,
00166                     SCMatrix*);
00167     void element_op(const Ref<SCElementOp3>&,
00168                     SCMatrix*,SCMatrix*);
00169     void vprint(const char* title=0,
00170                 std::ostream& out=ExEnv::out0(), int =10) const;
00171 
00172     // return a pointer to the data for fast access
00173     double *get_data() { return matrix; }
00174     double **get_rows() { return rows; }
00175 
00176     Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00177     Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00178 
00179     Ref<ReplSCMatrixKit> skit();
00180 };
00181 
00182 class ReplSymmSCMatrix: public SymmSCMatrix {
00183     friend class ReplSCMatrix;
00184     friend class ReplDiagSCMatrix;
00185     friend class ReplSCVector;
00186   protected:
00187     Ref<SCMatrixBlockList> blocklist;
00188     double* matrix;
00189     double** rows;
00190   protected:
00191     // utility functions
00192     int compute_offset(int,int) const;
00193     void init_blocklist();
00194 
00195     void before_elemop();
00196     void after_elemop();
00197   public:
00198     ReplSymmSCMatrix(const RefSCDimension&, ReplSCMatrixKit*);
00199     ~ReplSymmSCMatrix();
00200 
00201     // implementations and overrides of virtual functions
00202     void assign_val(double);
00203     void assign_s(SymmSCMatrix*);
00204     void assign_p(const double*);
00205     void assign_pp(const double**);
00206     double get_element(int,int) const;
00207     void set_element(int,int,double);
00208     void accumulate_element(int,int,double);
00209     void scale(double);
00210 
00211     SCMatrix * get_subblock(int,int,int,int);
00212     SymmSCMatrix * get_subblock(int,int);
00213     void assign_subblock(SCMatrix*, int,int,int,int);
00214     void assign_subblock(SymmSCMatrix*, int,int);
00215     void accumulate_subblock(SCMatrix*, int,int,int,int);
00216     void accumulate_subblock(SymmSCMatrix*, int,int);
00217     SCVector * get_row(int i);
00218     void assign_row(SCVector *v, int i);
00219     void accumulate_row(SCVector *v, int i);
00220 
00221     void accumulate_product_rr(SCMatrix*,SCMatrix*);
00222     void accumulate(const SymmSCMatrix*);
00223     double invert_this();
00224     double solve_this(SCVector*);
00225     double trace();
00226     double determ_this();
00227     void gen_invert_this();
00228 
00229     double scalar_product(SCVector*);
00230     void diagonalize(DiagSCMatrix*,SCMatrix*);
00231     void accumulate_symmetric_outer_product(SCVector*);
00232     void accumulate_symmetric_product(SCMatrix*);
00233     void accumulate_symmetric_sum(SCMatrix*);
00234     void accumulate_transform(SCMatrix*,SymmSCMatrix*,
00235                               SCMatrix::Transform = SCMatrix::NormalTransform);
00236     void accumulate_transform(SCMatrix*,DiagSCMatrix*,
00237                               SCMatrix::Transform = SCMatrix::NormalTransform);
00238     void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
00239     void element_op(const Ref<SCElementOp>&);
00240     void element_op(const Ref<SCElementOp2>&,
00241                     SymmSCMatrix*);
00242     void element_op(const Ref<SCElementOp3>&,
00243                     SymmSCMatrix*,SymmSCMatrix*);
00244     void vprint(const char* title=0,
00245                 std::ostream& out=ExEnv::out0(), int =10) const;
00246 
00247     // return a pointer to the data for fast access
00248     double *get_data() { return matrix; }
00249     double **get_rows() { return rows; }
00250 
00251     Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00252     Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00253 
00254     Ref<ReplSCMatrixKit> skit();
00255 };
00256 
00257 class ReplDiagSCMatrix: public DiagSCMatrix {
00258     friend class ReplSCMatrix;
00259     friend class ReplSymmSCMatrix;
00260     friend class ReplSCVector;
00261   protected:
00262     Ref<SCMatrixBlockList> blocklist;
00263     void init_blocklist();
00264     double* matrix;
00265 
00266     void before_elemop();
00267     void after_elemop();
00268   public:
00269     ReplDiagSCMatrix(const RefSCDimension&, ReplSCMatrixKit*);
00270     ~ReplDiagSCMatrix();
00271 
00272     // implementations and overrides of virtual functions
00273     void assign_val(double);
00274     double get_element(int) const;
00275     void set_element(int,double);
00276     void accumulate_element(int,double);
00277     void accumulate(const DiagSCMatrix*);
00278     double invert_this();
00279     double determ_this();
00280     double trace();
00281     void gen_invert_this();
00282 
00283     void element_op(const Ref<SCElementOp>&);
00284     void element_op(const Ref<SCElementOp2>&,
00285                     DiagSCMatrix*);
00286     void element_op(const Ref<SCElementOp3>&,
00287                     DiagSCMatrix*,DiagSCMatrix*);
00288     void vprint(const char* title=0,
00289                 std::ostream& out=ExEnv::out0(), int =10) const;
00290 
00291     // return a pointer to the data for fast access
00292     double *get_data() { return matrix; }
00293 
00294     Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
00295     Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
00296 
00297     Ref<ReplSCMatrixKit> skit();
00298 };
00299 
00300 }
00301 
00302 #endif
00303 
00304 // Local Variables:
00305 // mode: c++
00306 // c-file-style: "CLJ"
00307 // End:

Generated at Fri Jan 10 08:14:09 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14.