chokkan / liblbfgs

libLBFGS: a library of Limited-memory Broyden-Fletcher-Goldfarb-Shanno (L-BFGS)
http://www.chokkan.org/software/liblbfgs/
MIT License
559 stars 193 forks source link

Code contribution #5

Open normvcr opened 11 years ago

normvcr commented 11 years ago

Here are two routines for the LBFGS project, to be incorporated as seen fit by the project maintainers.

-- Converts LBFGS error codes to short strings. -- Pretty-prints the LBFGS parameters

//*** // Copyright 2013 Norman J. Goldstein // // License: // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this program. If not, see // http://www.gnu.org/licenses/. // // Author: Norman J. Goldstein (ngoldstein@SystemSolutionsRD.com, // normvcr@telus.net)

include "MthConfigLBFGS.h"

include

const char* LBFGS_ERR_str( int val ) { switch( val ) { case LBFGS_CONVERGENCE: { return "CONVERGENCE"; }

case LBFGS_STOP:
{
  return "STOP";
}

case LBFGS_ALREADY_MINIMIZED:
{
  return "ALREADY_MINIMIZED";
}

case LBFGSERR_UNKNOWNERROR:
{
  return "UNKNOWNERROR";
}

case LBFGSERR_LOGICERROR:
{
  return "LOGICERROR";
}

case LBFGSERR_OUTOFMEMORY:
{
  return "OUTOFMEMORY";
}

case LBFGSERR_CANCELED:
{
  return "CANCELED";
}

case LBFGSERR_INVALID_N:
{
  return "INVALID_N";
}

case LBFGSERR_INVALID_N_SSE:
{
  return "INVALID_N_SSE";
}

case LBFGSERR_INVALID_X_SSE:
{
  return "INVALID_X_SSE";
}

case LBFGSERR_INVALID_EPSILON:
{
  return "INVALID_EPSILON";
}

case LBFGSERR_INVALID_TESTPERIOD:
{
  return "INVALID_TESTPERIOD";
}

case LBFGSERR_INVALID_DELTA:
{
  return "INVALID_DELTA";
}

case LBFGSERR_INVALID_LINESEARCH:
{
  return "INVALID_LINESEARCH";
}

case LBFGSERR_INVALID_MINSTEP:
{
  return "INVALID_MINSTEP";
}

case LBFGSERR_INVALID_MAXSTEP:
{
  return "INVALID_MAXSTEP";
}

case LBFGSERR_INVALID_FTOL:
{
  return "INVALID_FTOL";
}

case LBFGSERR_INVALID_WOLFE:
{
  return "INVALID_WOLFE";
}

case LBFGSERR_INVALID_GTOL:
{
  return "INVALID_GTOL";
}

case LBFGSERR_INVALID_XTOL:
{
  return "INVALID_XTOL";
}

case LBFGSERR_INVALID_MAXLINESEARCH:
{
  return "INVALID_MAXLINESEARCH";
}

case LBFGSERR_INVALID_ORTHANTWISE:
{
  return "INVALID_ORTHANTWISE";
}

case LBFGSERR_INVALID_ORTHANTWISE_START:
{
  return "INVALID_ORTHANTWISE_START";
}

case LBFGSERR_INVALID_ORTHANTWISE_END:
{
  return "INVALID_ORTHANTWISE_END";
}

case LBFGSERR_OUTOFINTERVAL:
{
  return "OUTOFINTERVAL";
}

case LBFGSERR_INCORRECT_TMINMAX:
{
  return "INCORRECT_TMINMAX";
}

case LBFGSERR_ROUNDING_ERROR:
{
  return "ROUNDING_ERROR";
}

case LBFGSERR_MINIMUMSTEP:
{
  return "MINIMUMSTEP";
}

case LBFGSERR_MAXIMUMSTEP:
{
  return "MAXIMUMSTEP";
}

case LBFGSERR_MAXIMUMLINESEARCH:
{
  return "MAXIMUMLINESEARCH";
}

case LBFGSERR_MAXIMUMITERATION:
{
  return "MAXIMUMITERATION";
}

case LBFGSERR_WIDTHTOOSMALL:
{
  return "WIDTHTOOSMALL";
}

case LBFGSERR_INVALIDPARAMETERS:
{
  return "INVALIDPARAMETERS";
}

case LBFGSERR_INCREASEGRADIENT:
{
  return "INCREASEGRADIENT";
}

default:
{
  return "Not a valid LBFGS error code";
}

} }

using namespace std;

ostream& operator<<( ostream& os, const lbfgs_parameter_t& params ) {

define POUT(v) os << #v << "= " << params.v << endl

POUT(m); POUT(epsilon); POUT(past); POUT(delta); POUT(max_iterations); POUT(linesearch); POUT(max_linesearch); POUT(min_step); POUT(max_step); POUT(ftol); POUT(wolfe); POUT(gtol); POUT(xtol); POUT(orthantwise_c); POUT(orthantwise_start); POUT(orthantwise_end);

undef POUT

return os; }// operator<<

cynthia commented 5 years ago

Sorry this took so long. The patch you have sent is somewhat challenging to use as it got formatted into markdown, which I can potentially work around but brings up a different issue:

It's GPLv3. The project is currently licensed as MIT, and landing a GPL dependency effectively taints it - so unless you intend to relicense with a more permissive license, I'm afraid landing this would be problematic.