double PartitionModel::optimizeLinkedAlpha(bool write_info, double gradient_epsilon) { if (write_info) cout << "Optimizing linked gamma shape..." << endl; double negative_lh; double current_shape = linked_alpha; double ferror, optx; optx = minimizeOneDimen(MIN_GAMMA_SHAPE, current_shape, MAX_GAMMA_SHAPE, max(gradient_epsilon, TOL_GAMMA_SHAPE), &negative_lh, &ferror); if (write_info) cout << "Linked alpha across partitions: " << linked_alpha << endl; return site_rate->getTree()->computeLikelihood(); }
double RateGamma::optimizeParameters(double gradient_epsilon) { if (fix_gamma_shape) return phylo_tree->computeLikelihood(); if (verbose_mode >= VB_MAX) cout << "Optimizing gamma shape..." << endl; double negative_lh; double current_shape = gamma_shape; double ferror, optx; optx = minimizeOneDimen(phylo_tree->params->min_gamma_shape, current_shape, MAX_GAMMA_SHAPE, max(gradient_epsilon, TOL_GAMMA_SHAPE), &negative_lh, &ferror); // gamma_shape = optx; // computeRates(); // phylo_tree->clearAllPartialLH(); // return -negative_lh; return -computeFunction(optx); }
double RateInvar::optimizeParameters(double gradient_epsilon) { if (phylo_tree->aln->frac_const_sites == 0.0) return -computeFunction(0.0); if (fix_p_invar || !optimize_p_invar) return -computeFunction(p_invar); if (verbose_mode >= VB_MAX) cout << "Optimizing proportion of invariable sites..." << endl; double negative_lh; double ferror; p_invar = minimizeOneDimen(MIN_PINVAR, p_invar, min(phylo_tree->aln->frac_const_sites, 1.0-MIN_PINVAR), max(gradient_epsilon, TOL_PINVAR), &negative_lh, &ferror); //p_invar = minimizeOneDimen(MIN_PINVAR, p_invar, 1.0 - MIN_PINVAR, TOL_PINVAR, &negative_lh, &ferror); // phylo_tree->clearAllPartialLH(); // phylo_tree->computePtnInvar(); // return -negative_lh; return -computeFunction(p_invar); }
double RateMeyerDiscrete::optimizeCatRate(int cat) { optimizing_cat = cat; double negative_lh; double current_rate = rates[cat]; double ferror, optx; if (!rate_mh) { IntVector ptn_id; for (int i = 0; i < size(); i++) if (ptn_cat[i] == optimizing_cat) ptn_id.push_back(i); prepareRateML(ptn_id); } if (phylo_tree->optimize_by_newton && rate_mh) // Newton-Raphson method { optx = minimizeNewtonSafeMode(MIN_SITE_RATE, current_rate, MAX_SITE_RATE, TOL_SITE_RATE, negative_lh); } else { optx = minimizeOneDimen(MIN_SITE_RATE, current_rate, MAX_SITE_RATE, TOL_SITE_RATE, &negative_lh, &ferror); double fnew; if ((optx < MAX_SITE_RATE) && (fnew = computeFunction(MAX_SITE_RATE)) <= negative_lh+TOL_SITE_RATE) { optx = MAX_SITE_RATE; negative_lh = fnew; } if ((optx > MIN_SITE_RATE) && (fnew = computeFunction(MIN_SITE_RATE)) <= negative_lh+TOL_SITE_RATE) { optx = MIN_SITE_RATE; negative_lh = fnew; } } //negative_lh = brent(MIN_SITE_RATE, current_rate, max_rate, 1e-3, &optx); if (optx > MAX_SITE_RATE*0.99) optx = MAX_SITE_RATE; if (optx < MIN_SITE_RATE*2) optx = MIN_SITE_RATE; rates[cat] = optx; //#ifndef NDEBUG //#endif if (!rate_mh) completeRateML(); return optx; }
double RateMeyerHaeseler::optimizeRate(int pattern) { optimizing_pattern = pattern; double max_rate = MAX_SITE_RATE; double minf = INFINITY, minx = 0; double negative_lh; double current_rate = at(pattern); double ferror, optx; /* constant site alway have ZERO rates */ if (phylo_tree->aln->at(pattern).is_const) { return (at(pattern) = MIN_SITE_RATE); } if (!rate_mh) { IntVector ptn_id; ptn_id.push_back(optimizing_pattern); prepareRateML(ptn_id); } if (phylo_tree->optimize_by_newton && rate_mh) // Newton-Raphson method { optx = minimizeNewtonSafeMode(MIN_SITE_RATE, current_rate, max_rate, TOL_SITE_RATE, negative_lh); if (optx > MAX_SITE_RATE*0.99 || (optx < MIN_SITE_RATE*2 && !phylo_tree->aln->at(pattern).is_const)) { double optx2, negative_lh2; optx2 = minimizeOneDimen(MIN_SITE_RATE, current_rate, max_rate, TOL_SITE_RATE, &negative_lh2, &ferror); if (negative_lh2 < negative_lh - 1e-4) { cout << "+++NEWTON IS WRONG for pattern " << pattern << ": " << optx2 << " " << negative_lh2 << " (Newton: " << optx << " " << negative_lh <<")" << endl; } if (negative_lh < negative_lh2 - 1e-4 && verbose_mode >= VB_MED) { cout << "Brent is wrong for pattern " << pattern << ": " << optx2 << " " << negative_lh2 << " (Newton: " << optx << " " << negative_lh <<")" << endl; } } } else { optx = minimizeOneDimen(MIN_SITE_RATE, current_rate, max_rate, TOL_SITE_RATE, &negative_lh, &ferror); double fnew; if ((optx < max_rate) && (fnew = computeFunction(max_rate)) <= negative_lh+TOL_SITE_RATE) { optx = max_rate; negative_lh = fnew; } if ((optx > MIN_SITE_RATE) && (fnew = computeFunction(MIN_SITE_RATE)) <= negative_lh+TOL_SITE_RATE) { optx = MIN_SITE_RATE; negative_lh = fnew; } } //negative_lh = brent(MIN_SITE_RATE, current_rate, max_rate, 1e-3, &optx); if (optx > max_rate*0.99) optx = MAX_SITE_RATE; if (optx < MIN_SITE_RATE*2) optx = MIN_SITE_RATE; at(pattern) = optx; if (!rate_mh) { completeRateML(); return optx; } //#ifndef NDEBUG if (optx == MAX_SITE_RATE || (optx == MIN_SITE_RATE && !phylo_tree->aln->at(pattern).is_const)) { ofstream out; if (verbose_mode >= VB_MED) { cout << "Checking pattern " << pattern << " (" << current_rate << ", " << optx << ")" << endl; out.open("x", ios::app); out << pattern; } for (double val=0.1; val <= 100; val += 0.1) { double f = computeFunction(val); if (verbose_mode >= VB_MED) out << " " << f; if (f < minf) { minf = f; minx = val; } if (verbose_mode < VB_MED && minf < negative_lh) break; } if (verbose_mode >= VB_MED) { out << endl; out.close(); } //cout << "minx: " << minx << " " << minf << endl; if (negative_lh > minf+1e-3) { optx = minimizeOneDimen(MIN_SITE_RATE, minx, max_rate, 1e-3, &negative_lh, &ferror); at(pattern) = optx; if (verbose_mode >= VB_MED) cout << "FIX rate: " << minx << " , " << optx << endl; } } //#endif return optx; }