Add ComputeAssign
[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         ~FitContext();
51         
52         static void cacheFreeVarDependencies();
53         static void setRFitFunction(omxFitFunction *rff);
54 };
55
56 class omxCompute {
57  public:
58         FreeVarGroup *varGroup;
59         virtual void initFromFrontend(SEXP rObj) = 0;
60         virtual void compute(FitContext *fc) = 0;
61         virtual void reportResults(FitContext *fc, MxRList *out) = 0;
62         virtual double getOptimizerStatus() { return NA_REAL; }  // backward compatibility
63         virtual ~omxCompute();
64 };
65
66 class omxComputeOperation : public omxCompute {
67  public:
68         virtual void initFromFrontend(SEXP rObj);
69 };
70
71 class omxCompute *omxNewCompute(omxState* os, const char *type);
72
73 class omxCompute *newComputeGradientDescent();
74 class omxCompute *newComputeEstimatedHessian();
75
76 #endif