Skip to content

Commit

Permalink
new CMASolutions::stds() function that returns current vector of stan…
Browse files Browse the repository at this point in the history
…dard deviations + removed approximation of deviations when using vdcma, ref #129
  • Loading branch information
Emmanuel Benazera committed Feb 25, 2015
1 parent c7e10cd commit 44e61b5
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 13 deletions.
18 changes: 17 additions & 1 deletion src/cmasolutions.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,22 @@ namespace libcmaes
{
return _sepcsqinv;
}

/**
* \returns standard deviation vector
* @return standard deviation vector
*/
template<class TGenoPheno=GenoPheno<NoBoundStrategy>>
inline dVec stds(const CMAParameters<TGenoPheno> &cmaparams) const
{
if (!cmaparams.is_sep() && !cmaparams.is_vd())
return cmaparams.get_gp().pheno(static_cast<dVec>(_cov.sqrt().diagonal()));
else if (cmaparams.is_sep())
return cmaparams.get_gp().pheno(static_cast<dVec>(_sepcov.cwiseSqrt()));
else if (cmaparams.is_vd())
return cmaparams.get_gp().pheno(static_cast<dVec>((dVec::Constant(cmaparams.dim(),1.0)+_v.cwiseProduct(_v)).cwiseSqrt().cwiseProduct(_sepcov)));
return dVec(); // should never reach here.
}

/**
* \brief returns current value of step-size sigma
Expand Down Expand Up @@ -420,7 +436,7 @@ namespace libcmaes
template <class TGenoPheno=GenoPheno<NoBoundStrategy>>
std::ostream& print(std::ostream &out,
const int &verb_level=0,
const TGenoPheno &gp=GenoPheno<NoBoundStrategy>()) const;
const TGenoPheno &gp=TGenoPheno()) const;

private:
dMat _cov; /**< covariance matrix. */
Expand Down
14 changes: 2 additions & 12 deletions src/cmastrategy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,7 @@ namespace libcmaes
if (!cmasols.eigenvalues().size())
fplotstream << dVec::Zero(cmaparams.dim()).transpose() << sep;
else fplotstream << cmasols.eigenvalues().transpose() << sep;
if (!cmaparams.is_sep() && !cmaparams.is_vd())
fplotstream << cmaparams.get_gp().pheno((dVec)cmasols.cov().sqrt().diagonal()).transpose() << sep; // max deviation in all main axes
else if (cmaparams.is_sep())
fplotstream << cmaparams.get_gp().pheno((dVec)cmasols.sepcov().cwiseSqrt()).transpose() << sep;
else if (cmaparams.is_vd())
fplotstream << cmaparams.get_gp().pheno(cmasols.sepcov()).transpose() << sep; // C = D(I+vv')D, and we print out D^2 as an approx
fplotstream << cmasols.stds(cmaparams).transpose() << sep;
fplotstream << cmaparams.get_gp().pheno(cmasols.xmean()).transpose();
fplotstream << sep << cmasols.elapsed_last_iter();
#ifdef HAVE_DEBUG
Expand All @@ -83,12 +78,7 @@ namespace libcmaes
if (!cmasols.eigenvalues().size())
fplotstream << dVec::Zero(cmaparams.dim()).transpose() << sep;
else fplotstream << cmasols.eigenvalues().transpose() << sep;
if (!cmaparams.is_sep() && !cmaparams.is_vd())
fplotstream << cmaparams.get_gp().pheno((dVec)cmasols.cov().sqrt().diagonal()).transpose() << sep; // max deviation in all main axes
else if (cmaparams.is_sep())
fplotstream << cmaparams.get_gp().pheno((dVec)cmasols.sepcov().cwiseSqrt()).transpose() << sep;
else if (cmaparams.is_vd())
fplotstream << cmaparams.get_gp().pheno(cmasols.sepcov()).transpose() << sep; // C = D(I+vv')D, and we print out D^2 as an approx
fplotstream << cmasols.stds(cmaparams).transpose() << sep;
fplotstream << cmaparams.get_gp().pheno(cmasols.xmean()).transpose();
fplotstream << sep << cmasols.elapsed_last_iter();
#ifdef HAVE_DEBUG
Expand Down

0 comments on commit 44e61b5

Please sign in to comment.