[0b990d] | 1 | //
|
---|
| 2 | // abstract.h
|
---|
| 3 | //
|
---|
| 4 | // Copyright (C) 1996 Limit Point Systems, Inc.
|
---|
| 5 | //
|
---|
| 6 | // Author: Curtis Janssen <cljanss@limitpt.com>
|
---|
| 7 | // Maintainer: LPS
|
---|
| 8 | //
|
---|
| 9 | // This file is part of the SC Toolkit.
|
---|
| 10 | //
|
---|
| 11 | // The SC Toolkit is free software; you can redistribute it and/or modify
|
---|
| 12 | // it under the terms of the GNU Library General Public License as published by
|
---|
| 13 | // the Free Software Foundation; either version 2, or (at your option)
|
---|
| 14 | // any later version.
|
---|
| 15 | //
|
---|
| 16 | // The SC Toolkit is distributed in the hope that it will be useful,
|
---|
| 17 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 18 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 19 | // GNU Library General Public License for more details.
|
---|
| 20 | //
|
---|
| 21 | // You should have received a copy of the GNU Library General Public License
|
---|
| 22 | // along with the SC Toolkit; see the file COPYING.LIB. If not, write to
|
---|
| 23 | // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
---|
| 24 | //
|
---|
| 25 | // The U.S. Government is granted a limited license as per AL 91-7.
|
---|
| 26 | //
|
---|
| 27 |
|
---|
| 28 | #ifndef _math_scmat_abstract_h
|
---|
| 29 | #define _math_scmat_abstract_h
|
---|
| 30 |
|
---|
| 31 | #ifdef __GNUC__
|
---|
| 32 | #pragma interface
|
---|
| 33 | #endif
|
---|
| 34 |
|
---|
| 35 | #include <util/group/message.h>
|
---|
| 36 |
|
---|
| 37 | #include <util/state/state.h>
|
---|
| 38 | #include <math/scmat/dim.h>
|
---|
| 39 | #include <math/scmat/block.h>
|
---|
| 40 | #include <iostream>
|
---|
| 41 |
|
---|
| 42 | namespace sc {
|
---|
| 43 |
|
---|
| 44 | class SCMatrix;
|
---|
| 45 | class SymmSCMatrix;
|
---|
| 46 | class DiagSCMatrix;
|
---|
| 47 | class SCVector;
|
---|
| 48 |
|
---|
| 49 | class SCElementOp;
|
---|
| 50 | class SCElementOp2;
|
---|
| 51 | class SCElementOp3;
|
---|
| 52 |
|
---|
| 53 | class RefSCDimension;
|
---|
| 54 |
|
---|
| 55 | /** The SCMatrixKit abstract class acts as a factory for producing
|
---|
| 56 | matrices. By using one of these, the program makes sure that all of the
|
---|
| 57 | matrices are consistent. */
|
---|
| 58 | class SCMatrixKit: public DescribedClass {
|
---|
| 59 | protected:
|
---|
| 60 | Ref<MessageGrp> grp_;
|
---|
| 61 |
|
---|
| 62 | public:
|
---|
| 63 | SCMatrixKit();
|
---|
| 64 | SCMatrixKit(const Ref<KeyVal>&);
|
---|
| 65 | ~SCMatrixKit();
|
---|
| 66 |
|
---|
| 67 | // these members are default in local.cc
|
---|
| 68 | /** This returns a LocalSCMatrixKit, unless the
|
---|
| 69 | default has been changed with set_default_matrixkit. */
|
---|
| 70 | static SCMatrixKit* default_matrixkit();
|
---|
| 71 | static void set_default_matrixkit(const Ref<SCMatrixKit> &);
|
---|
| 72 |
|
---|
| 73 | Ref<MessageGrp> messagegrp() const;
|
---|
| 74 |
|
---|
| 75 | /// Given the dimensions, create matrices or vectors.
|
---|
| 76 | virtual SCMatrix* matrix(const RefSCDimension&,const RefSCDimension&) = 0;
|
---|
| 77 | virtual SymmSCMatrix* symmmatrix(const RefSCDimension&) = 0;
|
---|
| 78 | virtual DiagSCMatrix* diagmatrix(const RefSCDimension&) = 0;
|
---|
| 79 | virtual SCVector* vector(const RefSCDimension&) = 0;
|
---|
| 80 |
|
---|
| 81 | /** Given the dimensions and a StateIn object,
|
---|
| 82 | restore matrices or vectors. */
|
---|
| 83 | SCMatrix* restore_matrix(StateIn&,
|
---|
| 84 | const RefSCDimension&,
|
---|
| 85 | const RefSCDimension&);
|
---|
| 86 | SymmSCMatrix* restore_symmmatrix(StateIn&,
|
---|
| 87 | const RefSCDimension&);
|
---|
| 88 | DiagSCMatrix* restore_diagmatrix(StateIn&,
|
---|
| 89 | const RefSCDimension&);
|
---|
| 90 | SCVector* restore_vector(StateIn&,
|
---|
| 91 | const RefSCDimension&);
|
---|
| 92 | };
|
---|
| 93 |
|
---|
| 94 |
|
---|
| 95 | /** The SCVector class is the abstract base class for
|
---|
| 96 | double valued vectors. */
|
---|
| 97 | class SCVector: public DescribedClass {
|
---|
| 98 | protected:
|
---|
| 99 | RefSCDimension d;
|
---|
| 100 | Ref<SCMatrixKit> kit_;
|
---|
| 101 | public:
|
---|
| 102 | SCVector(const RefSCDimension&, SCMatrixKit *);
|
---|
| 103 |
|
---|
| 104 | /// Save and restore this in an implementation independent way.
|
---|
| 105 | virtual void save(StateOut&);
|
---|
| 106 | virtual void restore(StateIn&);
|
---|
| 107 |
|
---|
| 108 | /// Return the SCMatrixKit used to create this object.
|
---|
| 109 | Ref<SCMatrixKit> kit() const { return kit_; }
|
---|
| 110 |
|
---|
| 111 | // concrete functions (some can be overridden)
|
---|
| 112 | /// Return a vector with the same dimension and same elements.
|
---|
| 113 | virtual SCVector* copy();
|
---|
| 114 | /// Return a vector with the same dimension but uninitialized memory.
|
---|
| 115 | virtual SCVector* clone();
|
---|
| 116 |
|
---|
| 117 | virtual ~SCVector();
|
---|
| 118 | /// Return the length of the vector.
|
---|
| 119 | int n() const { return d->n(); }
|
---|
| 120 | /// Return the maximum absolute value element of this vector.
|
---|
| 121 | virtual double maxabs() const;
|
---|
| 122 | /// Normalize this.
|
---|
| 123 | virtual void normalize();
|
---|
| 124 | /// Assign each element to a random number between -1 and 1
|
---|
| 125 | virtual void randomize();
|
---|
| 126 | /// Assign all elements of this to val.
|
---|
| 127 | void assign(double val) { assign_val(val); }
|
---|
| 128 | /// Assign element i to v[i] for all i.
|
---|
| 129 | void assign(const double* v) { assign_p(v); }
|
---|
| 130 | /** Make this have the same elements as v. The dimensions must
|
---|
| 131 | match. */
|
---|
| 132 | void assign(SCVector* v) { assign_v(v); }
|
---|
| 133 | /// Overridden to implement the assign functions.
|
---|
| 134 | virtual void assign_val(double val);
|
---|
| 135 | virtual void assign_p(const double* v);
|
---|
| 136 | virtual void assign_v(SCVector *v);
|
---|
| 137 | /// Assign v[i] to element i for all i.
|
---|
| 138 | virtual void convert(double* v) const;
|
---|
| 139 | /** Convert an SCVector of a different specialization
|
---|
| 140 | to this specialization and possibly accumulate the data. */
|
---|
| 141 | virtual void convert(SCVector*);
|
---|
| 142 | virtual void convert_accumulate(SCVector*);
|
---|
| 143 | /// Multiply each element by val.
|
---|
| 144 | virtual void scale(double val);
|
---|
| 145 |
|
---|
| 146 | /// Return the RefSCDimension corresponding to this vector.
|
---|
| 147 | RefSCDimension dim() const { return d; }
|
---|
| 148 | /// Set element i to val.
|
---|
| 149 | virtual void set_element(int i,double val) = 0;
|
---|
| 150 | /// Add val to element i.
|
---|
| 151 | virtual void accumulate_element(int,double) = 0;
|
---|
| 152 | /// Return the value of element i.
|
---|
| 153 | virtual double get_element(int i) const = 0;
|
---|
| 154 | /// Sum the result of m times v into this.
|
---|
| 155 | void accumulate_product(SymmSCMatrix* m, SCVector* v)
|
---|
| 156 | { accumulate_product_sv(m,v); }
|
---|
| 157 | void accumulate_product(SCMatrix* m, SCVector* v)
|
---|
| 158 | { accumulate_product_rv(m,v); }
|
---|
| 159 | virtual void accumulate_product_sv(SymmSCMatrix* m, SCVector* v);
|
---|
| 160 | virtual void accumulate_product_rv(SCMatrix* m, SCVector* v) = 0;
|
---|
| 161 | /// Sum v into this.
|
---|
| 162 | virtual void accumulate(const SCVector*v) = 0;
|
---|
| 163 | /// Sum m into this. One of m's dimensions must be 1.
|
---|
| 164 | virtual void accumulate(const SCMatrix*m) = 0;
|
---|
| 165 | /// Return the dot product.
|
---|
| 166 | virtual double scalar_product(SCVector*) = 0;
|
---|
| 167 | /// Perform the element operation op on each element of this.
|
---|
| 168 | virtual void element_op(const Ref<SCElementOp>&) = 0;
|
---|
| 169 | virtual void element_op(const Ref<SCElementOp2>&,
|
---|
| 170 | SCVector*) = 0;
|
---|
| 171 | virtual void element_op(const Ref<SCElementOp3>&,
|
---|
| 172 | SCVector*,SCVector*) = 0;
|
---|
| 173 | /// Print out the vector.
|
---|
| 174 | void print(std::ostream&o=ExEnv::out0()) const;
|
---|
| 175 | void print(const char* title=0,std::ostream&out=ExEnv::out0(),int=10) const;
|
---|
| 176 | virtual void vprint(const char*title=0,std::ostream&out=ExEnv::out0(),
|
---|
| 177 | int=10) const = 0;
|
---|
| 178 |
|
---|
| 179 | /// Returns the message group used by the matrix kit
|
---|
| 180 | Ref<MessageGrp> messagegrp() const;
|
---|
| 181 |
|
---|
| 182 | /** Returns iterators for the local (rapidly accessible) blocks used in
|
---|
| 183 | this vector. Only one iterator is allowed for a matrix is it has
|
---|
| 184 | Accum or Write access is allowed. Multiple Read iterators are
|
---|
| 185 | permitted. */
|
---|
| 186 | virtual Ref<SCMatrixSubblockIter> local_blocks(
|
---|
| 187 | SCMatrixSubblockIter::Access) = 0;
|
---|
| 188 | /// Returns iterators for the all blocks used in this vector.
|
---|
| 189 | virtual Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access) = 0;
|
---|
| 190 | };
|
---|
| 191 |
|
---|
| 192 | /** The SCMatrix class is the abstract base class for general double valued
|
---|
| 193 | n by m matrices. For symmetric matrices use SymmSCMatrix and for
|
---|
| 194 | diagonal matrices use DiagSCMatrix. */
|
---|
| 195 | class SCMatrix: public DescribedClass {
|
---|
| 196 | protected:
|
---|
| 197 | RefSCDimension d1,d2;
|
---|
| 198 | Ref<SCMatrixKit> kit_;
|
---|
| 199 | public:
|
---|
| 200 | // used to control transformations
|
---|
| 201 | enum Transform { NormalTransform = 0, TransposeTransform = 1 };
|
---|
| 202 |
|
---|
| 203 | // concrete functions (some can be overridden)
|
---|
| 204 | SCMatrix(const RefSCDimension&, const RefSCDimension&, SCMatrixKit *);
|
---|
| 205 | virtual ~SCMatrix();
|
---|
| 206 |
|
---|
| 207 | /// Save and restore this in an implementation independent way.
|
---|
| 208 | virtual void save(StateOut&);
|
---|
| 209 | virtual void restore(StateIn&);
|
---|
| 210 |
|
---|
| 211 | /// Return the SCMatrixKit used to create this object.
|
---|
| 212 | Ref<SCMatrixKit> kit() const { return kit_; }
|
---|
| 213 |
|
---|
| 214 | /// Return the number of rows.
|
---|
| 215 | int nrow() const { return d1->n(); }
|
---|
| 216 | /// Return the number of columns.
|
---|
| 217 | int ncol() const { return d2->n(); }
|
---|
| 218 | /// Return the maximum absolute value element.
|
---|
| 219 | virtual double maxabs() const;
|
---|
| 220 | /// Assign each element to a random number between -1 and 1
|
---|
| 221 | virtual void randomize();
|
---|
| 222 | /// Set all elements to val.
|
---|
| 223 | void assign(double val) { assign_val(val); }
|
---|
| 224 | /// Assign element i, j to m[ir*nrow()+j].
|
---|
| 225 | void assign(const double* m) { assign_p(m); }
|
---|
| 226 | /// Assign element i, j to m[i][j].
|
---|
| 227 | void assign(const double** m) { assign_pp(m); }
|
---|
| 228 | /// Make this have the same elements as m. The dimensions must match.
|
---|
| 229 | void assign(SCMatrix* m) { assign_r(m); }
|
---|
| 230 | /// Overridden to implement to assign members.
|
---|
| 231 | virtual void assign_val(double val);
|
---|
| 232 | virtual void assign_p(const double* m);
|
---|
| 233 | virtual void assign_pp(const double** m);
|
---|
| 234 | virtual void assign_r(SCMatrix* m);
|
---|
| 235 | /** Like the assign members, but these write values to the
|
---|
| 236 | arguments. */
|
---|
| 237 | virtual void convert(double*) const;
|
---|
| 238 | virtual void convert(double**) const;
|
---|
| 239 | /** Convert an SCMatrix of a different specialization to this
|
---|
| 240 | specialization and possibly accumulate the data. */
|
---|
| 241 | virtual void convert(SCMatrix*);
|
---|
| 242 | virtual void convert_accumulate(SCMatrix*);
|
---|
| 243 | /// Multiply all elements by val.
|
---|
| 244 | virtual void scale(double val);
|
---|
| 245 | /// Scale the diagonal elements by val.
|
---|
| 246 | virtual void scale_diagonal(double val);
|
---|
| 247 | /// Shift the diagonal elements by val.
|
---|
| 248 | virtual void shift_diagonal(double val);
|
---|
| 249 | /// Make this equal to the unit matrix.
|
---|
| 250 | virtual void unit();
|
---|
| 251 | /// Return a matrix with the same dimension and same elements.
|
---|
| 252 | virtual SCMatrix* copy();
|
---|
| 253 | /// Return a matrix with the same dimension but uninitialized memory.
|
---|
| 254 | virtual SCMatrix* clone();
|
---|
| 255 |
|
---|
| 256 | // pure virtual functions
|
---|
| 257 | /// Return the row or column dimension.
|
---|
| 258 | RefSCDimension rowdim() const { return d1; }
|
---|
| 259 | RefSCDimension coldim() const { return d2; }
|
---|
| 260 | /// Return or modify an element.
|
---|
| 261 | virtual double get_element(int,int) const = 0;
|
---|
| 262 | virtual void set_element(int,int,double) = 0;
|
---|
| 263 | virtual void accumulate_element(int,int,double) = 0;
|
---|
| 264 |
|
---|
| 265 | /** Return a subblock of this. The subblock is defined as
|
---|
| 266 | the rows starting at br and ending at er, and the
|
---|
| 267 | columns beginning at bc and ending at ec. */
|
---|
| 268 | virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0;
|
---|
| 269 |
|
---|
| 270 | /// Assign m to a subblock of this.
|
---|
| 271 | virtual void assign_subblock(SCMatrix *m, int, int, int, int, int=0, int=0) =0;
|
---|
| 272 |
|
---|
| 273 | /// Sum m into a subblock of this.
|
---|
| 274 | virtual void accumulate_subblock(SCMatrix *m, int, int, int, int, int=0,int=0) =0;
|
---|
| 275 |
|
---|
| 276 | /// Return a row or column of this.
|
---|
| 277 | virtual SCVector * get_row(int i) =0;
|
---|
| 278 | virtual SCVector * get_column(int i) =0;
|
---|
| 279 |
|
---|
| 280 | /// Assign v to a row or column of this.
|
---|
| 281 | virtual void assign_row(SCVector *v, int i) =0;
|
---|
| 282 | virtual void assign_column(SCVector *v, int i) =0;
|
---|
| 283 |
|
---|
| 284 | /// Sum v to a row or column of this.
|
---|
| 285 | virtual void accumulate_row(SCVector *v, int i) =0;
|
---|
| 286 | virtual void accumulate_column(SCVector *v, int i) =0;
|
---|
| 287 |
|
---|
| 288 | /// Sum m into this.
|
---|
| 289 | virtual void accumulate(const SCMatrix* m) = 0;
|
---|
| 290 | virtual void accumulate(const SymmSCMatrix* m) = 0;
|
---|
| 291 | virtual void accumulate(const DiagSCMatrix* m) = 0;
|
---|
| 292 | virtual void accumulate(const SCVector*) = 0;
|
---|
| 293 | /// Sum into this the products of various vectors or matrices.
|
---|
| 294 | virtual void accumulate_outer_product(SCVector*,SCVector*) = 0;
|
---|
| 295 | void accumulate_product(SCMatrix*m1,SCMatrix*m2)
|
---|
| 296 | { accumulate_product_rr(m1,m2); }
|
---|
| 297 | void accumulate_product(SCMatrix*m1,SymmSCMatrix*m2)
|
---|
| 298 | { accumulate_product_rs(m1,m2); }
|
---|
| 299 | void accumulate_product(SCMatrix*m1,DiagSCMatrix*m2)
|
---|
| 300 | { accumulate_product_rd(m1,m2); }
|
---|
| 301 | void accumulate_product(SymmSCMatrix*m1,SCMatrix*m2)
|
---|
| 302 | { accumulate_product_sr(m1,m2); }
|
---|
| 303 | void accumulate_product(DiagSCMatrix*m1,SCMatrix*m2)
|
---|
| 304 | { accumulate_product_dr(m1,m2); }
|
---|
| 305 | void accumulate_product(SymmSCMatrix*m1,SymmSCMatrix*m2)
|
---|
| 306 | { accumulate_product_ss(m1,m2); }
|
---|
| 307 | virtual void accumulate_product_rr(SCMatrix*,SCMatrix*) = 0;
|
---|
| 308 | virtual void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
|
---|
| 309 | virtual void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
|
---|
| 310 | virtual void accumulate_product_sr(SymmSCMatrix*,SCMatrix*);
|
---|
| 311 | virtual void accumulate_product_dr(DiagSCMatrix*,SCMatrix*);
|
---|
| 312 | virtual void accumulate_product_ss(SymmSCMatrix*,SymmSCMatrix*);
|
---|
| 313 | /// Transpose this.
|
---|
| 314 | virtual void transpose_this() = 0;
|
---|
| 315 | /// Return the trace.
|
---|
| 316 | virtual double trace() =0;
|
---|
| 317 | /// Invert this.
|
---|
| 318 | virtual double invert_this() = 0;
|
---|
| 319 | /// Return the determinant of this. this is overwritten.
|
---|
| 320 | virtual double determ_this() = 0;
|
---|
| 321 |
|
---|
| 322 | /** Compute the singular value decomposition for this,
|
---|
| 323 | possibly destroying this. */
|
---|
| 324 | virtual void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
|
---|
| 325 | virtual double solve_this(SCVector*) = 0;
|
---|
| 326 | virtual void gen_invert_this();
|
---|
| 327 |
|
---|
| 328 | /** Schmidt orthogonalize this. S is the overlap matrix.
|
---|
| 329 | n is the number of columns to orthogonalize. */
|
---|
| 330 | virtual void schmidt_orthog(SymmSCMatrix*, int n) =0;
|
---|
| 331 |
|
---|
| 332 | /** Schmidt orthogonalize this. S is the overlap matrix. tol is the
|
---|
| 333 | tolerance. The number of linearly independent vectors is
|
---|
| 334 | returned. */
|
---|
| 335 | virtual int schmidt_orthog_tol(SymmSCMatrix*, double tol, double*res=0)=0;
|
---|
| 336 |
|
---|
| 337 | /// Perform the element operation op on each element of this.
|
---|
| 338 | virtual void element_op(const Ref<SCElementOp>&) = 0;
|
---|
| 339 | virtual void element_op(const Ref<SCElementOp2>&,
|
---|
| 340 | SCMatrix*) = 0;
|
---|
| 341 | virtual void element_op(const Ref<SCElementOp3>&,
|
---|
| 342 | SCMatrix*,SCMatrix*) = 0;
|
---|
| 343 | /// Print out the matrix.
|
---|
| 344 | void print(std::ostream&o=ExEnv::out0()) const;
|
---|
| 345 | void print(const char* title=0,std::ostream& out=ExEnv::out0(),
|
---|
| 346 | int =10) const;
|
---|
| 347 | virtual void vprint(const char*title=0,
|
---|
| 348 | std::ostream&out=ExEnv::out0(),int =10) const = 0;
|
---|
| 349 |
|
---|
| 350 | /// Returns the message group used by the matrix kit
|
---|
| 351 | Ref<MessageGrp> messagegrp() const;
|
---|
| 352 |
|
---|
| 353 | /** Returns iterators for the local (rapidly accessible)
|
---|
| 354 | blocks used in this matrix. */
|
---|
| 355 | virtual Ref<SCMatrixSubblockIter> local_blocks(
|
---|
| 356 | SCMatrixSubblockIter::Access) = 0;
|
---|
| 357 | /// Returns iterators for the all blocks used in this matrix.
|
---|
| 358 | virtual Ref<SCMatrixSubblockIter> all_blocks(
|
---|
| 359 | SCMatrixSubblockIter::Access) = 0;
|
---|
| 360 | };
|
---|
| 361 |
|
---|
| 362 | /** The SymmSCMatrix class is the abstract base class for symmetric
|
---|
| 363 | double valued matrices. */
|
---|
| 364 | class SymmSCMatrix: public DescribedClass {
|
---|
| 365 | protected:
|
---|
| 366 | RefSCDimension d;
|
---|
| 367 | Ref<SCMatrixKit> kit_;
|
---|
| 368 | public:
|
---|
| 369 | SymmSCMatrix(const RefSCDimension&, SCMatrixKit *);
|
---|
| 370 | ~SymmSCMatrix();
|
---|
| 371 |
|
---|
| 372 | /// Return the SCMatrixKit object that created this object.
|
---|
| 373 | Ref<SCMatrixKit> kit() const { return kit_; }
|
---|
| 374 |
|
---|
| 375 | /// Save and restore this in an implementation independent way.
|
---|
| 376 | virtual void save(StateOut&);
|
---|
| 377 | virtual void restore(StateIn&);
|
---|
| 378 | /// Return the maximum absolute value element of this vector.
|
---|
| 379 | virtual double maxabs() const;
|
---|
| 380 | /// Assign each element to a random number between -1 and 1
|
---|
| 381 | virtual void randomize();
|
---|
| 382 | /// Set all elements to val.
|
---|
| 383 | void assign(double val) { assign_val(val); }
|
---|
| 384 | /** Assign element i, j to m[i*(i+1)/2+j]. */
|
---|
| 385 | void assign(const double* m) { assign_p(m); }
|
---|
| 386 | /// Assign element i, j to m[i][j].
|
---|
| 387 | void assign(const double** m) { assign_pp(m); }
|
---|
| 388 | /** Make this have the same elements as m. The dimensions must
|
---|
| 389 | match. */
|
---|
| 390 | void assign(SymmSCMatrix* m) { assign_s(m); }
|
---|
| 391 | /// Overridden to implement the assign functions
|
---|
| 392 | virtual void assign_val(double val);
|
---|
| 393 | virtual void assign_p(const double* m);
|
---|
| 394 | virtual void assign_pp(const double** m);
|
---|
| 395 | virtual void assign_s(SymmSCMatrix* m);
|
---|
| 396 | /// Like the assign members, but these write values to the arguments.
|
---|
| 397 | virtual void convert(double*) const;
|
---|
| 398 | virtual void convert(double**) const;
|
---|
| 399 | /** Convert an SCSymmSCMatrix of a different specialization
|
---|
| 400 | to this specialization and possibly accumulate the data. */
|
---|
| 401 | virtual void convert(SymmSCMatrix*);
|
---|
| 402 | virtual void convert_accumulate(SymmSCMatrix*);
|
---|
| 403 | /// Multiply all elements by val.
|
---|
| 404 | virtual void scale(double);
|
---|
| 405 | /// Scale the diagonal elements by val.
|
---|
| 406 | virtual void scale_diagonal(double);
|
---|
| 407 | /// Shift the diagonal elements by val.
|
---|
| 408 | virtual void shift_diagonal(double);
|
---|
| 409 | /// Make this equal to the unit matrix.
|
---|
| 410 | virtual void unit();
|
---|
| 411 | /// Return the dimension.
|
---|
| 412 | int n() const { return d->n(); }
|
---|
| 413 | /// Return a matrix with the same dimension and same elements.
|
---|
| 414 | virtual SymmSCMatrix* copy();
|
---|
| 415 | /// Return a matrix with the same dimension but uninitialized memory.
|
---|
| 416 | virtual SymmSCMatrix* clone();
|
---|
| 417 |
|
---|
| 418 | // pure virtual functions
|
---|
| 419 | /// Return the dimension.
|
---|
| 420 | RefSCDimension dim() const { return d; }
|
---|
| 421 | /// Return or modify an element.
|
---|
| 422 | virtual double get_element(int,int) const = 0;
|
---|
| 423 | virtual void set_element(int,int,double) = 0;
|
---|
| 424 | virtual void accumulate_element(int,int,double) = 0;
|
---|
| 425 |
|
---|
| 426 | /** Return a subblock of this. The subblock is defined as the rows
|
---|
| 427 | starting at br and ending at er, and the columns beginning at bc
|
---|
| 428 | and ending at ec. */
|
---|
| 429 | virtual SCMatrix * get_subblock(int br, int er, int bc, int ec) =0;
|
---|
| 430 | virtual SymmSCMatrix * get_subblock(int br, int er) =0;
|
---|
| 431 |
|
---|
| 432 | /// Assign m to a subblock of this.
|
---|
| 433 | virtual void assign_subblock(SCMatrix *m, int, int, int, int) =0;
|
---|
| 434 | virtual void assign_subblock(SymmSCMatrix *m, int, int) =0;
|
---|
| 435 |
|
---|
| 436 | /// Sum m into a subblock of this.
|
---|
| 437 | virtual void accumulate_subblock(SCMatrix *m, int, int, int, int) =0;
|
---|
| 438 | virtual void accumulate_subblock(SymmSCMatrix *m, int, int) =0;
|
---|
| 439 |
|
---|
| 440 | /// Return a row of this.
|
---|
| 441 | virtual SCVector * get_row(int i) =0;
|
---|
| 442 |
|
---|
| 443 | /// Assign v to a row of this.
|
---|
| 444 | virtual void assign_row(SCVector *v, int i) =0;
|
---|
| 445 |
|
---|
| 446 | /// Sum v to a row of this.
|
---|
| 447 | virtual void accumulate_row(SCVector *v, int i) =0;
|
---|
| 448 |
|
---|
| 449 | /** Diagonalize this, placing the eigenvalues in d and the eigenvectors
|
---|
| 450 | in m. */
|
---|
| 451 | virtual void diagonalize(DiagSCMatrix*d,SCMatrix*m) = 0;
|
---|
| 452 | /// Sum m into this.
|
---|
| 453 | virtual void accumulate(const SymmSCMatrix* m) = 0;
|
---|
| 454 | /// Sum into this the products of various vectors or matrices.
|
---|
| 455 | virtual void accumulate_symmetric_sum(SCMatrix*) = 0;
|
---|
| 456 | virtual void accumulate_symmetric_product(SCMatrix*);
|
---|
| 457 | virtual void accumulate_transform(SCMatrix*,SymmSCMatrix*,
|
---|
| 458 | SCMatrix::Transform = SCMatrix::NormalTransform);
|
---|
| 459 | virtual void accumulate_transform(SCMatrix*,DiagSCMatrix*,
|
---|
| 460 | SCMatrix::Transform = SCMatrix::NormalTransform);
|
---|
| 461 | virtual void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
|
---|
| 462 | virtual void accumulate_symmetric_outer_product(SCVector*);
|
---|
| 463 | /** Return the scalar obtained by multiplying this on the
|
---|
| 464 | left and right by v. */
|
---|
| 465 | virtual double scalar_product(SCVector* v);
|
---|
| 466 | /// Return the trace.
|
---|
| 467 | virtual double trace() = 0;
|
---|
| 468 | /// Invert this.
|
---|
| 469 | virtual double invert_this() = 0;
|
---|
| 470 | /// Return the determinant of this. this is overwritten.
|
---|
| 471 | virtual double determ_this() = 0;
|
---|
| 472 |
|
---|
| 473 | virtual double solve_this(SCVector*) = 0;
|
---|
| 474 | virtual void gen_invert_this() = 0;
|
---|
| 475 |
|
---|
| 476 | /// Perform the element operation op on each element of this.
|
---|
| 477 | virtual void element_op(const Ref<SCElementOp>&) = 0;
|
---|
| 478 | virtual void element_op(const Ref<SCElementOp2>&,
|
---|
| 479 | SymmSCMatrix*) = 0;
|
---|
| 480 | virtual void element_op(const Ref<SCElementOp3>&,
|
---|
| 481 | SymmSCMatrix*,SymmSCMatrix*) = 0;
|
---|
| 482 | /// Print out the matrix.
|
---|
| 483 | void print(std::ostream&o=ExEnv::out0()) const;
|
---|
| 484 | void print(const char* title=0,std::ostream& out=ExEnv::out0(),
|
---|
| 485 | int =10) const;
|
---|
| 486 | virtual void vprint(const char* title=0,
|
---|
| 487 | std::ostream& out=ExEnv::out0(), int =10) const;
|
---|
| 488 |
|
---|
| 489 | /// Returns the message group used by the matrix kit
|
---|
| 490 | Ref<MessageGrp> messagegrp() const;
|
---|
| 491 |
|
---|
| 492 | /** Returns iterators for the local (rapidly accessible)
|
---|
| 493 | blocks used in this matrix. */
|
---|
| 494 | virtual Ref<SCMatrixSubblockIter> local_blocks(
|
---|
| 495 | SCMatrixSubblockIter::Access) = 0;
|
---|
| 496 | /// Returns iterators for the all blocks used in this matrix.
|
---|
| 497 | virtual Ref<SCMatrixSubblockIter> all_blocks(
|
---|
| 498 | SCMatrixSubblockIter::Access) = 0;
|
---|
| 499 | };
|
---|
| 500 |
|
---|
| 501 | /** The SymmSCMatrix class is the abstract base class for diagonal double
|
---|
| 502 | valued matrices. */
|
---|
| 503 | class DiagSCMatrix: public DescribedClass {
|
---|
| 504 | protected:
|
---|
| 505 | RefSCDimension d;
|
---|
| 506 | Ref<SCMatrixKit> kit_;
|
---|
| 507 | public:
|
---|
| 508 | DiagSCMatrix(const RefSCDimension&, SCMatrixKit *);
|
---|
| 509 | ~DiagSCMatrix();
|
---|
| 510 |
|
---|
| 511 | /// Return the SCMatrixKit used to create this object.
|
---|
| 512 | Ref<SCMatrixKit> kit() const { return kit_; }
|
---|
| 513 |
|
---|
| 514 | /// Save and restore this in an implementation independent way.
|
---|
| 515 | virtual void save(StateOut&);
|
---|
| 516 | virtual void restore(StateIn&);
|
---|
| 517 |
|
---|
| 518 | /// Return the maximum absolute value element of this vector.
|
---|
| 519 | virtual double maxabs() const;
|
---|
| 520 | /// Assign each element to a random number between -1 and 1
|
---|
| 521 | virtual void randomize();
|
---|
| 522 | /// Set all elements to val.
|
---|
| 523 | void assign(double val) { assign_val(val); }
|
---|
| 524 | /// Assign element i, i to m[i].
|
---|
| 525 | void assign(const double*p) { assign_p(p); }
|
---|
| 526 | /** Make this have the same elements as m. The dimensions must
|
---|
| 527 | match. */
|
---|
| 528 | void assign(DiagSCMatrix*d_a) { assign_d(d_a); }
|
---|
| 529 | /// Overridden to implement the assign members.
|
---|
| 530 | virtual void assign_val(double val);
|
---|
| 531 | virtual void assign_p(const double*);
|
---|
| 532 | virtual void assign_d(DiagSCMatrix*);
|
---|
| 533 | /// Like the assign member, but this writes values to the argument.
|
---|
| 534 | virtual void convert(double*) const;
|
---|
| 535 | /** Convert an SCDiagSCMatrix of a different specialization
|
---|
| 536 | to this specialization and possibly accumulate the data. */
|
---|
| 537 | virtual void convert(DiagSCMatrix*);
|
---|
| 538 | virtual void convert_accumulate(DiagSCMatrix*);
|
---|
| 539 | /// Multiply all elements by val.
|
---|
| 540 | virtual void scale(double);
|
---|
| 541 | /// Return the dimension.
|
---|
| 542 | int n() const { return d->n(); }
|
---|
| 543 | /// Return a matrix with the same dimension and same elements.
|
---|
| 544 | virtual DiagSCMatrix* copy();
|
---|
| 545 | /// Return a matrix with the same dimension but uninitialized memory.
|
---|
| 546 | virtual DiagSCMatrix* clone();
|
---|
| 547 |
|
---|
| 548 | // pure virtual functions
|
---|
| 549 | /// Return the dimension.
|
---|
| 550 | RefSCDimension dim() const { return d; }
|
---|
| 551 | /// Return or modify an element.
|
---|
| 552 | virtual double get_element(int) const = 0;
|
---|
| 553 | virtual void set_element(int,double) = 0;
|
---|
| 554 | virtual void accumulate_element(int,double) = 0;
|
---|
| 555 | /// Sum m into this.
|
---|
| 556 | virtual void accumulate(const DiagSCMatrix* m) = 0;
|
---|
| 557 | /// Return the trace.
|
---|
| 558 | virtual double trace() = 0;
|
---|
| 559 | /// Return the determinant of this. this is overwritten.
|
---|
| 560 | virtual double determ_this() = 0;
|
---|
| 561 | /// Invert this.
|
---|
| 562 | virtual double invert_this() = 0;
|
---|
| 563 | /// Do a generalized inversion of this.
|
---|
| 564 | virtual void gen_invert_this() = 0;
|
---|
| 565 | /// Perform the element operation op on each element of this.
|
---|
| 566 | virtual void element_op(const Ref<SCElementOp>&) = 0;
|
---|
| 567 | virtual void element_op(const Ref<SCElementOp2>&,
|
---|
| 568 | DiagSCMatrix*) = 0;
|
---|
| 569 | virtual void element_op(const Ref<SCElementOp3>&,
|
---|
| 570 | DiagSCMatrix*,DiagSCMatrix*) = 0;
|
---|
| 571 | /// Print out the matrix.
|
---|
| 572 | void print(std::ostream&o=ExEnv::out0()) const;
|
---|
| 573 | void print(const char* title=0,
|
---|
| 574 | std::ostream& out=ExEnv::out0(), int =10) const;
|
---|
| 575 | virtual void vprint(const char* title=0,
|
---|
| 576 | std::ostream& out=ExEnv::out0(), int =10) const;
|
---|
| 577 |
|
---|
| 578 | /// Returns the message group used by the matrix kit
|
---|
| 579 | Ref<MessageGrp> messagegrp() const;
|
---|
| 580 |
|
---|
| 581 | /** Returns iterators for the local (rapidly accessible)
|
---|
| 582 | blocks used in this matrix. */
|
---|
| 583 | virtual Ref<SCMatrixSubblockIter> local_blocks(
|
---|
| 584 | SCMatrixSubblockIter::Access) = 0;
|
---|
| 585 | /// Returns iterators for the all blocks used in this matrix.
|
---|
| 586 | virtual Ref<SCMatrixSubblockIter> all_blocks(
|
---|
| 587 | SCMatrixSubblockIter::Access) = 0;
|
---|
| 588 | };
|
---|
| 589 |
|
---|
| 590 | }
|
---|
| 591 |
|
---|
| 592 | #endif
|
---|
| 593 |
|
---|
| 594 | // Local Variables:
|
---|
| 595 | // mode: c++
|
---|
| 596 | // c-file-style: "CLJ"
|
---|
| 597 | // End:
|
---|