abstract.h

00001 //
00002 // abstract.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 #ifndef _math_scmat_abstract_h
00029 #define _math_scmat_abstract_h
00030 
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034 
00035 #include <util/group/message.h>
00036 
00037 #include <util/state/state.h>
00038 #include <math/scmat/dim.h>
00039 #include <math/scmat/block.h>
00040 #include <iostream>
00041 
00042 namespace sc {
00043 
00044 class SCMatrix;
00045 class SymmSCMatrix;
00046 class DiagSCMatrix;
00047 class SCVector;
00048 
00049 class SCElementOp;
00050 class SCElementOp2;
00051 class SCElementOp3;
00052 
00053 class RefSCDimension;
00054 
00058 class SCMatrixKit: public DescribedClass {
00059   protected:
00060     Ref<MessageGrp> grp_;
00061     
00062   public:
00063     SCMatrixKit();
00064     SCMatrixKit(const Ref<KeyVal>&);
00065     ~SCMatrixKit();
00066 
00067     // these members are default in local.cc
00070     static SCMatrixKit* default_matrixkit();
00071     static void set_default_matrixkit(const Ref<SCMatrixKit> &);
00072 
00073     Ref<MessageGrp> messagegrp() const;
00074 
00076     virtual SCMatrix* matrix(const RefSCDimension&,const RefSCDimension&) = 0;
00077     virtual SymmSCMatrix* symmmatrix(const RefSCDimension&) = 0;
00078     virtual DiagSCMatrix* diagmatrix(const RefSCDimension&) = 0;
00079     virtual SCVector* vector(const RefSCDimension&) = 0;
00080 
00083     SCMatrix* restore_matrix(StateIn&,
00084                              const RefSCDimension&,
00085                              const RefSCDimension&);
00086     SymmSCMatrix* restore_symmmatrix(StateIn&,
00087                                      const RefSCDimension&);
00088     DiagSCMatrix* restore_diagmatrix(StateIn&,             
00089                                      const RefSCDimension&);
00090     SCVector* restore_vector(StateIn&,
00091                              const RefSCDimension&);
00092 };
00093 
00094 
00097 class SCVector: public DescribedClass {
00098   protected:
00099     RefSCDimension d;
00100     Ref<SCMatrixKit> kit_;
00101   public:
00102     SCVector(const RefSCDimension&, SCMatrixKit *);
00103 
00105     virtual void save(StateOut&);
00106     virtual void restore(StateIn&);
00107 
00109     Ref<SCMatrixKit> kit() const { return kit_; }
00110 
00111     // concrete functions (some can be overridden)
00113     virtual SCVector* copy();
00115     virtual SCVector* clone();
00116 
00117     virtual ~SCVector();
00119     int n() const { return d->n(); }
00121     virtual double maxabs() const;
00123     virtual void normalize();
00125     virtual void randomize();
00127     void assign(double val) { assign_val(val); }
00129     void assign(const double* v) { assign_p(v); }
00132     void assign(SCVector* v) { assign_v(v); }
00134     virtual void assign_val(double val);
00135     virtual void assign_p(const double* v);
00136     virtual void assign_v(SCVector *v);
00138     void convert(double* v) const { convert_p(v); }
00139     void convert(SCVector*v) { convert_v(v); }
00140     virtual void convert_p(double* v) const;
00141     virtual void convert_v(SCVector*);
00142     virtual void convert_accumulate(SCVector*);
00144     virtual void scale(double val);
00145 
00147     RefSCDimension dim() const { return d; }
00149     virtual void set_element(int i,double val) = 0;
00151     virtual void accumulate_element(int,double) = 0;
00153     virtual double get_element(int i) const = 0;
00155     void accumulate_product(SymmSCMatrix* m, SCVector* v)
00156         { accumulate_product_sv(m,v); }
00157     void accumulate_product(SCMatrix* m, SCVector* v)
00158         {  accumulate_product_rv(m,v); }
00159     virtual void accumulate_product_sv(SymmSCMatrix* m, SCVector* v);
00160     virtual void accumulate_product_rv(SCMatrix* m, SCVector* v) = 0;
00162     virtual void accumulate(const SCVector*v) = 0;
00164     virtual void accumulate(const SCMatrix*m) = 0;
00166     virtual double scalar_product(SCVector*) = 0;
00168     virtual void element_op(const Ref<SCElementOp>&) = 0;
00169     virtual void element_op(const Ref<SCElementOp2>&,
00170                             SCVector*) = 0;
00171     virtual void element_op(const Ref<SCElementOp3>&,
00172                             SCVector*,SCVector*) = 0;
00174     void print(std::ostream&o=ExEnv::out0()) const;
00175     void print(const char* title=0,std::ostream&out=ExEnv::out0(),int=10) const;
00176     virtual void vprint(const char*title=0,std::ostream&out=ExEnv::out0(),
00177                         int=10) const = 0;
00178 
00180     Ref<MessageGrp> messagegrp() const;
00181     
00186     virtual Ref<SCMatrixSubblockIter> local_blocks(
00187         SCMatrixSubblockIter::Access) = 0;
00189     virtual Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access) = 0;
00190 };
00191 
00195 class SCMatrix: public DescribedClass {
00196   protected:
00197     RefSCDimension d1,d2;
00198     Ref<SCMatrixKit> kit_;
00199   public:
00200     // used to control transformations
00201     enum Transform { NormalTransform = 0, TransposeTransform = 1 };
00202     
00203     // concrete functions (some can be overridden)
00204     SCMatrix(const RefSCDimension&, const RefSCDimension&, SCMatrixKit *);
00205     virtual ~SCMatrix();
00206 
00208     virtual void save(StateOut&);
00209     virtual void restore(StateIn&);
00210 
00212     Ref<SCMatrixKit> kit() const { return kit_; }
00213 
00215     int nrow() const { return d1->n(); }
00217     int ncol() const { return d2->n(); }
00219     virtual double maxabs() const;
00221     virtual void randomize();
00223     void assign(double val) { assign_val(val); }
00225     void assign(const double* m) { assign_p(m); }
00227     void assign(const double** m) { assign_pp(m); }
00229     void assign(SCMatrix* m) { assign_r(m); }
00231     virtual void assign_val(double val);
00232     virtual void assign_p(const double* m);
00233     virtual void assign_pp(const double** m);
00234     virtual void assign_r(SCMatrix* m);
00237     void convert(double*a) const { convert_p(a); }
00238     void convert(double**a) const { convert_pp(a); }
00239     void convert(SCMatrix*a) { convert_r(a); }
00240     virtual void convert_p(double*) const;
00241     virtual void convert_pp(double**) const;
00242     virtual void convert_r(SCMatrix*a);
00243     virtual void convert_accumulate(SCMatrix*);
00245     virtual void scale(double val);
00247     virtual void scale_diagonal(double val);
00249     virtual void shift_diagonal(double val);
00251     virtual void unit();
00253     virtual SCMatrix* copy();
00255     virtual SCMatrix* clone();
00256 
00257     // pure virtual functions
00259     RefSCDimension rowdim() const { return d1; }
00260     RefSCDimension coldim() const { return d2; }
00262     virtual double get_element(int,int) const = 0;
00263     virtual void set_element(int,int,double) = 0;
00264     virtual void accumulate_element(int,int,double) = 0;
00265     
00269     virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0;
00270 
00272     virtual void assign_subblock(SCMatrix *m, int, int, int, int, int=0, int=0) =0;
00273 
00275     virtual void accumulate_subblock(SCMatrix *m, int, int, int, int, int=0,int=0) =0;
00276     
00278     virtual SCVector * get_row(int i) =0;
00279     virtual SCVector * get_column(int i) =0;
00280 
00282     virtual void assign_row(SCVector *v, int i) =0;
00283     virtual void assign_column(SCVector *v, int i) =0;
00284     
00286     virtual void accumulate_row(SCVector *v, int i) =0;
00287     virtual void accumulate_column(SCVector *v, int i) =0;
00288     
00290     virtual void accumulate(const SCMatrix* m) = 0;
00291     virtual void accumulate(const SymmSCMatrix* m) = 0;
00292     virtual void accumulate(const DiagSCMatrix* m) = 0;
00293     virtual void accumulate(const SCVector*) = 0;
00295     virtual void accumulate_outer_product(SCVector*,SCVector*) = 0;
00296     void accumulate_product(SCMatrix*m1,SCMatrix*m2)
00297         { accumulate_product_rr(m1,m2); }
00298     void accumulate_product(SCMatrix*m1,SymmSCMatrix*m2)
00299         { accumulate_product_rs(m1,m2); }
00300     void accumulate_product(SCMatrix*m1,DiagSCMatrix*m2)
00301         { accumulate_product_rd(m1,m2); }
00302     void accumulate_product(SymmSCMatrix*m1,SCMatrix*m2)
00303         { accumulate_product_sr(m1,m2); }
00304     void accumulate_product(DiagSCMatrix*m1,SCMatrix*m2)
00305         { accumulate_product_dr(m1,m2); }
00306     void accumulate_product(SymmSCMatrix*m1,SymmSCMatrix*m2)
00307         { accumulate_product_ss(m1,m2); }
00308     void accumulate_product(SymmSCMatrix*m1,DiagSCMatrix*m2)
00309         { accumulate_product_sd(m1,m2); }
00310     void accumulate_product(DiagSCMatrix*m1,SymmSCMatrix*m2)
00311         { accumulate_product_ds(m1,m2); }
00312     virtual void accumulate_product_rr(SCMatrix*,SCMatrix*) = 0;
00313     virtual void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
00314     virtual void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
00315     virtual void accumulate_product_sr(SymmSCMatrix*,SCMatrix*);
00316     virtual void accumulate_product_dr(DiagSCMatrix*,SCMatrix*);
00317     virtual void accumulate_product_ss(SymmSCMatrix*,SymmSCMatrix*);
00318     virtual void accumulate_product_sd(SymmSCMatrix*,DiagSCMatrix*);
00319     virtual void accumulate_product_ds(DiagSCMatrix*,SymmSCMatrix*);
00321     virtual void transpose_this() = 0;
00323     virtual double trace() =0;
00325     virtual double invert_this() = 0;
00327     virtual double determ_this() = 0;
00328 
00331     virtual void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
00332     virtual double solve_this(SCVector*) = 0;
00333     virtual void gen_invert_this();
00334 
00337     virtual void schmidt_orthog(SymmSCMatrix*, int n) =0;
00338 
00342     virtual int schmidt_orthog_tol(SymmSCMatrix*, double tol, double*res=0)=0;
00343     
00345     virtual void element_op(const Ref<SCElementOp>&) = 0;
00346     virtual void element_op(const Ref<SCElementOp2>&,
00347                             SCMatrix*) = 0;
00348     virtual void element_op(const Ref<SCElementOp3>&,
00349                             SCMatrix*,SCMatrix*) = 0;
00351     void print(std::ostream&o=ExEnv::out0()) const;
00352     void print(const char* title=0,std::ostream& out=ExEnv::out0(),
00353                int =10) const;
00354     virtual void vprint(const char*title=0,
00355                         std::ostream&out=ExEnv::out0(),int =10) const = 0;
00356 
00358     Ref<MessageGrp> messagegrp() const;
00359     
00362     virtual Ref<SCMatrixSubblockIter> local_blocks(
00363         SCMatrixSubblockIter::Access) = 0;
00365     virtual Ref<SCMatrixSubblockIter> all_blocks(
00366         SCMatrixSubblockIter::Access) = 0;
00367 };
00368 
00371 class SymmSCMatrix: public DescribedClass {
00372   protected:
00373     RefSCDimension d;
00374     Ref<SCMatrixKit> kit_;
00375   public:
00376     SymmSCMatrix(const RefSCDimension&, SCMatrixKit *);
00377     ~SymmSCMatrix();
00378 
00380     Ref<SCMatrixKit> kit() const { return kit_; }
00381 
00383     virtual void save(StateOut&);
00384     virtual void restore(StateIn&);
00386     virtual double maxabs() const;
00388     virtual void randomize();
00390     void assign(double val) { assign_val(val); }
00392     void assign(const double* m) { assign_p(m); }
00394     void assign(const double** m) { assign_pp(m); }
00397     void assign(SymmSCMatrix* m) { assign_s(m); }
00399     virtual void assign_val(double val);
00400     virtual void assign_p(const double* m);
00401     virtual void assign_pp(const double** m);
00402     virtual void assign_s(SymmSCMatrix* m);
00404     void convert(double*a) const { convert_p(a); }
00405     void convert(double**a) const { convert_pp(a); }
00406     void convert(SymmSCMatrix*a) { convert_s(a); }
00407     virtual void convert_p(double*) const;
00408     virtual void convert_pp(double**) const;
00409     virtual void convert_s(SymmSCMatrix*);
00410     virtual void convert_accumulate(SymmSCMatrix*);
00412     virtual void scale(double);
00414     virtual void scale_diagonal(double);
00416     virtual void shift_diagonal(double);
00418     virtual void unit();
00420     int n() const { return d->n(); }
00422     virtual SymmSCMatrix* copy();
00424     virtual SymmSCMatrix* clone();
00425 
00426     // pure virtual functions
00428     RefSCDimension dim() const { return d; }
00430     virtual double get_element(int,int) const = 0;
00431     virtual void set_element(int,int,double) = 0;
00432     virtual void accumulate_element(int,int,double) = 0;
00433 
00437     virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0;
00438     virtual SymmSCMatrix * get_subblock(int br, int er) =0;
00439 
00441     virtual void assign_subblock(SCMatrix *m, int, int, int, int) =0;
00442     virtual void assign_subblock(SymmSCMatrix *m, int, int) =0;
00443 
00445     virtual void accumulate_subblock(SCMatrix *m, int, int, int, int) =0;
00446     virtual void accumulate_subblock(SymmSCMatrix *m, int, int) =0;
00447 
00449     virtual SCVector * get_row(int i) =0;
00450 
00452     virtual void assign_row(SCVector *v, int i) =0;
00453     
00455     virtual void accumulate_row(SCVector *v, int i) =0;
00456 
00459     virtual void diagonalize(DiagSCMatrix*d,SCMatrix*m) = 0;
00461     virtual void accumulate(const SymmSCMatrix* m) = 0;
00463     virtual void accumulate_symmetric_sum(SCMatrix*) = 0;
00464     virtual void accumulate_symmetric_product(SCMatrix*);
00465     virtual void accumulate_transform(SCMatrix*,SymmSCMatrix*,
00466                             SCMatrix::Transform = SCMatrix::NormalTransform);
00467     virtual void accumulate_transform(SCMatrix*,DiagSCMatrix*, 
00468                             SCMatrix::Transform = SCMatrix::NormalTransform);
00469     virtual void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
00470     virtual void accumulate_symmetric_outer_product(SCVector*);
00473     virtual double scalar_product(SCVector* v);
00475     virtual double trace() = 0;
00477     virtual double invert_this() = 0;
00479     virtual double determ_this() = 0;
00480 
00481     virtual double solve_this(SCVector*) = 0;
00482     virtual void gen_invert_this() = 0;
00483 
00485     virtual void element_op(const Ref<SCElementOp>&) = 0;
00486     virtual void element_op(const Ref<SCElementOp2>&,
00487                             SymmSCMatrix*) = 0;
00488     virtual void element_op(const Ref<SCElementOp3>&,
00489                             SymmSCMatrix*,SymmSCMatrix*) = 0;
00491     void print(std::ostream&o=ExEnv::out0()) const;
00492     void print(const char* title=0,std::ostream& out=ExEnv::out0(),
00493                int =10) const;
00494     virtual void vprint(const char* title=0,
00495                         std::ostream& out=ExEnv::out0(), int =10) const;
00496 
00498     Ref<MessageGrp> messagegrp() const;
00499     
00502     virtual Ref<SCMatrixSubblockIter> local_blocks(
00503         SCMatrixSubblockIter::Access) = 0;
00505     virtual Ref<SCMatrixSubblockIter> all_blocks(
00506         SCMatrixSubblockIter::Access) = 0;
00507 };
00508 
00511 class DiagSCMatrix: public DescribedClass {
00512   protected:
00513     RefSCDimension d;
00514     Ref<SCMatrixKit> kit_;
00515   public:
00516     DiagSCMatrix(const RefSCDimension&, SCMatrixKit *);
00517     ~DiagSCMatrix();
00518 
00520     Ref<SCMatrixKit> kit() const { return kit_; }
00521 
00523     virtual void save(StateOut&);
00524     virtual void restore(StateIn&);
00525 
00527     virtual double maxabs() const;
00529     virtual void randomize();
00531     void assign(double val) { assign_val(val); }
00533     void assign(const double*p) { assign_p(p); }
00536     void assign(DiagSCMatrix*d_a) { assign_d(d_a); }
00538     virtual void assign_val(double val);
00539     virtual void assign_p(const double*);
00540     virtual void assign_d(DiagSCMatrix*);
00542     void convert(double*a) const { convert_p(a); }
00543     void convert(DiagSCMatrix*a) { convert_d(a); }
00544     virtual void convert_p(double*) const;
00545     virtual void convert_d(DiagSCMatrix*);
00546     virtual void convert_accumulate(DiagSCMatrix*);
00548     virtual void scale(double);
00550     int n() const { return d->n(); }
00552     virtual DiagSCMatrix* copy();
00554     virtual DiagSCMatrix* clone();
00555 
00556     // pure virtual functions
00558     RefSCDimension dim() const { return d; }
00560     virtual double get_element(int) const = 0;
00561     virtual void set_element(int,double) = 0;
00562     virtual void accumulate_element(int,double) = 0;
00564     virtual void accumulate(const DiagSCMatrix* m) = 0;
00566     virtual double trace() = 0;
00568     virtual double determ_this() = 0;
00570     virtual double invert_this() = 0;
00572     virtual void gen_invert_this() = 0;
00574     virtual void element_op(const Ref<SCElementOp>&) = 0;
00575     virtual void element_op(const Ref<SCElementOp2>&,
00576                             DiagSCMatrix*) = 0;
00577     virtual void element_op(const Ref<SCElementOp3>&,
00578                             DiagSCMatrix*,DiagSCMatrix*) = 0;
00580     void print(std::ostream&o=ExEnv::out0()) const;
00581     void print(const char* title=0,
00582                std::ostream& out=ExEnv::out0(), int =10) const;
00583     virtual void vprint(const char* title=0,
00584                         std::ostream& out=ExEnv::out0(), int =10) const;
00585 
00587     Ref<MessageGrp> messagegrp() const;
00588     
00591     virtual Ref<SCMatrixSubblockIter> local_blocks(
00592         SCMatrixSubblockIter::Access) = 0;
00594     virtual Ref<SCMatrixSubblockIter> all_blocks(
00595         SCMatrixSubblockIter::Access) = 0;
00596 };
00597 
00598 }
00599 
00600 #endif
00601 
00602 // Local Variables:
00603 // mode: c++
00604 // c-file-style: "CLJ"
00605 // End:

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