Rewrite dependency tracking
[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  public:
33         FreeVarGroup *varGroup;
34         double fit;
35         double *est;
36         //      double *denom;
37         double *grad;
38         double *hess;
39
40         void init();
41         FitContext();
42         FitContext(FitContext *parent, FreeVarGroup *group);
43         void copyParamToModel(omxState* os, double *at);
44         void copyParamToModel(omxState *os);
45         void copyParamToModel(omxMatrix *mat, double *at);
46         void copyParamToModel(omxMatrix *mat);
47         void updateParentAndFree();
48         void fixHessianSymmetry();
49         void log(const char *where, int what);
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 class omxCompute *newComputeNewtonRaphson();
76
77 #endif