cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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  $Id$
6 
7  Author(s): Ankur Kapoor
8  Created on: 2004-10-30
9 
10  (C) Copyright 2004-2007 Johns Hopkins University (JHU), All Rights
11  Reserved.
12 
13 --- begin cisst license - do not edit ---
14 
15 This software is provided "as is" under an open source license, with
16 no warranty. The complete license can be found in license.txt and
17 http://www.cisst.org/cisst/license.txt.
18 
19 --- end cisst license ---
20 */
21 
22 
28 #ifndef _nmrLSEISolver_h
29 #define _nmrLSEISolver_h
30 
33 
34 
40 
41 protected:
42  CISSTNETLIB_INTEGER ME;
43  CISSTNETLIB_INTEGER MA;
44  CISSTNETLIB_INTEGER MG;
45  CISSTNETLIB_INTEGER MDW;
46  CISSTNETLIB_INTEGER N;
47  CISSTNETLIB_INTEGER Mode;
48  CISSTNETLIB_DOUBLE RNormE;
49  CISSTNETLIB_DOUBLE RNormL;
61 
62 public:
63 
69  ME(0),
70  MA(0),
71  MG(0),
72  MDW(0),
73  N(0)
74  {
75  Allocate(0, 0, 0, 0);
76  }
77 
78 
84  nmrLSEISolver(CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n) {
85  Allocate(me, ma, mg, n);
86  }
87 
88 
96  Allocate(E, A, G);
97  }
98 
99 
109  inline void Allocate(CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n) {
110  N = n;
111  ME = me;
112  MA = ma;
113  MG = mg;
114  MDW = ME + MA + MG;
115  X.SetSize(N, 1, VCT_COL_MAJOR);
116  W.SetSize(MDW,(N+1), VCT_COL_MAJOR);
117  CISSTNETLIB_INTEGER K = std::max(MA + MG, N);
118  Work.SetSize(2 * (ME + N) + K + (MG + 2) * (N + 7), 1, VCT_COL_MAJOR);
119  Index.SetSize(MG + 2 * N + 2, 1, VCT_COL_MAJOR);
121  Index(0, 0) = static_cast<CISSTNETLIB_INTEGER>(Work.rows());
122  Index(1, 0) = static_cast<CISSTNETLIB_INTEGER>(Index.rows());
123  Options(0, 0) = 1;
124  // otherMatrix, startRow, startCol, rows, cols
125  ERef.SetRef(W, 0, 0, ME, N);
126  ARef.SetRef(W, ME, 0, MA, N);
127  GRef.SetRef(W, ME+MA, 0, MG, N);
128  fRef.SetRef(W, 0, N, ME, 1);
129  bRef.SetRef(W, ME, N, MA, 1);
130  hRef.SetRef(W, ME+MA, N, MG, 1);
131  }
132 
133 
141  { Allocate(E.rows(), A.rows(), G.rows(), A.cols()); }
142 
143 
170  throw (std::runtime_error)
171  {
172 
173  if( MA != static_cast<CISSTNETLIB_INTEGER>(A.rows()) ||
174  N != static_cast<CISSTNETLIB_INTEGER>(A.cols()) ||
175  MA != static_cast<CISSTNETLIB_INTEGER>(b.rows()) ||
176  1 != static_cast<CISSTNETLIB_INTEGER>(b.cols()) ){
177  std::string msg( "nmrLSEISolver::Solve: Objectives dimensions." );
178  cmnThrow( std::runtime_error( msg ) );
179  }
180 
181  if( !E.empty() &&
182  ( ME != static_cast<CISSTNETLIB_INTEGER>(E.rows()) ||
183  N != static_cast<CISSTNETLIB_INTEGER>(E.cols()) ||
184  ME != static_cast<CISSTNETLIB_INTEGER>(f.rows()) ||
185  1 != static_cast<CISSTNETLIB_INTEGER>(f.cols()) ) ){
186  std::string msg( "nmrLSEISolver::Solve: Equalities dimensions." );
187  cmnThrow( std::runtime_error( msg ) );
188  }
189 
190  if( !G.empty() &&
191  ( MG != static_cast<CISSTNETLIB_INTEGER>(G.rows()) ||
192  N != static_cast<CISSTNETLIB_INTEGER>(G.cols()) ||
193  MG != static_cast<CISSTNETLIB_INTEGER>(h.rows()) ||
194  1 != static_cast<CISSTNETLIB_INTEGER>(h.cols()) ) ){
195  std::string msg( "nmrLSEISolver::Solve: Inequalities dimensions." );
196  cmnThrow( std::runtime_error( msg ) );
197  }
198 
199  /* check that the matrices are Fortran like */
200  if ( ( !A.IsFortran() ) ||
201  ( !b.IsFortran() ) ||
202  ( !E.empty() && !E.IsFortran() ) ||
203  ( !f.empty() && !f.IsFortran() ) ||
204  ( !G.empty() && !G.IsFortran() ) ||
205  ( !h.empty() && !h.IsFortran() ) ){
206  std::string msg( "nmrLSEISolver::Solve: Incompatible matrices." );
207  cmnThrow( std::runtime_error( msg ) );
208  }
209 
210  if( ( MDW != static_cast<CISSTNETLIB_INTEGER>( W.rows() ) ) ||
211  ( N+1 != static_cast<CISSTNETLIB_INTEGER>( W.cols() ))) {
212  std::string msg( "nmrLSEISolver::Solve: workspace not allocated." );
213  cmnThrow( std::runtime_error( msg ) );
214  }
215 
216  /* copy */
217  ARef.Assign(A);
218  bRef.Assign(b);
219  if( !E.empty() ){ ERef.Assign(E); }
220  if( !f.empty() ){ fRef.Assign(f); }
221  if( !G.empty() ){ GRef.Assign(G); }
222  if( !h.empty() ){ hRef.Assign(h); }
223 
224 #if defined(CISSTNETLIB_VERSION_MAJOR)
225 #if (CISSTNETLIB_VERSION_MAJOR >= 3)
226  cisstNetlib_lsei_(W.Pointer(), &MDW, &ME, &MA, &MG, &N,
227  Options.Pointer(), X.Pointer(), &RNormE,
228  &RNormL, &Mode,
229  Work.Pointer(), Index.Pointer());
230 #endif
231 #else // no major version
232  lsei_(W.Pointer(), &MDW, &ME, &MA, &MG, &N,
233  Options.Pointer(), X.Pointer(), &RNormE,
234  &RNormL, &Mode,
235  Work.Pointer(), Index.Pointer());
236 #endif // CISSTNETLIB_VERSION
237  }
238 
240  throw (std::runtime_error)
241  {
242  if( (MDW != static_cast<CISSTNETLIB_INTEGER>(W.rows()) ) ||
243  (N+1 != static_cast<CISSTNETLIB_INTEGER>(W.cols())) ) {
244  std::string msg( "nmrLSEISolver::Solve: workspace not allocated." );
245  cmnThrow(std::runtime_error(msg));
246  }
247 
248 #if defined(CISSTNETLIB_VERSION_MAJOR)
249 #if (CISSTNETLIB_VERSION_MAJOR >= 3)
250  cisstNetlib_lsei_(W.Pointer(), &MDW, &ME, &MA, &MG, &N,
251  Options.Pointer(), X.Pointer(), &RNormE,
252  &RNormL, &Mode,
253  Work.Pointer(), Index.Pointer());
254 #endif
255 #else // no major version
256  lsei_(W.Pointer(), &MDW, &ME, &MA, &MG, &N,
257  Options.Pointer(), X.Pointer(), &RNormE,
258  &RNormL, &Mode,
259  Work.Pointer(), Index.Pointer());
260 #endif // CISSTNETLIB_VERSION
261  }
262 
264  inline const vctDynamicMatrix<CISSTNETLIB_DOUBLE> &GetX(void) const {
265  return X;
266  }
267 
268 
269  /* Get RNormE. This method must be used after Solve(). */
270  inline CISSTNETLIB_DOUBLE GetRNormE(void) const {
271  return RNormE;
272  }
273 
274  /* Get RNormL. This method must be used after Solve(). */
275  inline CISSTNETLIB_DOUBLE GetRNormL(void) const {
276  return RNormL;
277  }
278 };
279 
280 
281 #endif // _nmrLSEISolver_h
282 
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type GRef
Definition: nmrLSEISolver.h:55
CISSTNETLIB_INTEGER MDW
Definition: nmrLSEISolver.h:45
Declaration of vctDynamicMatrix.
CISSTNETLIB_DOUBLE RNormL
Definition: nmrLSEISolver.h:49
vctDynamicMatrix< CISSTNETLIB_DOUBLE > Work
Definition: nmrLSEISolver.h:59
CISSTNETLIB_INTEGER Mode
Definition: nmrLSEISolver.h:47
CISSTNETLIB_INTEGER N
Definition: nmrLSEISolver.h:46
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)
Definition: nmrLSEISolver.h:164
CISSTNETLIB_DOUBLE GetRNormL(void) const
Definition: nmrLSEISolver.h:275
CISSTNETLIB_INTEGER ME
Definition: nmrLSEISolver.h:42
CISSTNETLIB_DOUBLE GetRNormE(void) const
Definition: nmrLSEISolver.h:270
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type bRef
Definition: nmrLSEISolver.h:57
pointer Pointer(size_type rowIndex, size_type colIndex)
Definition: vctDynamicMatrixBase.h:143
size_type rows() const
Definition: vctDynamicConstMatrixBase.h:238
const vctDynamicMatrix< CISSTNETLIB_DOUBLE > & GetX(void) const
Definition: nmrLSEISolver.h:264
CISSTNETLIB_INTEGER MA
Definition: nmrLSEISolver.h:43
nmrLSEISolver(void)
Definition: nmrLSEISolver.h:68
size_type cols() const
Definition: vctDynamicConstMatrixBase.h:243
void Allocate(CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n)
Definition: nmrLSEISolver.h:109
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type ARef
Definition: nmrLSEISolver.h:54
void Solve(vctDynamicMatrix< CISSTNETLIB_DOUBLE > &W)
Definition: nmrLSEISolver.h:239
void Allocate(vctDynamicMatrix< CISSTNETLIB_DOUBLE > &E, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &A, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &G)
Definition: nmrLSEISolver.h:138
void SetSize(size_type rows, size_type cols, bool storageOrder)
Definition: vctDynamicMatrix.h:364
vctDynamicMatrix< CISSTNETLIB_DOUBLE > X
Definition: nmrLSEISolver.h:51
CISSTNETLIB_INTEGER MG
Definition: nmrLSEISolver.h:44
vctDynamicMatrix< CISSTNETLIB_DOUBLE > W
Definition: nmrLSEISolver.h:52
#define cmnThrow(a)
Definition: MinimalCmn.h:4
vctDynamicMatrix< CISSTNETLIB_INTEGER > Index
Definition: nmrLSEISolver.h:60
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type fRef
Definition: nmrLSEISolver.h:56
ThisType & Assign(const vctDynamicConstMatrixBase< __matrixOwnerType, value_type > &other)
Definition: vctDynamicMatrixBase.h:509
vctDynamicMatrix< CISSTNETLIB_DOUBLE > Options
Definition: nmrLSEISolver.h:50
CISSTNETLIB_DOUBLE RNormE
Definition: nmrLSEISolver.h:48
const bool VCT_COL_MAJOR
Definition: vctForwardDeclarations.h:46
nmrLSEISolver(CISSTNETLIB_INTEGER me, CISSTNETLIB_INTEGER ma, CISSTNETLIB_INTEGER mg, CISSTNETLIB_INTEGER n)
Definition: nmrLSEISolver.h:84
nmrLSEISolver(vctDynamicMatrix< CISSTNETLIB_DOUBLE > &E, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &A, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &G)
Definition: nmrLSEISolver.h:94
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type ERef
Definition: nmrLSEISolver.h:53
Definition: nmrLSEISolver.h:39
vctDynamicMatrix< CISSTNETLIB_DOUBLE >::Submatrix::Type hRef
Definition: nmrLSEISolver.h:58