Allow ComputeIterate to test maximum absolute change
[openmx:openmx.git] / src / Compute.h
1 /*
2  *  Copyright 2013 The OpenMx Project
3  *
4  *  Licensed under the Apache License, Version 2.0 (the "License");
5  *  you may not use this file except in compliance with the License.
6  *  You may obtain a copy of the License at
7  *
8  *       http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *   Unless required by applicable law or agreed to in writing, software
11  *   distributed under the License is distributed on an "AS IS" BASIS,
12  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *  See the License for the specific language governing permissions and
14  *  limitations under the License.
15  */
16
17 #ifndef _OMX_COMPUTE_H_
18 #define _OMX_COMPUTE_H_
19
20 #include <R.h>
21 #include <Rinternals.h>
22
23 #include "types.h"
24
25 // The idea of FitContext is to eventually enable fitting from
26 // multiple starting values in parallel.
27
28 class FitContext {
29         static omxFitFunction *RFitFunction;
30
31         FitContext *parent;
32
33  public:
34         FreeVarGroup *varGroup;
35         double mac;
36         double fit;
37         double *est;
38         int *flavor;
39         //      double *denom;
40         bool forwardDeriv;
41         double *grad;
42         double *hess;
43         double *ihess;
44         int wanted;
45         bool changedEstimates; // only used for FF_COMPUTE_PREOPTIMIZE
46
47         void init();
48         FitContext(std::vector<double> &startingValues);
49         FitContext(FitContext *parent, FreeVarGroup *group);
50         void fixHessianSymmetry(int want);
51         void copyParamToModel(omxState* os, double *at);
52         void copyParamToModel(omxState *os);
53         void copyParamToModel(omxMatrix *mat, double *at);
54         void copyParamToModel(omxMatrix *mat);
55         void maybeCopyParamToModel(omxState* os);
56         void updateParentAndFree();
57         void log(const char *where);
58         void log(const char *where, int what);
59         ~FitContext();
60         
61         static void cacheFreeVarDependencies();
62         static void setRFitFunction(omxFitFunction *rff);
63 };
64
65 class omxCompute {
66  public:
67         FreeVarGroup *varGroup;
68         omxCompute();
69         virtual void initFromFrontend(SEXP rObj);
70         virtual void compute(FitContext *fc) = 0;
71         virtual void reportResults(FitContext *fc, MxRList *out) = 0;
72         virtual double getOptimizerStatus() { return NA_REAL; }  // backward compatibility
73         virtual ~omxCompute();
74 };
75
76 class omxCompute *omxNewCompute(omxState* os, const char *type);
77
78 class omxCompute *newComputeGradientDescent();
79 class omxCompute *newComputeEstimatedHessian();
80 class omxCompute *newComputeNewtonRaphson();
81
82 void omxApproxInvertPosDefTriangular(int dim, double *hess, double *ihess, double *stress);
83 void omxApproxInvertPackedPosDefTriangular(int dim, int *mask, double *packedHess, double *stress);
84
85 #endif