close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 14 years ago

#1026 new task

API para COIN-R NLPAPI

Reported by: Víctor de Buen Remiro Owned by: Víctor de Buen Remiro
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);

Change History (0)

Note: See TracTickets for help on using tickets.