MPQC 3.0.0-alpha
Loading...
Searching...
No Matches
blocked.h
1//
2// blocked.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_blocked_h
29#define _math_scmat_blocked_h
30
31#include <math/scmat/block.h>
32#include <math/scmat/elemop.h>
33#include <math/scmat/matrix.h>
34#include <math/scmat/abstract.h>
35
36namespace sc {
37
38class BlockedSCMatrixKit;
39class BlockedSCVector;
40class BlockedSCMatrix;
41class BlockedSymmSCMatrix;
42class BlockedDiagSCMatrix;
43
46 private:
47 Ref<SCMatrixKit> subkit_;
48 public:
53 SymmSCMatrix* symmmatrix(const RefSCDimension&);
54 DiagSCMatrix* diagmatrix(const RefSCDimension&);
55 SCVector* vector(const RefSCDimension&);
56
58 Ref<SCMatrixKit> subkit() { return subkit_; }
59
62 SCMatrixKit* subkit = subkit_.pointer();
63 BlockedSCMatrixKit* bsubkit = dynamic_cast<BlockedSCMatrixKit*>(subkit);
64 while (bsubkit) {
65 subkit = bsubkit->subkit().pointer();
66 bsubkit = dynamic_cast<BlockedSCMatrixKit*>(subkit);
67 }
68 return subkit;
69 }
70
71};
72
73
75 friend class BlockedSCMatrix;
76 friend class BlockedSymmSCMatrix;
77 friend class BlockedDiagSCMatrix;
78 private:
79 Ref<SCMatrixKit> subkit;
80 RefSCVector *vecs_;
81
82 void resize(SCDimension*);
83
84 public:
87
88 // Save and restore this in an implementation independent way.
89 void save(StateOut&);
90 void restore(StateIn&);
91
92 void assign_val(double);
93 void assign_v(SCVector*);
94 void assign_p(const double*);
95
96 double get_element(int) const;
97 void set_element(int,double);
98 void accumulate_element(int,double);
99
100 void accumulate_product_rv(SCMatrix*,SCVector*);
101 void accumulate_product_sv(SymmSCMatrix*,SCVector*);
102
103 void accumulate(const SCVector*);
104 void accumulate(const SCMatrix*);
106
108 void element_op(const Ref<SCElementOp2>&,
109 SCVector*);
110 void element_op(const Ref<SCElementOp3>&,
112 void vprint(const char* title=0,
113 std::ostream& out=ExEnv::out0(), int =10) const;
114
115 // BlockedSCVector specific functions
116 RefSCDimension dim() const { return d; }
117 RefSCDimension dim(int) const;
118 int nblocks() const;
119 RefSCVector block(int);
120
121 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
122 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
123};
124
127 friend class BlockedSymmSCMatrix;
128 friend class BlockedDiagSCMatrix;
129 friend class BlockedSCVector;
130 private:
131 Ref<SCMatrixKit> subkit;
132 RefSCMatrix *mats_;
133 int nblocks_;
134
135 void resize(SCDimension*, SCDimension*);
136
137 public:
141
142 // Save and restore this in an implementation independent way.
144 void restore(StateIn&);
145
146 void assign_val(double);
147 double get_element(int,int) const;
148 void set_element(int,int,double);
149 void accumulate_element(int,int,double);
150
151 void assign_p(const double*);
152 void assign_pp(const double**);
153 void convert_p(double*) const;
154 void convert_pp(double**) const;
155
156 SCMatrix * get_subblock(int,int,int,int);
157 void assign_subblock(SCMatrix*, int,int,int,int,int=0,int=0);
158 void accumulate_subblock(SCMatrix*, int,int,int,int,int=0,int=0);
159
161 SCVector * get_column(int i);
162 void assign_row(SCVector *v, int i);
163 void assign_column(SCVector *v, int i);
164 void accumulate_row(SCVector *v, int i);
165 void accumulate_column(SCVector *v, int i);
166
168 void accumulate_product_rr(SCMatrix*,SCMatrix*);
169 void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
170 void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
171 void accumulate(const SCMatrix*);
172 void accumulate(const SymmSCMatrix*);
173 void accumulate(const DiagSCMatrix*);
174 void accumulate(const SCVector*);
175
177 double invert_this();
179 double solve_this(SCVector*);
180 double determ_this();
181 double trace();
183 void gen_invert_this(double condition_number_threshold = 1e8);
185 int schmidt_orthog_tol(SymmSCMatrix*, double tol, double *res=0);
186
187 void convert_accumulate(SCMatrix*a);
188
190 void element_op(const Ref<SCElementOp2>&,
191 SCMatrix*);
192 void element_op(const Ref<SCElementOp3>&,
194
195 void vprint(const char* title=0,
196 std::ostream& out=ExEnv::out0(), int =10) const;
197
198 // BlockedSCMatrix specific functions
199 RefSCDimension rowdim() const { return d1; }
200 RefSCDimension coldim() const { return d2; }
201 RefSCDimension rowdim(int) const;
202 RefSCDimension coldim(int) const;
203 int nblocks() const;
204 RefSCMatrix block(int);
205
206 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
207 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
208};
209
212 friend class BlockedSCMatrix;
213 friend class BlockedDiagSCMatrix;
214 friend class BlockedSCVector;
215 private:
216 Ref<SCMatrixKit> subkit;
217 RefSymmSCMatrix *mats_;
218
219 void resize(SCDimension*);
220
221 public:
224
225 // Save and restore this in an implementation independent way.
227 void restore(StateIn&);
228
229 double get_element(int,int) const;
230 void set_element(int,int,double);
231 void accumulate_element(int,int,double);
232 void scale(double);
233 void assign_val(double);
234 void assign_s(SymmSCMatrix*m);
235
236 void assign_p(const double*);
237 void assign_pp(const double**);
238 void convert_p(double*) const;
239 void convert_pp(double**) const;
240
241 SCMatrix * get_subblock(int,int,int,int);
242 SymmSCMatrix * get_subblock(int,int);
243 void assign_subblock(SCMatrix*, int,int,int,int);
244 void assign_subblock(SymmSCMatrix*, int,int);
245 void accumulate_subblock(SCMatrix*, int,int,int,int);
246 void accumulate_subblock(SymmSCMatrix*, int,int);
248 void assign_row(SCVector *v, int i);
249 void accumulate_row(SCVector *v, int i);
250
251 double invert_this();
252 double determ_this();
253 double trace();
254 double solve_this(SCVector*);
256 void gen_invert_this(double condition_number_threshold = 1e8);
257
262
264 void accumulate_symmetric_outer_product(SCVector*);
267 void accumulate_transform(SCMatrix*,SymmSCMatrix*,
268 SCMatrix::Transform = SCMatrix::NormalTransform);
269 void accumulate_transform(SCMatrix*,DiagSCMatrix*,
270 SCMatrix::Transform = SCMatrix::NormalTransform);
271 void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
272
273 void convert_accumulate(SymmSCMatrix*a);
274
276 void element_op(const Ref<SCElementOp2>&,
277 SymmSCMatrix*);
278 void element_op(const Ref<SCElementOp3>&,
280
281 void vprint(const char* title=0,
282 std::ostream& out=ExEnv::out0(), int =10) const;
283
284 // BlockedSymmSCMatrix specific functions
285 RefSCDimension dim() const { return d; }
286 RefSCDimension dim(int) const;
287 int nblocks() const;
288 RefSymmSCMatrix block(int);
289
290 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
291 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
292};
293
296 friend class BlockedSCMatrix;
297 friend class BlockedSymmSCMatrix;
298 friend class BlockedSCVector;
299 private:
300 Ref<SCMatrixKit> subkit;
301 RefDiagSCMatrix *mats_;
302
303 void resize(SCDimension*);
304
305 public:
308
309 // Save and restore this in an implementation independent way.
311 void restore(StateIn&);
312
313 double get_element(int) const;
314 void set_element(int,double);
315 void accumulate_element(int,double);
317
318 double invert_this();
319 double determ_this();
320 double trace();
322 void gen_invert_this(double condition_number_threshold = 1e8);
323
324 void convert_accumulate(DiagSCMatrix*a);
325
327 void element_op(const Ref<SCElementOp2>&,
328 DiagSCMatrix*);
329 void element_op(const Ref<SCElementOp3>&,
331 void vprint(const char* title=0,
332 std::ostream& out=ExEnv::out0(), int =10) const;
333
334 // BlockedDiagSCMatrix specific functions
335 RefSCDimension dim() const { return d; }
336 RefSCDimension dim(int) const;
337 int nblocks() const;
338 RefDiagSCMatrix block(int);
339
340 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
341 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
342};
343
345 private:
346 int current_block_;
347
348 public:
350 void working_on(int);
351 int current_block() const;
352};
353
355 private:
356 int current_block_;
357
358 public:
360 void working_on(int);
361 int current_block() const;
362};
363
365 private:
366 int current_block_;
367
368 public:
370 void working_on(int);
371 int current_block() const;
372};
373
374}
375
376#endif
377
378// Local Variables:
379// mode: c++
380// c-file-style: "CLJ"
381// End:
Blocked DiagSCMatrix.
Definition blocked.h:295
double get_element(int) const
Return or modify an element.
double invert_this()
Invert this.
void element_op(const Ref< SCElementOp > &)
Perform the element operation op on each element of this.
void save(StateOut &)
Save and restore this in an implementation independent way.
Ref< SCMatrixSubblockIter > all_blocks(SCMatrixSubblockIter::Access)
Returns iterators for the all blocks used in this matrix.
void gen_invert_this(double condition_number_threshold=1e8)
generalized-invert this.
double trace()
Return the trace.
Ref< SCMatrixSubblockIter > local_blocks(SCMatrixSubblockIter::Access)
Returns iterators for the local (rapidly accessible) blocks used in this matrix.
void accumulate(const DiagSCMatrix *)
Sum m into this.
double determ_this()
Return the determinant of this. this is overwritten.
Definition blocked.h:354
Definition blocked.h:364
Definition blocked.h:344
BlockedSCMatrixKit is a SCMatrixKit that produces blocked matrices.
Definition blocked.h:45
Ref< SCMatrixKit > subkit_lowest()
same as subkit, but recursive
Definition blocked.h:61
Ref< SCMatrixKit > subkit()
the kit used to implement blocks of the matrices
Definition blocked.h:58
SCMatrix * matrix(const RefSCDimension &, const RefSCDimension &)
Given the dimensions, create matrices or vectors.
Blocked SCMatrix.
Definition blocked.h:126
void schmidt_orthog(SymmSCMatrix *, int)
Schmidt orthogonalize this.
void assign_subblock(SCMatrix *, int, int, int, int, int=0, int=0)
Assign m to a subblock of this.
double get_element(int, int) const
Return or modify an element.
double determ_this()
Return the determinant of this. this is overwritten.
void assign_val(double)
Overridden to implement to assign members.
Ref< SCMatrixSubblockIter > local_blocks(SCMatrixSubblockIter::Access)
Returns iterators for the local (rapidly accessible) blocks used in this matrix.
void gen_invert_this(double condition_number_threshold=1e8)
generalized-invert this.
void accumulate_outer_product(SCVector *, SCVector *)
Sum into this the products of various vectors or matrices.
SCVector * get_row(int i)
Return a row or column of this.
double invert_this()
Invert this.
void accumulate_subblock(SCMatrix *, int, int, int, int, int=0, int=0)
Sum m into a subblock of this.
void transpose_this()
Transpose this.
void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V)
Compute the singular value decomposition for this, possibly destroying this.
void element_op(const Ref< SCElementOp > &)
Perform the element operation op on each element of this.
void assign_row(SCVector *v, int i)
Assign v to a row or column of this.
double trace()
Return the trace.
Ref< SCMatrixSubblockIter > all_blocks(SCMatrixSubblockIter::Access)
Returns iterators for the all blocks used in this matrix.
void accumulate(const SCMatrix *)
Sum m into this.
void accumulate_row(SCVector *v, int i)
Sum v to a row or column of this.
void save(StateOut &)
Save and restore this in an implementation independent way.
SCMatrix * get_subblock(int, int, int, int)
Return a subblock of this.
int schmidt_orthog_tol(SymmSCMatrix *, double tol, double *res=0)
Schmidt orthogonalize this.
Definition blocked.h:74
double scalar_product(SCVector *)
Return the dot product.
void accumulate(const SCMatrix *)
Sum m into this. One of m's dimensions must be 1.
void assign_val(double)
Overridden to implement the assign functions.
void element_op(const Ref< SCElementOp > &)
Perform the element operation op on each element of this.
double get_element(int) const
Return the value of element i.
void set_element(int, double)
Set element i to val.
Ref< SCMatrixSubblockIter > all_blocks(SCMatrixSubblockIter::Access)
Returns iterators for the all blocks used in this vector.
void accumulate_element(int, double)
Add val to element i.
void accumulate(const SCVector *)
Sum v into this.
Ref< SCMatrixSubblockIter > local_blocks(SCMatrixSubblockIter::Access)
Returns iterators for the local (rapidly accessible) blocks used in this vector.
void save(StateOut &)
Save and restore this in an implementation independent way.
Blocked SymmSCMatrix.
Definition blocked.h:211
double determ_this()
Return the determinant of this. this is overwritten.
void diagonalize(DiagSCMatrix *, SCMatrix *)
Diagonalize this, placing the eigenvalues in d and the eigenvectors in m.
Ref< SCMatrixSubblockIter > local_blocks(SCMatrixSubblockIter::Access)
Returns iterators for the local (rapidly accessible) blocks used in this matrix.
double scalar_product(SCVector *)
Return the scalar obtained by multiplying this on the left and right by v.
void accumulate_symmetric_sum(SCMatrix *)
Sum into a + a.t()
void element_op(const Ref< SCElementOp > &)
only applied to the unique elements of this.
void scale(double)
Multiply all elements by val.
void accumulate(const SymmSCMatrix *)
Sum m into this.
void assign_subblock(SCMatrix *, int, int, int, int)
Assign m to a subblock of this.
SCMatrix * get_subblock(int, int, int, int)
Return a subblock of this.
void assign_val(double)
Overridden to implement the assign functions.
void save(StateOut &)
Save and restore this in an implementation independent way.
void accumulate_symmetric_product(SCMatrix *)
Sum into this a * a.t()
double invert_this()
Invert this.
void eigensystem(SymmSCMatrix *S, DiagSCMatrix *e, SCMatrix *V)
like diagonalize(), but with general metric S
void gen_invert_this(double condition_number_threshold=1e8)
generalized-invert this.
Ref< SCMatrixSubblockIter > all_blocks(SCMatrixSubblockIter::Access)
Returns iterators for the all blocks used in this matrix.
void accumulate_subblock(SCMatrix *, int, int, int, int)
Sum m into a subblock of this.
double get_element(int, int) const
Return or modify an element.
SCVector * get_row(int i)
Return a row of this.
void assign_row(SCVector *v, int i)
Assign v to a row of this.
void accumulate_row(SCVector *v, int i)
Sum v to a row of this.
double trace()
Return the trace.
The SymmSCMatrix class is the abstract base class for diagonal double valued matrices.
Definition abstract.h:555
static std::ostream & out0()
Return an ostream that writes from node 0.
The RefDiagSCMatrix class is a smart pointer to an DiagSCMatrix specialization.
Definition matrix.h:389
The RefSCDimension class is a smart pointer to an SCDimension specialization.
Definition dim.h:152
The RefSCMatrix class is a smart pointer to an SCMatrix specialization.
Definition matrix.h:135
The RefSCVector class is a smart pointer to an SCVector specialization.
Definition matrix.h:55
The RefSymmSCMatrix class is a smart pointer to an SCSymmSCMatrix specialization.
Definition matrix.h:265
A template class that maintains references counts.
Definition ref.h:361
T * pointer() const
Returns a pointer the reference counted object.
Definition ref.h:413
The SCDimension class is used to determine the size and blocking of matrices.
Definition dim.h:105
The SCElementOp2 class is very similar to the SCElementOp class except that pairs of blocks are treat...
Definition elemop.h:159
The SCElementOp3 class is very similar to the SCElementOp class except that a triplet of blocks is tr...
Definition elemop.h:181
Objects of class SCElementOp are used to perform operations on the elements of matrices.
Definition elemop.h:94
The SCMatrixKit abstract class acts as a factory for producing matrices.
Definition abstract.h:57
The SCMatrix class is the abstract base class for general double valued n by m matrices.
Definition abstract.h:199
Transform
types of matrix transforms. Only real-valued matrices are assumed.
Definition abstract.h:205
The SCVector class is the abstract base class for double valued vectors.
Definition abstract.h:97
Restores fundamental and user-defined types from images created with StateOut.
Definition statein.h:79
Serializes fundamental and user-defined types.
Definition stateout.h:71
The SymmSCMatrix class is the abstract base class for symmetric double valued matrices.
Definition abstract.h:389
Contains all MPQC code up to version 3.
Definition mpqcin.h:14

Generated at Wed Sep 25 2024 02:45:30 for MPQC 3.0.0-alpha using the documentation package Doxygen 1.12.0.