1 | //
|
---|
2 | // scextrapmat.cc
|
---|
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 | #include <util/state/stateio.h>
|
---|
29 | #include <math/scmat/elemop.h>
|
---|
30 | #include <math/scmat/blocked.h>
|
---|
31 | #include <math/optimize/scextrapmat.h>
|
---|
32 |
|
---|
33 | using namespace sc;
|
---|
34 |
|
---|
35 | static ClassDesc SymmSCMatrixSCExtrapData_cd(
|
---|
36 | typeid(SymmSCMatrixSCExtrapData),"SymmSCMatrixSCExtrapData",1,"public SCExtrapData",
|
---|
37 | 0, 0, create<SymmSCMatrixSCExtrapData>);
|
---|
38 |
|
---|
39 | SymmSCMatrixSCExtrapData::SymmSCMatrixSCExtrapData(StateIn& s) :
|
---|
40 | SCExtrapData(s)
|
---|
41 | {
|
---|
42 | Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit();
|
---|
43 | RefSCDimension dim;
|
---|
44 | dim << SavableState::restore_state(s);
|
---|
45 |
|
---|
46 | int blocked;
|
---|
47 | s.get(blocked);
|
---|
48 |
|
---|
49 | if (blocked)
|
---|
50 | k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit());
|
---|
51 |
|
---|
52 | m = k->symmmatrix(dim);
|
---|
53 | m.restore(s);
|
---|
54 | }
|
---|
55 |
|
---|
56 | SymmSCMatrixSCExtrapData::SymmSCMatrixSCExtrapData(const RefSymmSCMatrix& mat)
|
---|
57 | {
|
---|
58 | m = mat;
|
---|
59 | }
|
---|
60 |
|
---|
61 | void
|
---|
62 | SymmSCMatrixSCExtrapData::save_data_state(StateOut& s)
|
---|
63 | {
|
---|
64 | SCExtrapData::save_data_state(s);
|
---|
65 | SavableState::save_state(m.dim().pointer(),s);
|
---|
66 |
|
---|
67 | int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m.pointer())) ? 1 : 0;
|
---|
68 | s.put(blocked);
|
---|
69 |
|
---|
70 | m.save(s);
|
---|
71 | }
|
---|
72 |
|
---|
73 | void
|
---|
74 | SymmSCMatrixSCExtrapData::zero()
|
---|
75 | {
|
---|
76 | m.assign(0.0);
|
---|
77 | }
|
---|
78 |
|
---|
79 | SCExtrapData*
|
---|
80 | SymmSCMatrixSCExtrapData::copy()
|
---|
81 | {
|
---|
82 | return new SymmSCMatrixSCExtrapData(m.copy());
|
---|
83 | }
|
---|
84 |
|
---|
85 | void
|
---|
86 | SymmSCMatrixSCExtrapData::accumulate_scaled(double scale,
|
---|
87 | const Ref<SCExtrapData>& data)
|
---|
88 | {
|
---|
89 | SymmSCMatrixSCExtrapData* a
|
---|
90 | = require_dynamic_cast<SymmSCMatrixSCExtrapData*>(
|
---|
91 | data.pointer(), "SymmSCMatrixSCExtrapData::accumulate_scaled");
|
---|
92 |
|
---|
93 | RefSymmSCMatrix am = a->m.copy();
|
---|
94 | am.scale(scale);
|
---|
95 | m.accumulate(am);
|
---|
96 | }
|
---|
97 |
|
---|
98 | ///////////////////////////////////////////////////////////////////////////
|
---|
99 |
|
---|
100 | static ClassDesc SymmSCMatrix2SCExtrapData_cd(
|
---|
101 | typeid(SymmSCMatrix2SCExtrapData),"SymmSCMatrix2SCExtrapData",1,"public SCExtrapData",
|
---|
102 | 0, 0, create<SymmSCMatrix2SCExtrapData>);
|
---|
103 |
|
---|
104 | SymmSCMatrix2SCExtrapData::SymmSCMatrix2SCExtrapData(StateIn&s) :
|
---|
105 | SCExtrapData(s)
|
---|
106 | {
|
---|
107 | Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit();
|
---|
108 | RefSCDimension dim;
|
---|
109 | dim << SavableState::restore_state(s);
|
---|
110 |
|
---|
111 | int blocked;
|
---|
112 | s.get(blocked);
|
---|
113 |
|
---|
114 | if (blocked)
|
---|
115 | k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit());
|
---|
116 |
|
---|
117 | m1 = k->symmmatrix(dim);
|
---|
118 | m2 = k->symmmatrix(dim);
|
---|
119 | m1.restore(s);
|
---|
120 | m2.restore(s);
|
---|
121 | }
|
---|
122 |
|
---|
123 | SymmSCMatrix2SCExtrapData::SymmSCMatrix2SCExtrapData(
|
---|
124 | const RefSymmSCMatrix& mat1,
|
---|
125 | const RefSymmSCMatrix& mat2)
|
---|
126 | {
|
---|
127 | m1 = mat1;
|
---|
128 | m2 = mat2;
|
---|
129 | }
|
---|
130 |
|
---|
131 | void
|
---|
132 | SymmSCMatrix2SCExtrapData::save_data_state(StateOut& s)
|
---|
133 | {
|
---|
134 | SCExtrapData::save_data_state(s);
|
---|
135 | SavableState::save_state(m1.dim().pointer(),s);
|
---|
136 |
|
---|
137 | int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m1.pointer())) ? 1 : 0;
|
---|
138 | s.put(blocked);
|
---|
139 |
|
---|
140 | m1.save(s);
|
---|
141 | m2.save(s);
|
---|
142 | }
|
---|
143 |
|
---|
144 | void
|
---|
145 | SymmSCMatrix2SCExtrapData::zero()
|
---|
146 | {
|
---|
147 | m1.assign(0.0);
|
---|
148 | m2.assign(0.0);
|
---|
149 | }
|
---|
150 |
|
---|
151 | SCExtrapData*
|
---|
152 | SymmSCMatrix2SCExtrapData::copy()
|
---|
153 | {
|
---|
154 | return new SymmSCMatrix2SCExtrapData(m1.copy(), m2.copy());
|
---|
155 | }
|
---|
156 |
|
---|
157 | void
|
---|
158 | SymmSCMatrix2SCExtrapData::accumulate_scaled(double scale,
|
---|
159 | const Ref<SCExtrapData>& data)
|
---|
160 | {
|
---|
161 | SymmSCMatrix2SCExtrapData* a
|
---|
162 | = require_dynamic_cast<SymmSCMatrix2SCExtrapData*>(
|
---|
163 | data.pointer(), "SymmSCMatrix2SCExtrapData::accumulate_scaled");
|
---|
164 |
|
---|
165 | RefSymmSCMatrix am = a->m1.copy();
|
---|
166 | am.scale(scale);
|
---|
167 | m1.accumulate(am);
|
---|
168 | am = 0;
|
---|
169 |
|
---|
170 | am = a->m2.copy();
|
---|
171 | am.scale(scale);
|
---|
172 | m2.accumulate(am);
|
---|
173 | }
|
---|
174 |
|
---|
175 | ///////////////////////////////////////////////////////////////////////////
|
---|
176 |
|
---|
177 | static ClassDesc SymmSCMatrix4SCExtrapData_cd(
|
---|
178 | typeid(SymmSCMatrix4SCExtrapData),"SymmSCMatrix4SCExtrapData",1,"public SCExtrapData",
|
---|
179 | 0, 0, create<SymmSCMatrix4SCExtrapData>);
|
---|
180 |
|
---|
181 | SymmSCMatrix4SCExtrapData::SymmSCMatrix4SCExtrapData(StateIn&s) :
|
---|
182 | SCExtrapData(s)
|
---|
183 | {
|
---|
184 | Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit();
|
---|
185 | RefSCDimension dim;
|
---|
186 | dim << SavableState::restore_state(s);
|
---|
187 |
|
---|
188 | int blocked;
|
---|
189 | s.get(blocked);
|
---|
190 |
|
---|
191 | if (blocked)
|
---|
192 | k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit());
|
---|
193 |
|
---|
194 | m1 = k->symmmatrix(dim);
|
---|
195 | m2 = k->symmmatrix(dim);
|
---|
196 | m3 = k->symmmatrix(dim);
|
---|
197 | m4 = k->symmmatrix(dim);
|
---|
198 | m1.restore(s);
|
---|
199 | m2.restore(s);
|
---|
200 | m3.restore(s);
|
---|
201 | m4.restore(s);
|
---|
202 | }
|
---|
203 |
|
---|
204 | SymmSCMatrix4SCExtrapData::SymmSCMatrix4SCExtrapData(
|
---|
205 | const RefSymmSCMatrix& mat1,
|
---|
206 | const RefSymmSCMatrix& mat2,
|
---|
207 | const RefSymmSCMatrix& mat3,
|
---|
208 | const RefSymmSCMatrix& mat4)
|
---|
209 | {
|
---|
210 | m1 = mat1;
|
---|
211 | m2 = mat2;
|
---|
212 | m3 = mat3;
|
---|
213 | m4 = mat4;
|
---|
214 | }
|
---|
215 |
|
---|
216 | void
|
---|
217 | SymmSCMatrix4SCExtrapData::save_data_state(StateOut& s)
|
---|
218 | {
|
---|
219 | SCExtrapData::save_data_state(s);
|
---|
220 | SavableState::save_state(m1.dim().pointer(),s);
|
---|
221 |
|
---|
222 | int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m1.pointer())) ? 1 : 0;
|
---|
223 | s.put(blocked);
|
---|
224 |
|
---|
225 | m1.save(s);
|
---|
226 | m2.save(s);
|
---|
227 | m3.save(s);
|
---|
228 | m4.save(s);
|
---|
229 | }
|
---|
230 |
|
---|
231 | void
|
---|
232 | SymmSCMatrix4SCExtrapData::zero()
|
---|
233 | {
|
---|
234 | m1.assign(0.0);
|
---|
235 | m2.assign(0.0);
|
---|
236 | m3.assign(0.0);
|
---|
237 | m4.assign(0.0);
|
---|
238 | }
|
---|
239 |
|
---|
240 | SCExtrapData*
|
---|
241 | SymmSCMatrix4SCExtrapData::copy()
|
---|
242 | {
|
---|
243 | return new SymmSCMatrix4SCExtrapData(m1.copy(), m2.copy(),
|
---|
244 | m3.copy(), m4.copy());
|
---|
245 | }
|
---|
246 |
|
---|
247 | void
|
---|
248 | SymmSCMatrix4SCExtrapData::accumulate_scaled(double scale,
|
---|
249 | const Ref<SCExtrapData>& data)
|
---|
250 | {
|
---|
251 | SymmSCMatrix4SCExtrapData* a
|
---|
252 | = require_dynamic_cast<SymmSCMatrix4SCExtrapData*>(
|
---|
253 | data.pointer(), "SymmSCMatrix4SCExtrapData::accumulate_scaled");
|
---|
254 |
|
---|
255 | RefSymmSCMatrix am = a->m1.copy();
|
---|
256 | am.scale(scale);
|
---|
257 | m1.accumulate(am);
|
---|
258 | am = 0;
|
---|
259 |
|
---|
260 | am = a->m2.copy();
|
---|
261 | am.scale(scale);
|
---|
262 | m2.accumulate(am);
|
---|
263 |
|
---|
264 | am = a->m3.copy();
|
---|
265 | am.scale(scale);
|
---|
266 | m3.accumulate(am);
|
---|
267 |
|
---|
268 | am = a->m4.copy();
|
---|
269 | am.scale(scale);
|
---|
270 | m4.accumulate(am);
|
---|
271 | }
|
---|
272 |
|
---|
273 | ///////////////////////////////////////////////////////////////////////////
|
---|
274 |
|
---|
275 | static ClassDesc SymmSCMatrixNSCExtrapData_cd(
|
---|
276 | typeid(SymmSCMatrixNSCExtrapData),"SymmSCMatrixNSCExtrapData",1,"public SCExtrapData",
|
---|
277 | 0, 0, create<SymmSCMatrixNSCExtrapData>);
|
---|
278 |
|
---|
279 | SymmSCMatrixNSCExtrapData::SymmSCMatrixNSCExtrapData(StateIn&s) :
|
---|
280 | SCExtrapData(s)
|
---|
281 | {
|
---|
282 | s.get(n_);
|
---|
283 |
|
---|
284 | Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit();
|
---|
285 | RefSCDimension dim;
|
---|
286 | dim << SavableState::restore_state(s);
|
---|
287 |
|
---|
288 | int blocked;
|
---|
289 | s.get(blocked);
|
---|
290 |
|
---|
291 | if (blocked)
|
---|
292 | k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit());
|
---|
293 |
|
---|
294 | m = new RefSymmSCMatrix[n_];
|
---|
295 |
|
---|
296 | for (int i=0; i < n_; i++) {
|
---|
297 | m[i] = k->symmmatrix(dim);
|
---|
298 | m[i].restore(s);
|
---|
299 | }
|
---|
300 | }
|
---|
301 |
|
---|
302 | SymmSCMatrixNSCExtrapData::SymmSCMatrixNSCExtrapData(int n,
|
---|
303 | RefSymmSCMatrix *mats)
|
---|
304 | {
|
---|
305 | n_=n;
|
---|
306 | m = new RefSymmSCMatrix[n_];
|
---|
307 | for (int i=0; i < n_; i++)
|
---|
308 | m[i] = mats[i];
|
---|
309 | }
|
---|
310 |
|
---|
311 | void
|
---|
312 | SymmSCMatrixNSCExtrapData::save_data_state(StateOut& s)
|
---|
313 | {
|
---|
314 | SCExtrapData::save_data_state(s);
|
---|
315 |
|
---|
316 | s.put(n_);
|
---|
317 | SavableState::save_state(m[0].dim().pointer(),s);
|
---|
318 |
|
---|
319 | int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m[0].pointer())) ? 1 : 0;
|
---|
320 | s.put(blocked);
|
---|
321 |
|
---|
322 | for (int i=0; i < n_; i++)
|
---|
323 | m[i].save(s);
|
---|
324 | }
|
---|
325 |
|
---|
326 | void
|
---|
327 | SymmSCMatrixNSCExtrapData::zero()
|
---|
328 | {
|
---|
329 | for (int i=0; i < n_; i++)
|
---|
330 | m[i].assign(0.0);
|
---|
331 | }
|
---|
332 |
|
---|
333 | SCExtrapData*
|
---|
334 | SymmSCMatrixNSCExtrapData::copy()
|
---|
335 | {
|
---|
336 | RefSymmSCMatrix *m2 = new RefSymmSCMatrix[n_];
|
---|
337 | for (int i=0; i < n_; i++)
|
---|
338 | m2[i] = m[i].copy();
|
---|
339 |
|
---|
340 | SCExtrapData *ret = new SymmSCMatrixNSCExtrapData(n_, m2);
|
---|
341 | delete[] m2;
|
---|
342 |
|
---|
343 | return ret;
|
---|
344 | }
|
---|
345 |
|
---|
346 | void
|
---|
347 | SymmSCMatrixNSCExtrapData::accumulate_scaled(double scale,
|
---|
348 | const Ref<SCExtrapData>& data)
|
---|
349 | {
|
---|
350 | SymmSCMatrixNSCExtrapData* a
|
---|
351 | = require_dynamic_cast<SymmSCMatrixNSCExtrapData*>(
|
---|
352 | data.pointer(), "SymmSCMatrixNSCExtrapData::accumulate_scaled");
|
---|
353 |
|
---|
354 | for (int i=0; i < n_; i++) {
|
---|
355 | RefSymmSCMatrix am = a->m[i].copy();
|
---|
356 | am.scale(scale);
|
---|
357 | m[i].accumulate(am);
|
---|
358 | }
|
---|
359 | }
|
---|
360 |
|
---|
361 | ///////////////////////////////////////////////////////////////////////////
|
---|
362 |
|
---|
363 | static ClassDesc SymmSCMatrixSCExtrapError_cd(
|
---|
364 | typeid(SymmSCMatrixSCExtrapError),"SymmSCMatrixSCExtrapError",1,"public SCExtrapError",
|
---|
365 | 0, 0, create<SymmSCMatrixSCExtrapError>);
|
---|
366 |
|
---|
367 | SymmSCMatrixSCExtrapError::SymmSCMatrixSCExtrapError(StateIn& s) :
|
---|
368 | SCExtrapError(s)
|
---|
369 | {
|
---|
370 | Ref<SCMatrixKit> k = SCMatrixKit::default_matrixkit();
|
---|
371 | RefSCDimension dim;
|
---|
372 | dim << SavableState::restore_state(s);
|
---|
373 |
|
---|
374 | int blocked;
|
---|
375 | s.get(blocked);
|
---|
376 |
|
---|
377 | if (blocked)
|
---|
378 | k = new BlockedSCMatrixKit(SCMatrixKit::default_matrixkit());
|
---|
379 |
|
---|
380 | m = k->symmmatrix(dim);
|
---|
381 | m.restore(s);
|
---|
382 | }
|
---|
383 |
|
---|
384 | SymmSCMatrixSCExtrapError::SymmSCMatrixSCExtrapError(
|
---|
385 | const RefSymmSCMatrix& mat)
|
---|
386 | {
|
---|
387 | m = mat;
|
---|
388 | }
|
---|
389 |
|
---|
390 | void
|
---|
391 | SymmSCMatrixSCExtrapError::save_data_state(StateOut& s)
|
---|
392 | {
|
---|
393 | SCExtrapError::save_data_state(s);
|
---|
394 | SavableState::save_state(m.dim().pointer(),s);
|
---|
395 |
|
---|
396 | int blocked = (dynamic_cast<BlockedSymmSCMatrix*>(m.pointer())) ? 1 : 0;
|
---|
397 | s.put(blocked);
|
---|
398 |
|
---|
399 | m.save(s);
|
---|
400 | }
|
---|
401 |
|
---|
402 | double
|
---|
403 | SymmSCMatrixSCExtrapError::error()
|
---|
404 | {
|
---|
405 | return m->maxabs();
|
---|
406 | }
|
---|
407 |
|
---|
408 | double
|
---|
409 | SymmSCMatrixSCExtrapError::scalar_product(const Ref<SCExtrapError>& arg)
|
---|
410 | {
|
---|
411 | SymmSCMatrixSCExtrapError* a
|
---|
412 | = require_dynamic_cast<SymmSCMatrixSCExtrapError*>(
|
---|
413 | arg.pointer(), "SymmSCMatrixSCExtrapError::scalar_product");
|
---|
414 | Ref<SCElementScalarProduct> sp(new SCElementScalarProduct);
|
---|
415 | m->element_op(sp.pointer(), a->m.pointer());
|
---|
416 | return sp->result();
|
---|
417 | }
|
---|
418 |
|
---|
419 | /////////////////////////////////////////////////////////////////////////////
|
---|
420 |
|
---|
421 | // Local Variables:
|
---|
422 | // mode: c++
|
---|
423 | // c-file-style: "CLJ"
|
---|
424 | // End:
|
---|