Brief description of class still missing. More...
#include <ModelRepository.h>
Public Member Functions | |
int | activeModelCount () const |
void | addModel (NewModel *m) |
void | addReport (NewModel *m, AbstractForward *forward) |
ModelSet * | allModels () |
int | bestModelCount () const |
int | bestModelIndex () const |
uint | checksum () const |
void | clear () |
ParentIndex * | createModel (double randomValue, RealSpace ¶meterSpace) const |
int | expectedModelCount () const |
AbstractForward * | forward () |
const AbstractForward * | forward () const |
int | giveUpCount () const |
bool | importModels (QString fileName, bool strict=true) |
void | init () |
void | lock () const |
double | misfit (int modelIndex) const |
const int * | model (int modelIndex) const |
ModelRepository () | |
bool | openReport (const QString &fileName) |
bool | operator== (const ModelRepository &o) const |
void | printActiveModels () |
int | rejectedCount () const |
void | setBestModelCount (int nr) |
void | setForward (AbstractForward *f) |
void | setGiveUp (double gu) |
void | setMaximumBestModelCount (int n) |
void | setMaximumModelCount (int n) |
void | setMaximumQueueLength (int l) |
void | setMaximumSavedMisfit (double m) |
void | setStorage () |
void | setWalkCount (int n) |
bool | start (int nThreads, Generator::Type type) |
void | stop () |
void | unlock () const |
int | validModelCount () const |
const Parameter * | variableParameter (int paramIndex) const |
int | variableParameterCount () const |
double | variableParameterValue (int modelIndex, int paramIndex) const |
int | visitedModelCount () const |
void | wait () |
~ModelRepository () |
Brief description of class still missing.
Full description of class still missing
Description of constructor still missing
References TRACE.
: _terminated(false) { TRACE; _maximumModelCount=10000; _maximumBestModelCount=RAND_MAX; // by default no limit _maximumQueueLenght=50; // A similar job as ns=50 in old releases _maximumSavedMisfit=1e99; // by default no limit _giveUp=0.9; _walkCount=2; _processingQueue=false; _report=0; _forward=0; _parameterSpaceChecksum=0; _allModels=0; _generatorModels=0; }
Description of destructor still missing
References QGpCoreTools::SharedObject::removeReference(), TRACE, and wait().
{ TRACE; wait(); // Not owner of forward delete _allModels; if(_generatorModels) { GeneratorModels::removeReference(_generatorModels); } delete _report; }
int DinverCore::ModelRepository::activeModelCount | ( | ) | const |
References DinverCore::GeneratorModels::activeModels(), and DinverCore::ActiveModels::count().
Referenced by InversionThread::activeModelCount().
{ return _generatorModels->activeModels()->count(); }
void DinverCore::ModelRepository::addModel | ( | NewModel * | m | ) |
Called by all ModelGenerator after creating one new model. Thread-safe.
References TRACE.
{ TRACE; _queueLock.lock(); _newModels.enqueue(m); if(!_processingQueue && _newModels.count()>=_maximumQueueLenght) { processQueue(); } _queueLock.unlock(); }
void DinverCore::ModelRepository::addReport | ( | NewModel * | m, |
AbstractForward * | forward | ||
) |
References DinverCore::ReportWriter::addModel(), DinverCore::NewModel::isValidMisfit(), DinverCore::NewModel::isValidParent(), DinverCore::NewModel::misfit(), DinverCore::AbstractForward::parameterSpace(), TRACE, and DinverCore::AbstractForward::writeReport().
{ TRACE; if(_report && m->isValidParent() && m->isValidMisfit() && m->misfit()<=_maximumSavedMisfit) { _reportLock.lock(); _report->addModel(m->misfit(), _parameterSpaceChecksum, forward->parameterSpace()); forward->writeReport(_report); _reportLock.unlock(); } }
ModelSet* DinverCore::ModelRepository::allModels | ( | ) | [inline] |
{return _allModels;}
int DinverCore::ModelRepository::bestModelCount | ( | ) | const |
References DinverCore::GeneratorModels::bestModels(), and DinverCore::BestModels::count().
Referenced by InversionThread::bestModelCount().
{ return _generatorModels->bestModels()->count(); }
int DinverCore::ModelRepository::bestModelIndex | ( | ) | const |
References DinverCore::ModelSet::bestModel().
Referenced by createModel(), and InversionThread::run().
{ // TODO: multi-dimensional misfit return _allModels->bestModel(); }
uint DinverCore::ModelRepository::checksum | ( | ) | const [inline] |
Referenced by InversionThread::start(), and InversionThread::xml_writeProperties().
{return _parameterSpaceChecksum;}
void DinverCore::ModelRepository::clear | ( | ) |
References DinverCore::ModelSet::clear(), DinverCore::GeneratorModels::clear(), and TRACE.
Referenced by InversionThread::clear(), and InversionThread::run().
ParentIndex * DinverCore::ModelRepository::createModel | ( | double | randomValue, |
RealSpace & | parameterSpace | ||
) | const |
Called by all Generator before creating one new model. Thread-safe.
randomValue must be between 0 and 1, generated by Random::ran2().
Returns a ParentIndex ready to model generation. parameterSpace is populated with the values of the selected parent model.
References DinverCore::ParentIndex::activeIndex(), DinverCore::ParentIndex::activeModels(), bestModelIndex(), DinverCore::GeneratorModels::bestModels(), DinverCore::BestModels::count(), DinverCore::ModelSet::lock(), DinverCore::ActiveModels::model(), DinverCore::BestModels::modelIndex(), DinverCore::Parameter::setGridValue(), TRACE, DinverCore::ModelSet::unlock(), DinverCore::RealSpace::variableParameter(), and DinverCore::RealSpace::variableParameterCount().
{ TRACE; int ndVar=parameterSpace.variableParameterCount(); // Selects randomly one of the best cells _generatorModelLock.lockForRead(); const BestModels * bestModels=_generatorModels->bestModels(); int bestModelIndex=(int)round((bestModels->count()-1)*randomValue); ParentIndex * parentIndex=new ParentIndex(_generatorModels, bestModels->modelIndex(bestModelIndex)); // Copy model to parameter structure to enable condition testing _allModels->lock(); const int * v=parentIndex->activeModels()->model(parentIndex->activeIndex()); for(int ip=0; ip<ndVar; ip++) { parameterSpace.variableParameter(ip)->setGridValue(v[ip]); } _allModels->unlock(); _generatorModelLock.unlock(); return parentIndex; }
int DinverCore::ModelRepository::expectedModelCount | ( | ) | const [inline] |
Referenced by InversionThread::expectedModelCount(), and InversionThread::start().
{return _maximumModelCount;}
AbstractForward* DinverCore::ModelRepository::forward | ( | ) | [inline] |
const AbstractForward* DinverCore::ModelRepository::forward | ( | ) | const [inline] |
{return _forward;}
int DinverCore::ModelRepository::giveUpCount | ( | ) | const |
References DinverCore::GeneratorModels::giveUpCount().
Referenced by InversionThread::giveUpCount().
{ return _generatorModels->giveUpCount(); }
bool DinverCore::ModelRepository::importModels | ( | QString | fileName, |
bool | strict = true |
||
) |
References DinverCore::GeneratorModels::add(), DinverCore::ModelSet::count(), QGpCoreTools::endl(), fileName, DinverCore::ModelSet::importModelsFromAscii(), DinverCore::ModelSet::importModelsFromReport(), DinverCore::ReportReader::isReportFormat(), DinverCore::ReportReader::nModels(), DinverCore::ReportReader::open(), DinverCore::AbstractForward::parameterSpace(), DinverCore::ReportReader::synchronize(), QGpCoreTools::tr(), and TRACE.
Referenced by InversionThread::checkImportModels(), InversionThread::importModels(), DinverCore::BatchRun::neighborhoodOptimization(), and InversionThread::run().
{ TRACE; int i=_allModels->count(); if(ReportReader::isReportFormat(fileName)) { ReportReader report(fileName); if(!report.open()) { App::stream() << tr("Error opening report %1").arg(fileName) << endl; return false; } report.synchronize(); _maximumModelCount=report.nModels(); if(!_allModels->importModelsFromReport(_forward->parameterSpace(), report, strict)) { return false; } } else { if(!_allModels->importModelsFromAscii(_forward->parameterSpace(), fileName)) { return false; } } int n=_allModels->count(); for(;i<n;i++) { _generatorModels->add(i); } return true; }
void DinverCore::ModelRepository::init | ( | ) |
References QGpCoreTools::AtomicBoolean::setValue(), and TRACE.
Referenced by InversionThread::start().
void DinverCore::ModelRepository::lock | ( | ) | const |
Used only by external objects to acces generated models (read only)
References DinverCore::ModelSet::lock().
Referenced by InversionThread::lock().
{ if(_allModels) { _allModels->lock(); } _generatorModelLock.lockForRead(); }
double DinverCore::ModelRepository::misfit | ( | int | modelIndex | ) | const |
References DinverCore::ModelSet::misfit().
Referenced by InversionThread::misfit(), and InversionThread::run().
{ // TODO: multi-dimensional misfit return _allModels ? _allModels->misfit(modelIndex)[0] : 0; }
const int * DinverCore::ModelRepository::model | ( | int | modelIndex | ) | const |
References DinverCore::ModelSet::model().
Referenced by start().
{ return _allModels->model(modelIndex); }
bool DinverCore::ModelRepository::openReport | ( | const QString & | fileName | ) |
Initializes report.
References QGpCoreTools::endl(), DinverCore::ReportWriter::open(), QGpCoreTools::tr(), and TRACE.
Referenced by DinverCore::BatchRun::neighborhoodOptimization(), and InversionThread::run().
bool DinverCore::ModelRepository::operator== | ( | const ModelRepository & | o | ) | const |
Returns true if the two repositories have the same parameterization.
References DinverCore::AbstractForward::parameterSpace().
{ return _forward->parameterSpace()==o._forward->parameterSpace(); }
References DinverCore::GeneratorModels::activeModels(), DinverCore::ActiveModels::at(), DinverCore::ActiveModels::count(), QGpCoreTools::endl(), DinverCore::ActiveModel::navigatorHit(), and QGpCoreTools::tr().
Referenced by DinverCore::BatchRun::neighborhoodOptimization().
{ const ActiveModels * m=_generatorModels->activeModels(); for(int i=0; i<m->count(); i++) { App::stream() << tr("navigator hit %1 %2").arg(i).arg(m->at(i).navigatorHit()) << endl; } }
int DinverCore::ModelRepository::rejectedCount | ( | ) | const |
References DinverCore::GeneratorModels::rejectedCount().
Referenced by InversionThread::rejectedCount().
{ return _generatorModels->rejectedCount(); }
void DinverCore::ModelRepository::setBestModelCount | ( | int | nr | ) |
References DinverCore::GeneratorModels::setBestModelCount(), and TRACE.
Referenced by InversionThread::run().
{ TRACE; _generatorModels->setBestModelCount(nr); }
Sets forward solver. Ownership is not taken over this forward.
References TRACE.
Referenced by DinverCore::BatchRun::neighborhoodOptimization(), and InversionThread::setForward().
{ TRACE; _forward=f; }
void DinverCore::ModelRepository::setGiveUp | ( | double | gu | ) | [inline] |
Referenced by InversionThread::run().
{_giveUp=gu;}
void DinverCore::ModelRepository::setMaximumBestModelCount | ( | int | n | ) | [inline] |
Referenced by DinverCore::BatchRun::neighborhoodOptimization().
{_maximumBestModelCount=n;}
void DinverCore::ModelRepository::setMaximumModelCount | ( | int | n | ) | [inline] |
Referenced by DinverCore::BatchRun::neighborhoodOptimization(), and InversionThread::run().
{_maximumModelCount=n;}
void DinverCore::ModelRepository::setMaximumQueueLength | ( | int | l | ) | [inline] |
Referenced by DinverCore::BatchRun::neighborhoodOptimization(), and InversionThread::run().
{_maximumQueueLenght=l;}
void DinverCore::ModelRepository::setMaximumSavedMisfit | ( | double | m | ) | [inline] |
Referenced by DinverCore::BatchRun::neighborhoodOptimization().
{_maximumSavedMisfit=m;}
References QGpCoreTools::SharedObject::addReference(), DinverCore::RealSpace::checksum(), DinverCore::AbstractForward::parameterSpace(), QGpCoreTools::SharedObject::removeReference(), and DinverCore::RealSpace::variableParameterCount().
Referenced by DinverCore::BatchRun::neighborhoodOptimization(), InversionThread::setStorage(), and InversionThread::xml_polish().
{ if(_allModels) { ASSERT(_generatorModels); delete _allModels; GeneratorModels::removeReference(_generatorModels); } _parameterSpaceChecksum=_forward->parameterSpace().checksum(); int ndVar=_forward->parameterSpace().variableParameterCount(); _allModels=new ModelSet(ndVar, 1); _generatorModels=new GeneratorModels(_allModels); _generatorModels->addReference(); }
void DinverCore::ModelRepository::setWalkCount | ( | int | n | ) | [inline] |
Referenced by InversionThread::run().
{_walkCount=n;}
bool DinverCore::ModelRepository::start | ( | int | nThreads, |
Generator::Type | type | ||
) |
References DinverCore::GeneratorModels::activeModels(), DinverCore::RealSpace::adjustRanges(), DinverCore::GeneratorModels::bestModels(), DinverCore::AbstractForward::clone(), DinverCore::AbstractForward::copyValues(), DinverCore::ActiveModels::count(), DinverCore::BestModels::count(), QGpCoreTools::endl(), DinverCore::AbstractForward::firstModel(), DinverCore::RealSpace::isOkDebug(), DinverCore::AbstractForward::maximumThreadCount(), DinverCore::BestModels::model(), model(), DinverCore::AbstractForward::parameterSpace(), DinverCore::Parameter::setGridValue(), DinverCore::Generator::setType(), DinverCore::RealSpace::setVariableParameters(), DinverCore::Generator::setWalkCount(), QGpCoreTools::tr(), TRACE, QGpCoreTools::Random::uniform(), DinverCore::AbstractForward::valueChanged(), DinverCore::RealSpace::variableParameter(), and DinverCore::RealSpace::variableParameterCount().
Referenced by DinverCore::BatchRun::neighborhoodOptimization(), and InversionThread::run().
{ TRACE; // Adjust number of threads if(nThreads>CoreApplication::instance()->maximumThreadCount()) { nThreads=CoreApplication::instance()->maximumThreadCount(); } if(nThreads>_forward->maximumThreadCount()) { nThreads=_forward->maximumThreadCount(); } if(nThreads<1) nThreads=1; App::stream() << tr("Starting %1 generator thread(s)").arg(nThreads) << endl; // Calculate seed model Random randomNumber(0); if(_generatorModels->activeModels()->count()==0) { if(!_forward->firstModel(randomNumber, _terminated)) { return false; } } else { // Load one of the best models into _forward RealSpace& parameterSpace=_forward->parameterSpace(); int ndVar=parameterSpace.variableParameterCount(); const int * model=_generatorModels->bestModels()->model(randomNumber.uniform(0, _generatorModels->bestModels()->count()-1)); for(int ip=0; ip<ndVar; ip++) { parameterSpace.variableParameter(ip)->setGridValue(model[ip]); } // Some parametrizations may need some updates before proceeding _forward->valueChanged(); // Check validity of exisiting best models if( !parameterSpace.isOkDebug()) { return false; } } // Init all forwards with this first model qDeleteAll(_generators); _generators.clear(); for(int i=0; i<nThreads; i++) { AbstractForward * f=_forward->clone(); RealSpace& parameterSpace=f->parameterSpace(); parameterSpace.setVariableParameters(); parameterSpace.adjustRanges(); // Assumed to be ok, because checked before for the first one // Init first model for f f->copyValues(*_forward); Generator * g=new Generator(this, f); App::setStream(&App::stream(), g); g->setType(type); g->setWalkCount(_walkCount); _generators.append(g); } _chrono.start(); for(QList<Generator *>::iterator it=_generators.begin(); it!=_generators.end(); it++) { (*it)->start(); } return true; }
void DinverCore::ModelRepository::stop | ( | ) |
References QGpCoreTools::AtomicBoolean::setValue(), and TRACE.
Referenced by InversionThread::terminate().
void DinverCore::ModelRepository::unlock | ( | ) | const |
Used only by external objects to acces generated models (read only)
References DinverCore::ModelSet::unlock().
Referenced by InversionThread::unlock().
{ if(_allModels) { _allModels->unlock(); } _generatorModelLock.unlock(); }
int DinverCore::ModelRepository::validModelCount | ( | ) | const |
References DinverCore::ModelSet::count(), and DinverCore::GeneratorModels::rejectedCount().
Referenced by InversionThread::checkImportModels(), DinverCore::BatchRun::neighborhoodOptimization(), InversionThread::run(), and InversionThread::validModelCount().
{ return _allModels->count()-_generatorModels->rejectedCount(); }
const Parameter * DinverCore::ModelRepository::variableParameter | ( | int | paramIndex | ) | const |
References DinverCore::AbstractForward::parameterSpace(), and DinverCore::RealSpace::variableParameter().
Referenced by InversionThread::variableParameter(), and variableParameterValue().
{ const RealSpace& parameterSpace=_forward->parameterSpace(); return parameterSpace.variableParameter(paramIndex); }
int DinverCore::ModelRepository::variableParameterCount | ( | ) | const |
References DinverCore::ModelSet::parameterCount().
Referenced by InversionThread::start(), and InversionThread::variableParameterCount().
{ return _allModels ? _allModels->parameterCount() : 0; }
double DinverCore::ModelRepository::variableParameterValue | ( | int | modelIndex, |
int | paramIndex | ||
) | const |
References DinverCore::ModelSet::model(), DinverCore::Parameter::realValue(), and variableParameter().
Referenced by InversionThread::variableParameterValue().
{ return variableParameter(paramIndex)->realValue(_allModels->model(modelIndex)[paramIndex]); }
int DinverCore::ModelRepository::visitedModelCount | ( | ) | const |
References DinverCore::ModelSet::count().
Referenced by InversionThread::visitedModelCount().
{ if(!_allModels) printf("Blank all models\n"); return _allModels ? _allModels->count() : 0; }
void DinverCore::ModelRepository::wait | ( | ) |
References TRACE.
Referenced by DinverCore::BatchRun::neighborhoodOptimization(), InversionThread::run(), and ~ModelRepository().
{ TRACE; for(QList<Generator *>::iterator it=_generators.begin(); it!=_generators.end(); it++) { if((*it)->isRunning()) { (*it)->wait(); } } // Flush model queue _queueLock.lock(); processQueue(); _queueLock.unlock(); // Clean generators qDeleteAll(_generators); _generators.clear(); }