double getSecondOrderDerivative(const string & variable1, const string & variable2) const throw (Exception) { return 0; }
double DRHomogeneousTreeLikelihood::getSecondOrderDerivative(const string & variable) const throw (Exception) { Parameter * p = _parameters.getParameter(variable); if(p == NULL) throw ParameterNotFoundException("HomogeneousTreeLikelihood::df", variable); if(getRateDistributionParameters().getParameter(variable) != NULL) { cout << "DEBUB: WARNING!!! Derivatives respective to rate distribution parameter are not implemented." << endl; return log(-1.); } if(getSubstitutionModelParameters().getParameter(variable) != NULL) { cout << "DEBUB: WARNING!!! Derivatives respective to substitution model parameters are not implemented." << endl; return log(-1.); }       int brI = TextTools::toInt(variable.substr(5)); Node * branch = _nodes[brI]; Vdouble * _dLikelihoods_branch = & _likelihoodData.getDLikelihoodArray(branch); Vdouble * _d2Likelihoods_branch = & _likelihoodData.getD2LikelihoodArray(branch); double d2 = 0;  for(unsigned int i = 0; i < _nbDistinctSites; i++) d2 += _likelihoodData._rootWeights[i] * ((* _d2Likelihoods_branch)[i] - pow((* _dLikelihoods_branch)[i], 2)); return -d2; }
		double getSecondOrderDerivative(const string & variable1, const string & variable2) const throw (Exception) { return 0; } // Not implemented for now.