void omxCompleteFitFunction(omxMatrix *om) { omxFitFunction *obj = om->fitFunction; if (obj->initialized) return; if (obj->expectation) { setFreeVarGroup(obj->expectation, obj->freeVarGroup); omxCompleteExpectation(obj->expectation); } obj->initFun(obj); if(obj->computeFun == NULL) Rf_error("Failed to initialize fit function %s", obj->fitType); if(obj->ciFun == NULL) obj->ciFun = defaultCIFun; obj->matrix->data[0] = NA_REAL; obj->initialized = TRUE; }
void omxState::initialRecalc(FitContext *fc) { omxInitialMatrixAlgebraCompute(fc); for(size_t j = 0; j < expectationList.size(); j++) { // TODO: Smarter inference for which expectations to duplicate omxCompleteExpectation(expectationList[j]); } for (int ax=0; ax < (int) algebraList.size(); ++ax) { omxMatrix *matrix = algebraList[ax]; if (!matrix->fitFunction) continue; omxCompleteFitFunction(matrix); omxFitFunctionCompute(matrix->fitFunction, FF_COMPUTE_INITIAL_FIT, fc); } for (size_t xx=0; xx < conListX.size(); ++xx) { conListX[xx]->prep(fc); } }
void omxCompleteExpectation(omxExpectation *ox) { if(ox->isComplete) return; if (ox->rObj) { omxState *os = ox->currentState; SEXP rObj = ox->rObj; SEXP slot; {ScopedProtect(slot, R_do_slot(rObj, Rf_install("container"))); if (Rf_length(slot) == 1) { int ex = INTEGER(slot)[0]; ox->container = os->expectationList.at(ex); } } {ScopedProtect(slot, R_do_slot(rObj, Rf_install("submodels"))); if (Rf_length(slot)) { int numSubmodels = Rf_length(slot); int *submodel = INTEGER(slot); for (int ex=0; ex < numSubmodels; ex++) { int sx = submodel[ex]; ox->submodels.push_back(omxExpectationFromIndex(sx, os)); } } } } omxExpectationProcessDataStructures(ox, ox->rObj); int numSubmodels = (int) ox->submodels.size(); for (int ex=0; ex < numSubmodels; ex++) { omxCompleteExpectation(ox->submodels[ex]); } ox->initFun(ox); if(ox->computeFun == NULL) { if (isErrorRaised()) { Rf_error("Failed to initialize '%s' of type %s: %s", ox->name, ox->expType, Global->getBads()); } else { Rf_error("Failed to initialize '%s' of type %s", ox->name, ox->expType); } } if (OMX_DEBUG) { omxData *od = ox->data; omxState *state = ox->currentState; std::string msg = string_snprintf("Expectation '%s' of type '%s' has" " %d definition variables:\n", ox->name, ox->expType, int(od->defVars.size())); for (int dx=0; dx < int(od->defVars.size()); ++dx) { omxDefinitionVar &dv = od->defVars[dx]; msg += string_snprintf("[%d] column '%s' ->", dx, omxDataColumnName(od, dv.column)); for (int lx=0; lx < dv.numLocations; ++lx) { msg += string_snprintf(" %s[%d,%d]", state->matrixToName(~dv.matrices[lx]), dv.rows[lx], dv.cols[lx]); } msg += "\n dirty:"; for (int mx=0; mx < dv.numDeps; ++mx) { msg += string_snprintf(" %s", state->matrixToName(dv.deps[mx])); } msg += "\n"; } mxLogBig(msg); } ox->isComplete = TRUE; }