bool CQFittingWidget::saveTask() { CFitTask * pTask = dynamic_cast< CFitTask * >(mpTask); if (!pTask) return false; saveCommon(); saveMethod(); CFitProblem * pProblem = dynamic_cast<CFitProblem *>(mpTask->getProblem()); if (!pProblem) return false; std::map<std::string, std::string> ExperimentMap; std::map<std::string, std::string> CrossValidationMap; // Save experiment set CExperimentSet * pExperimentSet = dynamic_cast<CExperimentSet *>(pProblem->getGroup("Experiment Set")); std::string Name; CExperiment * pExperiment; size_t i, imax; std::set<CExperiment *> DealtWith; for (i = pExperimentSet->getExperimentCount() - 1; i != C_INVALID_INDEX; i--) { pExperiment = dynamic_cast<CExperiment *>(CCopasiRootContainer::getKeyFactory()->get(mExperimentKeyMap[pExperimentSet->getExperiment(i)->CCopasiParameter::getKey()])); if (pExperiment && pExperiment == mpExperimentSet->getExperiment(pExperiment->getObjectName())) { if (!(*pExperimentSet->getExperiment(i) == *pExperiment)) { *pExperimentSet->getExperiment(i) = *pExperiment; mChanged = true; } DealtWith.insert(pExperiment); } else { mExperimentKeyMap.erase(pExperimentSet->getExperiment(i)->CCopasiParameter::getKey()); pExperimentSet->removeExperiment(i); mChanged = true; } } for (i = 0, imax = mpExperimentSet->getExperimentCount(); i < imax; i++) { pExperiment = mpExperimentSet->getExperiment(i); if (DealtWith.count(pExperiment)) continue; pExperiment = pExperimentSet->addExperiment(*pExperiment); mExperimentKeyMap[pExperiment->CCopasiParameter::getKey()] = mpExperimentSet->getExperiment(i)->CCopasiParameter::getKey(); mChanged = true; } // We need to invert the key map for saving! std::map<std::string, std::string>::iterator it = mExperimentKeyMap.begin(); std::map<std::string, std::string>::iterator end = mExperimentKeyMap.end(); for (; it != end; ++it) ExperimentMap[it->second] = it->first; // Save cross validation experiment set CCrossValidationSet * pCrossValidationSet = dynamic_cast<CCrossValidationSet *>(pProblem->getGroup("Validation Set")); if (pCrossValidationSet->getWeight() != mpCrossValidationSet->getWeight()) { pCrossValidationSet->setWeight(mpCrossValidationSet->getWeight()); mChanged = true; } if (pCrossValidationSet->getThreshold() != mpCrossValidationSet->getThreshold()) { pCrossValidationSet->setThreshold(mpCrossValidationSet->getThreshold()); mChanged = true; } DealtWith.clear(); for (i = pCrossValidationSet->getExperimentCount() - 1; i != C_INVALID_INDEX; i--) { pExperiment = dynamic_cast<CExperiment *>(CCopasiRootContainer::getKeyFactory()->get(mCrossValidationKeyMap[pCrossValidationSet->getExperiment(i)->CCopasiParameter::getKey()])); if (pExperiment && pExperiment == mpCrossValidationSet->getExperiment(pExperiment->getObjectName())) { if (!(*pCrossValidationSet->getExperiment(i) == *pExperiment)) { *pCrossValidationSet->getExperiment(i) = *pExperiment; mChanged = true; } DealtWith.insert(pExperiment); } else { mCrossValidationKeyMap.erase(pCrossValidationSet->getExperiment(i)->CCopasiParameter::getKey()); pCrossValidationSet->removeExperiment(i); mChanged = true; } } for (i = 0, imax = mpCrossValidationSet->getExperimentCount(); i < imax; i++) { pExperiment = mpCrossValidationSet->getExperiment(i); if (DealtWith.count(pExperiment)) continue; pExperiment = pCrossValidationSet->addExperiment(*pExperiment); mCrossValidationKeyMap[pExperiment->CCopasiParameter::getKey()] = mpCrossValidationSet->getExperiment(i)->CCopasiParameter::getKey(); mChanged = true; } // We need to invert the key map for saving! it = mCrossValidationKeyMap.begin(); end = mCrossValidationKeyMap.end(); for (; it != end; ++it) CrossValidationMap[it->second] = it->first; if (mpCheckRandomize->isChecked() != pProblem->getRandomizeStartValues()) { mChanged = true; pProblem->setRandomizeStartValues(mpCheckRandomize->isChecked()); } if (mpCreateParameterSets->isChecked() != pProblem->getCreateParameterSets()) { mChanged = true; pProblem->setCreateParameterSets(mpCreateParameterSets->isChecked()); } if (mpCheckStatistics->isChecked() != pProblem->getCalculateStatistics()) { mChanged = true; pProblem->setCalculateStatistics(mpCheckStatistics->isChecked()); } mChanged |= mpParameters->save(&ExperimentMap, &CrossValidationMap); mChanged |= mpConstraints->save(&ExperimentMap, &CrossValidationMap); assert(mpDataModel != NULL); if (mChanged) mpDataModel->changed(); mChanged = false; return true; }
bool CQFittingWidget::loadTask() { CFitTask * pTask = dynamic_cast< CFitTask * >(mpTask); if (!pTask) return false; loadCommon(); loadMethod(); CFitProblem * pProblem = dynamic_cast<CFitProblem *>(mpTask->getProblem()); if (!pProblem) return false; pdelete(mpExperimentSet) CExperimentSet * pExperimentSet = dynamic_cast<CExperimentSet *>(pProblem->getGroup("Experiment Set")); mpExperimentSet = new CExperimentSet(*pExperimentSet, NO_PARENT); mExperimentKeyMap.clear(); size_t i, imax = mpExperimentSet->getExperimentCount(); for (i = 0; i < imax; i++) mExperimentKeyMap[pExperimentSet->getExperiment(i)->CCopasiParameter::getKey()] = mpExperimentSet->getExperiment(i)->CCopasiParameter::getKey(); pdelete(mpCrossValidationSet) CCrossValidationSet * pCrossValidationSet = dynamic_cast<CCrossValidationSet *>(pProblem->getGroup("Validation Set")); mpCrossValidationSet = new CCrossValidationSet(*pCrossValidationSet, NO_PARENT); mCrossValidationKeyMap.clear(); imax = mpCrossValidationSet->getExperimentCount(); for (i = 0; i < imax; i++) mCrossValidationKeyMap[pCrossValidationSet->getExperiment(i)->CCopasiParameter::getKey()] = mpCrossValidationSet->getExperiment(i)->CCopasiParameter::getKey(); mpCheckRandomize->setChecked(pProblem->getRandomizeStartValues()); mpCreateParameterSets->setChecked(pProblem->getCreateParameterSets()); mpCheckStatistics->setChecked(pProblem->getCalculateStatistics()); mpParameters->load(mpDataModel, pProblem->getGroup("OptimizationItemList"), &mExperimentKeyMap, &mCrossValidationKeyMap); if (CCopasiMessage::peekLastMessage().getType() == CCopasiMessage::ERROR) { CQMessageBox::critical(this, "Error loading Parameter estimation task", CCopasiMessage::getAllMessageText().c_str(), QMessageBox::Ok | QMessageBox::Default, QMessageBox::NoButton); } mpParameters->setExperimentSet(const_cast<const CExperimentSet *&>(mpExperimentSet)); mpParameters->setCrossValidationSet(const_cast<const CCrossValidationSet *&>(mpCrossValidationSet)); mpConstraints->load(mpDataModel, pProblem->getGroup("OptimizationConstraintList"), &mExperimentKeyMap, &mCrossValidationKeyMap); mpConstraints->setExperimentSet(const_cast<const CExperimentSet *&>(mpExperimentSet)); mpConstraints->setCrossValidationSet(const_cast<const CCrossValidationSet *&>(mpCrossValidationSet)); mChanged = false; return true; }