cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
nmrLSNonLinJacobianSolver.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 
6  Author(s): Ankur Kapoor
7  Created on: 2004-10-26
8 
9  (C) Copyright 2004-2007 Johns Hopkins University (JHU), All Rights
10  Reserved.
11 
12 --- begin cisst license - do not edit ---
13 
14 This software is provided "as is" under an open source license, with
15 no warranty. The complete license can be found in license.txt and
16 http://www.cisst.org/cisst/license.txt.
17 
18 --- end cisst license ---
19 */
20 
21 
28 #ifndef _nmrLSNonLinJacobianSolver_h
29 #define _nmrLSNonLinJacobianSolver_h
30 
31 
33 
34 #include <cnetlib.h>
35 
125  // we have this class so that we reserve memory only one
126  // would help if svd of a same size matrix (or a matrix)
127  // that doesnt change much is desired.
128 
129 protected:
130  CISSTNETLIB_INTEGER M;
131  CISSTNETLIB_INTEGER N;
132  CISSTNETLIB_INTEGER Ldfjac;
133  CISSTNETLIB_DOUBLE Tolerance;
134  CISSTNETLIB_INTEGER Info;
135  CISSTNETLIB_INTEGER Lwork;
138 
139 public:
145  {
146  Allocate(0, 0);
147  }
148 
149 
159  nmrLSNonLinJacobianSolver(CISSTNETLIB_INTEGER m, CISSTNETLIB_INTEGER n)
160  {
161  Allocate(m, n);
162  }
163 
164 
172  Allocate(X, F);
173  }
175 
176 
184  inline void Allocate(CISSTNETLIB_INTEGER m, CISSTNETLIB_INTEGER n) {
185  M = m;
186  N = n;
187  Lwork = M * N + 5 * N + M;
188  Ldfjac = M;
189  Tolerance = 1e-6;
190  Work.SetSize(Lwork);
191  IWork.SetSize(N);
192  }
193 
194 
201  Allocate(X.size(), F.size());
202  }
204 
205 
213  template <int __instanceLineF,
214  class __elementTypeF,
215  int __instanceLineJ,
216  class __elementTypeJ>
222  CISSTNETLIB_DOUBLE tolerance) throw (std::runtime_error) {
223  //if ((N != (CISSTNETLIB_INTEGER) X.size()) || (M != (CISSTNETLIB_INTEGER) F.size()) || (Ldfjac != (CISSTNETLIB_INTEGER) J.rows()) || (N != (CISSTNETLIB_INTEGER) J.cols())) {
224  if ((N != static_cast<CISSTNETLIB_INTEGER>(X.size())) || (M != static_cast<CISSTNETLIB_INTEGER>(F.size())) || (Ldfjac*N != static_cast<CISSTNETLIB_INTEGER>(J.size()))) {
225  cmnThrow(std::runtime_error("nmrLSNonLinJacobianSolver Solve: Size used for Allocate was different"));
226  }
227  Tolerance = tolerance;
228  /* call the MINPACK C function */
229  lmder2_(callBackF.FunctionFlmdif, callBackJ.FunctionFlmder2, &M, &N,
230  X.Pointer(), F.Pointer(), J.Pointer(),
231  &Ldfjac, &Tolerance, &Info,
232  IWork.Pointer(), Work.Pointer(), &Lwork);
233  }
235 
236 };
237 
238 #endif // _nmrLSNonLinJacobianSolver_h
239 
void Solve(nmrCallBackFunctionF< __instanceLineF, __elementTypeF > &callBackF, nmrCallBackFunctionJ< __instanceLineJ, __elementTypeJ > &callBackJ, vctDynamicVector< CISSTNETLIB_DOUBLE > &X, vctDynamicVector< CISSTNETLIB_DOUBLE > &F, vctDynamicVector< CISSTNETLIB_DOUBLE > &J, CISSTNETLIB_DOUBLE tolerance)
Definition: nmrLSNonLinJacobianSolver.h:217
vctDynamicVector< CISSTNETLIB_INTEGER > IWork
Definition: nmrLSNonLinJacobianSolver.h:136
void Allocate(vctDynamicVector< CISSTNETLIB_DOUBLE > &X, vctDynamicVector< CISSTNETLIB_DOUBLE > &F)
Definition: nmrLSNonLinJacobianSolver.h:200
Declaration of vctDynamicMatrix.
CISSTNETLIB_INTEGER Lwork
Definition: nmrLSNonLinJacobianSolver.h:135
vctDynamicVector< CISSTNETLIB_DOUBLE > Work
Definition: nmrLSNonLinJacobianSolver.h:137
nmrLSNonLinJacobianSolver(void)
Definition: nmrLSNonLinJacobianSolver.h:144
CISSTNETLIB_INTEGER Info
Definition: nmrLSNonLinJacobianSolver.h:134
Definition: nmrLSNonLinJacobianSolver.h:124
CISSTNETLIB_INTEGER Ldfjac
Definition: nmrLSNonLinJacobianSolver.h:132
void SetSize(size_type size)
Definition: vctDynamicVector.h:315
size_type size(void) const
Definition: vctDynamicConstVectorBase.h:164
Definition: nmrCallBack.h:45
nmrLSNonLinJacobianSolver(vctDynamicVector< CISSTNETLIB_DOUBLE > &X, vctDynamicVector< CISSTNETLIB_DOUBLE > &F)
Definition: nmrLSNonLinJacobianSolver.h:171
Definition: nmrCallBack.h:106
nmrLSNonLinJacobianSolver(CISSTNETLIB_INTEGER m, CISSTNETLIB_INTEGER n)
Definition: nmrLSNonLinJacobianSolver.h:159
#define cmnThrow(a)
Definition: MinimalCmn.h:4
pointer Pointer(index_type index=0)
Definition: vctDynamicVectorBase.h:155
void Allocate(CISSTNETLIB_INTEGER m, CISSTNETLIB_INTEGER n)
Definition: nmrLSNonLinJacobianSolver.h:184
CISSTNETLIB_INTEGER N
Definition: nmrLSNonLinJacobianSolver.h:131
CISSTNETLIB_INTEGER M
Definition: nmrLSNonLinJacobianSolver.h:130
CISSTNETLIB_DOUBLE Tolerance
Definition: nmrLSNonLinJacobianSolver.h:133