Revert "Add option to checkpoint every evaluation"
[openmx:openmx.git] / src / omxFitFunction.h
1 /*
2  *  Copyright 2007-2014 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 /***********************************************************
18
19 *  omxFitFunction.h
20 *
21 *  Created: Timothy R. Brick    Date: 2009-02-17
22 *
23 *       Contains header information for the omxFitFunction class
24 *   omxFitFunction objects hold necessary information to simplify
25 *       fit function calculation.
26 *
27 **********************************************************/
28
29 #ifndef _OMXFITFUNCTION_H_
30 #define _OMXFITFUNCTION_H_
31
32 #define R_NO_REMAP
33 #include <R.h>
34 #include <Rinternals.h> 
35 #include <R_ext/Rdynload.h> 
36 #include <R_ext/BLAS.h>
37 #include <R_ext/Lapack.h>
38
39 #include "omxDefines.h"
40 #include "omxMatrix.h"
41 #include "omxAlgebra.h"
42 #include "omxAlgebraFunctions.h"
43 #include "omxData.h"
44 #include "omxState.h"
45 #include "omxExpectation.h"
46 #include "Compute.h"
47
48 typedef struct {
49         char label[250];
50         double* values;
51         int numValues;
52         int rows, cols;
53 } omxRListElement;
54
55 struct omxFitFunction {                                 // A fit function
56
57         /* Fields unique to FitFunction Functions */
58         void (*initFun)(omxFitFunction *oo);
59         void (*destructFun)(omxFitFunction* oo);                                                                        // Wrapper for the destructor object
60         // ffcompute is somewhat redundent because grad=NULL when gradients are unwanted
61         void (*computeFun)(omxFitFunction* oo, int ffcompute, FitContext *fc);
62
63         omxRListElement* (*setFinalReturns)(omxFitFunction* oo, int *numVals); // DEPRECATED, use addOutput instead
64
65         // addOutput should only be used for returning global results
66         void (*addOutput)(omxFitFunction* oo, MxRList *out);
67
68         // populateAttrFun should be used for returning results specific to fit functions or expectations
69         void (*populateAttrFun)(omxFitFunction* oo, SEXP algebra);
70
71         void (*setVarGroup)(omxFitFunction*, FreeVarGroup *);
72         
73         SEXP rObj;                                                                                                                                      // Original r Object Pointer
74         omxExpectation* expectation;                                                                                            // Data expectation object
75         void* argStruct;                                                                                                                        // Arguments needed for fit function
76 // This is always a pointer to a static string.
77 // We do not need to allocate or free it.
78         const char* fitType;                                                                                                            // Type of FitFunction Function
79
80         omxMatrix* matrix;                                                                                                                      // The (1x1) matrix populated by this fit function
81         int usesChildModels;    // whether to create child models for parallelization
82         bool initialized;
83         FreeVarGroup *freeVarGroup;
84         bool gradientAvailable;
85         bool hessianAvailable;
86 };
87
88 /* Initialize and Destroy */
89 void omxFillMatrixFromMxFitFunction(omxMatrix* om, const char *fitType, int matrixNumber);
90 void omxCompleteFitFunction(omxMatrix *om);
91 void setFreeVarGroup(omxFitFunction *ff, FreeVarGroup *fvg);
92
93         void omxFreeFitFunctionArgs(omxFitFunction* fitFunction);                                               // Frees all args
94         void omxGetFitFunctionStandardErrors(omxFitFunction *oo);                                       // Get Standard Errors
95
96 /* FitFunction-specific implementations of matrix functions */
97 void omxFitFunctionCompute(omxFitFunction *off, int want, FitContext *fc);
98         void omxDuplicateFitMatrix(omxMatrix *tgt, const omxMatrix *src, omxState* targetState);
99         
100 void omxFitFunctionPrint(omxFitFunction *source, const char* d);
101         
102 omxMatrix* omxNewMatrixFromSlot(SEXP rObj, omxState* state, const char* slotName);
103
104 void omxFitFunctionCreateChildren(omxState *globalState);
105
106 void omxInitFIMLFitFunction(omxFitFunction* off);
107 void omxInitAlgebraFitFunction(omxFitFunction *off);
108 void omxInitWLSFitFunction(omxFitFunction *off);
109 void omxInitRowFitFunction(omxFitFunction *off);
110 void omxInitMLFitFunction(omxFitFunction *off);
111 void omxInitRFitFunction(omxFitFunction *off);
112 void omxInitFitFunctionBA81(omxFitFunction* oo);
113 void ba81SetFreeVarGroup(omxFitFunction *oo, FreeVarGroup *fvg);
114
115 #endif /* _OMXFITFUNCTION_H_ */