Revert "Split fit function initialization similar to expectations"
[openmx:openmx.git] / src / omxAlgebraFitFunction.cpp
1 /*
2  *  Copyright 2007-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 #include "omxAlgebraFunctions.h"
18
19 #ifndef _OMX_ALGEBRA_FITFUNCTION_
20 #define _OMX_ALGEBRA_FITFUNCTION_ TRUE
21
22 typedef struct {
23
24         omxMatrix *algebra;
25
26 } omxAlgebraFitFunction;
27
28 void omxDestroyAlgebraFitFunction(omxFitFunction *off) {
29
30 }
31
32 static void omxCallAlgebraFitFunction(omxFitFunction *off, int want, double *gradient) {        // TODO: Figure out how to give access to other per-iteration structures.
33         if(OMX_DEBUG_ALGEBRA) {Rprintf("Beginning Algebra Fit Function Computation.\n");}
34         omxMatrix* algebra = ((omxAlgebraFitFunction*)(off->argStruct))->algebra;
35
36         omxRecompute(algebra);
37         
38         // This should really be checked elsewhere. TODO
39         if(algebra->rows != 1 || algebra->cols != 1) {
40                 error("MxAlgebraFitFunction's fit function algebra does not evaluate to a 1x1 matrix.");
41         }
42         
43         off->matrix->data[0] = algebra->data[0];
44         
45         if(OMX_DEBUG) {Rprintf("Algebra Fit Function value is %f.\n", off->matrix->data[0]);}
46 }
47
48 omxRListElement* omxSetFinalReturnsAlgebraFitFunction(omxFitFunction *off, int *numReturns) {
49         *numReturns = 1;
50         omxRListElement* retVal = (omxRListElement*) R_alloc(1, sizeof(omxRListElement));
51
52         retVal[0].numValues = 1;
53         retVal[0].values = (double*) R_alloc(1, sizeof(double));
54         strncpy(retVal[0].label, "Minus2LogLikelihood", 20);
55         retVal[0].values[0] = omxMatrixElement(off->matrix, 0, 0);
56
57         return retVal;
58 }
59
60 void omxInitAlgebraFitFunction(omxFitFunction* off, SEXP rObj) {
61         
62         if(OMX_DEBUG && off->matrix->currentState->parentState == NULL) {
63                 Rprintf("Initializing Algebra fitFunction function.\n");
64         }
65         
66         SEXP newptr;
67         
68         omxAlgebraFitFunction *newObj = (omxAlgebraFitFunction*) R_alloc(1, sizeof(omxAlgebraFitFunction));
69         PROTECT(newptr = GET_SLOT(rObj, install("algebra")));
70         newObj->algebra = omxMatrixLookupFromState1(newptr, off->matrix->currentState);
71         if(OMX_DEBUG && off->matrix->currentState->parentState == NULL) {
72                 Rprintf("Algebra Fit Function Bound to Algebra %d\n", newObj->algebra);
73         }
74         
75         off->computeFun = omxCallAlgebraFitFunction;
76         off->setFinalReturns = omxSetFinalReturnsAlgebraFitFunction;
77         off->destructFun = omxDestroyAlgebraFitFunction;
78         off->repopulateFun = handleFreeVarList;
79
80         
81         off->argStruct = (void*) newObj;
82 }
83
84
85 #endif /* _OMX_ALGEBRA_FITFUNCTION_ */