本文整理汇总了C++中Mutator::accept方法的典型用法代码示例。如果您正苦于以下问题:C++ Mutator::accept方法的具体用法?C++ Mutator::accept怎么用?C++ Mutator::accept使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Mutator
的用法示例。
在下文中一共展示了Mutator::accept方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: process
//.........这里部分代码省略.........
Float Qyx = mutator->Q(*proposed, *current, muRec.reverse()) * suitabilities[mutatorIdx];
Float a;
if (!m_config.importanceMap) {
if(Qxy > RCPOVERFLOW)
a = std::min((Float) 1, Qyx / Qxy);
else
a = 0.f;
} else {
const Float *luminanceValues = m_config.importanceMap->getFloatData();
const Point2 &curPos = current->getSamplePosition();
const Point2 &propPos = proposed->getSamplePosition();
Vector2i size = m_config.importanceMap->getSize();
Point2i curPosI(
std::min(std::max(0, (int) curPos.x), size.x-1),
std::min(std::max(0, (int) curPos.y), size.y-1));
Point2i propPosI(
std::min(std::max(0, (int) propPos.x), size.x-1),
std::min(std::max(0, (int) propPos.y), size.y-1));
Float curValue = luminanceValues[curPosI.x + curPosI.y * size.x];
Float propValue = luminanceValues[propPosI.x + propPosI.y * size.x];
a = std::min((Float) 1, (Qyx * curValue) / (Qxy * propValue));
}
#if defined(MTS_BD_DEBUG_HEAVY)
if (!proposed->verify(m_scene, EImportance, oss)) {
Log(EWarn, "%s proposed as %s, Qxy=%f, Qyx=%f", oss.str().c_str(),
muRec.toString().c_str(), Qxy, Qyx);
proposed->release(muRec.l, muRec.l + muRec.ka + 1, *m_pool);
oss.str("");
continue;
}
#endif
if (Qxy == 0) { // be tolerant of this (can occasionally happen due to floating point inaccuracies)
a = 0;
} else if (Qxy < 0 || Qyx < 0 || std::isnan(Qxy) || std::isnan(Qyx)) {
#if defined(MTS_BD_DEBUG)
Log(EDebug, "Source path: %s", current->toString().c_str());
Log(EDebug, "Proposal path: %s", proposed->toString().c_str());
Log(EWarn, "Internal error while computing acceptance probabilities: "
"Qxy=%f, Qyx=%f, muRec=%s", Qxy, Qyx, muRec.toString().c_str());
#endif
a = 0;
}
accumulatedWeight += 1-a;
/* Accept with probability 'a' */
if (a == 1 || m_sampler->next1D() < a) {
current->release(muRec.l, muRec.m+1, *m_pool);
Spectrum value = relWeight * accumulatedWeight;
if (!value.isZero())
result->put(current->getSamplePosition(), &value[0]);
/* The mutation was accepted */
std::swap(current, proposed);
relWeight = current->getRelativeWeight();
mutator->accept(muRec);
currentMuRec = muRec;
accumulatedWeight = a;
consecRejections = 0;
++statsAccepted;
} else {
/* The mutation was rejected */
proposed->release(muRec.l, muRec.l + muRec.ka + 1, *m_pool);
consecRejections++;
if (a > 0) {
Spectrum value = proposed->getRelativeWeight() * a;
result->put(proposed->getSamplePosition(), &value[0]);
}
}
} else {
accumulatedWeight += 1;
consecRejections++;
}
}
#if defined(MTS_BD_DEBUG)
if (consecRejections == m_config.nMutations)
Log(EWarn, "Encountered a path that could *never* be mutated!: %s",
current->toString().c_str());
#endif
if (accumulatedWeight > 0) {
Spectrum value = relWeight * accumulatedWeight;
result->put(current->getSamplePosition(), &value[0]);
}
#if defined(MTS_DEBUG_FP)
disableFPExceptions();
#endif
current->release(*m_pool);
delete current;
delete proposed;
if (!m_pool->unused())
Log(EError, "Internal error: detected a memory pool leak!");
}