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
#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
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
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
virtual void convert(
double* v)
const;
00141
virtual void convert(
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
00201
enum Transform { NormalTransform = 0, TransposeTransform = 1 };
00202
00203
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
virtual void convert(
double*) const;
00238 virtual
void convert(
double**) const;
00241 virtual
void convert(
SCMatrix*);
00242 virtual
void convert_accumulate(SCMatrix*);
00244 virtual
void scale(
double val);
00246 virtual
void scale_diagonal(
double val);
00248 virtual
void shift_diagonal(
double val);
00250 virtual
void unit();
00252 virtual SCMatrix* copy();
00254 virtual SCMatrix* clone();
00255
00256
00258 RefSCDimension rowdim()
const {
return d1; }
00259
RefSCDimension coldim()
const {
return d2; }
00261
virtual double get_element(
int,
int) const = 0;
00262 virtual
void set_element(
int,
int,
double) = 0;
00263 virtual
void accumulate_element(
int,
int,
double) = 0;
00264
00268 virtual SCMatrix * get_subblock(
int br,
int er,
int bc,
int ec) =0;
00269
00271 virtual
void assign_subblock(SCMatrix *m,
int,
int,
int,
int,
int=0,
int=0) =0;
00272
00274 virtual
void accumulate_subblock(SCMatrix *m,
int,
int,
int,
int,
int=0,
int=0) =0;
00275
00277 virtual SCVector * get_row(
int i) =0;
00278 virtual SCVector * get_column(
int i) =0;
00279
00281 virtual
void assign_row(SCVector *v,
int i) =0;
00282 virtual
void assign_column(SCVector *v,
int i) =0;
00283
00285 virtual
void accumulate_row(SCVector *v,
int i) =0;
00286 virtual
void accumulate_column(SCVector *v,
int i) =0;
00287
00289 virtual
void accumulate(const SCMatrix* m) = 0;
00290 virtual
void accumulate(const SymmSCMatrix* m) = 0;
00291 virtual
void accumulate(const DiagSCMatrix* m) = 0;
00292 virtual
void accumulate(const SCVector*) = 0;
00294 virtual
void accumulate_outer_product(SCVector*,SCVector*) = 0;
00295
void accumulate_product(SCMatrix*m1,SCMatrix*m2)
00296 { accumulate_product_rr(m1,m2); }
00297
void accumulate_product(SCMatrix*m1,SymmSCMatrix*m2)
00298 { accumulate_product_rs(m1,m2); }
00299
void accumulate_product(SCMatrix*m1,DiagSCMatrix*m2)
00300 { accumulate_product_rd(m1,m2); }
00301
void accumulate_product(SymmSCMatrix*m1,SCMatrix*m2)
00302 { accumulate_product_sr(m1,m2); }
00303
void accumulate_product(DiagSCMatrix*m1,SCMatrix*m2)
00304 { accumulate_product_dr(m1,m2); }
00305
void accumulate_product(SymmSCMatrix*m1,SymmSCMatrix*m2)
00306 { accumulate_product_ss(m1,m2); }
00307
virtual void accumulate_product_rr(SCMatrix*,SCMatrix*) = 0;
00308
virtual void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
00309
virtual void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
00310
virtual void accumulate_product_sr(SymmSCMatrix*,SCMatrix*);
00311
virtual void accumulate_product_dr(DiagSCMatrix*,SCMatrix*);
00312
virtual void accumulate_product_ss(SymmSCMatrix*,SymmSCMatrix*);
00314
virtual void transpose_this() = 0;
00316
virtual double trace() =0;
00318
virtual double invert_this() = 0;
00320
virtual double determ_this() = 0;
00321
00324
virtual void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
00325
virtual double solve_this(SCVector*) = 0;
00326
virtual void gen_invert_this();
00327
00330
virtual void schmidt_orthog(SymmSCMatrix*,
int n) =0;
00331
00335
virtual int schmidt_orthog_tol(SymmSCMatrix*,
double tol,
double*res=0)=0;
00336
00338
virtual void element_op(
const Ref<SCElementOp>&) = 0;
00339
virtual void element_op(
const Ref<SCElementOp2>&,
00340 SCMatrix*) = 0;
00341
virtual void element_op(
const Ref<SCElementOp3>&,
00342 SCMatrix*,SCMatrix*) = 0;
00344
void print(std::ostream&o=ExEnv::out0())
const;
00345
void print(
const char* title=0,std::ostream& out=ExEnv::out0(),
00346
int =10) const;
00347 virtual
void vprint(const
char*title=0,
00348 std::ostream&out=ExEnv::out0(),
int =10) const = 0;
00349
00351 Ref<MessageGrp> messagegrp() const;
00352
00355 virtual Ref<SCMatrixSubblockIter> local_blocks(
00356 SCMatrixSubblockIter::Access) = 0;
00358 virtual Ref<SCMatrixSubblockIter> all_blocks(
00359 SCMatrixSubblockIter::Access) = 0;
00360 };
00361
00364 class
SymmSCMatrix: public DescribedClass {
00365
protected:
00366
RefSCDimension d;
00367
Ref<SCMatrixKit> kit_;
00368
public:
00369
SymmSCMatrix(
const RefSCDimension&,
SCMatrixKit *);
00370
00372 Ref<SCMatrixKit> kit()
const {
return kit_; }
00373
00375
virtual void save(
StateOut&);
00376
virtual void restore(
StateIn&);
00378
virtual double maxabs() const;
00380 virtual
void randomize();
00382 void assign(
double val) {
assign_val(val); }
00384 void assign(
const double* m) { assign_p(m); }
00386 void assign(
const double** m) { assign_pp(m); }
00389 void assign(
SymmSCMatrix* m) { assign_s(m); }
00391
virtual void assign_val(
double val);
00392
virtual void assign_p(
const double* m);
00393
virtual void assign_pp(
const double** m);
00394
virtual void assign_s(
SymmSCMatrix* m);
00396
virtual void convert(
double*) const;
00397 virtual
void convert(
double**) const;
00400 virtual
void convert(
SymmSCMatrix*);
00401 virtual
void convert_accumulate(SymmSCMatrix*);
00403 virtual
void scale(
double);
00405 virtual
void scale_diagonal(
double);
00407 virtual
void shift_diagonal(
double);
00409 virtual
void unit();
00411 int n()
const {
return d->
n(); }
00413
virtual SymmSCMatrix*
copy();
00415
virtual SymmSCMatrix*
clone();
00416
00417
00419 RefSCDimension dim()
const {
return d; }
00421
virtual double get_element(
int,
int) const = 0;
00422 virtual
void set_element(
int,
int,
double) = 0;
00423 virtual
void accumulate_element(
int,
int,
double) = 0;
00424
00428 virtual
SCMatrix * get_subblock(
int br,
int er,
int bc,
int ec) =0;
00429 virtual
SymmSCMatrix * get_subblock(
int br,
int er) =0;
00430
00432 virtual
void assign_subblock(
SCMatrix *m,
int,
int,
int,
int) =0;
00433 virtual
void assign_subblock(
SymmSCMatrix *m,
int,
int) =0;
00434
00436 virtual
void accumulate_subblock(
SCMatrix *m,
int,
int,
int,
int) =0;
00437 virtual
void accumulate_subblock(
SymmSCMatrix *m,
int,
int) =0;
00438
00440 virtual
SCVector * get_row(
int i) =0;
00441
00443 virtual
void assign_row(
SCVector *v,
int i) =0;
00444
00446 virtual
void accumulate_row(
SCVector *v,
int i) =0;
00447
00450 virtual
void diagonalize(
DiagSCMatrix*d,
SCMatrix*m) = 0;
00452 virtual
void accumulate(const
SymmSCMatrix* m) = 0;
00454 virtual
void accumulate_symmetric_sum(
SCMatrix*) = 0;
00455 virtual
void accumulate_symmetric_product(SCMatrix*);
00456 virtual
void accumulate_transform(SCMatrix*,
SymmSCMatrix*,
00457 SCMatrix::Transform = SCMatrix::NormalTransform);
00458 virtual
void accumulate_transform(SCMatrix*,
DiagSCMatrix*,
00459 SCMatrix::Transform = SCMatrix::NormalTransform);
00460 virtual
void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
00461 virtual
void accumulate_symmetric_outer_product(
SCVector*);
00464 virtual
double scalar_product(SCVector* v);
00466 virtual
double trace() = 0;
00468 virtual
double invert_this() = 0;
00470 virtual
double determ_this() = 0;
00471
00472 virtual
double solve_this(SCVector*) = 0;
00473 virtual
void gen_invert_this() = 0;
00474
00476 virtual
void element_op(const
Ref<
SCElementOp>&) = 0;
00477 virtual
void element_op(const
Ref<
SCElementOp2>&,
00478 SymmSCMatrix*) = 0;
00479 virtual
void element_op(const
Ref<
SCElementOp3>&,
00480 SymmSCMatrix*,SymmSCMatrix*) = 0;
00482
void print(std::ostream&o=
ExEnv::out0()) const;
00483
void print(const
char* title=0,std::ostream& out=
ExEnv::out0(),
00484
int =10) const;
00485 virtual
void vprint(const
char* title=0,
00486 std::ostream& out=
ExEnv::out0(),
int =10) const;
00487
00489
Ref<
MessageGrp> messagegrp() const;
00490
00493 virtual
Ref<
SCMatrixSubblockIter> local_blocks(
00494
SCMatrixSubblockIter::Access) = 0;
00496 virtual
Ref<
SCMatrixSubblockIter> all_blocks(
00497
SCMatrixSubblockIter::Access) = 0;
00498 };
00499
00502 class DiagSCMatrix: public DescribedClass {
00503
protected:
00504
RefSCDimension d;
00505
Ref<SCMatrixKit> kit_;
00506
public:
00507 DiagSCMatrix(
const RefSCDimension&,
SCMatrixKit *);
00508
00510 Ref<SCMatrixKit> kit()
const {
return kit_; }
00511
00513
virtual void save(
StateOut&);
00514
virtual void restore(
StateIn&);
00515
00517
virtual double maxabs() const;
00519 virtual
void randomize();
00521 void assign(
double val) {
assign_val(val); }
00523 void assign(
const double*p) { assign_p(p); }
00526 void assign(DiagSCMatrix*d_a) { assign_d(d_a); }
00528
virtual void assign_val(
double val);
00529
virtual void assign_p(
const double*);
00530
virtual void assign_d(DiagSCMatrix*);
00532
virtual void convert(
double*) const;
00535 virtual
void convert(DiagSCMatrix*);
00536 virtual
void convert_accumulate(DiagSCMatrix*);
00538 virtual
void scale(
double);
00540 int n()
const {
return d->
n(); }
00542
virtual DiagSCMatrix*
copy();
00544
virtual DiagSCMatrix*
clone();
00545
00546
00548 RefSCDimension dim()
const {
return d; }
00550
virtual double get_element(
int) const = 0;
00551 virtual
void set_element(
int,
double) = 0;
00552 virtual
void accumulate_element(
int,
double) = 0;
00554 virtual
void accumulate(const DiagSCMatrix* m) = 0;
00556 virtual
double trace() = 0;
00558 virtual
double determ_this() = 0;
00560 virtual
double invert_this() = 0;
00562 virtual
void gen_invert_this() = 0;
00564 virtual
void element_op(const
Ref<SCElementOp>&) = 0;
00565 virtual
void element_op(const
Ref<SCElementOp2>&,
00566 DiagSCMatrix*) = 0;
00567 virtual
void element_op(const
Ref<SCElementOp3>&,
00568 DiagSCMatrix*,DiagSCMatrix*) = 0;
00570
void print(std::ostream&o=
ExEnv::out0()) const;
00571
void print(const
char* title=0,
00572 std::ostream& out=
ExEnv::out0(),
int =10) const;
00573 virtual
void vprint(const
char* title=0,
00574 std::ostream& out=
ExEnv::out0(),
int =10) const;
00575
00577
Ref<
MessageGrp> messagegrp() const;
00578
00581 virtual
Ref<
SCMatrixSubblockIter> local_blocks(
00582
SCMatrixSubblockIter::Access) = 0;
00584 virtual
Ref<
SCMatrixSubblockIter> all_blocks(
00585
SCMatrixSubblockIter::Access) = 0;
00586 };
00587
00588 }
00589
00590 #endif
00591
00592
00593
00594
00595