Brief description of class still missing. More...
#include <GridSnoop.h>
Public Member Functions | |
| uint | checksum () const |
| GridSnoop () | |
| bool | openReport (const QString &fileName) |
| bool | optimization () |
| void | setForward (AbstractForward *forward) |
| void | setSeed (int seed) |
| bool | setThreadCount (int nThreads) |
| void | sleep () |
| int | variableParameterCount () const |
| void | wake () |
| ~GridSnoop () | |
Brief description of class still missing.
Full description of class still missing
| uint DinverCore::GridSnoop::checksum | ( | ) | const [inline] |
Referenced by DinverCore::BatchRun::snoopOptimization().
{return _parameterSpaceChecksum;}
| bool DinverCore::GridSnoop::openReport | ( | const QString & | fileName | ) |
Initialize report. Can be called at any time.
References QGpCoreTools::endl(), DinverCore::ReportWriter::open(), and QGpCoreTools::tr().
Referenced by DinverCore::BatchRun::snoopOptimization().
| bool DinverCore::GridSnoop::optimization | ( | ) |
References DinverCore::ReportWriter::addModel(), QGpCoreTools::endl(), DinverCore::Parameter::gridValue(), DinverCore::RealSpace::isOk(), DinverCore::AbstractForward::misfit(), DinverCore::AbstractForward::parameterSpace(), DinverCore::Parameter::setGridValue(), QGpCoreTools::tr(), TRACE, DinverCore::AbstractForward::valueChanged(), DinverCore::RealSpace::variableParameter(), DinverCore::RealSpace::variableParameterCount(), and DinverCore::AbstractForward::writeReport().
Referenced by DinverCore::BatchRun::snoopOptimization().
{
TRACE;
AbstractForward * refForward=_forwards.first();
RealSpace& parameterSpace=refForward->parameterSpace();
int ndVar=parameterSpace.variableParameterCount();
ASSERT(parameterSpace.isOk());
// Perturbations
bool ok=true;
while(true) {
double m;
int bestAxis=-1, bestDirection=0;
for(int ip=0; ip<ndVar; ip++) {
Parameter * p=parameterSpace.variableParameter(ip);
int currentValue=p->gridValue();
App::stream() << tr("%1: %2 (%3)").arg(ip).arg(currentValue).arg(_bestMisfit) << endl;
// +1
p->setGridValue(currentValue+1);
// Some parametrizations may need some updates before proceeding
refForward->valueChanged(p);
if(parameterSpace.isOk()) {
m=refForward->misfit(ok);
App::stream() << tr("+1 param ok, misfit %1").arg(m) << endl;
if(ok) {
if(m<_bestMisfit) {
_bestMisfit=m;
bestAxis=ip;
bestDirection=1;
}
} else {
ok=true;
}
}
// -1
p->setGridValue(currentValue-1);
// Some parametrizations may need some updates before proceeding
refForward->valueChanged(p);
if(parameterSpace.isOk()) {
m=refForward->misfit(ok);
App::stream() << tr("-1 param ok, misfit %1").arg(m) << endl;
if(ok) {
if(m<_bestMisfit) {
_bestMisfit=m;
bestAxis=ip;
bestDirection=-1;
}
} else {
ok=true;
}
}
// Reset to original point
p->setGridValue(currentValue);
// Some parametrizations may need some updates before proceeding
refForward->valueChanged(p);
}
// Effectively move to a new better position
if(bestDirection!=0) {
int currentValue=parameterSpace.variableParameter(bestAxis)->gridValue();
Parameter * p=parameterSpace.variableParameter(bestAxis);
p->setGridValue(currentValue+bestDirection);
// Some parametrizations may need some updates before proceeding
refForward->valueChanged(p);
refForward->misfit(ok);
_report->addModel(_bestMisfit, _parameterSpaceChecksum, parameterSpace);
refForward->writeReport(_report);
} else {
break;
}
}
return true;
}
| void DinverCore::GridSnoop::setForward | ( | AbstractForward * | forward | ) |
Set the forward object in charge of forward computation. Can be called only once.
References TRACE.
Referenced by DinverCore::BatchRun::snoopOptimization().
{
TRACE;
ASSERT(_forwards.count()==0);
// There is always at least one thread, create it
_forwards.append(forward);
}
| void DinverCore::GridSnoop::setSeed | ( | int | seed | ) |
If seed is null, a random number is calculated from current time.
References QGpCoreTools::endl(), and QGpCoreTools::tr().
Referenced by DinverCore::BatchRun::snoopOptimization().
{
if(_forwards.isEmpty() || _forwards.first()->isSleeping()) {
delete _generator;
_generator=new UniqueRandom(seed);
if( !_forwards.isEmpty()) _forwards.first()->setGenerator(_generator);
} else {
App::stream() << tr("Cannot change the random seed of a running inversion, first terminate it.") << endl;
}
}
| bool DinverCore::GridSnoop::setThreadCount | ( | int | nThreads | ) |
If there is no model currently in list, it generates a random model without checking conditions between parameters limits. In a second step, the model is adjusted until matching all conditions of the parameter space.
References QGpCoreTools::endl(), QGpCoreTools::tr(), and TRACE.
Referenced by DinverCore::BatchRun::snoopOptimization().
{
TRACE;
//QTime chrono;
//chrono.start();
ASSERT(_forwards.count()==1);
AbstractForward * refForward=_forwards.first();
if(nThreads>refForward->maximumThreadCount()) nThreads=refForward->maximumThreadCount();
if(nThreads<1) nThreads=1;
// Get the checksum of the parameterization
_parameterSpaceChecksum=refForward->parameterSpace().checksum();
refForward->setFinishSignal(&_forwardSignal);
refForward->setGenerator(_generator);
if( ! refForward->firstModel()) {
App::stream() << tr("Error generating first model") << endl;
return false;
}
bool ok;
_bestMisfit=refForward->misfit(ok);
//_timeTotal+=chrono.elapsed();
return true;
}
| void DinverCore::GridSnoop::sleep | ( | ) |
References DinverCore::AbstractForward::sleep(), and TRACE.
Referenced by DinverCore::BatchRun::snoopOptimization().
{
TRACE;
// Remove all but one forward thread
while(_forwards.count()>1) {
AbstractForward * f=_forwards.last();
f->sleep();
delete f;
_forwards.pop_back();
}
_forwards.first()->sleep();
}
| int DinverCore::GridSnoop::variableParameterCount | ( | ) | const |
Referenced by DinverCore::BatchRun::snoopOptimization().
{
return _forwards.first()->parameterSpace().variableParameterCount();
}
| void DinverCore::GridSnoop::wake | ( | ) |
Activate this first forward thread. This is used as a semaphore to indicate if the inversion is currently running or not.
References TRACE.
Referenced by DinverCore::BatchRun::snoopOptimization().
{
TRACE;
ASSERT(_forwards.count()==1);
_forwards.first()->wake();
//_timeAdd=0;
//_timeMainWait=0;
//_timeTotal=0;
}