Logo ROOT   6.10/09
Reference Guide
GlobalMinimization.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_r
3 /// \notebook -nodraw
4 /// Example based in
5 /// http://cran.r-project.org/web/packages/DEoptim/DEoptim.pdf
6 /// Please install the R package DEoptim before run this example.
7 ///
8 /// \macro_code
9 ///
10 /// \author Omar Zapata
11 
12 #include<TRInterface.h>
13 #include<TBenchmark.h>
14 #include<math.h>
15 #include<stdlib.h>
16 
17 // In the next function the *double pointer should be changed by a TVectorD datatype,
18 // because the pointer has no meaning in R's enviroment.
19 // This is a generalization of the RosenBrock function, with the min xi=1 and i>0.
20 Double_t GenRosenBrock(const TVectorD xx )
21 {
22  int length=xx.GetNoElements();
23 
24  Double_t result=0;
25  for (int i=0;i<(length-1);i++) {
26  result+=pow(1-xx[i],2)+100*pow(xx[i+1]-pow(xx[i],2),2);
27  }
28  return result;
29 }
30 
31 //the min xi=0 i>0
32 Double_t Rastrigin(const TVectorD xx)
33 {
34  int length=xx.GetNoElements();
35  Double_t result=10*length;
36  for (int i=0;i<length;i++) {
37  result+=xx[i]*xx[i]-10*cos(6.2831853*xx[i]);
38  }
39  return result;
40 }
41 
42 void GlobalMinimization()
43 {
44  TBenchmark bench;
46 
47  Bool_t installed=r.Eval("is.element('DEoptim', installed.packages()[,1])");
48  if (!installed) {
49  std::cout<<"Package DEoptim no installed in R"<<std::endl;
50  std::cout<<"Run install.packages('DEoptim') in R's environment"<<std::endl;
51  return;
52  }
53 
54  //loading DEoptim
55  r<<"suppressMessages(library(DEoptim, quietly = TRUE))";
56 
57  // passing RosenBrock function to R
58  r["GenRosenBrock"]<<ROOT::R::TRFunctionExport(GenRosenBrock);
59 
60  // maximun number of iterations
61  r["MaxIter"]<<5000;
62  // n = size of vector that is an argument for GenRosenBrock
63  r["n"]<<3;
64 
65  // lower limits
66  r<<"ll<-rep(-25, n)";
67  //upper limits
68  r<<"ul<-rep(25, n)";
69 
70  bench.Start("GlobalMinimizationRosenBrock");
71  // calling minimization and timing it.
72  r<<"result1<-DEoptim(fn=GenRosenBrock,lower=ll,upper=ul,control=list(NP=10*n,itermax=MaxIter,trace=FALSE))";
73  std::cout<<"-----------------------------------------"<<std::endl;
74  std::cout<<"RosenBrock's minimum in: "<<std::endl;
75  r<<"print(result1$optim$bestmem)";
76  std::cout<<"Bechmark Times"<<std::endl;
77  // printing times
78  bench.Show("GlobalMinimizationRosenBrock");
79 
80  // passing RosenBrock function to R
81  r["Rastrigin"]<<ROOT::R::TRFunctionExport(Rastrigin);
82  // maximun number of iterations
83  r["MaxIter"]<<2000;
84  // n = size of a vector which is an argument for Rastrigin
85  r["n"]<<3;
86  // lower limits
87  r<<"ll<-rep(-5, n)";
88  // upper limits
89  r<<"ul<-rep(5, n)";
90 
91  bench.Start("GlobalMinimizationRastrigin");
92  // calling minimization and timing it.
93  r<<"result2<-DEoptim(fn=Rastrigin,lower=ll,upper=ul,control=list(NP=10*n,itermax=MaxIter,trace=FALSE))";
94  std::cout<<"-----------------------------------------"<<std::endl;
95  std::cout<<"Rastrigin's minimum in: "<<std::endl;
96  r<<"print(result2$optim$bestmem)";
97  std::cout<<"Bechmark Times"<<std::endl;
98  // printing times
99  bench.Show("GlobalMinimizationRastrigin");
100  // skip R plotting in batch mode
101  if (!gROOT->IsBatch()) {
102  r<<"dev.new(title='RosenBrock Convergence')";
103  r<<"plot(result1,type='o',pch='.')";
104  r<<"dev.off()";
105  r<<"dev.new(title='Rastrigin Convergence')";
106  r<<"plot(result2,type='o',pch='.')";
107  r<<"dev.off()";
108  }
109 }
TVectorT.
Definition: TMatrixTBase.h:77
#define gROOT
Definition: TROOT.h:375
virtual void Show(const char *name)
Stops Benchmark name and Prints results.
Definition: TBenchmark.cxx:157
bool Bool_t
Definition: RtypesCore.h:59
double cos(double)
virtual void Start(const char *name)
Starts Benchmark with the specified name.
Definition: TBenchmark.cxx:174
double pow(double, double)
TRandom2 r(17)
Int_t GetNoElements() const
Definition: TVectorT.h:76
This class is a ROOT utility to help benchmarking applications.
Definition: TBenchmark.h:29
double Double_t
Definition: RtypesCore.h:55
static TRInterface & Instance()
static method to get an TRInterface instance reference
double result[121]
Int_t Eval(const TString &code, TRObject &ans)
Method to eval R code and you get the result in a reference to TRObject.
Definition: TRInterface.cxx:63
This is a class to pass functions from ROOT to R