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);