// Does vector=TRUE mean something sensible? Mixture of mixtures? void state::init() { auto *oo = this; auto *ms = this; if (!oo->expectation) { mxThrow("%s requires an expectation", oo->fitType); } oo->units = FIT_UNITS_MINUS2LL; oo->canDuplicate = true; omxState *currentState = oo->matrix->currentState; const char *myex1 = "MxExpectationHiddenMarkov"; const char *myex2 = "MxExpectationMixture"; if (!expectation || !(strEQ(expectation->expType, myex1) || strEQ(expectation->expType, myex2))) mxThrow("%s must be paired with %s or %s", oo->name(), myex1, myex2); ProtectedSEXP Rverbose(R_do_slot(oo->rObj, Rf_install("verbose"))); ms->verbose = Rf_asInteger(Rverbose); ProtectedSEXP Rcomponents(R_do_slot(oo->rObj, Rf_install("components"))); int nc = Rf_length(Rcomponents); int *cvec = INTEGER(Rcomponents); componentUnits = FIT_UNITS_UNINITIALIZED; for (int cx=0; cx < nc; ++cx) { omxMatrix *fmat = currentState->algebraList[ cvec[cx] ]; if (fmat->fitFunction) { omxCompleteFitFunction(fmat); auto ff = fmat->fitFunction; if (ff->units != FIT_UNITS_PROBABILITY) { omxRaiseErrorf("%s: component %s must be in probability units", oo->name(), ff->name()); return; } if (componentUnits == FIT_UNITS_UNINITIALIZED) { componentUnits = ff->units; } else if (ff->units != componentUnits) { omxRaiseErrorf("%s: components with heterogenous units %s and %s in same mixture", oo->name(), fitUnitsToName(ff->units), fitUnitsToName(componentUnits)); } } ms->components.push_back(fmat); } if (componentUnits == FIT_UNITS_UNINITIALIZED) componentUnits = FIT_UNITS_PROBABILITY; ms->initial = expectation->getComponent("initial"); ms->transition = expectation->getComponent("transition"); }
void MarkovExpectation::init() { ProtectedSEXP Rverbose(R_do_slot(rObj, Rf_install("verbose"))); verbose = Rf_asInteger(Rverbose); ProtectedSEXP Rcomponents(R_do_slot(rObj, Rf_install("components"))); int *cvec = INTEGER(Rcomponents); int nc = Rf_length(Rcomponents); for (int cx=0; cx < nc; ++cx) { components.push_back(omxExpectationFromIndex(cvec[cx], currentState)); } if (isMixtureInterface) { initial = omxNewMatrixFromSlot(rObj, currentState, "weights"); transition = 0; } else { initial = omxNewMatrixFromSlot(rObj, currentState, "initial"); transition = omxNewMatrixFromSlot(rObj, currentState, "transition"); } ProtectedSEXP Rscale(R_do_slot(rObj, Rf_install("scale"))); auto scaleName = CHAR(STRING_ELT(Rscale, 0)); if (strEQ(scaleName, "softmax")) { scale = SCALE_SOFTMAX; } else if (strEQ(scaleName, "sum")) { scale = SCALE_SUM; } else if (strEQ(scaleName, "none")) { scale = SCALE_NONE; } else { Rf_error("%s: unknown scale '%s'", name, scaleName); } scaledInitial = omxInitMatrix(1, 1, TRUE, currentState); scaledTransition = 0; if (transition) { scaledTransition = omxInitMatrix(1, 1, TRUE, currentState); } }