double RateGammaInvar::optimizeParameters(double gradient_epsilon) { int ndim = getNDim(); // return if nothing to be optimized if (ndim == 0) return phylo_tree->computeLikelihood(); if (verbose_mode >= VB_MED) cout << "Optimizing " << name << " model parameters by " << optimize_alg << " algorithm..." << endl; if (optimize_alg.find("EM_RR") != string::npos) { return randomRestartOptimization(gradient_epsilon); } else if (optimize_alg.find("Brent") != string::npos || phylo_tree->aln->frac_const_sites == 0.0 || isFixPInvar() || isFixGammaShape()) { double lh = phylo_tree->computeLikelihood(); cur_optimize = 0; double gamma_lh = RateGamma::optimizeParameters(gradient_epsilon); ASSERT(gamma_lh >= lh-0.1); cur_optimize = 1; double invar_lh = -DBL_MAX; invar_lh = RateInvar::optimizeParameters(gradient_epsilon); ASSERT(invar_lh >= gamma_lh-0.1); cur_optimize = 0; return invar_lh; } else if (optimize_alg.find("EM") != string::npos) { return optimizeWithEM(gradient_epsilon); } else if (optimize_alg.find("BFGS") != string::npos) { //if (freq_type == FREQ_ESTIMATE) scaleStateFreq(false); double *variables = new double[ndim+1]; double *upper_bound = new double[ndim+1]; double *lower_bound = new double[ndim+1]; bool *bound_check = new bool[ndim+1]; double score; // by BFGS algorithm setVariables(variables); setBounds(lower_bound, upper_bound, bound_check); score = -minimizeMultiDimen(variables, ndim, lower_bound, upper_bound, bound_check, max(gradient_epsilon, TOL_GAMMA_SHAPE)); getVariables(variables); phylo_tree->clearAllPartialLH(); score = phylo_tree->computeLikelihood(); delete [] bound_check; delete [] lower_bound; delete [] upper_bound; delete [] variables; return score; } else { string errMsg = "Unknown optimization algorithm: " + optimize_alg; outError(errMsg.c_str()); return 0.0; } }
double NGSRateCat::optimizeParameters(double epsilon) { int ndim = getNDim(); // return if nothing to be optimized if (ndim == 0) return 0.0; cout << "Optimizing " << name << " model parameters..." << endl; double *variables = new double[ndim+1]; double *upper_bound = new double[ndim+1]; double *lower_bound = new double[ndim+1]; bool *bound_check = new bool[ndim+1]; int i; double score; // by BFGS algorithm setVariables(variables); for (i = 1; i <= ndim; i++) { //cout << variables[i] << endl; lower_bound[i] = 1e-4; upper_bound[i] = 100.0; bound_check[i] = false; } for (i = ndim-ncategory+2; i <= ndim; i++) upper_bound[i] = 1.0; //packData(variables, lower_bound, upper_bound, bound_check); score = -minimizeMultiDimen(variables, ndim, lower_bound, upper_bound, bound_check, max(epsilon, 1e-6)); getVariables(variables); delete [] bound_check; delete [] lower_bound; delete [] upper_bound; delete [] variables; return score; }
/** optimize parameters. Default is to optimize gamma shape @return the best likelihood */ double RateFree::optimizeParameters(double gradient_epsilon) { int ndim = getNDim(); // return if nothing to be optimized if (ndim == 0) return phylo_tree->computeLikelihood(); if (verbose_mode >= VB_MED) cout << "Optimizing " << name << " model parameters by " << optimize_alg << " algorithm..." << endl; // TODO: turn off EM algorithm for +ASC model if ((optimize_alg.find("EM") != string::npos && phylo_tree->getModelFactory()->unobserved_ptns.empty())) if (fix_params == 0) return optimizeWithEM(); //if (freq_type == FREQ_ESTIMATE) scaleStateFreq(false); double *variables = new double[ndim+1]; double *upper_bound = new double[ndim+1]; double *lower_bound = new double[ndim+1]; bool *bound_check = new bool[ndim+1]; double score; // score = optimizeWeights(); int left = 1, right = 2; if (fix_params == 1) // fix proportions right = 1; if (optimize_alg.find("1-BFGS") != string::npos) { left = 0; right = 0; } // changed to Wi -> Ri by Thomas on Sept 11, 15 for (optimizing_params = right; optimizing_params >= left; optimizing_params--) { ndim = getNDim(); // by BFGS algorithm setVariables(variables); setBounds(lower_bound, upper_bound, bound_check); // if (optimizing_params == 2 && optimize_alg.find("-EM") != string::npos) // score = optimizeWeights(); // else if (optimize_alg.find("BFGS-B") != string::npos) score = -L_BFGS_B(ndim, variables+1, lower_bound+1, upper_bound+1, max(gradient_epsilon, TOL_FREE_RATE)); else score = -minimizeMultiDimen(variables, ndim, lower_bound, upper_bound, bound_check, max(gradient_epsilon, TOL_FREE_RATE)); getVariables(variables); // sort the rates in increasing order if (sorted_rates) quicksort(rates, 0, ncategory-1, prop); phylo_tree->clearAllPartialLH(); score = phylo_tree->computeLikelihood(); } optimizing_params = 0; delete [] bound_check; delete [] lower_bound; delete [] upper_bound; delete [] variables; return score; }