void UnconstrainedTestProblem::generateDisplacement(float_t stdDev) { // generate displacement until a feasible one is found do { for (size_t t = 0; t < d; t++) { // every component is normally distributed displacement[t] = RandomNumberGenerator::getInstance().getGaussianRN(stdDev); } } while (!isDisplacementFeasible()); // set the displacement also in the objective function getObjectiveFunction().setDisplacement(displacement); }
void UnconstrainedTestProblem::setDisplacement(const base::DataVector& displacement) { this->displacement = displacement; // set the displacement also in the objective function getObjectiveFunction().setDisplacement(displacement); }
void CyclicCoordinateDescent::findMode( int maxIterations, int convergenceType, double epsilon ) { if (convergenceType < GRADIENT || convergenceType > ZHANG_OLES) { std::ostringstream stream; stream << "Unknown convergence criterion: " << convergenceType; error->throwError(stream); } if (!validWeights || hXI.getTouchedY() // || hXI.getTouchedX() ) { computeNEvents(); computeFixedTermsInLogLikelihood(); computeFixedTermsInGradientAndHessian(); validWeights = true; hXI.clean(); } if (!xBetaKnown) { computeXBeta(); xBetaKnown = true; sufficientStatisticsKnown = false; } if (!sufficientStatisticsKnown) { computeRemainingStatistics(true, 0); // TODO Check index? sufficientStatisticsKnown = true; } resetBounds(); bool done = false; int iteration = 0; double lastObjFunc = 0.0; if (convergenceType < ZHANG_OLES) { lastObjFunc = getObjectiveFunction(convergenceType); } else { // ZHANG_OLES saveXBeta(); } while (!done) { // Do a complete cycle for(int index = 0; index < J; index++) { if (!fixBeta[index]) { double delta = ccdUpdateBeta(index); delta = applyBounds(delta, index); if (delta != 0.0) { sufficientStatisticsKnown = false; updateSufficientStatistics(delta, index); } } if ( (noiseLevel > QUIET) && ((index+1) % 100 == 0)) { std::ostringstream stream; stream << "Finished variable " << (index+1); logger->writeLine(stream); } } iteration++; // bool checkConvergence = (iteration % J == 0 || iteration == maxIterations); bool checkConvergence = true; // Check after each complete cycle if (checkConvergence) { double conv; bool illconditioned = false; if (convergenceType < ZHANG_OLES) { double thisObjFunc = getObjectiveFunction(convergenceType); if (thisObjFunc != thisObjFunc) { std::ostringstream stream; stream << "\nWarning: problem is ill-conditioned for this choice of\n" << "\t prior (" << jointPrior->getDescription() << ") or\n" << "\t initial bounding box (" << initialBound << ")\n" << "Enforcing convergence!"; logger->writeLine(stream); conv = 0.0; illconditioned = true; } else { conv = computeConvergenceCriterion(thisObjFunc, lastObjFunc); } lastObjFunc = thisObjFunc; } else { // ZHANG_OLES conv = computeZhangOlesConvergenceCriterion(); saveXBeta(); } // Necessary to call getObjFxn or computeZO before getLogLikelihood, // since these copy over XBeta double thisLogLikelihood = getLogLikelihood(); double thisLogPrior = getLogPrior(); double thisLogPost = thisLogLikelihood + thisLogPrior; std::ostringstream stream; if (noiseLevel > QUIET) { stream << "\n"; printVector(&hBeta[0], J, stream); stream << "\n"; stream << "log post: " << thisLogPost << " (" << thisLogLikelihood << " + " << thisLogPrior << ") (iter:" << iteration << ") "; } if (epsilon > 0 && conv < epsilon) { if (illconditioned) { lastReturnFlag = ILLCONDITIONED; } else { if (noiseLevel > SILENT) { stream << "Reached convergence criterion"; } lastReturnFlag = SUCCESS; } done = true; } else if (iteration == maxIterations) { if (noiseLevel > SILENT) { stream << "Reached maximum iterations"; } done = true; lastReturnFlag = MAX_ITERATIONS; } if (noiseLevel > QUIET) { logger->writeLine(stream); } logger->yield(); } } lastIterationCount = iteration; updateCount += 1; modelSpecifics.printTiming(); fisherInformationKnown = false; varianceKnown = false; }