blocked.h

00001 //
00002 // blocked.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_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     // Save and restore this in an implementation independent way.
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     // BlockedSCVector specific functions
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     // Save and restore this in an implementation independent way.
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     // BlockedSCMatrix specific functions
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     // Save and restore this in an implementation independent way.
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     // BlockedSymmSCMatrix specific functions
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     // Save and restore this in an implementation independent way.
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     // BlockedDiagSCMatrix specific functions
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 // Local Variables:
00357 // mode: c++
00358 // c-file-style: "CLJ"
00359 // End:

Generated at Wed Sep 5 14:02:29 2007 for MPQC 3.0.0-alpha using the documentation package Doxygen 1.5.2.
These pages are hosted on SourceForge.net