cisst-saw
Loading...
Searching...
No Matches
nmrLSEISolver.h
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3
4/*
5 Author(s): Ankur Kapoor
6 Created on: 2004-10-30
7
8 (C) Copyright 2004-2018 Johns Hopkins University (JHU), All Rights Reserved.
9
10--- begin cisst license - do not edit ---
11
12This software is provided "as is" under an open source license, with
13no warranty. The complete license can be found in license.txt and
14http://www.cisst.org/cisst/license.txt.
15
16--- end cisst license ---
17*/
18
19
24
25#ifndef _nmrLSEISolver_h
26#define _nmrLSEISolver_h
27
30
31
37
38protected:
39 CISSTNETLIB_INTEGER ME;
40 CISSTNETLIB_INTEGER MA;
41 CISSTNETLIB_INTEGER MG;
42 CISSTNETLIB_INTEGER MDW;
43 CISSTNETLIB_INTEGER N;
44 CISSTNETLIB_INTEGER Mode;
45 CISSTNETLIB_DOUBLE RNormE;
46 CISSTNETLIB_DOUBLE RNormL;
58
59public:
60
66 ME(0),
67 MA(0),
68 MG(0),
69 MDW(0),
70 N(0)
71 {
72 Allocate(0, 0, 0, 0);
73 }
74
75
81 nmrLSEISolver(CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n) {
82 Allocate(me, ma, mg, n);
83 }
84
85
95
96
106 inline void Allocate(CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n) {
107 N = n;
108 ME = me;
109 MA = ma;
110 MG = mg;
111 MDW = ME + MA + MG;
112 X.SetSize(N, 1, VCT_COL_MAJOR);
113 W.SetSize(MDW,(N+1), VCT_COL_MAJOR);
114 CISSTNETLIB_INTEGER K = std::max(MA + MG, N);
115 Work.SetSize(2 * (ME + N) + K + (MG + 2) * (N + 7), 1, VCT_COL_MAJOR);
116 Index.SetSize(MG + 2 * N + 2, 1, VCT_COL_MAJOR);
117 Options.SetSize(1, 1, VCT_COL_MAJOR);
118 Index(0, 0) = static_cast<CISSTNETLIB_INTEGER>(Work.rows());
119 Index(1, 0) = static_cast<CISSTNETLIB_INTEGER>(Index.rows());
120 Options(0, 0) = 1;
121 // otherMatrix, startRow, startCol, rows, cols
122 ERef.SetRef(W, 0, 0, ME, N);
123 ARef.SetRef(W, ME, 0, MA, N);
124 GRef.SetRef(W, ME+MA, 0, MG, N);
125 fRef.SetRef(W, 0, N, ME, 1);
126 bRef.SetRef(W, ME, N, MA, 1);
127 hRef.SetRef(W, ME+MA, N, MG, 1);
128 }
129
130
138 { Allocate(E.rows(), A.rows(), G.rows(), A.cols()); }
139
140
167 CISST_THROW(std::runtime_error)
168 {
169
170 if( MA != static_cast<CISSTNETLIB_INTEGER>(A.rows()) ||
171 N != static_cast<CISSTNETLIB_INTEGER>(A.cols()) ||
172 MA != static_cast<CISSTNETLIB_INTEGER>(b.rows()) ||
173 1 != static_cast<CISSTNETLIB_INTEGER>(b.cols()) ){
174 std::string msg( "nmrLSEISolver::Solve: Objectives dimensions." );
175 cmnThrow( std::runtime_error( msg ) );
176 }
177
178 if( !E.empty() &&
179 ( ME != static_cast<CISSTNETLIB_INTEGER>(E.rows()) ||
180 N != static_cast<CISSTNETLIB_INTEGER>(E.cols()) ||
181 ME != static_cast<CISSTNETLIB_INTEGER>(f.rows()) ||
182 1 != static_cast<CISSTNETLIB_INTEGER>(f.cols()) ) ){
183 std::string msg( "nmrLSEISolver::Solve: Equalities dimensions." );
184 cmnThrow( std::runtime_error( msg ) );
185 }
186
187 if( !G.empty() &&
188 ( MG != static_cast<CISSTNETLIB_INTEGER>(G.rows()) ||
189 N != static_cast<CISSTNETLIB_INTEGER>(G.cols()) ||
190 MG != static_cast<CISSTNETLIB_INTEGER>(h.rows()) ||
191 1 != static_cast<CISSTNETLIB_INTEGER>(h.cols()) ) ){
192 std::string msg( "nmrLSEISolver::Solve: Inequalities dimensions." );
193 cmnThrow( std::runtime_error( msg ) );
194 }
195
196 /* check that the matrices are Fortran like */
197 if ( ( !A.IsFortran() ) ||
198 ( !b.IsFortran() ) ||
199 ( !E.empty() && !E.IsFortran() ) ||
200 ( !f.empty() && !f.IsFortran() ) ||
201 ( !G.empty() && !G.IsFortran() ) ||
202 ( !h.empty() && !h.IsFortran() ) ){
203 std::string msg( "nmrLSEISolver::Solve: Incompatible matrices." );
204 cmnThrow( std::runtime_error( msg ) );
205 }
206
207 if( ( MDW != static_cast<CISSTNETLIB_INTEGER>( W.rows() ) ) ||
208 ( N+1 != static_cast<CISSTNETLIB_INTEGER>( W.cols() ))) {
209 std::string msg( "nmrLSEISolver::Solve: workspace not allocated." );
210 cmnThrow( std::runtime_error( msg ) );
211 }
212
213 /* copy */
214 ARef.Assign(A);
215 bRef.Assign(b);
216 if( !E.empty() ){ ERef.Assign(E); }
217 if( !f.empty() ){ fRef.Assign(f); }
218 if( !G.empty() ){ GRef.Assign(G); }
219 if( !h.empty() ){ hRef.Assign(h); }
220
221#if defined(CISSTNETLIB_VERSION_MAJOR)
222#if (CISSTNETLIB_VERSION_MAJOR >= 3)
223 cisstNetlib_lsei_(W.Pointer(), &MDW, &ME, &MA, &MG, &N,
224 Options.Pointer(), X.Pointer(), &RNormE,
225 &RNormL, &Mode,
226 Work.Pointer(), Index.Pointer());
227#endif
228#else // no major version
229 lsei_(W.Pointer(), &MDW, &ME, &MA, &MG, &N,
230 Options.Pointer(), X.Pointer(), &RNormE,
231 &RNormL, &Mode,
232 Work.Pointer(), Index.Pointer());
233#endif // CISSTNETLIB_VERSION
234 }
235
237 CISST_THROW(std::runtime_error)
238 {
239 if( (MDW != static_cast<CISSTNETLIB_INTEGER>(W.rows()) ) ||
240 (N+1 != static_cast<CISSTNETLIB_INTEGER>(W.cols())) ) {
241 std::string msg( "nmrLSEISolver::Solve: workspace not allocated." );
242 cmnThrow(std::runtime_error(msg));
243 }
244
245#if defined(CISSTNETLIB_VERSION_MAJOR)
246#if (CISSTNETLIB_VERSION_MAJOR >= 3)
247 cisstNetlib_lsei_(W.Pointer(), &MDW, &ME, &MA, &MG, &N,
248 Options.Pointer(), X.Pointer(), &RNormE,
249 &RNormL, &Mode,
250 Work.Pointer(), Index.Pointer());
251#endif
252#else // no major version
253 lsei_(W.Pointer(), &MDW, &ME, &MA, &MG, &N,
254 Options.Pointer(), X.Pointer(), &RNormE,
255 &RNormL, &Mode,
256 Work.Pointer(), Index.Pointer());
257#endif // CISSTNETLIB_VERSION
258 }
259
261 inline const vctDynamicMatrix<CISSTNETLIB_DOUBLE> &GetX(void) const {
262 return X;
263 }
264
265
266 /* Get RNormE. This method must be used after Solve(). */
267 inline CISSTNETLIB_DOUBLE GetRNormE(void) const {
268 return RNormE;
269 }
270
271 /* Get RNormL. This method must be used after Solve(). */
272 inline CISSTNETLIB_DOUBLE GetRNormL(void) const {
273 return RNormL;
274 }
275};
276
277
278#endif // _nmrLSEISolver_h
nmrLSEISolver(CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n)
Definition nmrLSEISolver.h:81
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type ERef
Definition nmrLSEISolver.h:50
CISSTNETLIB_INTEGER MA
Definition nmrLSEISolver.h:40
vctDynamicMatrix< CISSTNETLIB_INTEGER > Index
Definition nmrLSEISolver.h:57
CISSTNETLIB_INTEGER ME
Definition nmrLSEISolver.h:39
void Allocate(vctDynamicMatrix< CISSTNETLIB_DOUBLE > &E, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &A, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &G)
Definition nmrLSEISolver.h:135
CISSTNETLIB_INTEGER Mode
Definition nmrLSEISolver.h:44
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type hRef
Definition nmrLSEISolver.h:55
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type bRef
Definition nmrLSEISolver.h:54
CISSTNETLIB_DOUBLE GetRNormE(void) const
Definition nmrLSEISolver.h:267
vctDynamicMatrix< CISSTNETLIB_DOUBLE > Options
Definition nmrLSEISolver.h:47
nmrLSEISolver(void)
Definition nmrLSEISolver.h:65
void Allocate(CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n)
Definition nmrLSEISolver.h:106
void Solve(vctDynamicMatrix< CISSTNETLIB_DOUBLE > &E, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &f, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &A, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &b, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &G, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &h) CISST_THROW(std
Definition nmrLSEISolver.h:161
CISSTNETLIB_INTEGER N
Definition nmrLSEISolver.h:43
CISSTNETLIB_DOUBLE GetRNormL(void) const
Definition nmrLSEISolver.h:272
CISSTNETLIB_DOUBLE RNormE
Definition nmrLSEISolver.h:45
vctDynamicMatrix< CISSTNETLIB_DOUBLE > Work
Definition nmrLSEISolver.h:56
const vctDynamicMatrix< CISSTNETLIB_DOUBLE > & GetX(void) const
Definition nmrLSEISolver.h:261
nmrLSEISolver(vctDynamicMatrix< CISSTNETLIB_DOUBLE > &E, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &A, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &G)
Definition nmrLSEISolver.h:91
CISSTNETLIB_INTEGER MG
Definition nmrLSEISolver.h:41
vctDynamicMatrix< CISSTNETLIB_DOUBLE > W
Definition nmrLSEISolver.h:49
CISSTNETLIB_INTEGER MDW
Definition nmrLSEISolver.h:42
vctDynamicMatrix< CISSTNETLIB_DOUBLE > X
Definition nmrLSEISolver.h:48
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type fRef
Definition nmrLSEISolver.h:53
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type GRef
Definition nmrLSEISolver.h:52
CISSTNETLIB_DOUBLE RNormL
Definition nmrLSEISolver.h:46
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type ARef
Definition nmrLSEISolver.h:51
void Solve(vctDynamicMatrix< CISSTNETLIB_DOUBLE > &W) CISST_THROW(std
Definition nmrLSEISolver.h:236
Definition vctForwardDeclarations.h:157
#define CISST_THROW(exceptionParameter)
Somewhat portable compilation warning message. This works with very recent versions of gcc (4....
Definition cmnPortability.h:559
void cmnThrow(const _exceptionType &except, cmnLogLevel lod=CMN_LOG_LEVEL_INIT_ERROR)
Definition cmnThrow.h:76
Declaration of vctDynamicMatrix.
const bool VCT_COL_MAJOR
Definition vctForwardDeclarations.h:44