Improve debugging for FitContext
[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 std::vector<int> markMatrices;   // constant, therefore thread-safe
30         static omxFitFunction *RFitFunction;
31
32         FitContext *parent;
33  public:
34         FreeVarGroup *varGroup;
35         double fit;
36         double *est;
37         //      double *denom;
38         double *grad;
39         double *hess;
40
41         void init();
42         FitContext();
43         FitContext(FitContext *parent);
44         FitContext(FitContext *parent, FreeVarGroup *group);
45         void copyParamToModel(omxState* os, double *at);
46         void copyParamToModel(omxState *os);
47         void copyParamToModel(omxMatrix *mat, double *at);
48         void copyParamToModel(omxMatrix *mat);
49         void updateParentAndFree();
50         void log(int what);
51         ~FitContext();
52         
53         static void cacheFreeVarDependencies();
54         static void setRFitFunction(omxFitFunction *rff);
55 };
56
57 class omxCompute {
58  public:
59         FreeVarGroup *varGroup;
60         virtual void initFromFrontend(SEXP rObj) = 0;
61         virtual void compute(FitContext *fc) = 0;
62         virtual void reportResults(FitContext *fc, MxRList *out) = 0;
63         virtual double getOptimizerStatus() { return NA_REAL; }  // backward compatibility
64         virtual ~omxCompute();
65 };
66
67 class omxComputeOperation : public omxCompute {
68  public:
69         virtual void initFromFrontend(SEXP rObj);
70 };
71
72 class omxCompute *omxNewCompute(omxState* os, const char *type);
73
74 class omxCompute *newComputeGradientDescent();
75 class omxCompute *newComputeEstimatedHessian();
76
77 #endif