void estimate_tree(const alignment& A, SequenceTree& T, substitution::MultiModel& smodel, const vector<int>& parameters) { //------- Estimate branch lengths -------------// log_branch_likelihood score2(A,smodel,T,parameters); // Initialize starting point optimize::Vector start(0.1, T.n_branches() + parameters.size()); for(int b=0;b<T.n_branches();b++) start[b] = log(T.branch(b).length()); for(int i=0;i<parameters.size();i++) start[i+T.n_branches()] = smodel.get_parameter_value_as<Double>( parameters[i] ); // optimize::Vector end = search_gradient(start,score); // optimize::Vector end = search_basis(start,score); optimize::Vector end = search_gradient(start,score2,1e-3); for(int b=0;b<T.n_branches();b++) T.branch(b).set_length(exp(end[b])); for(int i=0;i<parameters.size();i++) smodel.set_parameter_value(parameters[i], end[i+T.n_branches()]); smodel.set_rate(1); }