void FreeVarGroup::markDirty(omxState *os) { size_t numMats = os->matrixList.size(); size_t numAlgs = os->algebraList.size(); for(size_t i = 0; i < numMats; i++) { if (!locations[i]) continue; // The point of this is to increment the version numbers // on matrices holding free parameters. Otherwise there // is no way to tell which free parameters changes when // freeSet is used to partition parameters. omxMarkClean(os->matrixList[i]); } for(size_t i = 0; i < numMats; i++) { if (dependencies[i]) { int offset = ~(i - numMats); omxMarkDirty(os->matrixList[offset]); } } for(size_t i = 0; i < numAlgs; i++) { if (dependencies[i + numMats]) { omxMarkDirty(os->algebraList[i]); } } }
void markDataRowDependencies(omxState* os, omxRowFitFunction* orff) { int numDeps = orff->numDataRowDeps; int *deps = orff->dataRowDeps; for (int i = 0; i < numDeps; i++) { int value = deps[i]; if(value < 0) { omxMarkDirty(os->matrixList[~value]); } else { omxMarkDirty(os->algebraList[value]); } } }
void omxFreeVar::markDirty(omxState *os) { auto deps = getDeps(); for (int dx=0; dx < deps.size(); ++dx) { int dep = deps[dx]; if (dep < 0) { omxMarkDirty(os->matrixList[~dep]); } else { omxMarkDirty(os->algebraList[dep]); } } for (int lx=0; lx < int(locations.size()); ++lx) { omxMarkClean(os->matrixList[locations[lx].matrix]); } }
void omxState::invalidateCache() { for (int ax=0; ax < int(dataList.size()); ++ax) { auto d1 = dataList[ax]; d1->invalidateCache(); } for (int ax=0; ax < (int) matrixList.size(); ++ax) { omxMatrix *matrix = matrixList[ax]; omxMarkDirty(matrix); } for(size_t ex = 0; ex < expectationList.size(); ex++) { expectationList[ex]->invalidateCache(); } for (int ax=0; ax < (int) algebraList.size(); ++ax) { omxMatrix *matrix = algebraList[ax]; if (!matrix->fitFunction) { omxMarkDirty(matrix); } else { matrix->fitFunction->invalidateCache(); } } }