ifa: Fixup
[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  protected:
34         FreeVarGroup *varGroup;
35  public:
36         size_t numParam;
37         double fit;
38         double *est;
39         //      double *denom;
40         double *grad;
41         double *hess;
42
43         void init();
44         FitContext();
45         FitContext(FitContext *parent);
46         FitContext(FitContext *parent, int group);
47         void copyParamToModel(omxState* os, double *at);
48         void copyParamToModel(omxState *os);
49         void copyParamToModel(omxMatrix *mat, double *at);
50         void copyParamToModel(omxMatrix *mat);
51         void updateParentAndFree();
52         ~FitContext();
53         
54         static void cacheFreeVarDependencies();
55         static void setRFitFunction(omxFitFunction *rff);
56 };
57
58 class omxCompute {
59  public:
60         int paramGroup;  // probably better to store FreeVarGroup* here TODO
61         virtual void initFromFrontend(SEXP rObj) = 0;
62         virtual void compute(FitContext *fc) = 0;
63         virtual void reportResults(FitContext *fc, MxRList *out) = 0;
64         virtual double getOptimizerStatus() { return NA_REAL; }  // backward compatibility
65         virtual ~omxCompute();
66 };
67
68 class omxComputeOperation : public omxCompute {
69  public:
70         virtual void initFromFrontend(SEXP rObj);
71 };
72
73 class omxCompute *omxNewCompute(omxState* os, const char *type);
74
75 class omxCompute *newComputeGradientDescent();
76 class omxCompute *newComputeEstimatedHessian();
77
78 #endif