Ticket #1026 (new task)

Opened 7 years ago

API para COIN-R NLPAPI

Reported by: vdebuen Owned by: vdebuen
Priority: normal Milestone: Numerical methods
Component: Math Version:
Severity: normal Keywords:
Cc:

Description

Hay que estudiar la posibilidad de crear una API TOL para el paquete de programación no lineal NLPAPI que es una interfaz C para el sistema fortran LANCELOT, perteneciente a la comunidad de software abierto COIN-OR, una especie de club abierto de programadores con un repositorio de paquetes escrito y comprobado por los miembros.

No he encontrado ninguna documentación sobre los algoritmos matemáticos que hay por debajo, sólo te remiten a un libro que hay que comprar, no es gratis. De hecho LANCELOT no es open-source, es libre para uso académico pero no para uso comercial. Sin embargo, no es necesario instalar LANCELOT para usar NLPAPI así que la situación legal no está nada clara pues NLPAPI sí es open source. Es algo que habría que comprobar antes de nada.

Contiene, entre otras, una forma de definir problemas mediante texto que podría ser relativamente sencilla de exportar a TOL. A partir de la guía del usuario he reconstruido un código de ejemplo en C que ilustra como usarlo de este modo

NLProblem P;
int v[3];
P=NLCreateProblem("HS65",3);

NLPSetVariableName(P,0,"X1");
NLPSetSimpleBounds(P,0,-4.5,4.5);
NLPSetVariableName(P,1,"X2");
NLPSetSimpleBounds(P,1,-4.5,4.5);
NLPSetVariableName(P,2,"X3");
NLPSetSimpleBounds(P,2,-5.,5.);

v[0]=0;v[1]=1;v[2]=2;
NLPSetObjectiveByString(P,"Obj",3,v,
"[x1,x2,x3]","(x1-x2)**2+(x1+x2-10)**2/9+(x3-5)**2");

v[0]=0;v[1]=1;v[2]=2;
NLPAddInequalityConstraintByString(P,"RI1",0.,1.e40,3,v,
"[x1,x2,x3]","48-x1**2-x2**2-x3**2");

NLPAddEqualityConstraintByString(P,"RE1",nv,v,
"[x1,x2,x3]",
"48-x1**2-x2**2-x3**2");


Lan=NLCreateLancelot();
x0[0]=-5.;
x0[1]=5.;
x0[2]=0.;
rc=LNMinimize(Lan,P,x0,(double*)NULL,x);

printf("There were %d errors\n",NLGetNErrors());
if(NLError())
{
  for(i=0;i<NLGetNErrors();i++)
  {
    printf(" %d line %d, file %s, Sev: %d\n",i,
    NLGetErrorLine(i),NLGetErrorFile(i),NLGetErrorSev(i));
    printf(" Routine: \"%s\"\n",NLGetErrorRoutine(i));
    printf(" Msg: \"%s\"\n",NLGetErrorMsg(i));
  }
}

NLClearErrors();
NLFreeLancelot(Lan);
NLFreeProblem(P);
return(0);

Note: See TracTickets for help on using tickets.