17 #include <QtGui/QApplication>
18 #include <QtGui/QPalette>
19 #include <QtGui/QHeaderView>
38 #include <QtCore/QtDebug>
92 mpTable->horizontalHeader()->hide();
93 mpTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
94 mpTable->setAlternatingRowColors(
true);
95 mpTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
96 mpTable->setSelectionBehavior(QAbstractItemView::SelectRows);
119 mpBtnCrossValidations->hide();
120 mpCheckCrossValidationsAll->hide();
121 mpBoxCrossValidations->hide();
122 mpLblCrossValidations->hide();
127 std::vector< COptItem * >::iterator it =
mpItemsCopy->begin();
128 std::vector< COptItem * >::iterator end =
mpItemsCopy->end();
130 for (; it != end; ++it)
138 mpEditLower->setEnabled(!checked);
144 mpCheckLowerInf->setStyleSheet(QString(mpCheckLowerInf->metaObject()->className()) +
" {background-color:" +
mChangedColor.name() +
";}");
150 mpCheckLowerInf->setStyleSheet(QString(mpCheckLowerInf->metaObject()->className()) +
" {background-color:" +
mSavedColor.name() +
";}");
158 Number =
TO_UTF8(mpEditLower->text());
163 std::set< size_t >::const_iterator it =
mSelection.begin();
164 std::set< size_t >::const_iterator end =
mSelection.end();
166 for (; it != end; ++it)
168 (*mpItemsCopy)[*it]->setLowerBound(Number);
175 mpEditUpper->setEnabled(!checked);
181 mpCheckUpperInf->setStyleSheet(QString(mpCheckUpperInf->metaObject()->className()) +
" {background-color:" +
mChangedColor.name() +
";}");
187 mpCheckUpperInf->setStyleSheet(QString(mpCheckUpperInf->metaObject()->className()) +
" {background-color:" +
mSavedColor.name() +
";}");
195 Number =
TO_UTF8(mpEditUpper->text());
200 std::set< size_t >::const_iterator it =
mSelection.begin();
201 std::set< size_t >::const_iterator end =
mSelection.end();
203 for (; it != end; ++it)
205 (*mpItemsCopy)[*it]->setUpperBound(Number);
241 mpCheckLowerInf->setChecked(
false);
242 mpEditLower->setEnabled(
true);
247 std::set< size_t >::const_iterator it =
mSelection.begin();
248 std::set< size_t >::const_iterator end =
mSelection.end();
253 for (; it != end; ++it)
255 (*mpItemsCopy)[*it]->setLowerBound(CN);
261 mpEditLower->setText(Value);
296 mpCheckUpperInf->setChecked(
false);
297 mpEditUpper->setEnabled(
true);
302 std::set< size_t >::const_iterator it =
mSelection.begin();
303 std::set< size_t >::const_iterator end =
mSelection.end();
308 for (; it != end; ++it)
310 (*mpItemsCopy)[*it]->setUpperBound(CN);
316 mpEditUpper->setText(Value);
322 std::vector< const CCopasiObject * > Selection;
352 Selection.push_back(pObject);
358 if (Selection.size() != 0)
388 current = mpTable->rowCount();
390 mpTable->insertRow((
int) current);
395 std::set< size_t >::const_iterator it =
mSelection.begin();
396 std::set< size_t >::const_iterator end =
mSelection.end();
398 for (; it != end; ++it)
400 (*mpItemsCopy)[*it]->setObjectCN(Selection[0]->getCN());
408 size_t i, imax = Selection.size();
412 for (i = 1; i != imax; i++)
438 mpTable->insertRow((
int)(current + i));
461 if (pDialog->exec() == QDialog::Accepted)
466 std::set< size_t >::const_iterator it =
mSelection.begin();
467 std::set< size_t >::const_iterator end =
mSelection.end();
469 for (; it != end; ++it)
471 (*mpItemsCopy)[*it]->getGroup(
"Affected Experiments")->clear();
472 size_t i, imax = mpBoxExperiments->count();
474 for (i = 0; i < imax && imax < (*mppExperimentSet)->getExperimentCount(); i++)
475 static_cast<CFitItem *>((*
mpItemsCopy)[*it])->addExperiment((*mppExperimentSet)->getExperiment(
TO_UTF8(mpBoxExperiments->itemText((
int) i)))->CCopasiParameter::getKey());
489 const std::map<std::string, std::string> * pExperimentMap,
490 const std::map<std::string, std::string> * pCrossValidationMap)
497 std::vector< COptItem * >::iterator it =
mpItemsCopy->begin();
498 std::vector< COptItem * >::iterator end =
mpItemsCopy->end();
500 for (; it != end; ++it)
514 std::vector< COptItem * >::const_iterator src =
515 static_cast<std::vector< COptItem * > *
>(
mpItems->CCopasiParameter::getValue().pVOID)->begin();
519 for (i = 0; it != end; ++it, ++src, ++i)
539 if (!pExperimentMap)
return false;
546 for (j = 0; j < jmax; j++)
557 Key = pExperimentMap->find(Key)->second;
560 if (!pCrossValidationMap)
return false;
565 for (j = 0; j < jmax; j++)
576 Key = pCrossValidationMap->find(Key)->second;
589 mpTable->resizeRowsToContents();
595 const std::map<std::string, std::string> * pCrossValidationMap)
600 bool changed =
false;
602 std::vector< COptItem * >::const_iterator it =
mpItemsCopy->begin();
603 std::vector< COptItem * >::const_iterator end =
mpItemsCopy->end();
605 std::vector< COptItem * >::iterator target =
606 static_cast<std::vector< COptItem * > *
>(
mpItems->CCopasiParameter::getValue().pVOID)->begin();
607 std::vector< COptItem * >::iterator targetEnd =
608 static_cast<std::vector< COptItem * > *
>(
mpItems->CCopasiParameter::getValue().pVOID)->end();
613 for (i = 0; it != end && target != targetEnd; ++it, ++target, ++i)
615 if ((*target)->getObjectCN() != (*it)->getObjectCN())
619 if (!(*target)->setObjectCN((*it)->getObjectCN()))
620 (*target)->setValue(
"ObjectCN", (*it)->getObjectCN());
623 if ((*target)->getLowerBound() != (*it)->getLowerBound())
626 (*target)->setLowerBound((*it)->getLowerBound());
629 if ((*target)->getUpperBound() != (*it)->getUpperBound())
632 (*target)->setUpperBound((*it)->getUpperBound());
635 if ((*target)->getStartValue() != (*it)->getStartValue())
638 (*target)->setStartValue((*it)->getStartValue());
643 if (pExperimentMap == NULL)
return false;
646 std::min(static_cast<CFitItem *>(*it)->getExperimentCount(),
650 for (j = 0; j < jmax; j++)
652 std::string & Target =
661 std::map<std::string, std::string>::const_iterator found = pExperimentMap->find(Key);
663 if (found == pExperimentMap->end())
668 if (Target != found->second)
671 Target = found->second;
676 for (jmax = static_cast<CFitItem *>(*target)->getExperimentCount() - 1;
684 for (jmax = static_cast<CFitItem *>(*it)->getExperimentCount(); j < jmax; j++)
688 const std::string & Source =
689 pExperimentMap->find(static_cast<CFitItem *>(*it)->getExperiment(j))->second;
694 if (pCrossValidationMap == NULL)
return false;
697 std::min(static_cast<CFitItem *>(*it)->getCrossValidationCount(),
701 for (j = 0; j < jmax; j++)
703 std::string & Target =
712 std::map<std::string, std::string>::const_iterator found = pCrossValidationMap->find(Key);
714 if (found == pCrossValidationMap->end())
719 if (Target != found->second)
722 Target = found->second;
727 for (jmax = static_cast<CFitItem *>(*target)->getCrossValidationCount() - 1;
735 for (jmax = static_cast<CFitItem *>(*it)->getCrossValidationCount(); j < jmax; j++)
739 const std::string & Source =
740 pCrossValidationMap->find(static_cast<CFitItem *>(*it)->getCrossValidation(j))->second;
755 for (; it != end; ++it)
779 if (pExperimentMap == NULL)
return false;
782 static_cast<CFitItem *
>(pItem)->getExperimentCount();
785 for (j = 0; j < jmax; j++)
787 std::string & Target =
788 *
const_cast<std::string *
>(&
static_cast<CFitItem *
>(pItem)->getExperiment(j));
789 const std::string & Source =
790 pExperimentMap->find(static_cast<CFitItem *>(*it)->getExperiment(j))->second;
808 mpLblExperiments->show();
810 mpBoxExperiments->show();
811 mpBtnExperiments->show();
812 mpBtnPerExperiment->show();
814 mpLblCrossValidations->show();
815 mpCheckCrossValidationsAll->show();
816 mpBoxCrossValidations->show();
817 mpBtnCrossValidations->show();
821 mpLblExperiments->hide();
823 mpBoxExperiments->hide();
824 mpBtnExperiments->hide();
825 mpBtnPerExperiment->hide();
827 mpLblCrossValidations->hide();
828 mpCheckCrossValidationsAll->hide();
829 mpBoxCrossValidations->hide();
830 mpBtnCrossValidations->hide();
846 qApp->processEvents();
857 std::vector< COptItem * >::iterator it =
mpItemsCopy->begin();
858 std::vector< COptItem * >::iterator end =
mpItemsCopy->end();
863 for (Row = 0; it != end; ++it, ++Row)
865 for (i = 0, imax = static_cast<CFitItem *>(*it)->getExperimentCount(); i < imax; ++i)
887 std::set< size_t >::const_iterator it =
mSelection.begin();
888 std::set< size_t >::const_iterator end =
mSelection.end();
895 for (; it != end; ++it, ++Deleted)
899 pItem = (*mpItemsCopy)[row];
904 mpTable->removeRow((
int) row);
908 mpTable->clearSelection();
961 mpTable->insertRow((
int) row);
978 std::set< size_t > NewSelection;
979 std::set< size_t >::const_iterator it =
mSelection.begin();
980 std::set< size_t >::const_iterator end =
mSelection.end();
985 for (; it != end; ++it)
987 NewSelection.insert(*it - 1);
990 pItem = (*mpItemsCopy)[*it];
991 (*mpItemsCopy)[*it] = (*mpItemsCopy)[*it - 1];
992 (*mpItemsCopy)[*it - 1] = pItem;
995 QTableWidgetItem *item1 = mpTable->takeItem((
int)(*it - 1), 0);
996 QTableWidgetItem *item2 = mpTable->takeItem((
int) * it, 0);
997 mpTable->setItem((
int) *it, 0, item1);
998 mpTable->setItem((
int)(*it - 1), 0, item2);
1011 std::set< size_t > NewSelection;
1012 std::set< size_t >::reverse_iterator it =
mSelection.rbegin();
1013 std::set< size_t >::reverse_iterator end =
mSelection.rend();
1016 if ((
int) *it == (mpTable->rowCount() - 1))
1019 for (; it != end; ++it)
1021 NewSelection.insert(*it + 1);
1024 pItem = (*mpItemsCopy)[*it];
1025 (*mpItemsCopy)[*it] = (*mpItemsCopy)[*it + 1];
1026 (*mpItemsCopy)[*it + 1] = pItem;
1029 QTableWidgetItem *item1 = mpTable->takeItem((
int)(*it + 1), 0);
1030 QTableWidgetItem *item2 = mpTable->takeItem((
int) * it, 0);
1031 mpTable->setItem((
int) *it, 0, item1);
1032 mpTable->setItem((
int)(*it + 1), 0, item2);
1053 CFitItem * pItem = NULL, * pTemplate = NULL;
1080 for (i = imax - 1; i != 0; i--)
1103 mpTable->insertRow((
int) row);
1110 imax = (*mppExperimentSet)->getExperimentCount();
1115 for (i = imax - 1; i != 0; i--)
1118 pItem->
addExperiment((*mppExperimentSet)->getExperiment(i)->CCopasiParameter::getKey());
1123 mpTable->insertRow((
int) row);
1130 static_cast<CFitItem *
>((*mpItemsCopy)[*
mSelection.begin()])->addExperiment((*mppExperimentSet)->getExperiment(0)->CCopasiParameter::getKey());
1170 size_t row = mpTable->rowCount();
1176 mpTable->insertRow((
int) row);
1201 Item +=
FROM_UTF8(std::string(
" \xe2\x89\xa4 "));
1212 QString Experiments =
1213 FROM_UTF8(static_cast<const CFitItem *>(pItem)->getExperiments());
1215 if (Experiments !=
"")
1216 Item +=
"; {" + Experiments +
"}";
1220 Item +=
FROM_UTF8(std::string(
" \xe2\x89\xa4 "));
1232 Item +=
"; Start Value = " + QString::number(pItem->
getStartValue());
1235 QTableWidgetItem *itemValue =
new QTableWidgetItem(Item);
1236 itemValue->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
1237 itemValue->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
1238 mpTable->setItem(row, 0, itemValue);
1240 mpTable->resizeRowToContents(row);
1255 size_t i, imax = mpTable->rowCount();
1258 for (i = 0; i != imax; i++)
1260 if (mpTable->item((
int) i, 0)->isSelected())
1274 mpBtnCopy->setEnabled(Enabled);
1275 mpBtnPerExperiment->setEnabled(Enabled);
1277 std::set< size_t >::const_iterator it =
mSelection.begin();
1278 std::set< size_t >::const_iterator end =
mSelection.end();
1282 mpEditObject->setText(
"");
1284 mpEditLower->setText(QString::number(1e-06));
1285 mpCheckLowerInf->setChecked(
false);
1288 mpEditUpper->setText(QString::number(1e+06));
1289 mpCheckUpperInf->setChecked(
false);
1292 mpEditStart->setText(
"");
1294 mpCheckAll->setChecked(
true);
1295 mpBoxExperiments->setEnabled(
false);
1297 mpCheckCrossValidationsAll->setChecked(
true);
1298 mpBoxCrossValidations->setEnabled(
false);
1310 COptItem * pItem = (*mpItemsCopy)[*it];
1317 mpEditObject->setText(Value);
1327 mpEditObject->setText(Value);
1343 mpEditLower->setText(Value);
1344 mpCheckLowerInf->setChecked(Value ==
"-inf");
1356 mpEditUpper->setText(Value);
1357 mpCheckUpperInf->setChecked(Value ==
"inf");
1359 mpEditStart->setText(QString::number(pItem->
getStartValue()));
1361 std::string Experiments;
1362 std::string CrossValidations;
1366 Experiments =
static_cast<CFitItem *
>(pItem)->getExperiments();
1368 mpBoxExperiments->
clear();
1370 size_t i, imax =
static_cast<CFitItem *
>(pItem)->getExperimentCount();
1372 for (i = 0; i < imax; i++)
1381 mpCheckAll->setChecked(imax == 0);
1382 mpBoxExperiments->setEnabled(imax != 0);
1384 CrossValidations =
static_cast<CFitItem *
>(pItem)->getCrossValidations();
1386 mpBoxCrossValidations->
clear();
1388 imax =
static_cast<CFitItem *
>(pItem)->getCrossValidationCount();
1390 for (i = 0; i < imax; i++)
1399 mpCheckCrossValidationsAll->setChecked(imax == 0);
1400 mpBoxCrossValidations->setEnabled(imax != 0);
1403 for (++it; it != end; ++it)
1405 pItem = (*mpItemsCopy)[*it];
1419 if (Value != mpEditObject->text())
1421 mpEditObject->setText(
"");
1433 if (Value != mpEditLower->text())
1435 mpEditLower->setText(
"");
1436 mpCheckLowerInf->setChecked(
false);
1447 if (Value != mpEditUpper->text())
1449 mpEditUpper->setText(
"");
1450 mpCheckUpperInf->setChecked(
false);
1453 if (QString::number(pItem->
getStartValue()) != mpEditStart->text())
1454 mpEditStart->setText(
"");
1457 Experiments != static_cast<CFitItem *>(pItem)->getExperiments())
1459 mpCheckAll->setChecked(
false);
1460 mpBoxExperiments->setEnabled(
false);
1464 CrossValidations != static_cast<CFitItem *>(pItem)->getCrossValidations())
1466 mpCheckCrossValidationsAll->setChecked(
false);
1467 mpBoxCrossValidations->setEnabled(
false);
1478 mpCheckLowerInf->setStyleSheet(QString(mpCheckLowerInf->metaObject()->className()) +
" {background-color:" +
mSavedColor.name() +
";}");
1481 mpCheckUpperInf->setStyleSheet(QString(mpCheckUpperInf->metaObject()->className()) +
" {background-color:" +
mSavedColor.name() +
";}");
1487 std::set< size_t >::const_iterator it =
mSelection.begin();
1488 std::set< size_t >::const_iterator end =
mSelection.end();
1492 for (; it != end; ++it)
1494 pItem = (*mpItemsCopy)[*it];
1496 if (mpCheckLowerInf->isChecked())
1501 if (mpCheckUpperInf->isChecked())
1509 mpCheckLowerInf->setStyleSheet(QString(mpCheckLowerInf->metaObject()->className()) +
" {background-color:" +
mSavedColor.name() +
";}");
1512 mpCheckUpperInf->setStyleSheet(QString(mpCheckUpperInf->metaObject()->className()) +
" {background-color:" +
mSavedColor.name() +
";}");
1531 mpTable->setCurrentCell((
int) row, 0);
1535 mpTable->clearSelection();
1538 mpTable->selectRow((
int) row);
1545 std::set< size_t >::const_iterator it = selection.begin();
1546 std::set< size_t >::const_iterator end = selection.end();
1553 mpTable->setCurrentCell((
int) *it, 0);
1555 mpTable->setCurrentCell(-1, 0);
1558 for (; it != end; ++it)
1559 mpTable->item((
int) *it, 0)->setSelected(
true);
1566 std::string Number =
TO_UTF8(mpEditLower->text());
1569 !(Number[0] ==
'-' &&
1570 Number[Number.length() - 1] ==
'%' &&
1571 isNumber(Number.substr(1, Number.length() - 2))))
return;
1576 std::string NewValue =
"";
1578 std::set< size_t >::const_iterator it =
mSelection.begin();
1579 std::set< size_t >::const_iterator end =
mSelection.end();
1581 for (; it != end; ++it)
1583 (*mpItemsCopy)[*it]->setLowerBound(Number);
1587 NewValue = (*mpItemsCopy)[*it]->getLowerBound();
1590 else if (NewValue != (*
mpItemsCopy)[*it]->getLowerBound())
1596 mpEditLower->setText(
FROM_UTF8(NewValue));
1601 std::string Number =
TO_UTF8(mpEditUpper->text());
1604 !(Number[0] ==
'+' &&
1605 Number[Number.length() - 1] ==
'%' &&
1606 isNumber(Number.substr(1, Number.length() - 2))))
return;
1610 std::set< size_t >::const_iterator it =
mSelection.begin();
1611 std::set< size_t >::const_iterator end =
mSelection.end();
1614 std::string NewValue =
"";
1616 for (; it != end; ++it)
1618 (*mpItemsCopy)[*it]->setUpperBound(Number);
1622 NewValue = (*mpItemsCopy)[*it]->getUpperBound();
1625 else if (NewValue != (*
mpItemsCopy)[*it]->getUpperBound())
1631 mpEditUpper->setText(
FROM_UTF8(NewValue));
1639 std::set< size_t >::const_iterator it =
mSelection.begin();
1640 std::set< size_t >::const_iterator end =
mSelection.end();
1642 switch (pDialog->result())
1644 case QDialog::Rejected:
1649 for (; it != end; ++it)
1651 (*mpItemsCopy)[*it]->setStartValue(std::numeric_limits<C_FLOAT64>::quiet_NaN());
1652 mpEditStart->setText(QString::number((*
mpItemsCopy)[*it]->getStartValue()));
1660 for (; it != end; ++it)
1662 (*mpItemsCopy)[*it]->setStartValue((*
mpItemsCopy)[*it]->getRandomValue());
1663 mpEditStart->setText(QString::number((*
mpItemsCopy)[*it]->getStartValue()));
1675 for (; it != end; ++it)
1677 (*mpItemsCopy)[*it]->setStartValue(Solution[*it]);
1678 mpEditStart->setText(QString::number((*
mpItemsCopy)[*it]->getStartValue()));
1694 C_FLOAT64 Number = mpEditStart->text().toDouble();
1696 std::set< size_t >::const_iterator it =
mSelection.begin();
1697 std::set< size_t >::const_iterator end =
mSelection.end();
1699 for (; it != end; ++it)
1701 (*mpItemsCopy)[*it]->setStartValue(Number);
1713 if (pDialog->exec() == QDialog::Accepted)
1718 std::set< size_t >::const_iterator it =
mSelection.begin();
1719 std::set< size_t >::const_iterator end =
mSelection.end();
1721 for (; it != end; ++it)
1723 (*mpItemsCopy)[*it]->getGroup(
"Affected Cross Validation Experiments")->clear();
1724 size_t i, imax = mpBoxCrossValidations->count();
1726 for (i = 0; i < imax && imax < (*mppCrossValidationSet)->getExperimentCount(); i++)
1727 static_cast<CFitItem *>((*
mpItemsCopy)[*it])->addCrossValidation((*mppCrossValidationSet)->getExperiment(
TO_UTF8(mpBoxCrossValidations->itemText(i)))->CCopasiParameter::getKey());
1747 std::vector< COptItem * >::iterator it =
mpItemsCopy->begin();
1748 std::vector< COptItem * >::iterator end =
mpItemsCopy->end();
1753 for (Row = 0; it != end; ++it, ++Row)
1755 for (i = 0, imax = static_cast<CFitItem *>(*it)->getCrossValidationCount(); i < imax; ++i)
1777 mpBtnCrossValidations->setEnabled(Enabled);
1778 mpCheckCrossValidationsAll->setEnabled(Enabled);
1779 mpBoxCrossValidations->setEnabled(Enabled && !mpCheckCrossValidationsAll->isChecked());
1780 mpLblCrossValidations->setEnabled(Enabled);
1787 if (!checked && mpBoxCrossValidations->count() == 0)
1791 std::set< size_t >::const_iterator it =
mSelection.begin();
1792 std::set< size_t >::const_iterator end =
mSelection.end();
1794 for (; it != end; ++it)
1796 (*mpItemsCopy)[*it]->getGroup(
"Affected Cross Validation Experiments")->clear();
1808 if (!checked && mpBoxExperiments->count() == 0)
1812 std::set< size_t >::const_iterator it =
mSelection.begin();
1813 std::set< size_t >::const_iterator end =
mSelection.end();
1815 for (; it != end; ++it)
1817 (*mpItemsCopy)[*it]->getGroup(
"Affected Experiments")->clear();
const std::string & getExperiment(const size_t &index) const
CCopasiObject * getDataObject(const CCopasiObjectName &CN) const
virtual std::string getObjectDisplayName(bool regular=true, bool richtext=false) const
bool isNumber(const std::string &str)
const CCopasiObjectName getObjectCN() const
virtual CCopasiObjectName getCN() const
const std::string & getObjectName() const
bool setLowerBound(const CCopasiObjectName &lowerBound)
CCopasiObject * get(const std::string &key)
const std::string getUpperBound() const
static std::vector< const CCopasiObject * > getObjectVector(QWidget *pParent, const CQSimpleSelectionTree::ObjectClasses &classes, const std::vector< const CCopasiObject * > *pCurrentSelection=NULL)
bool removeCrossValidation(const size_t &index)
bool setObjectCN(const CCopasiObjectName &objectCN)
bool addExperiment(const std::string &key)
bool setUpperBound(const CCopasiObjectName &upperBound)
bool removeParameter(const std::string &name)
virtual void force(const QString &input) const
virtual void saved() const
virtual State revalidate()
static const QIcon & icon(const IconID &id)
const CVector< C_FLOAT64 > & getSolutionVariables() const
bool setStartValue(const C_FLOAT64 &value)
virtual void load(QComboBox *pBox, const CExperimentSet *pExperimentSet)
const C_FLOAT64 & getStartValue() const
size_t getCrossValidationCount() const
static CKeyFactory * getKeyFactory()
const std::string getLowerBound() const
bool fl(const C_FLOAT64 &d1, const C_FLOAT64 &d2)
bool addParameter(const CCopasiParameter ¶meter)
bool removeExperiment(const size_t &index)
virtual State validate(QString &input, int &pos) const
size_t getExperimentCount() const
const std::string & getCrossValidation(const size_t &index) const
static const CCopasiObject * getObjectSingle(QWidget *pParent, const CQSimpleSelectionTree::ObjectClasses &classes, const CCopasiObject *pCurrentObject=NULL)
size_t getExperimentCount() const
CCopasiContainer * getObjectParent() const
bool addCrossValidation(const std::string &key)