MPQC 2.3.1

- Main Page
- Related Pages
- Classes
- Files

- File List

local.h
1 //
2 // local.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 #ifdef __GNUC__
29 #pragma interface
30 #endif
31
32 #ifndef _math_scmat_local_h
33 #define _math_scmat_local_h
34
35 #include <math/scmat/block.h>
36 #include <math/scmat/matrix.h>
37 #include <math/scmat/abstract.h>
38
39 namespace sc {
40
41 class LocalSCMatrixKit;
42 class LocalSCVector;
43 class LocalSCMatrix;
44 class LocalSymmSCMatrix;
45 class LocalDiagSCMatrix;
46
49 class LocalSCMatrixKit: public SCMatrixKit {
50 public:
51 LocalSCMatrixKit();
52 LocalSCMatrixKit(const Ref<KeyVal>&);
53 ~LocalSCMatrixKit();
54 SCMatrix* matrix(const RefSCDimension&,const RefSCDimension&);
55 SymmSCMatrix* symmmatrix(const RefSCDimension&);
56 DiagSCMatrix* diagmatrix(const RefSCDimension&);
57 SCVector* vector(const RefSCDimension&);
58 };
59
60 class LocalSCVector: public SCVector {
61 friend class LocalSCMatrix;
62 friend class LocalSymmSCMatrix;
63 friend class LocalDiagSCMatrix;
64 private:
65 Ref<SCVectorSimpleBlock> block;
66
67 void resize(int);
68 public:
69 LocalSCVector();
70 LocalSCVector(const RefSCDimension&,LocalSCMatrixKit*);
71 ~LocalSCVector();
72 void assign_val(double);
73 void assign_v(SCVector*);
74 void assign_p(const double*);
75
76 void set_element(int,double);
77 void accumulate_element(int,double);
78 double get_element(int) const;
79 void accumulate_product_sv(SymmSCMatrix*,SCVector*);
80 void accumulate_product_rv(SCMatrix*,SCVector*);
81 void accumulate(const SCVector*);
82 void accumulate(const SCMatrix*);
83 double scalar_product(SCVector*);
84 void element_op(const Ref<SCElementOp>&);
85 void element_op(const Ref<SCElementOp2>&,
86 SCVector*);
87 void element_op(const Ref<SCElementOp3>&,
88 SCVector*,SCVector*);
89 void vprint(const char* title=0,
90 std::ostream& out=ExEnv::out0(), int =10) const;
91
92 // return a pointer to the data for fast access
93 double *get_data();
94
95 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
96 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
97 };
98
99 class LocalSCMatrix: public SCMatrix {
100 friend class LocalSymmSCMatrix;
101 friend class LocalDiagSCMatrix;
102 friend class LocalSCVector;
103 private:
104 Ref<SCMatrixRectBlock> block;
105 double** rows;
106 private:
107 // utility functions
108 int compute_offset(int,int) const;
109 void resize(int,int);
110 public:
111 LocalSCMatrix(const RefSCDimension&,const RefSCDimension&,
112 LocalSCMatrixKit*);
113 ~LocalSCMatrix();
114
115 // implementations and overrides of virtual functions
116 void assign_val(double);
117 double get_element(int,int) const;
118 void set_element(int,int,double);
119 void accumulate_element(int,int,double);
120 SCMatrix * get_subblock(int,int,int,int);
121 void assign_subblock(SCMatrix*, int,int,int,int,int=0,int=0);
122 void accumulate_subblock(SCMatrix*, int,int,int,int,int=0,int=0);
123 SCVector * get_row(int i);
124 SCVector * get_column(int i);
125 void assign_row(SCVector *v, int i);
126 void assign_column(SCVector *v, int i);
127 void accumulate_row(SCVector *v, int i);
128 void accumulate_column(SCVector *v, int i);
129 void accumulate_outer_product(SCVector*,SCVector*);
130 void accumulate_product_rr(SCMatrix*,SCMatrix*);
131 void accumulate_product_rs(SCMatrix*,SymmSCMatrix*);
132 void accumulate_product_rd(SCMatrix*,DiagSCMatrix*);
133 void accumulate(const SCMatrix*);
134 void accumulate(const SymmSCMatrix*);
135 void accumulate(const DiagSCMatrix*);
136 void accumulate(const SCVector*);
137 void transpose_this();
138 double invert_this();
139 void svd_this(SCMatrix *U, DiagSCMatrix *sigma, SCMatrix *V);
140 double solve_this(SCVector*);
141 double determ_this();
142 double trace();
143 void schmidt_orthog(SymmSCMatrix*,int);
144 int schmidt_orthog_tol(SymmSCMatrix*, double tol, double *res=0);
145 void element_op(const Ref<SCElementOp>&);
146 void element_op(const Ref<SCElementOp2>&,
147 SCMatrix*);
148 void element_op(const Ref<SCElementOp3>&,
149 SCMatrix*,SCMatrix*);
150 void vprint(const char* title=0,
151 std::ostream& out=ExEnv::out0(), int =10) const;
152
153 // return a pointer to the data for fast access
154 double *get_data();
155 double **get_rows();
156
157 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
158 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
159 };
160
161 class LocalSymmSCMatrix: public SymmSCMatrix {
162 friend class LocalSCMatrix;
163 friend class LocalDiagSCMatrix;
164 friend class LocalSCVector;
165 private:
166 Ref<SCMatrixLTriBlock> block;
167 double** rows;
168 private:
169 // utility functions
170 int compute_offset(int,int) const;
171 void resize(int n);
172 public:
173 LocalSymmSCMatrix(const RefSCDimension&, LocalSCMatrixKit*);
174 ~LocalSymmSCMatrix();
175
176 // implementations and overrides of virtual functions
177 double get_element(int,int) const;
178 void set_element(int,int,double);
179 void accumulate_element(int,int,double);
180
181 SCMatrix * get_subblock(int,int,int,int);
182 SymmSCMatrix * get_subblock(int,int);
183 void assign_subblock(SCMatrix*, int,int,int,int);
184 void assign_subblock(SymmSCMatrix*, int,int);
185 void accumulate_subblock(SCMatrix*, int,int,int,int);
186 void accumulate_subblock(SymmSCMatrix*, int,int);
187 SCVector * get_row(int i);
188 void assign_row(SCVector *v, int i);
189 void accumulate_row(SCVector *v, int i);
190
191 void accumulate_product_rr(SCMatrix*,SCMatrix*);
192 void accumulate(const SymmSCMatrix*);
193 double invert_this();
194 double solve_this(SCVector*);
195 double trace();
196 double determ_this();
197 void gen_invert_this();
198
199 double scalar_product(SCVector*);
200 void diagonalize(DiagSCMatrix*,SCMatrix*);
201 void accumulate_symmetric_outer_product(SCVector*);
202 void accumulate_symmetric_product(SCMatrix*);
203 void accumulate_symmetric_sum(SCMatrix*);
204 void accumulate_transform(SCMatrix*,SymmSCMatrix*,
205 SCMatrix::Transform = SCMatrix::NormalTransform);
206 void accumulate_transform(SCMatrix*,DiagSCMatrix*,
207 SCMatrix::Transform = SCMatrix::NormalTransform);
208 void accumulate_transform(SymmSCMatrix*,SymmSCMatrix*);
209 void element_op(const Ref<SCElementOp>&);
210 void element_op(const Ref<SCElementOp2>&,
211 SymmSCMatrix*);
212 void element_op(const Ref<SCElementOp3>&,
213 SymmSCMatrix*,SymmSCMatrix*);
214 void vprint(const char* title=0,
215 std::ostream& out=ExEnv::out0(), int =10) const;
216
217 // return a pointer to the data for fast access
218 double *get_data();
219 double **get_rows();
220
221 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
222 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
223 };
224
225 class LocalDiagSCMatrix: public DiagSCMatrix {
226 friend class LocalSCMatrix;
227 friend class LocalSymmSCMatrix;
228 friend class LocalSCVector;
229 private:
230 Ref<SCMatrixDiagBlock> block;
231 void resize(int n);
232 public:
233 LocalDiagSCMatrix(const RefSCDimension&, LocalSCMatrixKit*);
234 ~LocalDiagSCMatrix();
235
236 // implementations and overrides of virtual functions
237 void save_data_state(StateOut&);
238 double get_element(int) const;
239 void set_element(int,double);
240 void accumulate_element(int,double);
241 void accumulate(const DiagSCMatrix*);
242 double invert_this();
243 double determ_this();
244 double trace();
245 void gen_invert_this();
246
247 void element_op(const Ref<SCElementOp>&);
248 void element_op(const Ref<SCElementOp2>&,
249 DiagSCMatrix*);
250 void element_op(const Ref<SCElementOp3>&,
251 DiagSCMatrix*,DiagSCMatrix*);
252 void vprint(const char* title=0,
253 std::ostream& out=ExEnv::out0(), int =10) const;
254
255 // return a pointer to the data for fast access
256 double *get_data();
257
258 Ref<SCMatrixSubblockIter> local_blocks(SCMatrixSubblockIter::Access);
259 Ref<SCMatrixSubblockIter> all_blocks(SCMatrixSubblockIter::Access);
260 };
261
262 }
263
264 #endif
265
266 // Local Variables:
267 // mode: c++
268 // c-file-style: "CLJ"
269 // End: