Opened 10 years ago
Closed 9 years ago
#1850 closed defect (fixed)
Uso de R-nomad desde TOL
Reported by: | Víctor de Buen Remiro | Owned by: | Pedro Gea |
---|---|---|---|
Priority: | normal | Milestone: | Mantainance |
Component: | R API | Version: | head |
Severity: | normal | Keywords: | |
Cc: |
Description
En https://www.dropbox.com/sh/gs0diwn3pthysrz/AAChNpPpZ71Z8RlC86zsQTmma?dl=0 he dejado un ejemplo de llamada a la librería de optimización NOMAD a través de R. Se trata de un ejemplo trivial de una regresión lineal que me sirve para evaluar la librería y aprender a usarla.
evaluator.tol : Evaluación de la función objetivo a minimizar optimice.R : Llama a la librería NOMAD para optimizar una función TOL run.tol : Ejecuta todo el programa desde TOL llamando a evaluator.tol y optimice.R run.R : Ejecuta todo el programa desde R llamando a evaluator.tol y optimice.R (Hay que cambiar el setwd!)
Si ejecuto desde R (run.R) funciona perfectamente pero cuando ejecuto desde TOL (run.tol) me está dando este error que soy incapaz de interpretar y que me impide seguir con la evaluación.
ERROR: [1] Exception caught: Error evaluating: assign("anything.0.1917802977841348", {library(tolLink) library(crs) numVar <- tolGet('n') x0 <- tolGet('x0') y0 = tolExecute('F::eval',x0, grammar='Real') eval.f <- function ( x ) { f = tolExecute('F::eval',matrix(x, nrow=numVar, ncol=1), grammar='Real') return ( as.double(f) ); } bbin <- rep(0,numVar) bbout <-c(0, 2, 1) lb <- rep(-2.0,numVar) ub <- rep(+2.0,numVar) opts <-list('MAX_BB_EVAL'=1000, 'MIN_MESH_SIZE'=0.00001, 'INITIAL_MESH_SIZE'=0.1, 'MIN_POLL_SIZE'=0.0001) result=snomadr(eval.f=eval.f,n=numVar, x0=x0, bbin=bbin, bbout=bbout, lb=lb, ub=ub, opts=opts) result[['solution']] }, envir=tolRI) 0 [Call stack] [2] Anything TolRInside::API::_.RGetAnything (Text expression) [1] Anything TolRInside::API::REval (Text expression)
Change History (5)
comment:1 Changed 10 years ago by
comment:2 follow-up: 4 Changed 10 years ago by
El fallo se debe a que hay errores en las líneas compiladas en R.
Yo obtuve ese error cuando aún no tenía instalado "crs", pero en tu caso puede tratarse de otra cosa.
Después de instalar "crs" me funciona correctamente.
Lo más recomendable es ejecutar línea a línea el código para localizar cuál es la línea que da el problema, ya que aún no tenemos un mecanismo por el que comunicar cómodamente los errores de un programa a otro.
Por ejemplo:
Set lines = Tokenizer(ReadFile("optimice.R"), "\n"); Set For(1, Card(lines), Anything (Real i) { If(i==Card(lines), TolRInside::API::REval(lines[i]), TolRInside::API::RCall(lines[i]) ) });
comment:3 Changed 10 years ago by
Me doy cuenta de que en el archivo "optimize.R" hay sentencias R de más de una linea, de manera que la manera de ejecutar el ejemplo anterior no valdría, salvo que se reescribiera el .R a sentencia por línea.
Pero la idea sigue siendo la misma. Ejecutar paso a paso para localizar el error.
comment:4 Changed 10 years ago by
Replying to pgea:
El fallo se debe a que hay errores en las líneas compiladas en R.
Si lo corro desde R no me problemas así que no veo qué puede estar mal en R.
Yo obtuve ese error cuando aún no tenía instalado "crs", pero en tu caso puede tratarse de otra cosa.
Después de instalar "crs" me funciona correctamente.
Yo lo tenía todo instalado desde el principio, la prueba es que con el run.R me funciona todo.
Lo más recomendable es ejecutar línea a línea el código para localizar cuál es la línea que da el problema, ya que aún no tenemos un mecanismo por el que comunicar cómodamente los errores de un programa a otro.
Por ejemplo:
Set lines = Tokenizer(ReadFile("optimice.R"), "\n"); Set For(1, Card(lines), Anything (Real i) { If(i==Card(lines), TolRInside::API::REval(lines[i]), TolRInside::API::RCall(lines[i]) ) });
He cambiado el fichero run.tol para que llame línea por línea
#Require TolRInside; Set Include("evaluator.tol"); //Set solution = TolRInside::API::REval(ReadFile("optimice.R")); Real TolRInside::API::RCall(" library(tolLink) "); Real TolRInside::API::RCall(" library(crs) "); Real TolRInside::API::RCall(" numVar <- tolGet('n') "); Real TolRInside::API::RCall(" x0 <- tolGet('x0') "); Real TolRInside::API::RCall(" y0 = tolExecute('F::eval',x0, grammar='Real') "); Real TolRInside::API::RCall(" eval.f <- function ( x ) { f = tolExecute('F::eval',matrix(x, nrow=numVar, ncol=1), grammar='Real') return ( as.double(f) ); } "); Real TolRInside::API::RCall(" bbin <- rep(0,numVar) "); Real TolRInside::API::RCall(" bbout <-c(0, 2, 1) "); Real TolRInside::API::RCall(" lb <- rep(-2.0,numVar) "); Real TolRInside::API::RCall(" ub <- rep(+2.0,numVar) "); Real TolRInside::API::RCall(" opts <-list('MAX_BB_EVAL'=1000, 'MIN_MESH_SIZE'=0.00001, 'INITIAL_MESH_SIZE'=0.1, 'MIN_POLL_SIZE'=0.0001) "); Real TolRInside::API::RCall(" result=snomadr(eval.f=eval.f,n=numVar, x0=x0, bbin=bbin, bbout=bbout, lb=lb, ub=ub, opts=opts) "); Set solution = TolRInside::API::REval(" result[['solution']] ");
Ahora me da error en todas excepto curiosamente en la que carga el crs
ERROR: [1] Exception caught: Error evaluating: library(tolLink) 1 [Call stack] [1] Real TolRInside::API::RCall (Text expression) ERROR: [2] Exception caught: Error evaluating: numVar <- tolGet('n') 1 [Call stack] [1] Real TolRInside::API::RCall (Text expression) ERROR: [3] Exception caught: Error evaluating: x0 <- tolGet('x0') 1 [Call stack] [1] Real TolRInside::API::RCall (Text expression) ERROR: [4] Exception caught: Error evaluating: y0 = tolExecute('F::eval',x0, grammar='Real') 1 [Call stack] [1] Real TolRInside::API::RCall (Text expression) ERROR: [5] Exception caught: Error evaluating: bbin <- rep(0,numVar) 1 [Call stack] [1] Real TolRInside::API::RCall (Text expression) ERROR: [6] Exception caught: Error evaluating: lb <- rep(-2.0,numVar) 1 [Call stack] [1] Real TolRInside::API::RCall (Text expression) ERROR: [7] Exception caught: Error evaluating: ub <- rep(+2.0,numVar) 1 [Call stack] [1] Real TolRInside::API::RCall (Text expression) ERROR: [8] Exception caught: Error evaluating: result=snomadr(eval.f=eval.f,n=numVar, x0=x0, bbin=bbin, bbout=bbout, lb=lb, ub=ub, opts=opts) 1 [Call stack] [1] Real TolRInside::API::RCall (Text expression) ERROR: [9] Exception caught: Error evaluating: assign("anything.0.02420399244874716", { result[['solution']] }, envir=tolRI) 0 [Call stack] [2] Anything TolRInside::API::_.RGetAnything (Text expression) [1] Anything TolRInside::API::REval (Text expression)
comment:5 Changed 9 years ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
Creo que ya se ha localizado la fuente de error.
Algunas librerías de R necesitan acceder al bin de R de manera natural. Al usar R desde TOL y si este directorio no está en la variable PATH (o corresponde a otra versión) no se hace correctamente.
Se corrige esto en la carga de TolRInside: Véase [6833].
Extraído desde #1812#98.