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 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 Pedro Gea

Extraído desde #1812#98.

comment:2 Changed 10 years ago by Pedro Gea

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 Pedro Gea

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 in reply to:  2 Changed 10 years ago by Víctor de Buen Remiro

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 Pedro Gea

Resolution: fixed
Status: newclosed

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].

Note: See TracTickets for help on using tickets.