Nuiton-j2r-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
August 2006
- 1 participants
- 5 discussions
[LutinJ2R-commits] r5 - doc src/java/org/codelutin/j2r src/java/org/codelutin/j2r/net src/test/org/codelutin/j2r
by thimel@users.labs.libre-entreprise.org 31 Aug '06
by thimel@users.labs.libre-entreprise.org 31 Aug '06
31 Aug '06
Author: thimel
Date: 2006-08-31 17:12:15 +0000 (Thu, 31 Aug 2006)
New Revision: 5
Modified:
doc/etude.rst
doc/installation.rst
src/java/org/codelutin/j2r/RProxy.java
src/java/org/codelutin/j2r/net/RNetEngine.java
src/test/org/codelutin/j2r/NetTest.java
Log:
- Modification de la detection des params reseau : net://ip:port
- maj doc
Modified: doc/etude.rst
===================================================================
--- doc/etude.rst 2006-08-31 07:57:43 UTC (rev 4)
+++ doc/etude.rst 2006-08-31 17:12:15 UTC (rev 5)
@@ -12,14 +12,15 @@
Heureusement, R est un projet tr�s modulaire et permet par le biais d'extensions
d'ouvrir son moteur � d'autres appplications. En Java, deux possibilit�s
s'offrent � nous :
- - Acc�s par le r�seau : L'application envoie des requ�tes par le r�seau � une
- extension de R faisant office de serveur, laquelle renvoie par la suite les
- r�sultats obtenus.
- - Acc�s par une librairie JNI : Il s'agit d'�crire du code en un langage autre
- que Java qui sera compil� et exc�cut� par la machine plut�t qu'interpr�t�.
- Gr�ce � JNI, il est ensuite possible d'appeler ce code depuis une application
- Java.
+- Acc�s par le r�seau : L'application envoie des requ�tes par le r�seau � une
+ extension de R faisant office de serveur, laquelle renvoie par la suite les
+ r�sultats obtenus.
+- Acc�s par une librairie JNI : Il s'agit d'�crire du code en un langage autre
+ que Java qui sera compil� et exc�cut� par la machine plut�t qu'interpr�t�.
+ Gr�ce � JNI, il est ensuite possible d'appeler ce code depuis une application
+ Java.
+
Le pr�sent document va donc comparer ces deux solutions afin de d�terminer
laquelle est la plus adapt�e. Afin d'effectuer une comparaison plus pertinente,
ces solutions seront compar�es, lorsque c'est possible, � l'utilisation de R
@@ -33,15 +34,15 @@
d�cision finale. Avant m�me de commencer, la nature m�me des solutions sugg�re
certains r�sultats qu'il faudra v�rifier :
- - Les temps de r�ponse obtenus en R pur seront inf�rieurs aux solutions r�seau
- et JNI. Le contraire serait �tonnant dans la mesure o� l'utilisation de R pur
- est la seule solution n'impliquant pas de technologie tierce.
- - Les appels JNI devraient prendre moins de temps que les appels r�seau.
- L'utilisation des interfaces r�seau est reconnue est informatique pour �tre
- un point qui ralenti souvent les applications.
- - Certains calculs simples effectu�s en Java pur pourraient parfois s'av�rer
- plus rapide. Cependant, des calculs plus complexes comme des calculs
- matriciels devraient faire ressortir l'avantage de R.
+- Les temps de r�ponse obtenus en R pur seront inf�rieurs aux solutions r�seau
+ et JNI. Le contraire serait �tonnant dans la mesure o� l'utilisation de R pur
+ est la seule solution n'impliquant pas de technologie tierce.
+- Les appels JNI devraient prendre moins de temps que les appels r�seau.
+ L'utilisation des interfaces r�seau est reconnue est informatique pour �tre
+ un point qui ralenti souvent les applications.
+- Certains calculs simples effectu�s en Java pur pourraient parfois s'av�rer
+ plus rapide. Cependant, des calculs plus complexes comme des calculs
+ matriciels devraient faire ressortir l'avantage de R.
Consid�rations techniques
@@ -55,9 +56,9 @@
possibilit� de recevoir et traiter des requ�tes TCP/IP, le rendant ainsi
accessible � tous types de langages.
- - Avantages : R non n�cessaire sur la machine cliente, d�l�gation des calculs �
- une machine tierce, appli 100% portable
- - Inconv�nient : Rserve � installer sur le serveur
+- Avantages : R non n�cessaire sur la machine cliente, d�l�gation des calculs �
+ une machine tierce, appli 100% portable
+- Inconv�nient : Rserve � installer sur le serveur
JNI
---
@@ -65,10 +66,10 @@
L'utilisation de JNI implique la cr�ation d'une librairie d�pendante du syst�me.
On perd donc un peu de la portabilit� du Java.
- - Avantages : Installation basique de R
- - Inconv�nients : M�me machine, n�cessite des param�tres de d�marrage de
- l'application Java, l'application Java n'est plus 100% portable car
- cr�ation/compilation d'une librairie n�cessaire.
+- Avantages : Installation basique de R
+- Inconv�nients : M�me machine, n�cessite des param�tres de d�marrage de
+ l'application Java, l'application Java n'est plus 100% portable car
+ cr�ation/compilation d'une librairie n�cessaire.
D�roulement (protocole) des tests
@@ -79,18 +80,20 @@
conditions, s'il y en a, dans lesquelles telle ou telle solution est meilleure.
Deux types de tests ont �t� effectu�s.
- - Le premier consiste � envoyer de tr�s petits calculs � R et ce beaucoup de
- fois de suite. On obtient donc une moyenne pour chacune des solutions ce qui
- permettra d'�valuer le co�t de chaque m�thode.
- - Le second se base sur la quantit� de donn�es � v�hiculer. Il s'agit donc l�
- de calculs plus long mais surtout g�n�rant un plus gros volume de donn�es.
- Plusieurs mesures seront effectu�es avec des tailles croissantes afin
- d'�valuer l'impact de l'augmentation volum�trique.
- - Le dernier test est surtout informatif et ne fera ressortir que le temps
- n�cessaire � initialiser chacunes des solutions �tudi�es.
+- Le premier consiste � envoyer de tr�s petits calculs � R et ce beaucoup de
+ fois de suite. On obtient donc une moyenne pour chacune des solutions ce qui
+ permettra d'�valuer le co�t de chaque m�thode.
+- Le second se base sur la quantit� de donn�es � v�hiculer. Il s'agit donc l�
+ de calculs plus long mais surtout g�n�rant un plus gros volume de donn�es.
+ Plusieurs mesures seront effectu�es avec des tailles croissantes afin
+ d'�valuer l'impact de l'augmentation volum�trique.
+- Le dernier test est surtout informatif et ne fera ressortir que le temps
+ n�cessaire � initialiser chacunes des solutions �tudi�es.
+
A noter que :
- De fa�on � ne pas trop laisser libre cours aux optimisations des diff�rentes
+
+De fa�on � ne pas trop laisser libre cours aux optimisations des diff�rentes
plateformes, les calculs r�p�t�s sont volontairement changeants au sein d'un
m�me test (ils restent n�anmoins identiques entre les tests).
Modified: doc/installation.rst
===================================================================
--- doc/installation.rst 2006-08-31 07:57:43 UTC (rev 4)
+++ doc/installation.rst 2006-08-31 17:12:15 UTC (rev 5)
@@ -0,0 +1,97 @@
+Le pr�sent document a pour but de faciliter les diff�rentes installations n�cessaires en vue d'utiliser la librairie LutinJ2R.
+
+.. contents::
+
+Installation
+============
+
+Premi�rement il est n�cessaire d'avoir R d'install� sur la machine qui devra effectuer les calculs R. Chaque solution a des particularit�s.
+
+Solution r�seau
+---------------
+
+Il est possible d'utiliser R en local (machine locale) ou de confier les calculs � une tierce machine (machine distante).
+
+Que ce soit sur la machine locale ou distante, il faut installer R. Le plus simple est de consulter la documentation en ligne de R :
+ http://wiki.r-project.org/rwiki/doku.php?id=getting-started:installation:pa…
+
+La proc�dure suivante diff�re selon la plateforme :
+
+Sous Linux
+~~~~~~~~~~
+
+Il faut installer le serveur qui va r�ceptionner et traiter les requ�tes TCP/IP. Dans l'ordre, il faut :
+ - T�l�charger les sources de la version 0.4-3 (http://rosuda.org/Rserve/dist/Rserve_0.4-3.tar.gz) ou � defaut la derni�re disponible � l'adresse ;
+ - Se logguer en root ;
+ - Exc�cuter la commande "R CMD INSTALL Rserve_0.4-3.tar.gz".
+
+A noter que l'�tape d'installation requiert un compilateur C/C++. Une intervention suppl�mentaire est peut-�tre donc n�cessaire !
+
+Sous Windows
+~~~~~~~~~~~~
+
+Les �tapes � suivre :
+ - T�l�charger la version 0.4-3 pr�compil�e (http://rosuda.org/Rserve/dist/w32bin/0.4-3/2.3.1/Rserve.exe) ou � d�faut la derni�re disponible � l'adresse http://rosuda.org/Rserve/dist/rserve-win.html ;
+ - Il faut ensuite copier le fichier t�l�charg� dans le dossier 'bin' de l'installation de R. Par d�faut pour la version 2.3.1 de R, ce dossier est "C:\Program Files\R\R-2.3.1\bin".
+
+Solution JNI
+------------
+
+Il faut avant tout que R soit install�. Le plus simple est de consulter la documentation en ligne de R :
+ http://wiki.r-project.org/rwiki/doku.php?id=getting-started:installation:pa…
+
+Concr�tement R est pr�t.
+Cependant, si la plateforme ou l'architecture de la machine est particuli�re, il reste � compiler les sources natives (non-Java) du projet et cr�er une librairie adapt�e.
+
+Heureusement, la proc�dure est simple
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+
+Configuration
+=============
+
+Solution r�seau
+---------------
+
+Il n'y a de configuration � faire que s'il s'agit d'une utilisation sur une machine distante. Dans le cas contraire, la configuration de la solution r�seau est termin�e.
+
+Dans le cas d'une machine distante, il faut autoriser les connections entrantes. Par d�faut, Rserve rejette ces connections.
+
+Pour contrer cela, il faut �diter un fichier de configuration.
+
+Sous Linux, il s'agit du fichier
+ /etc/Rserv.conf
+alors que sous Windows, il s'agit du fichier
+ Rserv.cfg - qui doit se trouver au m�me endroit que l'exc�cutable Rserve.exe. (Par d�faut : C:\Program Files\R\R-2.3.1\bin)
+
+Si ce fichier n'existe pas, il faut le cr�er et ajouter la ligne suivante :
+ remote enable
+
+Solution JNI
+------------
+
+La librairie compil�e ou obtenue � l'�tape pr�c�dente doit �tre plac�e au bon endroit sur le syst�me pour pouvoir �tre utilis�e.
+
+Quelque soit la plateforme, il faut positionner des variables d'environnement.
+
+- R_HOME : doit pointer sur le dossier d'installation de R (soit /usr/lib/R sous Linux ou C:\Program Files\R\R-2.3.1 sous Windows ou ...)
+- LD_LIBRARY_PATH : doit pointer sur le dossier lib contenu dans R_HOME (soit R_HOME/lib/ sous Linux ou R_HOME\lib sous Windows ou ...)
+
+Il faut ensuite copier la librairie (libjri.so ou jri.dll ou ...) dans le dossier LD_LIBRARY_PATH
+
+D�marrage
+=========
+
+Cette �tape n'est n�cessaire que pour la solution r�seau.
+
+Solution r�seau
+---------------
+
+La derni�re �tape de pr�paration est le lancement de Rserve.
+
+Sous Linux, tapez la commande :
+ R CMD Rserve
+
+Sous Windows, double-cliquez sur :
+ Rserve.exe dans le dossier d'installation de R (par d�faut : C:\Program Files\R\R-2.3.1\bin)
Modified: src/java/org/codelutin/j2r/RProxy.java
===================================================================
--- src/java/org/codelutin/j2r/RProxy.java 2006-08-31 07:57:43 UTC (rev 4)
+++ src/java/org/codelutin/j2r/RProxy.java 2006-08-31 17:12:15 UTC (rev 5)
@@ -46,6 +46,8 @@
* <li><code>-DR.type=jni</code></li>
* <li><code>-DR.type=...</code></li>
* </ul>
+ * Il est possible de parametrer la solution network, pour cela, voir la
+ * documentation de {@link org.codelutin.j2r.net.RNetEngine}
*/
public class RProxy implements REngine {
@@ -59,7 +61,10 @@
private boolean init(String RType) {
boolean initSucceded = false;
- if ("net".equalsIgnoreCase(RType)) {
+ if (RType == null) {
+ RType = "net";
+ }
+ if (RType.startsWith("net")) {
initSucceded = initOnNet();
if (!initSucceded) {
if (log.isErrorEnabled()) {
Modified: src/java/org/codelutin/j2r/net/RNetEngine.java
===================================================================
--- src/java/org/codelutin/j2r/net/RNetEngine.java 2006-08-31 07:57:43 UTC (rev 4)
+++ src/java/org/codelutin/j2r/net/RNetEngine.java 2006-08-31 17:12:15 UTC (rev 5)
@@ -41,7 +41,14 @@
import org.rosuda.JRclient.Rconnection;
/**
+ * Cette classe represente le moteur reseau pour acceder a R. Par defaut, il
+ * essaye de se connecter a l'adresse 127.0.0.1 sur le port 6311. Cependant, il
+ * est possible de le parametrer.
*
+ * Il suffit de remplacer l'option de lancement <code>-DR.type=net</code> par
+ * <code>-DR.type=net://192.168.99.122:6312</code> ou 192.168.99.122 est
+ * l'adresse de la machine distante et 6312 le port sur lequel tourne le
+ * serveur.
*/
public class RNetEngine implements REngine {
@@ -55,19 +62,29 @@
* @see org.codelutin.j2r.REngine#init()
*/
public boolean init() {
- String host = System.getProperty("R.net.host", "127.0.0.1");
- return init(host);
- }
-
- public boolean init(String host) {
- String portAsString = System.getProperty("R.net.port", ""+DEFAULT_PORT);
+ String typeProp = System.getProperty("R.type", "net");
+ int urlPos = typeProp.indexOf("net://");
+ String host = "127.0.0.1";
+ String portAsString = null;
+ if (urlPos != -1) {
+ String url = typeProp.substring(urlPos + 6);
+ int commaPos = url.indexOf(":");
+ if (commaPos != -1) {
+ host = url.substring(0, commaPos);
+ portAsString = url.substring(commaPos + 1);
+ } else {
+ host = url;
+ }
+ }
int port = DEFAULT_PORT;
- try {
- port = Integer.parseInt(portAsString);
- } catch (NumberFormatException nfe) {
- if (log.isWarnEnabled()) {
- log.warn("Bad port format " + portAsString + ", using default" +
- " port : " + port);
+ if (portAsString != null) {
+ try {
+ port = Integer.parseInt(portAsString);
+ } catch (NumberFormatException nfe) {
+ if (log.isWarnEnabled()) {
+ log.warn("Bad port format " + portAsString + ", using default" +
+ " port : " + port);
+ }
}
}
return init(host, port);
Modified: src/test/org/codelutin/j2r/NetTest.java
===================================================================
--- src/test/org/codelutin/j2r/NetTest.java 2006-08-31 07:57:43 UTC (rev 4)
+++ src/test/org/codelutin/j2r/NetTest.java 2006-08-31 17:12:15 UTC (rev 5)
@@ -55,9 +55,7 @@
protected void setUp() throws Exception {
LutinTimer init = new LutinTimer();
init.startTiming();
- System.setProperty("R.type", "net");
-// System.setProperty("R.net.host", "monitor");
-// System.setProperty("R.net.port", "6311");
+// System.setProperty("R.type", "net://192.168.99.122:6312");
if (engine == null) {
engine = new RProxy();
}
1
0
[LutinJ2R-commits] r4 - in src: java/org/codelutin/j2r java/org/codelutin/j2r/jni java/org/codelutin/j2r/net test/org/codelutin/j2r
by thimel@users.labs.libre-entreprise.org 31 Aug '06
by thimel@users.labs.libre-entreprise.org 31 Aug '06
31 Aug '06
Author: thimel
Date: 2006-08-31 07:57:43 +0000 (Thu, 31 Aug 2006)
New Revision: 4
Modified:
src/java/org/codelutin/j2r/REngine.java
src/java/org/codelutin/j2r/RProxy.java
src/java/org/codelutin/j2r/jni/RJniEngine.java
src/java/org/codelutin/j2r/net/RNetEngine.java
src/test/org/codelutin/j2r/JNITest.java
src/test/org/codelutin/j2r/JPurTest.java
src/test/org/codelutin/j2r/NetTest.java
Log:
Ajout de javadoc
r?\195?\169seau : meilleure d?\195?\169tection de params
JNI : plus stable
Modified: src/java/org/codelutin/j2r/REngine.java
===================================================================
--- src/java/org/codelutin/j2r/REngine.java 2006-08-29 10:40:09 UTC (rev 3)
+++ src/java/org/codelutin/j2r/REngine.java 2006-08-31 07:57:43 UTC (rev 4)
@@ -38,17 +38,35 @@
*/
public interface REngine {
+ /**
+ * Effectue l'initialisation du moteur. Les parametres sont passes par les
+ * options de JVM, -D...
+ * @return true/false pour indiquer si l'initialisation a pu se faire sans
+ * encombre
+ */
public boolean init();
/**
* Delegue a R le traitement passe en parametre.
* @param expr l'expression a evaluer
* @return La valeur renvoyee par la commande
+ * @throws RException
*/
public Object eval(String expr) throws RException;
+ /**
+ * Effectue un eval mais sans retour de resultat. Quand c'est possible cela
+ * permet donc de na pas consommer du temps de transfert et conversion de R
+ * a Java.
+ * @param expr l'expression a evaluer
+ * @throws RException
+ */
public void voidEval(String expr) throws RException;
+ /**
+ * Met fin a l'utilisation de l'engine
+ * @throws RException
+ */
public void terminate() throws RException;
} //RJniEngine
Modified: src/java/org/codelutin/j2r/RProxy.java
===================================================================
--- src/java/org/codelutin/j2r/RProxy.java 2006-08-29 10:40:09 UTC (rev 3)
+++ src/java/org/codelutin/j2r/RProxy.java 2006-08-31 07:57:43 UTC (rev 4)
@@ -38,7 +38,14 @@
import org.codelutin.j2r.net.RNetEngine;
/**
- *
+ * Cette classe permet d'initialiser un REngine sans savoir quelle est
+ * l'implatation choisie. La detection est basee sur l'option de demarrage de la
+ * JVM :
+ * <ul>
+ * <li><code>-DR.type=net</code></li>
+ * <li><code>-DR.type=jni</code></li>
+ * <li><code>-DR.type=...</code></li>
+ * </ul>
*/
public class RProxy implements REngine {
@@ -110,6 +117,9 @@
return engine.eval(expr);
}
+ /* (non-Javadoc)
+ * @see org.codelutin.j2r.REngine#init()
+ */
public boolean init() {
String RType = System.getProperty("R.type");
if (RType == null || "".equals(RType)) {
@@ -126,6 +136,9 @@
return true;
}
+ /* (non-Javadoc)
+ * @see org.codelutin.j2r.REngine#terminate()
+ */
public void terminate() throws RException {
if (engine == null) {
log.fatal("The R Proxy is not initialized. An error probably " +
@@ -135,6 +148,9 @@
}
}
+ /* (non-Javadoc)
+ * @see org.codelutin.j2r.REngine#voidEval(java.lang.String)
+ */
public void voidEval(String expr) throws RException {
if (engine == null) {
log.fatal("The R Proxy is not initialized. An error probably " +
Modified: src/java/org/codelutin/j2r/jni/RJniEngine.java
===================================================================
--- src/java/org/codelutin/j2r/jni/RJniEngine.java 2006-08-29 10:40:09 UTC (rev 3)
+++ src/java/org/codelutin/j2r/jni/RJniEngine.java 2006-08-31 07:57:43 UTC (rev 4)
@@ -46,24 +46,29 @@
private Log log = LogFactory.getLog(RJniEngine.class);
- private Rengine engine;
+ /**
+ * Le Rengine est fait pour tourner en static
+ */
+ private static Rengine engine;
/* (non-Javadoc)
* @see org.codelutin.j2r.REngine#init()
*/
public boolean init() {
- try {
- String[] args = { "--no-save" };
- engine = new Rengine(args, false, null);
- if (!engine.waitForR()) {
- if (log.isErrorEnabled()) {
- log.error("Cannot load the R engine");
+ if (engine == null) {
+ try {
+ String[] args = { "--no-save" };
+ engine = new Rengine(args, false, null);
+ if (!engine.waitForR()) {
+ if (log.isErrorEnabled()) {
+ log.error("Cannot load the R engine");
+ }
+ return false;
}
+ } catch (Throwable twable) {
+ log.error("An error occured during R/JNI initialization.", twable);
return false;
}
- } catch (Throwable twable) {
- log.error("An error occured during R/JNI initialization.", twable);
- return false;
}
return true;
}
Modified: src/java/org/codelutin/j2r/net/RNetEngine.java
===================================================================
--- src/java/org/codelutin/j2r/net/RNetEngine.java 2006-08-29 10:40:09 UTC (rev 3)
+++ src/java/org/codelutin/j2r/net/RNetEngine.java 2006-08-31 07:57:43 UTC (rev 4)
@@ -45,28 +45,48 @@
*/
public class RNetEngine implements REngine {
+ public static final int DEFAULT_PORT = 6311;
+
private Log log = LogFactory.getLog(RNetEngine.class);
private Rconnection conn;
+ /* (non-Javadoc)
+ * @see org.codelutin.j2r.REngine#init()
+ */
public boolean init() {
- return init("127.0.0.1");
+ String host = System.getProperty("R.net.host", "127.0.0.1");
+ return init(host);
}
public boolean init(String host) {
- return init(host, 6311);
+ String portAsString = System.getProperty("R.net.port", ""+DEFAULT_PORT);
+ int port = DEFAULT_PORT;
+ try {
+ port = Integer.parseInt(portAsString);
+ } catch (NumberFormatException nfe) {
+ if (log.isWarnEnabled()) {
+ log.warn("Bad port format " + portAsString + ", using default" +
+ " port : " + port);
+ }
+ }
+ return init(host, port);
}
public boolean init(String host, int port) {
+ if (log.isInfoEnabled()) {
+ log.info("Trying to connect to the Rserve on '" + host + ":" + port + "'");
+ }
try {
conn = new Rconnection(host, port);
} catch (RSrvException e) {
log.error("Unable to establish a connection to the R server. " +
"Maybe you forgot to start it. " +
"Try using the command \"R CMD Rserve\".");
+ e.printStackTrace();
return false;
}
- return true;
+ return conn.isConnected();
}
/* (non-Javadoc)
@@ -130,7 +150,7 @@
* @see org.codelutin.j2r.REngine#terminate()
*/
public void terminate() throws RException {
- if (conn.isConnected()) {
+ if (conn != null && conn.isConnected()) {
conn.close();
}
}
Modified: src/test/org/codelutin/j2r/JNITest.java
===================================================================
--- src/test/org/codelutin/j2r/JNITest.java 2006-08-29 10:40:09 UTC (rev 3)
+++ src/test/org/codelutin/j2r/JNITest.java 2006-08-31 07:57:43 UTC (rev 4)
@@ -1,112 +1,125 @@
/* *##%
-* Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
-* Cedric Pineau, Benjamin Poussin, Arnaud Thimel
-*
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*##%*/
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+ * Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *##%*/
/* *
-* NetTest.java
-*
-* Created: 23 août 06
-*
-* @author Arnaud Thimel <thimel(a)codelutin.com>
-* @version $Revision: $
-*
-* Mise a jour: $Date: $
-* par : $Author: $
-*/
+ * NetTest.java
+ *
+ * Created: 23 août 06
+ *
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ * @version $Revision: $
+ *
+ * Mise a jour: $Date: $
+ * par : $Author: $
+ */
package org.codelutin.j2r;
-
import static org.codelutin.j2r.TestConstants.*;
-
import junit.framework.TestCase;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
public class JNITest extends TestCase {
+ private static Log log = LogFactory.getLog(JNITest.class);
+
private REngine engine;
- @Override
- protected void setUp() throws Exception {
+ @Override
+ protected void setUp() throws Exception {
LutinTimer init = new LutinTimer();
init.startTiming();
- System.setProperty("R.type", "jni");
- if (engine == null) {
- engine = new RProxy();
- }
- System.err.println("jni init: " + init.endTiming() + "ms");
- }
+ System.setProperty("R.type", "jni");
+ if (engine == null) {
+ engine = new RProxy();
+ }
+ if (log.isInfoEnabled()) {
+ log.info("jni init: " + init.endTiming() + "ms");
+ }
+ }
- @Override
+ @Override
protected void tearDown() throws Exception {
engine.terminate();
}
-//
-// public void testDouble() throws Exception {
-// assertEquals(5.0, engine.eval("5.0"));
-// }
-//
-// public void testIntArray() throws Exception {
-// Object result = engine.eval("5:10");
-// assertEquals(int[].class, result.getClass());
-// int[] intArray = (int[])result;
-// assertEquals(6, intArray.length);
-// for (int i=5; i<11; i++) {
-// assertEquals(i, intArray[i-5]);
-// }
-// }
+ public void testDouble() throws Exception {
+ assertEquals(5.0, engine.eval("5.0"));
+ }
+
+ public void testIntArray() throws Exception {
+ Object result = engine.eval("5:10");
+ assertEquals(int[].class, result.getClass());
+ int[] intArray = (int[]) result;
+ assertEquals(6, intArray.length);
+ for (int i = 5; i < 11; i++) {
+ assertEquals(i, intArray[i - 5]);
+ }
+ }
+
+ public void testDoubleArray() throws Exception {
+ Object result = engine.eval("5.5:10.5");
+ assertEquals(double[].class, result.getClass());
+ double[] doubleArray = (double[]) result;
+ assertEquals(6, doubleArray.length);
+ for (int i = 5; i < 11; i++) {
+ double d = i + 0.5;
+ assertEquals(d, doubleArray[i - 5]);
+ }
+ }
+
public void testSimpleOp() throws Exception {
LutinTimer t = new LutinTimer();
- for (int loop=0; loop<S_NB_LOOPS; loop++) {
+ for (int loop = 0; loop < S_NB_LOOPS; loop++) {
engine.voidEval("t<-0");
t.startTiming();
engine.voidEval(S_OP);
t.endTiming();
- System.err.println((Double)engine.eval("t"));
+ double d = (Double)engine.eval("t");
+ assertEquals((double)S_T_MAX, d);
}
double[] results = t.computeResults();
- System.err.println("min: " + results[0]);
- System.err.println("avg: " + results[1]);
- System.err.println("max: " + results[2]);
- System.err.println("etype: " + results[3]);
+ System.err.println("[SO]min: " + results[0]);
+ System.err.println("[SO]avg: " + results[1]);
+ System.err.println("[SO]max: " + results[2]);
+ System.err.println("[SO]etype: " + results[3]);
}
public void testVector() throws Exception {
System.err.println(V_OP_R);
- for (int loop=0; loop<V_NB_LOOPS; loop++) {
- LutinTimer t = new LutinTimer();
+ LutinTimer t = new LutinTimer();
+ for (int loop = 0; loop < V_NB_LOOPS; loop++) {
t.startTiming();
engine.voidEval(V_OP_A);
engine.voidEval(V_OP_B);
- double[] r = (double[])engine.eval(V_OP_AB);
- long end = t.endTiming();
- System.err.println("duration: " + end);
- double sum = 0.0;
- for (int i=0; i<r.length; i++) {
- // if (i%10000==0) {
- // System.err.println(r[i]);
- // }
- sum += r[i];
- }
-// System.err.println("sum: " + sum);
-// System.err.println(r.length);
+ double[] r = (double[]) engine.eval(V_OP_AB);
+ t.endTiming();
+ assertEquals(V_MAX, r.length);
}
+ double[] results = t.computeResults();
+ System.err.println("[V]min: " + results[0]);
+ System.err.println("[V]avg: " + results[1]);
+ System.err.println("[V]max: " + results[2]);
+ System.err.println("[V]etype: " + results[3]);
}
-} //NetTest
+} // NetTest
Modified: src/test/org/codelutin/j2r/JPurTest.java
===================================================================
--- src/test/org/codelutin/j2r/JPurTest.java 2006-08-29 10:40:09 UTC (rev 3)
+++ src/test/org/codelutin/j2r/JPurTest.java 2006-08-31 07:57:43 UTC (rev 4)
@@ -51,15 +51,15 @@
lt.endTiming();
}
double[] results = lt.computeResults();
- System.err.println("min: " + results[0]);
- System.err.println("avg: " + results[1]);
- System.err.println("max: " + results[2]);
- System.err.println("etype: " + results[3]);
+ System.err.println("[SO]min: " + results[0]);
+ System.err.println("[SO]avg: " + results[1]);
+ System.err.println("[SO]max: " + results[2]);
+ System.err.println("[SO]etype: " + results[3]);
}
public void testVector() throws Exception {
+ LutinTimer lt = new LutinTimer();
for (int loop=0; loop<V_NB_LOOPS; loop++) {
- LutinTimer lt = new LutinTimer();
lt.startTiming();
double[] a = new double[V_MAX];
double[] b = new double[V_MAX];
@@ -72,18 +72,13 @@
for (int i=0; i<a.length; i++) {
r[i] = a[i] * b[i];
}
- long end = lt.endTiming();
- System.err.println("duration: " + end);
- double sum = 0.0;
- for (int i=0; i<r.length; i++) {
- // if (i%10000==0) {
- // System.err.println(r[i]);
- // }
- sum += r[i];
- }
-// System.err.println("sum: " + sum);
-// System.err.println(r.length);
+ lt.endTiming();
}
+ double[] results = lt.computeResults();
+ System.err.println("[V]min: " + results[0]);
+ System.err.println("[V]avg: " + results[1]);
+ System.err.println("[V]max: " + results[2]);
+ System.err.println("[V]etype: " + results[3]);
}
}
Modified: src/test/org/codelutin/j2r/NetTest.java
===================================================================
--- src/test/org/codelutin/j2r/NetTest.java 2006-08-29 10:40:09 UTC (rev 3)
+++ src/test/org/codelutin/j2r/NetTest.java 2006-08-31 07:57:43 UTC (rev 4)
@@ -1,106 +1,118 @@
/* *##%
-* Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
-* Cedric Pineau, Benjamin Poussin, Arnaud Thimel
-*
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*##%*/
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+ * Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *##%*/
/* *
-* NetTest.java
-*
-* Created: 23 août 06
-*
-* @author Arnaud Thimel <thimel(a)codelutin.com>
-* @version $Revision: $
-*
-* Mise a jour: $Date: $
-* par : $Author: $
-*/
+ * NetTest.java
+ *
+ * Created: 23 août 06
+ *
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ * @version $Revision: $
+ *
+ * Mise a jour: $Date: $
+ * par : $Author: $
+ */
package org.codelutin.j2r;
-import static org.codelutin.j2r.TestConstants.*;
-
+import static org.codelutin.j2r.TestConstants.S_NB_LOOPS;
+import static org.codelutin.j2r.TestConstants.S_OP;
+import static org.codelutin.j2r.TestConstants.S_T_MAX;
+import static org.codelutin.j2r.TestConstants.V_MAX;
+import static org.codelutin.j2r.TestConstants.V_NB_LOOPS;
+import static org.codelutin.j2r.TestConstants.V_OP_A;
+import static org.codelutin.j2r.TestConstants.V_OP_AB;
+import static org.codelutin.j2r.TestConstants.V_OP_B;
import junit.framework.TestCase;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
public class NetTest extends TestCase {
- private REngine engine;
+ private static Log log = LogFactory.getLog(NetTest.class);
- @Override
- protected void setUp() throws Exception {
+ private REngine engine;
+
+ @Override
+ protected void setUp() throws Exception {
LutinTimer init = new LutinTimer();
init.startTiming();
- System.setProperty("R.type", "net");
- if (engine == null) {
- engine = new RProxy();
- }
- System.err.println("net init: " + init.endTiming() + "ms");
- }
-//
-// public void testDouble() throws Exception {
-// assertEquals(5.0, engine.eval("5.0"));
-// }
-//
-// public void testIntArray() throws Exception {
-// Object result = engine.eval("5:10");
-// assertNotNull(result);
-// assertEquals(int[].class, result.getClass());
-// int[] intArray = (int[])result;
-// assertEquals(6, intArray.length);
-// for (int i=5; i<11; i++) {
-// assertEquals(i, intArray[i-5]);
-// }
-// }
+ System.setProperty("R.type", "net");
+// System.setProperty("R.net.host", "monitor");
+// System.setProperty("R.net.port", "6311");
+ if (engine == null) {
+ engine = new RProxy();
+ }
+ if (log.isInfoEnabled()) {
+ log.info("net init: " + init.endTiming() + "ms");
+ }
+ }
+ public void testDouble() throws Exception {
+ assertEquals(5.0, engine.eval("5.0"));
+ }
+
+ public void testIntArray() throws Exception {
+ Object result = engine.eval("5:10");
+ assertNotNull(result);
+ assertEquals(int[].class, result.getClass());
+ int[] intArray = (int[]) result;
+ assertEquals(6, intArray.length);
+ for (int i = 5; i < 11; i++) {
+ assertEquals(i, intArray[i - 5]);
+ }
+ }
+
public void testSimpleOp() throws Exception {
LutinTimer t = new LutinTimer();
- for (int loop=0; loop<S_NB_LOOPS; loop++) {
+ for (int loop = 0; loop < S_NB_LOOPS; loop++) {
engine.voidEval("t<-0");
t.startTiming();
engine.voidEval(S_OP);
t.endTiming();
- System.err.println((Double)engine.eval("t"));
+ double d = (Double) engine.eval("t");
+ assertEquals((double) S_T_MAX, d);
}
double[] results = t.computeResults();
- System.err.println("min: " + results[0]);
- System.err.println("avg: " + results[1]);
- System.err.println("max: " + results[2]);
- System.err.println("etype: " + results[3]);
+ System.err.println("[SO]min: " + results[0]);
+ System.err.println("[SO]avg: " + results[1]);
+ System.err.println("[SO]max: " + results[2]);
+ System.err.println("[SO]etype: " + results[3]);
}
public void testVector() throws Exception {
- for (int loop=0; loop<V_NB_LOOPS; loop++) {
- LutinTimer t = new LutinTimer();
+ LutinTimer t = new LutinTimer();
+ for (int loop = 0; loop < V_NB_LOOPS; loop++) {
t.startTiming();
engine.voidEval(V_OP_A);
engine.voidEval(V_OP_B);
- double[] r = (double[])engine.eval(V_OP_AB);
- long end = t.endTiming();
- System.err.println("duration: " + end);
- double sum = 0.0;
- for (int i=0; i<r.length; i++) {
- // if (i%10000==0) {
- // System.err.println(r[i]);
- // }
- sum += r[i];
- }
-// System.err.println("sum: " + sum);
-// System.err.println(r.length);
+ double[] r = (double[]) engine.eval(V_OP_AB);
+ t.endTiming();
+ assertEquals(V_MAX, r.length);
}
+ double[] results = t.computeResults();
+ System.err.println("[V]min: " + results[0]);
+ System.err.println("[V]avg: " + results[1]);
+ System.err.println("[V]max: " + results[2]);
+ System.err.println("[V]etype: " + results[3]);
}
-} //NetTest
+} // NetTest
1
0
Author: thimel
Date: 2006-08-29 10:40:09 +0000 (Tue, 29 Aug 2006)
New Revision: 3
Modified:
doc/etude.rst
Log:
fin du doc
Modified: doc/etude.rst
===================================================================
--- doc/etude.rst 2006-08-28 17:13:03 UTC (rev 2)
+++ doc/etude.rst 2006-08-29 10:40:09 UTC (rev 3)
@@ -1,25 +1,47 @@
Introduction
============
-Ce document a pour but de comparer les diff�rentes solutions envisageables pour l'utilisation de R en Java.
+Ce document a pour but de comparer les diff�rentes solutions envisageables pour
+l'utilisation de R en Java.
-R est un outil libre de calculs et cr�ation de graphiques li�s aux statistiques. Il pr�sente l'avantage non n�gligeable d'�tre optimis� pour bon nombre de calculs. Cependant, R n'est pas �crit en Java et ne permet donc pas d'�tre directement utilis� dans une application Java.
+R est un outil libre de calculs et de cr�ation de graphiques li�s aux
+statistiques. Il pr�sente l'avantage non n�gligeable d'�tre optimis� pour bon
+nombre de calculs. Cependant, R n'est pas �crit en Java et ne permet donc pas
+d'�tre directement utilis� dans une application Java.
-Heureusement, R est un projet tr�s modulaire et permet par le biais d'extensions d'ouvrir son moteur � d'autres appplications. En Java, deux possibilit�s s'offrent � nous :
- - Acc�s par le r�seau : L'application envoie des requ�tes par le r�seau � une extension de R faisant office de serveur, laquelle renvoie par la suite les r�sultats obtenus.
- - Acc�s par une librairie JNI : Il s'agit d'�crire du code en un langage autre que Java qui sera compil� et exc�cut� par la machine plut�t qu'interpr�t�. Gr�ce � JNI, il est ensuite possible d'appeler ce code depuis une application Java.
+Heureusement, R est un projet tr�s modulaire et permet par le biais d'extensions
+d'ouvrir son moteur � d'autres appplications. En Java, deux possibilit�s
+s'offrent � nous :
+ - Acc�s par le r�seau : L'application envoie des requ�tes par le r�seau � une
+ extension de R faisant office de serveur, laquelle renvoie par la suite les
+ r�sultats obtenus.
+ - Acc�s par une librairie JNI : Il s'agit d'�crire du code en un langage autre
+ que Java qui sera compil� et exc�cut� par la machine plut�t qu'interpr�t�.
+ Gr�ce � JNI, il est ensuite possible d'appeler ce code depuis une application
+ Java.
-Le pr�sent document va donc comparer ces deux solutions afin de d�terminer laquelle est la plus adapt�e. Afin d'effectuer une comparaison plus pertinente, ces solutions seront compar�es, lorsque c'est possible, � l'utilisation de R seul (sans Java) et Java seul (sans R).
+Le pr�sent document va donc comparer ces deux solutions afin de d�terminer
+laquelle est la plus adapt�e. Afin d'effectuer une comparaison plus pertinente,
+ces solutions seront compar�es, lorsque c'est possible, � l'utilisation de R
+seul (sans Java) et Java seul (sans R).
R�sultats attendus
==================
-Chacune des solutions a ses avantages et ses inconv�nients qui entreront dans la d�cision finale. Avant m�me de commencer, la nature m�me des solutions sugg�re certains r�sultats qu'il faudra v�rifier :
+Chacune des solutions a ses avantages et ses inconv�nients qui entreront dans la
+d�cision finale. Avant m�me de commencer, la nature m�me des solutions sugg�re
+certains r�sultats qu'il faudra v�rifier :
- - Les temps de r�ponse obtenus en R pur seront inf�rieurs aux solutions r�seau et JNI. Le contraire serait �tonnant dans la mesure o� l'utilisation de R pur est la seule solution n'impliquant pas de technologie tierce.
- - Les appels JNI devraient prendre moins de temps que les appels r�seau. L'utilisation des interfaces r�seau est reconnue est informatique pour �tre un point qui ralenti souvent les applications.
- - Certaines calculs simples effectu�s en Java pur pourraient parfois s'av�rer plus rapide. Cependant, des calculs plus complexes comme des calculs matriciels devraient faire ressortir l'avantage de R.
+ - Les temps de r�ponse obtenus en R pur seront inf�rieurs aux solutions r�seau
+ et JNI. Le contraire serait �tonnant dans la mesure o� l'utilisation de R pur
+ est la seule solution n'impliquant pas de technologie tierce.
+ - Les appels JNI devraient prendre moins de temps que les appels r�seau.
+ L'utilisation des interfaces r�seau est reconnue est informatique pour �tre
+ un point qui ralenti souvent les applications.
+ - Certains calculs simples effectu�s en Java pur pourraient parfois s'av�rer
+ plus rapide. Cependant, des calculs plus complexes comme des calculs
+ matriciels devraient faire ressortir l'avantage de R.
Consid�rations techniques
@@ -28,32 +50,49 @@
R�seau
------
-Par d�faut, R n'int�gre aucune interface r�seau, et ne peut donc �tre utilis� � distance. Il existe une extension du nom de 'Rserve' permettant d'ajouter � R la possibilit� de recevoir et traiter des requ�tes TCP/IP, le rendant ainsi accessible � tous types de langages.
+Par d�faut, R n'int�gre aucune interface r�seau, et ne peut donc �tre utilis� �
+distance. Il existe une extension du nom de 'Rserve' permettant d'ajouter � R la
+possibilit� de recevoir et traiter des requ�tes TCP/IP, le rendant ainsi
+accessible � tous types de langages.
-Avantages : R non n�cessaire sur la machine cliente, d�l�gation des calculs � une machine tierce, appli 100% portable
-Inconv�nients : Rserve a installer sur le serveur
+ - Avantages : R non n�cessaire sur la machine cliente, d�l�gation des calculs �
+ une machine tierce, appli 100% portable
+ - Inconv�nient : Rserve � installer sur le serveur
JNI
---
-L'utilisation de JNI implique la cr�ation d'une librarie d�pendante du syst�me. On perd donc un peu de la portabilit� du Java.
+L'utilisation de JNI implique la cr�ation d'une librairie d�pendante du syst�me.
+On perd donc un peu de la portabilit� du Java.
-Avantages : Installation basique de R
-Inconv�nients : M�me machine, n�cessite des param�tres de d�marrage de l'application Java, l'application Java n'est plus 100% portable car cr�ation/compilation d'une librairie n�cessaire.
+ - Avantages : Installation basique de R
+ - Inconv�nients : M�me machine, n�cessite des param�tres de d�marrage de
+ l'application Java, l'application Java n'est plus 100% portable car
+ cr�ation/compilation d'une librairie n�cessaire.
D�roulement (protocole) des tests
=================================
-Le but des tests est de faire ressortir le co�t de chacune des solutions de mani�re � d�terminer laquelle pourrait �tre la meilleure, mais surtout les conditions, s'il y en a, dans lesquelles telle ou telle solution est meilleure.
+Le but des tests est de faire ressortir le co�t de chacune des solutions de
+mani�re � d�terminer laquelle pourrait �tre la meilleure, mais surtout les
+conditions, s'il y en a, dans lesquelles telle ou telle solution est meilleure.
Deux types de tests ont �t� effectu�s.
- - Le permier consiste � envoyer de tr�s petits calculs � R et ce beaucoup de fois de suite. On obtient donc une moyenne pour chacune des solutions ce qui permettra d'�valuer le co�t de chaque m�thode.
- - Le second se base sur la quantit� de donn�es � v�hiculer. Il s'agit donc l� de calculs plus long mais surtout g�n�rant un plus gros volume de donn�es. Plusieurs mesures seront effectu�es avec des tailles croissantes afin d'�valuer l'impact de l'augmentation volum�trique.
- - Le dernier test est surtout informatif et ne fera ressortir que le temps n�cessaires � initialiser chacune des solutions �tudi�es.
+ - Le premier consiste � envoyer de tr�s petits calculs � R et ce beaucoup de
+ fois de suite. On obtient donc une moyenne pour chacune des solutions ce qui
+ permettra d'�valuer le co�t de chaque m�thode.
+ - Le second se base sur la quantit� de donn�es � v�hiculer. Il s'agit donc l�
+ de calculs plus long mais surtout g�n�rant un plus gros volume de donn�es.
+ Plusieurs mesures seront effectu�es avec des tailles croissantes afin
+ d'�valuer l'impact de l'augmentation volum�trique.
+ - Le dernier test est surtout informatif et ne fera ressortir que le temps
+ n�cessaire � initialiser chacunes des solutions �tudi�es.
A noter que :
- De fa�on � ne pas trop laisser libre cours aux optimisations des diff�rentes plateformes, les calculs r�p�t�s sont volotairement changeants au sein d'un m�me test (il restent n�anmoins identiques entre les tests).
+ De fa�on � ne pas trop laisser libre cours aux optimisations des diff�rentes
+plateformes, les calculs r�p�t�s sont volontairement changeants au sein d'un
+m�me test (ils restent n�anmoins identiques entre les tests).
R�sultats des tests
@@ -110,31 +149,47 @@
Exploitation des r�sultats
==========================
-Les tests �tant effectu�s, il faut maintenant les interpr�ter et en tirer des conclusions.
+Les tests �tant effectu�s, il faut maintenant les interpr�ter et en tirer des
+conclusions.
Test A - Calculs rapides
------------------------
Le premier test avait pour but d'isoler le co�t de chaque appel � R.
-La comparason avec du Java pur n'avait ici aucun int�ret dans la mesure ou le but est de calculer le temps d'appel � R.
+La comparaison avec du Java pur n'avait ici aucun int�ret dans la mesure ou le
+but est de calculer le temps d'appel � R.
-Premi�rement, l'op�ration est r�alis�e en R pur afin d'avoir un temps de base : 229.83ms.
+Premi�rement, l'op�ration est r�alis�e en R pur afin d'avoir un temps de
+base : 229.83ms.
A partir de l�, on peut estimer que le temps n�cessaire � chaque technologie.
-Ainsi, un appel JNI est en moyenne d'un peu moins de 3ms (2.73ms), alors que par le r�seau, il faut plus de 10ms (10,23ms), soit un ecart d'environ 7ms en faveur de JNI.
+Ainsi, un appel JNI est en moyenne d'un peu moins de 3ms (2.73ms), alors que par
+le r�seau, il faut plus de 10ms (10,23ms), soit un ecart d'environ 7ms en faveur
+de JNI.
-La diff�rence est relativement faible, elle ne repr�sente ici que 3%, mais r�p�t� � grande �chelle elle peut �tre p�nalisante. Si par exemple 100.000 appels cons�cutifs sont n�cessaires, la diff�rence se monte � 700 secondes soit 11 minutes et 40 secondes ce qui peut �tre �norme pour des simulateurs par exemple.
+La diff�rence est relativement faible, elle ne repr�sente ici que 3%, mais
+r�p�t�e � grande �chelle elle peut �tre p�nalisante. Si par exemple 100.000
+appels cons�cutifs sont n�cessaires, la diff�rence se monte � 700 secondes soit
+11 minutes et 40 secondes ce qui peut �tre �norme pour des simulateurs par
+exemple.
-Pour ce test, l'�cart-type �tait mesur� afin d'estimer la r�partition des valeurs.
-L'�cart-type nous permet ici de constater que la r�partition des valeurs avec JNI est plus proche de la moyenne que par le r�seau. La solution r�seau est donc plus sensible aux variations de temps.
+Pour ce test, l'�cart-type �tait mesur� afin d'estimer la r�partition des
+valeurs.
+L'�cart-type nous permet ici de constater que la r�partition des valeurs avec
+JNI est plus proche de la moyenne que par le r�seau. La solution r�seau est donc
+plus sensible aux variations de temps.
Test B - Volumes importants
---------------------------
-La deuxi�me s�rie de tests veut mettre en valeur l'�volution des temps n�cessaires avec l'augmentation du volume de donn�es.
-Inversement au pr�c�dent test, c'est la solution R pur qui n'a ici pas de sens puisqu'on cherche � �valuer l'impact d'un passqge de Java � R.
+La deuxi�me s�rie de tests veut mettre en valeur l'�volution des temps
+n�cessaires avec l'augmentation du volume de donn�es.
+Inversement au pr�c�dent test, c'est la solution R pur qui n'a ici pas de sens
+puisqu'on cherche � �valuer l'impact d'un passage de Java � R.
-L'op�ration r�alis�e pour ce test est un simple produit scalaire entre deux vecteurs dont la taille va augmenter progressivement. Le graphique ci-dessous permet de voir instantann�ment la mani�re dont �voluent ces technologies :
+L'op�ration r�alis�e pour ce test est un simple produit scalaire entre deux
+vecteurs dont la taille va augmenter progressivement. Le graphique ci-dessous
+permet de voir instantann�ment la mani�re dont �voluent ces technologies :
.. image:: img/testB-results.png
:alt: Evolution des temps de r�ponse
@@ -143,25 +198,51 @@
A faibles volumes de donn�es, les r�sultats des 3 solutions sont comparables.
-Cependant, la solution r�seau montre vite ses faiblesses. D�s l'utilisation de vecteurs d'une taille de 5.000 chiffres la comparaison devient ridicule tant les temps n�cessaires pour transf�rer les vecteurs prend le pas sur le calcul. Pour le reste de ce test, le r�seau restera toujours la solution la moins adapt�e.
+Cependant, la solution r�seau montre vite ses faiblesses. D�s l'utilisation de
+vecteurs d'une taille de 5.000 chiffres la comparaison devient ridicule tant les
+temps n�cessaires pour transf�rer les vecteurs prend le pas sur le calcul. Pour
+le reste de ce test, le r�seau restera toujours la solution la moins adapt�e.
-Du c�t� de JNI, la solution s'av�re beaucoup plus pertinente. R sur JNI s'offre m�me le luxe de battre Java sur certaines tailles ce qui est tr�s flatteur si on tient compte du fait que les r�sultats doivent �tre convertis de R � Java afin d'�tre exploitables. La solution se montre donc viable mais uniquement jusqu'� ce que la taille des vecteurs depasse les 100.000 chiffres. Les optimisations de Java prennent alors le dessus et affichent des temps bien inf�rieurs.
+Du c�t� de JNI, la solution s'av�re beaucoup plus pertinente. R sur JNI s'offre
+m�me le luxe de battre Java sur certaines tailles ce qui est tr�s flatteur si on
+tient compte du fait que les r�sultats doivent �tre convertis de R � Java afin
+d'�tre exploitables. La solution se montre donc viable mais uniquement jusqu'�
+ce que la taille des vecteurs depasse les 100.000 chiffres. Les optimisations de
+Java prennent alors le dessus et affichent des temps bien inf�rieurs.
-Enfin le dernier test sur des vecteurs d'une taille de 1.000.000 de chiffres indique des temps qui, m�me s'ils ne sont plus comparables � Java (94ms), restent honorables. La solution JNI n�cessite 282ms pour effectuer le calcul et le renvoyer � Java, ce qui signifie qu'il est toujours possible d'effectuer 3 produits scalaires sur des vecteurs d'un million d'entr�es en moins d'une seconde. Le temps n�cessaire � la solution r�seau (620ms) n'est pas non plus ridicule compte tenu de la taille des donn�es � traiter. La solution r�seau souffre simplement de temps de transfert trop longs qui sont le reflet habituel de l'utilisation des r�seaux.
+Enfin le dernier test sur des vecteurs d'une taille de 1.000.000 de chiffres
+indique des temps qui, m�me s'ils ne sont plus comparables � Java (94ms),
+restent honorables. La solution JNI n�cessite 282ms pour effectuer le calcul et
+le renvoyer � Java, ce qui signifie qu'il est toujours possible d'effectuer 3
+produits scalaires sur des vecteurs d'un million d'entr�es en moins d'une
+seconde. Le temps n�cessaire � la solution r�seau (620ms) n'est pas non plus
+ridicule compte tenu de la taille des donn�es � traiter. La solution r�seau
+souffre simplement de temps de transfert trop longs qui sont le reflet habituel
+de l'utilisation des r�seaux.
Test C - Temps d'initialisation
-------------------------------
-Le temps d'initialisation repr�sente le temps n�cessaire � la premi�re utilisation de l'application avant de pouvoir acc�der � R. Il peut parraitre annodin, mais en r�alit� il peut s'av�rer primordial dans le choix de la solution � utiliser.
+Le temps d'initialisation repr�sente le temps n�cessaire � la premi�re
+utilisation de l'application avant de pouvoir acc�der � R. Il peut parraitre
+annodin, mais en r�alit� il peut s'av�rer primordial dans le choix de la
+solution � utiliser.
-Si les tests pr�c�dents n'ont pas �t� en faveur de la solution r�seau, ce test l� montre que l'initialisation de JNI prend en moyenne 550ms de plus que l'initialisation du r�seau. Cette diff�rence peut s'av�rer cruciale si les calculs � effectuer sont petits et peu r�p�t�s.
+Si les tests pr�c�dents n'ont pas �t� en faveur de la solution r�seau, ce test
+l� montre que l'initialisation de JNI prend en moyenne 550ms de plus que
+l'initialisation du r�seau. Cette diff�rence peut s'av�rer cruciale si les
+calculs � effectuer sont petits et peu r�p�t�s.
Notes
-----
-Certains faits n'apparaissent pas dans les chiffres pr�c�demment cit�s mais peuvent �galement pencher dans la balance.
+Certains faits n'apparaissent pas dans les chiffres pr�c�demment cit�s mais
+peuvent �galement faire pencher la balance.
-Par exemple, les diff�rents tests ont fait ressortir que la solution r�seau n�cessite un "temps de chauffe". Un simple test r�p�t� 10 fois de suite peut le mettre en �vidence. Chaque ligne suivante repr�sente l'�volution d'un m�me test :
+Par exemple, les diff�rents tests ont fait ressortir que la solution r�seau
+n�cessite un "temps de chauffe". Un simple test r�p�t� 10 fois de suite peut le
+mettre en �vidence. Chaque ligne suivante repr�sente l'�volution d'un m�me
+test :
+-----------------+
| duration: 801ms |
@@ -185,9 +266,62 @@
| duration: 326ms |
+-----------------+
-La diff�rence entre le premier et le dernier test atteint quasiment la demi seconde soit plus de 150% du temps n�cessaire au final pour l'op�ration.
+La diff�rence entre le premier et le dernier test atteint quasiment la demi
+seconde soit plus de 150% du temps n�cessaire au final pour l'op�ration.
+
R�capitulatif
-------------
+Les tests effectu�s se sont montr�s r�v�lateurs.
+Net
+---
+
+Cette solution s'est montr�e moins efficace que les autres. La diff�rence n'est
+pas pour autant dramatique puisque les temps restent tout � fait corrects.
+
+Cette approche n'a pas que des inconv�nients. En effet, la mise en place de la
+solution r�seau est plus simple compar�e � JNI et b�n�ficie �galement d'un temps
+d'initialisation beaucoup plus faible. A ne pas oublier aussi que le r�seau
+offre la possibilit� de mobiliser une seconde machine pour effectuer les calculs
+en R, ce qui permettra encore d'am�liorer les performances. A noter cependant
+que les performances de la solution r�seau s'am�liorent avec le temps. Ceci
+signifie que la solution perd de son inter�t seulement si quelques rares appels
+sont effectu�s.
+
+JNI
+---
+
+La solution JNI a fait ses preuves sur les diff�rents tests. Il s'est av�r� que
+les temps d'appels �taient toujours inf�rieurs � la solution r�seau.
+
+N�anmoins, la solution JNI n'a pas que des avantages. La mise en place, par
+exemple, est plus complexe car elle n�cessite une recompilation des sources JNI.
+On perd ainsi un peu de la portabilit� de Java. D'autre part, la premi�re
+initialisation de JNI s'av�re particuli�rement longue (une demi seconde) surtout
+si elle est compar�e � la solution r�seau.
+
+Java
+----
+
+La comparaison n'a que peu d'inter�t mais permet de faire ressortir la puissance
+de Java qui par le biais d'optimisations parvient � devancer R sur de nombreux
+calculs.
+
+Il n'en reste pas moins que l'utilisation de R a des avantages. Les tests
+effectu�s ici ne se basaient que sur des calculs simples. En appelant des
+fonctions plus optimis�es de R voire des librairies sp�cifiques, Java ne
+pourraient certainement plus rivaliser avec R.
+
+Conclusion
+==========
+
+Les deux principales solutions �tudi�es (JNI et r�seau) ont toutes deux montr�s
+des avantages et inconv�nients et fait ressortir des cas dans lesquels elles
+sont pr�f�rables � l'autre.
+
+Difficile donc de faire un choix. C'est pourquoi ce choix est laiss� �
+l'utilisateur avec la librairie LutinJ2R qui propose une interface unifi�e pour
+acc�der aux fonctionnalit�s de R permettant ainsi de choisir � la vol�e quelle
+solution utiliser.
1
0
[LutinJ2R-commits] r2 - / doc doc/img src/java/org/codelutin/j2r src/java/org/codelutin/j2r/jni src/java/org/codelutin/j2r/net src/test/org/codelutin/j2r
by thimel@users.labs.libre-entreprise.org 28 Aug '06
by thimel@users.labs.libre-entreprise.org 28 Aug '06
28 Aug '06
Author: thimel
Date: 2006-08-28 17:13:03 +0000 (Mon, 28 Aug 2006)
New Revision: 2
Added:
doc/
doc/etude.rst
doc/img/
doc/img/testB-results.png
doc/installation.rst
doc/resultats.ods
doc/results-mesuresSimple.ods
src/test/org/codelutin/j2r/JPurTest.java
src/test/org/codelutin/j2r/LutinTimer.java
src/test/org/codelutin/j2r/TestConstants.java
Modified:
pom.xml
src/java/org/codelutin/j2r/REngine.java
src/java/org/codelutin/j2r/RException.java
src/java/org/codelutin/j2r/RProxy.java
src/java/org/codelutin/j2r/jni/RJniEngine.java
src/java/org/codelutin/j2r/net/RNetEngine.java
src/test/org/codelutin/j2r/JNITest.java
src/test/org/codelutin/j2r/NetTest.java
Log:
Suite des devs
Ajout des tests
Added: doc/etude.rst
===================================================================
--- doc/etude.rst 2006-08-23 16:14:42 UTC (rev 1)
+++ doc/etude.rst 2006-08-28 17:13:03 UTC (rev 2)
@@ -0,0 +1,193 @@
+Introduction
+============
+
+Ce document a pour but de comparer les diff�rentes solutions envisageables pour l'utilisation de R en Java.
+
+R est un outil libre de calculs et cr�ation de graphiques li�s aux statistiques. Il pr�sente l'avantage non n�gligeable d'�tre optimis� pour bon nombre de calculs. Cependant, R n'est pas �crit en Java et ne permet donc pas d'�tre directement utilis� dans une application Java.
+
+Heureusement, R est un projet tr�s modulaire et permet par le biais d'extensions d'ouvrir son moteur � d'autres appplications. En Java, deux possibilit�s s'offrent � nous :
+ - Acc�s par le r�seau : L'application envoie des requ�tes par le r�seau � une extension de R faisant office de serveur, laquelle renvoie par la suite les r�sultats obtenus.
+ - Acc�s par une librairie JNI : Il s'agit d'�crire du code en un langage autre que Java qui sera compil� et exc�cut� par la machine plut�t qu'interpr�t�. Gr�ce � JNI, il est ensuite possible d'appeler ce code depuis une application Java.
+
+Le pr�sent document va donc comparer ces deux solutions afin de d�terminer laquelle est la plus adapt�e. Afin d'effectuer une comparaison plus pertinente, ces solutions seront compar�es, lorsque c'est possible, � l'utilisation de R seul (sans Java) et Java seul (sans R).
+
+
+R�sultats attendus
+==================
+
+Chacune des solutions a ses avantages et ses inconv�nients qui entreront dans la d�cision finale. Avant m�me de commencer, la nature m�me des solutions sugg�re certains r�sultats qu'il faudra v�rifier :
+
+ - Les temps de r�ponse obtenus en R pur seront inf�rieurs aux solutions r�seau et JNI. Le contraire serait �tonnant dans la mesure o� l'utilisation de R pur est la seule solution n'impliquant pas de technologie tierce.
+ - Les appels JNI devraient prendre moins de temps que les appels r�seau. L'utilisation des interfaces r�seau est reconnue est informatique pour �tre un point qui ralenti souvent les applications.
+ - Certaines calculs simples effectu�s en Java pur pourraient parfois s'av�rer plus rapide. Cependant, des calculs plus complexes comme des calculs matriciels devraient faire ressortir l'avantage de R.
+
+
+Consid�rations techniques
+=========================
+
+R�seau
+------
+
+Par d�faut, R n'int�gre aucune interface r�seau, et ne peut donc �tre utilis� � distance. Il existe une extension du nom de 'Rserve' permettant d'ajouter � R la possibilit� de recevoir et traiter des requ�tes TCP/IP, le rendant ainsi accessible � tous types de langages.
+
+Avantages : R non n�cessaire sur la machine cliente, d�l�gation des calculs � une machine tierce, appli 100% portable
+Inconv�nients : Rserve a installer sur le serveur
+
+JNI
+---
+
+L'utilisation de JNI implique la cr�ation d'une librarie d�pendante du syst�me. On perd donc un peu de la portabilit� du Java.
+
+Avantages : Installation basique de R
+Inconv�nients : M�me machine, n�cessite des param�tres de d�marrage de l'application Java, l'application Java n'est plus 100% portable car cr�ation/compilation d'une librairie n�cessaire.
+
+
+D�roulement (protocole) des tests
+=================================
+
+Le but des tests est de faire ressortir le co�t de chacune des solutions de mani�re � d�terminer laquelle pourrait �tre la meilleure, mais surtout les conditions, s'il y en a, dans lesquelles telle ou telle solution est meilleure.
+
+Deux types de tests ont �t� effectu�s.
+ - Le permier consiste � envoyer de tr�s petits calculs � R et ce beaucoup de fois de suite. On obtient donc une moyenne pour chacune des solutions ce qui permettra d'�valuer le co�t de chaque m�thode.
+ - Le second se base sur la quantit� de donn�es � v�hiculer. Il s'agit donc l� de calculs plus long mais surtout g�n�rant un plus gros volume de donn�es. Plusieurs mesures seront effectu�es avec des tailles croissantes afin d'�valuer l'impact de l'augmentation volum�trique.
+ - Le dernier test est surtout informatif et ne fera ressortir que le temps n�cessaires � initialiser chacune des solutions �tudi�es.
+
+A noter que :
+ De fa�on � ne pas trop laisser libre cours aux optimisations des diff�rentes plateformes, les calculs r�p�t�s sont volotairement changeants au sein d'un m�me test (il restent n�anmoins identiques entre les tests).
+
+
+R�sultats des tests
+===================
+
+Tous les temps sont mesur�s en milli-secondes :
+
+Test A - Calculs rapides
+------------------------
+
++------------+--------+--------+--------+--------+
+| | Java | Net | JNI | R |
++============+========+========+========+========+
+| Moyenne | | 241,06 | 233,56 | 230,83 |
++------------+--------+--------+--------+--------+
+| Ecart-type | | 18,65 | 11,99 | |
++------------+--------+--------+--------+--------+
+
+
+Test B - Volumes importants
+---------------------------
+
++------------+--------+--------+--------+--------+
+| | Java | Net | JNI | R |
++============+========+========+========+========+
+| 50 | 0,00 | 1,00 | 1,33 | |
++------------+--------+--------+--------+--------+
+| 500 | 0,00 | 3,00 | 1,33 | |
++------------+--------+--------+--------+--------+
+| 5000 | 1,00 | 13,00 | 3,33 | |
++------------+--------+--------+--------+--------+
+| 50000 | 24,20 | 33,50 | 8,00 | |
++------------+--------+--------+--------+--------+
+| 100000 | 60,20 | 118,00 | 79,00 | |
++------------+--------+--------+--------+--------+
+| 200000 | 66,60 | 142,00 | 116,00 | |
++------------+--------+--------+--------+--------+
+| 500000 | 89,00 | 330,00 | 189,00 | |
++------------+--------+--------+--------+--------+
+| 1000000 | 94,00 | 620,00 | 282,00 | |
++------------+--------+--------+--------+--------+
+
+
+Test C - Temps d'initialisation
+-------------------------------
+
++------------+--------+--------+--------+--------+
+| | Java | Net | JNI | R |
++============+========+========+========+========+
+| Init. | | 22,10 | 571,10 | |
++------------+--------+--------+--------+--------+
+
+
+Exploitation des r�sultats
+==========================
+
+Les tests �tant effectu�s, il faut maintenant les interpr�ter et en tirer des conclusions.
+
+Test A - Calculs rapides
+------------------------
+
+Le premier test avait pour but d'isoler le co�t de chaque appel � R.
+La comparason avec du Java pur n'avait ici aucun int�ret dans la mesure ou le but est de calculer le temps d'appel � R.
+
+Premi�rement, l'op�ration est r�alis�e en R pur afin d'avoir un temps de base : 229.83ms.
+A partir de l�, on peut estimer que le temps n�cessaire � chaque technologie.
+Ainsi, un appel JNI est en moyenne d'un peu moins de 3ms (2.73ms), alors que par le r�seau, il faut plus de 10ms (10,23ms), soit un ecart d'environ 7ms en faveur de JNI.
+
+La diff�rence est relativement faible, elle ne repr�sente ici que 3%, mais r�p�t� � grande �chelle elle peut �tre p�nalisante. Si par exemple 100.000 appels cons�cutifs sont n�cessaires, la diff�rence se monte � 700 secondes soit 11 minutes et 40 secondes ce qui peut �tre �norme pour des simulateurs par exemple.
+
+Pour ce test, l'�cart-type �tait mesur� afin d'estimer la r�partition des valeurs.
+L'�cart-type nous permet ici de constater que la r�partition des valeurs avec JNI est plus proche de la moyenne que par le r�seau. La solution r�seau est donc plus sensible aux variations de temps.
+
+
+Test B - Volumes importants
+---------------------------
+
+La deuxi�me s�rie de tests veut mettre en valeur l'�volution des temps n�cessaires avec l'augmentation du volume de donn�es.
+Inversement au pr�c�dent test, c'est la solution R pur qui n'a ici pas de sens puisqu'on cherche � �valuer l'impact d'un passqge de Java � R.
+
+L'op�ration r�alis�e pour ce test est un simple produit scalaire entre deux vecteurs dont la taille va augmenter progressivement. Le graphique ci-dessous permet de voir instantann�ment la mani�re dont �voluent ces technologies :
+
+.. image:: img/testB-results.png
+ :alt: Evolution des temps de r�ponse
+
+L'�tude de l'�volution des temps de r�ponse s'av�re r�v�latrice.
+
+A faibles volumes de donn�es, les r�sultats des 3 solutions sont comparables.
+
+Cependant, la solution r�seau montre vite ses faiblesses. D�s l'utilisation de vecteurs d'une taille de 5.000 chiffres la comparaison devient ridicule tant les temps n�cessaires pour transf�rer les vecteurs prend le pas sur le calcul. Pour le reste de ce test, le r�seau restera toujours la solution la moins adapt�e.
+
+Du c�t� de JNI, la solution s'av�re beaucoup plus pertinente. R sur JNI s'offre m�me le luxe de battre Java sur certaines tailles ce qui est tr�s flatteur si on tient compte du fait que les r�sultats doivent �tre convertis de R � Java afin d'�tre exploitables. La solution se montre donc viable mais uniquement jusqu'� ce que la taille des vecteurs depasse les 100.000 chiffres. Les optimisations de Java prennent alors le dessus et affichent des temps bien inf�rieurs.
+
+Enfin le dernier test sur des vecteurs d'une taille de 1.000.000 de chiffres indique des temps qui, m�me s'ils ne sont plus comparables � Java (94ms), restent honorables. La solution JNI n�cessite 282ms pour effectuer le calcul et le renvoyer � Java, ce qui signifie qu'il est toujours possible d'effectuer 3 produits scalaires sur des vecteurs d'un million d'entr�es en moins d'une seconde. Le temps n�cessaire � la solution r�seau (620ms) n'est pas non plus ridicule compte tenu de la taille des donn�es � traiter. La solution r�seau souffre simplement de temps de transfert trop longs qui sont le reflet habituel de l'utilisation des r�seaux.
+
+Test C - Temps d'initialisation
+-------------------------------
+
+Le temps d'initialisation repr�sente le temps n�cessaire � la premi�re utilisation de l'application avant de pouvoir acc�der � R. Il peut parraitre annodin, mais en r�alit� il peut s'av�rer primordial dans le choix de la solution � utiliser.
+
+Si les tests pr�c�dents n'ont pas �t� en faveur de la solution r�seau, ce test l� montre que l'initialisation de JNI prend en moyenne 550ms de plus que l'initialisation du r�seau. Cette diff�rence peut s'av�rer cruciale si les calculs � effectuer sont petits et peu r�p�t�s.
+
+Notes
+-----
+
+Certains faits n'apparaissent pas dans les chiffres pr�c�demment cit�s mais peuvent �galement pencher dans la balance.
+
+Par exemple, les diff�rents tests ont fait ressortir que la solution r�seau n�cessite un "temps de chauffe". Un simple test r�p�t� 10 fois de suite peut le mettre en �vidence. Chaque ligne suivante repr�sente l'�volution d'un m�me test :
+
++-----------------+
+| duration: 801ms |
++-----------------+
+| duration: 700ms |
++-----------------+
+| duration: 638ms |
++-----------------+
+| duration: 584ms |
++-----------------+
+| duration: 642ms |
++-----------------+
+| duration: 581ms |
++-----------------+
+| duration: 415ms |
++-----------------+
+| duration: 323ms |
++-----------------+
+| duration: 321ms |
++-----------------+
+| duration: 326ms |
++-----------------+
+
+La diff�rence entre le premier et le dernier test atteint quasiment la demi seconde soit plus de 150% du temps n�cessaire au final pour l'op�ration.
+
+R�capitulatif
+-------------
+
+
Added: doc/img/testB-results.png
===================================================================
(Binary files differ)
Property changes on: doc/img/testB-results.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: doc/installation.rst
===================================================================
Added: doc/resultats.ods
===================================================================
(Binary files differ)
Property changes on: doc/resultats.ods
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: doc/results-mesuresSimple.ods
===================================================================
(Binary files differ)
Property changes on: doc/results-mesuresSimple.ods
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: pom.xml
===================================================================
--- pom.xml 2006-08-23 16:14:42 UTC (rev 1)
+++ pom.xml 2006-08-28 17:13:03 UTC (rev 2)
@@ -24,8 +24,7 @@
<!--Description-->
<description>
- Librairie permettant d'utiliser R en Java, que ce soit par
-le Network ou en JNI.
+ Librairie permettant d'utiliser R en Java, que ce soit par le Network ou en JNI.
</description>
<inceptionYear>2006</inceptionYear>
@@ -45,13 +44,13 @@
<dependency>
<groupId>externallib</groupId>
<artifactId>JRclient</artifactId>
- <version>RE817</version>
+ <version>RF503</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>externallib</groupId>
<artifactId>JRI</artifactId>
- <version>0.2-4</version>
+ <version>0.2-4-cl</version>
<scope>compile</scope>
</dependency>
</dependencies>
Modified: src/java/org/codelutin/j2r/REngine.java
===================================================================
--- src/java/org/codelutin/j2r/REngine.java 2006-08-23 16:14:42 UTC (rev 1)
+++ src/java/org/codelutin/j2r/REngine.java 2006-08-28 17:13:03 UTC (rev 2)
@@ -33,7 +33,8 @@
package org.codelutin.j2r;
/**
- *
+ * Cette interface est le point commun entre les differentes technologies
+ * utilisees pour l'acces a R
*/
public interface REngine {
@@ -46,6 +47,8 @@
*/
public Object eval(String expr) throws RException;
+ public void voidEval(String expr) throws RException;
+
public void terminate() throws RException;
} //RJniEngine
Modified: src/java/org/codelutin/j2r/RException.java
===================================================================
--- src/java/org/codelutin/j2r/RException.java 2006-08-23 16:14:42 UTC (rev 1)
+++ src/java/org/codelutin/j2r/RException.java 2006-08-28 17:13:03 UTC (rev 2)
@@ -21,7 +21,7 @@
/* *
* RException.java
*
-* Created: 22 ao�t 06
+* Created: 22 aout 06
*
* @author Arnaud Thimel <thimel(a)codelutin.com>
* @version $Revision: $
Modified: src/java/org/codelutin/j2r/RProxy.java
===================================================================
--- src/java/org/codelutin/j2r/RProxy.java 2006-08-23 16:14:42 UTC (rev 1)
+++ src/java/org/codelutin/j2r/RProxy.java 2006-08-28 17:13:03 UTC (rev 2)
@@ -135,4 +135,13 @@
}
}
+ public void voidEval(String expr) throws RException {
+ if (engine == null) {
+ log.fatal("The R Proxy is not initialized. An error probably " +
+ "occured during the initialization.");
+ return;
+ }
+ engine.voidEval(expr);
+ }
+
} //RProxy
Modified: src/java/org/codelutin/j2r/jni/RJniEngine.java
===================================================================
--- src/java/org/codelutin/j2r/jni/RJniEngine.java 2006-08-23 16:14:42 UTC (rev 1)
+++ src/java/org/codelutin/j2r/jni/RJniEngine.java 2006-08-28 17:13:03 UTC (rev 2)
@@ -52,12 +52,17 @@
* @see org.codelutin.j2r.REngine#init()
*/
public boolean init() {
- String[] args = { "--no-save" };
- engine = new Rengine(args, false, null);
- if (!engine.waitForR()) {
- if (log.isErrorEnabled()) {
- log.error("Cannot load the R engine");
+ try {
+ String[] args = { "--no-save" };
+ engine = new Rengine(args, false, null);
+ if (!engine.waitForR()) {
+ if (log.isErrorEnabled()) {
+ log.error("Cannot load the R engine");
+ }
+ return false;
}
+ } catch (Throwable twable) {
+ log.error("An error occured during R/JNI initialization.", twable);
return false;
}
return true;
@@ -80,6 +85,10 @@
}
private Object convertResult(REXP rexp) {
+ if (rexp == null) {
+ log.debug("Null returned");
+ return null;
+ }
if (log.isDebugEnabled()) {
log.debug("Converting : " + rexp.toString());
}
@@ -119,4 +128,16 @@
}
}
+ /* (non-Javadoc)
+ * @see org.codelutin.j2r.REngine#voidEval(java.lang.String)
+ */
+ public void voidEval(String expr) throws RException {
+ //voidEval is not really supproted by JRI, we just discard the result conversion
+ try {
+ engine.eval(expr);
+ }catch (Exception eee) {
+ throw new RException("An error occured while voidEval on JNI", eee);
+ }
+ }
+
} // RJniEngine
Modified: src/java/org/codelutin/j2r/net/RNetEngine.java
===================================================================
--- src/java/org/codelutin/j2r/net/RNetEngine.java 2006-08-23 16:14:42 UTC (rev 1)
+++ src/java/org/codelutin/j2r/net/RNetEngine.java 2006-08-28 17:13:03 UTC (rev 2)
@@ -21,7 +21,7 @@
/* *
* RNetEngine.java
*
-* Created: 22 ao�t 06
+* Created: 22 aout 06
*
* @author Arnaud Thimel <thimel(a)codelutin.com>
* @version $Revision: $
@@ -61,7 +61,10 @@
try {
conn = new Rconnection(host, port);
} catch (RSrvException e) {
- e.printStackTrace();
+ log.error("Unable to establish a connection to the R server. " +
+ "Maybe you forgot to start it. " +
+ "Try using the command \"R CMD Rserve\".");
+ return false;
}
return true;
}
@@ -80,6 +83,10 @@
}
private Object convertResult(REXP rexp) {
+ if (rexp == null) {
+ log.debug("Null returned");
+ return null;
+ }
if (log.isDebugEnabled()) {
log.debug("Converting : " + rexp.toString());
}
@@ -128,4 +135,15 @@
}
}
+ /* (non-Javadoc)
+ * @see org.codelutin.j2r.REngine#voidEval(java.lang.String)
+ */
+ public void voidEval(String expr) throws RException {
+ try {
+ conn.voidEval(expr);
+ } catch (RSrvException rse) {
+ throw new RException("An error occured while voidEval on net", rse);
+ }
+ }
+
} //RNetEngine
Modified: src/test/org/codelutin/j2r/JNITest.java
===================================================================
--- src/test/org/codelutin/j2r/JNITest.java 2006-08-23 16:14:42 UTC (rev 1)
+++ src/test/org/codelutin/j2r/JNITest.java 2006-08-28 17:13:03 UTC (rev 2)
@@ -32,37 +32,81 @@
package org.codelutin.j2r;
+
+import static org.codelutin.j2r.TestConstants.*;
+
import junit.framework.TestCase;
public class JNITest extends TestCase {
- private REngine engine;
+ private REngine engine;
@Override
protected void setUp() throws Exception {
+ LutinTimer init = new LutinTimer();
+ init.startTiming();
System.setProperty("R.type", "jni");
if (engine == null) {
engine = new RProxy();
}
+ System.err.println("jni init: " + init.endTiming() + "ms");
}
@Override
protected void tearDown() throws Exception {
engine.terminate();
}
+//
+// public void testDouble() throws Exception {
+// assertEquals(5.0, engine.eval("5.0"));
+// }
+//
+// public void testIntArray() throws Exception {
+// Object result = engine.eval("5:10");
+// assertEquals(int[].class, result.getClass());
+// int[] intArray = (int[])result;
+// assertEquals(6, intArray.length);
+// for (int i=5; i<11; i++) {
+// assertEquals(i, intArray[i-5]);
+// }
+// }
- public void testDouble() throws Exception {
- assertEquals(5.0, engine.eval("5.0"));
- }
+ public void testSimpleOp() throws Exception {
+ LutinTimer t = new LutinTimer();
+ for (int loop=0; loop<S_NB_LOOPS; loop++) {
+ engine.voidEval("t<-0");
+ t.startTiming();
+ engine.voidEval(S_OP);
+ t.endTiming();
+ System.err.println((Double)engine.eval("t"));
+ }
+ double[] results = t.computeResults();
+ System.err.println("min: " + results[0]);
+ System.err.println("avg: " + results[1]);
+ System.err.println("max: " + results[2]);
+ System.err.println("etype: " + results[3]);
+ }
- public void testIntArray() throws Exception {
- Object result = engine.eval("5:10");
- assertEquals(int[].class, result.getClass());
- int[] intArray = (int[])result;
- assertEquals(6, intArray.length);
- for (int i=5; i<11; i++) {
- assertEquals(i, intArray[i-5]);
- }
- }
+ public void testVector() throws Exception {
+ System.err.println(V_OP_R);
+ for (int loop=0; loop<V_NB_LOOPS; loop++) {
+ LutinTimer t = new LutinTimer();
+ t.startTiming();
+ engine.voidEval(V_OP_A);
+ engine.voidEval(V_OP_B);
+ double[] r = (double[])engine.eval(V_OP_AB);
+ long end = t.endTiming();
+ System.err.println("duration: " + end);
+ double sum = 0.0;
+ for (int i=0; i<r.length; i++) {
+ // if (i%10000==0) {
+ // System.err.println(r[i]);
+ // }
+ sum += r[i];
+ }
+// System.err.println("sum: " + sum);
+// System.err.println(r.length);
+ }
+ }
} //NetTest
Added: src/test/org/codelutin/j2r/JPurTest.java
===================================================================
--- src/test/org/codelutin/j2r/JPurTest.java 2006-08-23 16:14:42 UTC (rev 1)
+++ src/test/org/codelutin/j2r/JPurTest.java 2006-08-28 17:13:03 UTC (rev 2)
@@ -0,0 +1,89 @@
+/* *##%
+* Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+* Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+*
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*##%*/
+
+/* *
+* JPurTest.java
+*
+* Created: 25 ao�t 06
+*
+* @author Arnaud Thimel <thimel(a)codelutin.com>
+* @version $Revision: $
+*
+* Mise a jour: $Date: $
+* par : $Author: $
+*/
+
+package org.codelutin.j2r;
+
+import static org.codelutin.j2r.TestConstants.*;
+import junit.framework.TestCase;
+
+
+public class JPurTest extends TestCase {
+
+ public void testSimpleOp() throws Exception {
+ LutinTimer lt = new LutinTimer();
+ for (int loop=0; loop<S_NB_LOOPS; loop++) {
+ int t=0;
+ lt.startTiming();
+ while (t<S_T_MAX) {
+ t += 2;
+ t *= 2;
+ t /= 2;
+ }
+ lt.endTiming();
+ }
+ double[] results = lt.computeResults();
+ System.err.println("min: " + results[0]);
+ System.err.println("avg: " + results[1]);
+ System.err.println("max: " + results[2]);
+ System.err.println("etype: " + results[3]);
+ }
+
+ public void testVector() throws Exception {
+ for (int loop=0; loop<V_NB_LOOPS; loop++) {
+ LutinTimer lt = new LutinTimer();
+ lt.startTiming();
+ double[] a = new double[V_MAX];
+ double[] b = new double[V_MAX];
+ for (int i=0; i<a.length; i++) {
+ a[i] = (i + 0.5);
+ b[i] = ((V_MAX-0.5)-i);
+ }
+
+ double[] r = new double[V_MAX];
+ for (int i=0; i<a.length; i++) {
+ r[i] = a[i] * b[i];
+ }
+ long end = lt.endTiming();
+ System.err.println("duration: " + end);
+ double sum = 0.0;
+ for (int i=0; i<r.length; i++) {
+ // if (i%10000==0) {
+ // System.err.println(r[i]);
+ // }
+ sum += r[i];
+ }
+// System.err.println("sum: " + sum);
+// System.err.println(r.length);
+ }
+ }
+
+}
Added: src/test/org/codelutin/j2r/LutinTimer.java
===================================================================
--- src/test/org/codelutin/j2r/LutinTimer.java 2006-08-23 16:14:42 UTC (rev 1)
+++ src/test/org/codelutin/j2r/LutinTimer.java 2006-08-28 17:13:03 UTC (rev 2)
@@ -0,0 +1,112 @@
+/* *##%
+* Copyright (C) 2002, 2003, 2004, 2005 Code Lutin,
+* C�dric Pineau, Benjamin Poussin,
+*
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*##%*/
+
+/* *
+* Timer.java
+*
+* Created: 18 ao�t 2006
+*
+* @author Arnaud Thimel <thimel(a)codelutin.com>
+* @version $Revision: $
+*
+* Mise a jour: $Date: $
+* par : $Author: $
+*/
+
+package org.codelutin.j2r;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class LutinTimer {
+
+ private static Log log = LogFactory.getLog(LutinTimer.class);
+
+ private List<Long> times = new ArrayList<Long>();
+ private long currentStart = -1;
+
+ public void startTiming() {
+ currentStart = System.currentTimeMillis();
+ }
+
+ public long endTiming() {
+ if (currentStart == -1) {
+ System.err.println("Timer didn't start...");
+ return -1;
+ }
+ long end = System.currentTimeMillis();
+ long duration = end - currentStart;
+ currentStart = -1;
+ times.add(duration);
+ return duration;
+ }
+
+ public void markTiming() {
+ if (currentStart == -1) {
+ startTiming();
+ return;
+ }
+ long end = System.currentTimeMillis();
+ long duration = end - currentStart;
+ currentStart = end;
+ times.add(duration);
+ }
+
+ public void reset() {
+ currentStart = -1;
+ times.clear();
+ }
+
+ public double[] computeResults() {
+ if (times.size() == 0) {
+ System.err.println("To time saved");
+ return null;
+ }
+ long min = Long.MAX_VALUE;
+ long max = Long.MIN_VALUE;
+ long total = 0;
+ for (long time : times ){
+ if (time > max) {
+ max = time;
+ }
+ if (time < min) {
+ min = time;
+ }
+ total += time;
+ }
+ double avg = (((double)total) / times.size());
+ double etype = 0;
+ for (long time : times) {
+ etype += Math.pow(((double)time) - avg, 2);
+ }
+ etype /= times.size();
+ etype = Math.sqrt(etype);
+ double[] results = new double[4];
+ results[0] = min;
+ results[1] = avg;
+ results[2] = max;
+ results[3] = etype;
+ return results;
+ }
+
+} //Timer
Modified: src/test/org/codelutin/j2r/NetTest.java
===================================================================
--- src/test/org/codelutin/j2r/NetTest.java 2006-08-23 16:14:42 UTC (rev 1)
+++ src/test/org/codelutin/j2r/NetTest.java 2006-08-28 17:13:03 UTC (rev 2)
@@ -32,6 +32,8 @@
package org.codelutin.j2r;
+import static org.codelutin.j2r.TestConstants.*;
+
import junit.framework.TestCase;
public class NetTest extends TestCase {
@@ -40,24 +42,65 @@
@Override
protected void setUp() throws Exception {
+ LutinTimer init = new LutinTimer();
+ init.startTiming();
System.setProperty("R.type", "net");
if (engine == null) {
engine = new RProxy();
}
+ System.err.println("net init: " + init.endTiming() + "ms");
}
+//
+// public void testDouble() throws Exception {
+// assertEquals(5.0, engine.eval("5.0"));
+// }
+//
+// public void testIntArray() throws Exception {
+// Object result = engine.eval("5:10");
+// assertNotNull(result);
+// assertEquals(int[].class, result.getClass());
+// int[] intArray = (int[])result;
+// assertEquals(6, intArray.length);
+// for (int i=5; i<11; i++) {
+// assertEquals(i, intArray[i-5]);
+// }
+// }
- public void testDouble() throws Exception {
- assertEquals(5.0, engine.eval("5.0"));
- }
+ public void testSimpleOp() throws Exception {
+ LutinTimer t = new LutinTimer();
+ for (int loop=0; loop<S_NB_LOOPS; loop++) {
+ engine.voidEval("t<-0");
+ t.startTiming();
+ engine.voidEval(S_OP);
+ t.endTiming();
+ System.err.println((Double)engine.eval("t"));
+ }
+ double[] results = t.computeResults();
+ System.err.println("min: " + results[0]);
+ System.err.println("avg: " + results[1]);
+ System.err.println("max: " + results[2]);
+ System.err.println("etype: " + results[3]);
+ }
- public void testIntArray() throws Exception {
- Object result = engine.eval("5:10");
- assertEquals(int[].class, result.getClass());
- int[] intArray = (int[])result;
- assertEquals(6, intArray.length);
- for (int i=5; i<11; i++) {
- assertEquals(i, intArray[i-5]);
- }
- }
+ public void testVector() throws Exception {
+ for (int loop=0; loop<V_NB_LOOPS; loop++) {
+ LutinTimer t = new LutinTimer();
+ t.startTiming();
+ engine.voidEval(V_OP_A);
+ engine.voidEval(V_OP_B);
+ double[] r = (double[])engine.eval(V_OP_AB);
+ long end = t.endTiming();
+ System.err.println("duration: " + end);
+ double sum = 0.0;
+ for (int i=0; i<r.length; i++) {
+ // if (i%10000==0) {
+ // System.err.println(r[i]);
+ // }
+ sum += r[i];
+ }
+// System.err.println("sum: " + sum);
+// System.err.println(r.length);
+ }
+ }
} //NetTest
Added: src/test/org/codelutin/j2r/TestConstants.java
===================================================================
--- src/test/org/codelutin/j2r/TestConstants.java 2006-08-23 16:14:42 UTC (rev 1)
+++ src/test/org/codelutin/j2r/TestConstants.java 2006-08-28 17:13:03 UTC (rev 2)
@@ -0,0 +1,58 @@
+/* *##%
+* Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+* Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+*
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*##%*/
+
+/* *
+* TestConstants.java
+*
+* Created: 25 ao�t 06
+*
+* @author Arnaud Thimel <thimel(a)codelutin.com>
+* @version $Revision: $
+*
+* Mise a jour: $Date: $
+* par : $Author: $
+*/
+
+package org.codelutin.j2r;
+
+public class TestConstants {
+
+ /*
+ * Constants for simple operations
+ */
+ public static final int S_T_MAX = 100000;
+
+ public static final String S_OP = "while (t<" + S_T_MAX + ") {t<-t+2; t<-t*2; t<-t/2;}";
+
+ public static final int S_NB_LOOPS = 5;
+
+ /*
+ * Constants for volumetric operations
+ */
+ public static final int V_MAX = 50000;
+
+ public static final String V_OP_A = "a<-0.5:"+(V_MAX-0.5);
+ public static final String V_OP_B = "b<-"+(V_MAX-0.5)+":0.5";
+ public static final String V_OP_AB = "r<-a*b";
+ public static final String V_OP_R = V_OP_A + "; " + V_OP_B + "; " + V_OP_AB;
+
+ public static final int V_NB_LOOPS = 10;
+
+} //TestConstants
1
0
23 Aug '06
Author: thimel
Date: 2006-08-23 16:14:42 +0000 (Wed, 23 Aug 2006)
New Revision: 1
Added:
.build Lutin utilities library.launch
.classpath
.cvsignore
.project
.settings/
.settings/org.eclipse.jdt.core.prefs
LICENSE.txt
pom.xml
profiles.xml
site/
site/site.xml
src/
src/java/
src/java/org/
src/java/org/codelutin/
src/java/org/codelutin/j2r/
src/java/org/codelutin/j2r/REngine.java
src/java/org/codelutin/j2r/RException.java
src/java/org/codelutin/j2r/RProxy.java
src/java/org/codelutin/j2r/jni/
src/java/org/codelutin/j2r/jni/RJniEngine.java
src/java/org/codelutin/j2r/net/
src/java/org/codelutin/j2r/net/RNetEngine.java
src/resources/
src/resources/libjri.so
src/resources/log4j.properties
src/test/
src/test/org/
src/test/org/codelutin/
src/test/org/codelutin/j2r/
src/test/org/codelutin/j2r/JNITest.java
src/test/org/codelutin/j2r/NetTest.java
target/
target/classes/
target/classes/libjri.so
target/classes/log4j.properties
target/classes/org/
target/classes/org/codelutin/
target/classes/org/codelutin/j2r/
target/classes/org/codelutin/j2r/REngine.class
target/classes/org/codelutin/j2r/RException.class
target/classes/org/codelutin/j2r/RProxy.class
target/classes/org/codelutin/j2r/jni/
target/classes/org/codelutin/j2r/jni/RJniEngine.class
target/classes/org/codelutin/j2r/net/
target/classes/org/codelutin/j2r/net/RNetEngine.class
target/test-classes/
target/test-classes/org/
target/test-classes/org/codelutin/
target/test-classes/org/codelutin/j2r/
target/test-classes/org/codelutin/j2r/JNITest.class
target/test-classes/org/codelutin/j2r/NetTest.class
Log:
Ajout initial sur le repository
Added: .build Lutin utilities library.launch
===================================================================
--- .build Lutin utilities library.launch 2006-08-22 17:21:04 UTC (rev 0)
+++ .build Lutin utilities library.launch 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="jar"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_REFRESH_SCOPE" value="${project}"/>
+<stringAttribute key="org.eclipse.debug.ui.target_debug_perspective" value="perspective_default"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/Lutin utilities library}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/opt/maven/bin/maven"/>
+<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
+<stringAttribute key="org.eclipse.debug.ui.target_run_perspective" value="perspective_default"/>
+</launchConfiguration>
Added: .classpath
===================================================================
--- .classpath 2006-08-22 17:21:04 UTC (rev 0)
+++ .classpath 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/java"/>
+ <classpathentry kind="src" path="src/resources"/>
+ <classpathentry output="target/test-classes" kind="src" path="src/test"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/logkit/logkit/1.0.1/logkit-1.0.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/externallib/JRI/0.2-4/JRI-0.2-4-cl.jar"/>
+ <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/javax/servlet/servlet-api/2.3/servlet-api-2.3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/externallib/JRclient/RE817/JRclient-RE817.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.12/log4j-1.2.12.jar"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
Added: .cvsignore
===================================================================
--- .cvsignore 2006-08-22 17:21:04 UTC (rev 0)
+++ .cvsignore 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,3 @@
+maven.log
+target
+velocity.log
Added: .project
===================================================================
--- .project 2006-08-22 17:21:04 UTC (rev 0)
+++ .project 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,15 @@
+<projectDescription>
+ <name>lutinj2r</name>
+ <comment>Librairie permettant d'utiliser R en Java, que ce soit par
+le Network ou en JNI.</comment>
+ <projects/>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments/>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
\ No newline at end of file
Added: .settings/org.eclipse.jdt.core.prefs
===================================================================
--- .settings/org.eclipse.jdt.core.prefs 2006-08-22 17:21:04 UTC (rev 0)
+++ .settings/org.eclipse.jdt.core.prefs 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,5 @@
+#Wed Aug 23 15:47:28 CEST 2006
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
Added: LICENSE.txt
===================================================================
--- LICENSE.txt 2006-08-22 17:21:04 UTC (rev 0)
+++ LICENSE.txt 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,280 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
Added: pom.xml
===================================================================
--- pom.xml 2006-08-22 17:21:04 UTC (rev 0)
+++ pom.xml 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <!--The version of maven's project object model-->
+ <modelVersion>4.0.0</modelVersion>
+
+ <!--lutinproject.xml-->
+ <parent>
+ <groupId>lutinlib</groupId>
+ <artifactId>lutinproject</artifactId>
+ <version>2.0</version>
+ </parent>
+
+ <!--A unique name for this project-->
+ <artifactId>lutinj2r</artifactId>
+ <name>Lutin Java-2-R library</name>
+
+ <!--ejb, jar, war...-->
+ <packaging>jar</packaging>
+
+ <!--Version-->
+ <version>0.1</version>
+
+ <!--Description-->
+ <description>
+ Librairie permettant d'utiliser R en Java, que ce soit par
+le Network ou en JNI.
+ </description>
+ <inceptionYear>2006</inceptionYear>
+
+ <!--Tracking-->
+ <issueManagement>
+ <url>http://labs.libre-entreprise.org/tracker/?group_id=109</url>
+ </issueManagement>
+
+ <!--Librairies-->
+ <dependencies>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.1</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>externallib</groupId>
+ <artifactId>JRclient</artifactId>
+ <version>RE817</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>externallib</groupId>
+ <artifactId>JRI</artifactId>
+ <version>0.2-4</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+</project>
Added: profiles.xml
===================================================================
--- profiles.xml 2006-08-22 17:21:04 UTC (rev 0)
+++ profiles.xml 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<settings>
+ <profiles>
+ <profile>
+ <id>project</id>
+
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+
+ <properties>
+ <!--Source base dir-->
+ <maven.src.dir>${basedir}/src</maven.src.dir>
+
+ <!--Test-->
+ <maven.test.skip>true</maven.test.skip>
+
+ <!--Compile with ?-->
+ <maven.compile.source>1.5</maven.compile.source>
+ <maven.compile.target>1.5</maven.compile.target>
+
+ <!--Main class in JAR -->
+ <maven.jar.main.class>org.codelutin.j2r.RProxy</maven.jar.main.class>
+ </properties>
+ </profile>
+ </profiles>
+</settings>
Added: site/site.xml
===================================================================
--- site/site.xml 2006-08-22 17:21:04 UTC (rev 0)
+++ site/site.xml 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<project name="LutinJ2R">
+
+ <bannerLeft>
+ <name>LutinJ2R</name>
+ </bannerLeft>
+
+ <bannerRight>
+ <src>http://www.codelutin.com/images/lutinorange-codelutin.png</src>
+ <href>http://www.codelutin.com</href>
+ </bannerRight>
+
+ <body>
+ <links>
+ <item name="Labs" href="http://labs.libre-entreprise.org/"/>
+ <item name="Code Lutin" href="http://www.codelutin.com/"/>
+ </links>
+
+ ${reports}
+
+ <menu name="Utilisateur">
+ <item href="http://lutinbuilder.labs.libre-entreprise.org/maven2/lutinlib/lutinutil/" name="Téléchargement"/>
+ </menu>
+
+ <menu name="Developpeur">
+ <item name="Todo" href="Todo.html"/>
+ </menu>
+
+ </body>
+</project>
Added: src/java/org/codelutin/j2r/REngine.java
===================================================================
--- src/java/org/codelutin/j2r/REngine.java 2006-08-22 17:21:04 UTC (rev 0)
+++ src/java/org/codelutin/j2r/REngine.java 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,51 @@
+/* *##%
+* Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+* Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+*
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*##%*/
+
+/* *
+* RInterface.java
+*
+* Created: 21 aout 2006
+*
+* @author Arnaud Thimel <thimel(a)codelutin.com>
+* @version $Revision: $
+*
+* Mise a jour: $Date: $
+* par : $Author: $
+*/
+
+package org.codelutin.j2r;
+
+/**
+ *
+ */
+public interface REngine {
+
+ public boolean init();
+
+ /**
+ * Delegue a R le traitement passe en parametre.
+ * @param expr l'expression a evaluer
+ * @return La valeur renvoyee par la commande
+ */
+ public Object eval(String expr) throws RException;
+
+ public void terminate() throws RException;
+
+} //RJniEngine
Added: src/java/org/codelutin/j2r/RException.java
===================================================================
--- src/java/org/codelutin/j2r/RException.java 2006-08-22 17:21:04 UTC (rev 0)
+++ src/java/org/codelutin/j2r/RException.java 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,73 @@
+/* *##%
+* Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+* Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+*
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*##%*/
+
+/* *
+* RException.java
+*
+* Created: 22 ao�t 06
+*
+* @author Arnaud Thimel <thimel(a)codelutin.com>
+* @version $Revision: $
+*
+* Mise a jour: $Date: $
+* par : $Author: $
+*/
+
+package org.codelutin.j2r;
+
+/**
+ * Exception levee lorsqu'une erreur est intervenue pendant la communication
+ * avec R (quelque soit le mode de communication).
+ */
+public class RException extends Exception {
+
+ /**
+ * Constructeur de l'exception.
+ */
+ public RException() {
+ super();
+ }
+
+ /**
+ * Constructeur de l'exception.
+ * @param message texte decrivant l'exception
+ */
+ public RException(String message) {
+ super(message);
+ }
+
+ /**
+ * Constructeur de l'exception.
+ * @param cause l'instance de Throwable qui a declenche cette exception
+ */
+ public RException(Throwable cause) {
+ super(cause);
+ }
+
+ /**
+ * Constructeur de l'exception.
+ * @param message texte decrivant l'exception
+ * @param cause l'instance de Throwable qui a declenche cette exception
+ */
+ public RException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+} //RException
Added: src/java/org/codelutin/j2r/RProxy.java
===================================================================
--- src/java/org/codelutin/j2r/RProxy.java 2006-08-22 17:21:04 UTC (rev 0)
+++ src/java/org/codelutin/j2r/RProxy.java 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,138 @@
+/* *##%
+* Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+* Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+*
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*##%*/
+
+/* *
+* RProxy.java
+*
+* Created: 21 aout 2006
+*
+* @author Arnaud Thimel <thimel(a)codelutin.com>
+* @version $Revision: $
+*
+* Mise a jour: $Date: $
+* par : $Author: $
+*/
+
+package org.codelutin.j2r;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codelutin.j2r.jni.RJniEngine;
+import org.codelutin.j2r.net.RNetEngine;
+
+/**
+ *
+ */
+public class RProxy implements REngine {
+
+ private Log log = LogFactory.getLog(RProxy.class);
+
+ private REngine engine;
+
+ public RProxy() {
+ init();
+ }
+
+ private boolean init(String RType) {
+ boolean initSucceded = false;
+ if ("net".equalsIgnoreCase(RType)) {
+ initSucceded = initOnNet();
+ if (!initSucceded) {
+ if (log.isErrorEnabled()) {
+ log.error("Initialization of R with Network failed, trying JNI");
+ }
+ initSucceded = initOnJNI();
+ }
+ } else if ("jni".equalsIgnoreCase(RType)) {
+ initSucceded = initOnJNI();
+ if (!initSucceded) {
+ if (log.isErrorEnabled()) {
+ log.error("Initialization of R over JNI failed, trying with Network");
+ }
+ initSucceded = initOnNet();
+ }
+ } else if (log.isErrorEnabled()) {
+ log.error("Invalid type specified : " + RType);
+ }
+ return initSucceded;
+ }
+
+ private boolean initOnJNI() {
+ if (log.isInfoEnabled()) {
+ log.info("Trying to initialize the R Proxy over JNI");
+ }
+ RJniEngine newEngine = new RJniEngine();
+ if (newEngine.init()) {
+ engine = newEngine;
+ return true;
+ }
+ return false;
+ }
+
+ private boolean initOnNet() {
+ if (log.isInfoEnabled()) {
+ log.info("Trying to initialize the R Proxy with Network");
+ }
+ RNetEngine newEngine = new RNetEngine();
+ if (newEngine.init()) {
+ engine = newEngine;
+ return true;
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.codelutin.R.REngine#eval(java.lang.String)
+ */
+ public Object eval(String expr) throws RException {
+ if (engine == null) {
+ log.fatal("The R Proxy is not initialized. An error probably " +
+ "occured during the initialization.");
+ return null;
+ }
+ return engine.eval(expr);
+ }
+
+ public boolean init() {
+ String RType = System.getProperty("R.type");
+ if (RType == null || "".equals(RType)) {
+ log.warn("No R type specified.\nusage:\n\tjava -DR.type=net ...\n" +
+ "or\n\tjava -DR.type=jni ...\n\nConsidering network type");
+ RType = "net";
+ }
+ if (!init(RType)) {
+ if (log.isFatalEnabled()) {
+ log.fatal("The initializaing of R failed.");
+ }
+ return false;
+ }
+ return true;
+ }
+
+ public void terminate() throws RException {
+ if (engine == null) {
+ log.fatal("The R Proxy is not initialized. An error probably " +
+ "occured during the initialization.");
+ } else {
+ engine.terminate();
+ }
+ }
+
+} //RProxy
Added: src/java/org/codelutin/j2r/jni/RJniEngine.java
===================================================================
--- src/java/org/codelutin/j2r/jni/RJniEngine.java 2006-08-22 17:21:04 UTC (rev 0)
+++ src/java/org/codelutin/j2r/jni/RJniEngine.java 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,122 @@
+/* *##%
+ * Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+ * Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *##%*/
+
+/* *
+ * RJniEngine.java
+ *
+ * Created: 22 aout 2006
+ *
+ * @author Arnaud Thimel <thimel(a)codelutin.com>
+ * @version $Revision: $
+ *
+ * Mise a jour: $Date: $
+ * par : $Author: $
+ */
+
+package org.codelutin.j2r.jni;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codelutin.j2r.REngine;
+import org.codelutin.j2r.RException;
+import org.rosuda.JRI.REXP;
+import org.rosuda.JRI.Rengine;
+
+/**
+ *
+ */
+public class RJniEngine implements REngine {
+
+ private Log log = LogFactory.getLog(RJniEngine.class);
+
+ private Rengine engine;
+
+ /* (non-Javadoc)
+ * @see org.codelutin.j2r.REngine#init()
+ */
+ public boolean init() {
+ String[] args = { "--no-save" };
+ engine = new Rengine(args, false, null);
+ if (!engine.waitForR()) {
+ if (log.isErrorEnabled()) {
+ log.error("Cannot load the R engine");
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.codelutin.R.REngine#eval(java.lang.String)
+ */
+ public Object eval(String expr) throws RException {
+ REXP result = null;
+ try {
+ result = engine.eval(expr);
+ } catch (Exception eee) {
+ throw new RException("Unable to evaluate the R expression "
+ + "over JNI", eee);
+ }
+ return convertResult(result);
+ }
+
+ private Object convertResult(REXP rexp) {
+ if (log.isDebugEnabled()) {
+ log.debug("Converting : " + rexp.toString());
+ }
+ int type = rexp.xt;
+ Object result = null;
+ switch (type) {
+ case REXP.XT_STR:
+ result = rexp.asString();
+ break;
+ case REXP.XT_DOUBLEARRAY:
+ result = rexp.asDoubleArray();
+ double[] doublearray = (double[]) result;
+ if (doublearray.length == 1) {
+ result = doublearray[0];
+ }
+ break;
+ case REXP.XT_INTARRAY:
+ result = rexp.asIntArray();
+ int[] intarray = (int[]) result;
+ if (intarray.length == 1) {
+ result = intarray[0];
+ }
+ break;
+ default:
+ log.error("Unknown return type [" + type + "] " +
+ "on : " + rexp.toString());
+ }
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.codelutin.j2r.REngine#terminate()
+ */
+ public void terminate() {
+ if (engine.isAlive()) {
+ engine.end();
+ }
+ }
+
+} // RJniEngine
Added: src/java/org/codelutin/j2r/net/RNetEngine.java
===================================================================
--- src/java/org/codelutin/j2r/net/RNetEngine.java 2006-08-22 17:21:04 UTC (rev 0)
+++ src/java/org/codelutin/j2r/net/RNetEngine.java 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,131 @@
+/* *##%
+* Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+* Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+*
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*##%*/
+
+/* *
+* RNetEngine.java
+*
+* Created: 22 ao�t 06
+*
+* @author Arnaud Thimel <thimel(a)codelutin.com>
+* @version $Revision: $
+*
+* Mise a jour: $Date: $
+* par : $Author: $
+*/
+
+package org.codelutin.j2r.net;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codelutin.j2r.REngine;
+import org.codelutin.j2r.RException;
+import org.rosuda.JRclient.REXP;
+import org.rosuda.JRclient.RSrvException;
+import org.rosuda.JRclient.Rconnection;
+
+/**
+ *
+ */
+public class RNetEngine implements REngine {
+
+ private Log log = LogFactory.getLog(RNetEngine.class);
+
+ private Rconnection conn;
+
+ public boolean init() {
+ return init("127.0.0.1");
+ }
+
+ public boolean init(String host) {
+ return init(host, 6311);
+ }
+
+ public boolean init(String host, int port) {
+ try {
+ conn = new Rconnection(host, port);
+ } catch (RSrvException e) {
+ e.printStackTrace();
+ }
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.codelutin.R.REngine#eval(java.lang.String)
+ */
+ public Object eval(String expr) throws RException {
+ REXP result = null;
+ try {
+ result = conn.eval(expr);
+ } catch (RSrvException e) {
+ throw new RException("An error occured during the eval method", e);
+ }
+ return convertResult(result);
+ }
+
+ private Object convertResult(REXP rexp) {
+ if (log.isDebugEnabled()) {
+ log.debug("Converting : " + rexp.toString());
+ }
+ int type = rexp.getType();
+ Object result = null;
+ switch (type) {
+ case REXP.XT_BOOL:
+ result = rexp.asBool().isTRUE();
+ break;
+ case REXP.XT_STR:
+ result = rexp.asString();
+ break;
+ case REXP.XT_DOUBLE:
+ result = rexp.asDouble();
+ break;
+ case REXP.XT_INT:
+ result = rexp.asInt();
+ break;
+ case REXP.XT_ARRAY_DOUBLE:
+ result = rexp.asDoubleArray();
+ double[] doublearray = (double[])result;
+ if (doublearray.length == 1) {
+ result = doublearray[0];
+ }
+ break;
+ case REXP.XT_ARRAY_INT:
+ result = rexp.asIntArray();
+ int[] intarray = (int[])result;
+ if (intarray.length == 1) {
+ result = intarray[0];
+ }
+ break;
+ default:
+ log.error("Unknown return type [" + type + "] " +
+ "on : " + rexp.toString());
+ }
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.codelutin.j2r.REngine#terminate()
+ */
+ public void terminate() throws RException {
+ if (conn.isConnected()) {
+ conn.close();
+ }
+ }
+
+} //RNetEngine
Added: src/resources/libjri.so
===================================================================
(Binary files differ)
Property changes on: src/resources/libjri.so
___________________________________________________________________
Name: svn:executable
+
Name: svn:mime-type
+ application/octet-stream
Added: src/resources/log4j.properties
===================================================================
--- src/resources/log4j.properties 2006-08-22 17:21:04 UTC (rev 0)
+++ src/resources/log4j.properties 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,8 @@
+# Global logging configuration
+log4j.rootLogger=INFO, stdout
+# Console output...
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) %M - %m%n
+# package level
+log4j.logger.org.codelutin.j2r=INFO
Added: src/test/org/codelutin/j2r/JNITest.java
===================================================================
--- src/test/org/codelutin/j2r/JNITest.java 2006-08-22 17:21:04 UTC (rev 0)
+++ src/test/org/codelutin/j2r/JNITest.java 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,68 @@
+/* *##%
+* Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+* Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+*
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*##%*/
+
+/* *
+* NetTest.java
+*
+* Created: 23 août 06
+*
+* @author Arnaud Thimel <thimel(a)codelutin.com>
+* @version $Revision: $
+*
+* Mise a jour: $Date: $
+* par : $Author: $
+*/
+
+package org.codelutin.j2r;
+
+import junit.framework.TestCase;
+
+public class JNITest extends TestCase {
+
+ private REngine engine;
+
+ @Override
+ protected void setUp() throws Exception {
+ System.setProperty("R.type", "jni");
+ if (engine == null) {
+ engine = new RProxy();
+ }
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ engine.terminate();
+ }
+
+ public void testDouble() throws Exception {
+ assertEquals(5.0, engine.eval("5.0"));
+ }
+
+ public void testIntArray() throws Exception {
+ Object result = engine.eval("5:10");
+ assertEquals(int[].class, result.getClass());
+ int[] intArray = (int[])result;
+ assertEquals(6, intArray.length);
+ for (int i=5; i<11; i++) {
+ assertEquals(i, intArray[i-5]);
+ }
+ }
+
+} //NetTest
Added: src/test/org/codelutin/j2r/NetTest.java
===================================================================
--- src/test/org/codelutin/j2r/NetTest.java 2006-08-22 17:21:04 UTC (rev 0)
+++ src/test/org/codelutin/j2r/NetTest.java 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,63 @@
+/* *##%
+* Copyright (C) 2002, 2003, 2004, 2005, 2006 Code Lutin,
+* Cedric Pineau, Benjamin Poussin, Arnaud Thimel
+*
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*##%*/
+
+/* *
+* NetTest.java
+*
+* Created: 23 août 06
+*
+* @author Arnaud Thimel <thimel(a)codelutin.com>
+* @version $Revision: $
+*
+* Mise a jour: $Date: $
+* par : $Author: $
+*/
+
+package org.codelutin.j2r;
+
+import junit.framework.TestCase;
+
+public class NetTest extends TestCase {
+
+ private REngine engine;
+
+ @Override
+ protected void setUp() throws Exception {
+ System.setProperty("R.type", "net");
+ if (engine == null) {
+ engine = new RProxy();
+ }
+ }
+
+ public void testDouble() throws Exception {
+ assertEquals(5.0, engine.eval("5.0"));
+ }
+
+ public void testIntArray() throws Exception {
+ Object result = engine.eval("5:10");
+ assertEquals(int[].class, result.getClass());
+ int[] intArray = (int[])result;
+ assertEquals(6, intArray.length);
+ for (int i=5; i<11; i++) {
+ assertEquals(i, intArray[i-5]);
+ }
+ }
+
+} //NetTest
Added: target/classes/libjri.so
===================================================================
(Binary files differ)
Property changes on: target/classes/libjri.so
___________________________________________________________________
Name: svn:executable
+
Name: svn:mime-type
+ application/octet-stream
Added: target/classes/log4j.properties
===================================================================
--- target/classes/log4j.properties 2006-08-22 17:21:04 UTC (rev 0)
+++ target/classes/log4j.properties 2006-08-23 16:14:42 UTC (rev 1)
@@ -0,0 +1,8 @@
+# Global logging configuration
+log4j.rootLogger=INFO, stdout
+# Console output...
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) %M - %m%n
+# package level
+log4j.logger.org.codelutin.j2r=INFO
Added: target/classes/org/codelutin/j2r/REngine.class
===================================================================
(Binary files differ)
Property changes on: target/classes/org/codelutin/j2r/REngine.class
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: target/classes/org/codelutin/j2r/RException.class
===================================================================
(Binary files differ)
Property changes on: target/classes/org/codelutin/j2r/RException.class
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: target/classes/org/codelutin/j2r/RProxy.class
===================================================================
(Binary files differ)
Property changes on: target/classes/org/codelutin/j2r/RProxy.class
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: target/classes/org/codelutin/j2r/jni/RJniEngine.class
===================================================================
(Binary files differ)
Property changes on: target/classes/org/codelutin/j2r/jni/RJniEngine.class
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: target/classes/org/codelutin/j2r/net/RNetEngine.class
===================================================================
(Binary files differ)
Property changes on: target/classes/org/codelutin/j2r/net/RNetEngine.class
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: target/test-classes/org/codelutin/j2r/JNITest.class
===================================================================
(Binary files differ)
Property changes on: target/test-classes/org/codelutin/j2r/JNITest.class
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: target/test-classes/org/codelutin/j2r/NetTest.class
===================================================================
(Binary files differ)
Property changes on: target/test-classes/org/codelutin/j2r/NetTest.class
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
1
0