From 4c66fea7342fa513bbec19d8461ea12e2fef30dc Mon Sep 17 00:00:00 2001 From: Giovanni Pelosi Date: Fri, 7 Apr 2023 12:53:39 +0200 Subject: [PATCH] F/2304 rpackage (#1) * r package refactor * commit dist ExtraTrees.jar * development.md --------- Co-authored-by: GC.Pelosi --- .Rbuildignore | 79 ++++++ .gitattributes | 39 +++ .gitignore | 157 +++++++++- R-skeleton/DESCRIPTION => DESCRIPTION | 0 R-skeleton/NAMESPACE => NAMESPACE | 14 +- {R-skeleton/R => R}/extraTrees.R | 8 +- {R-skeleton/R => R}/extraTrees.default.R | 0 {R-skeleton/R => R}/onLoad.R | 4 +- {R-skeleton/R => R}/predict.extraTrees.R | 0 {R-skeleton/R => R}/print.extraTrees.R | 0 {R-skeleton/R => R}/setMemory.R | 0 {R-skeleton/inst => inst}/CHANGELOG | 0 {R-skeleton/inst => inst}/CITATION | 0 inst/java/ExtraTrees.jar | Bin 0 -> 39523 bytes {R-skeleton/inst => inst}/tests/test-all.R | 0 .../tests/testthat/test-classification.r | 0 .../tests/testthat/test-multitask.r | 0 .../inst => inst}/tests/testthat/test-na.r | 0 .../tests/testthat/test-quantile.r | 0 .../tests/testthat/test-regression.r | 0 .../tests/testthat/test-sparse-input.r | 0 .../tests/testthat/test-weights.r | 0 {R-skeleton/man => man}/extraTrees.Rd | 0 {R-skeleton/man => man}/predict.extraTrees.Rd | 0 {R-skeleton/man => man}/prepareForSave.Rd | 0 {R-skeleton/man => man}/selectTrees.Rd | 0 {R-skeleton/man => man}/setJavaMemory.Rd | 42 +-- {R-skeleton/man => man}/toJavaCSMatrix.Rd | 0 {R-skeleton/man => man}/toJavaMatrix.Rd | 36 +-- {R-skeleton/man => man}/toJavaMatrix2D.Rd | 40 +-- {R-skeleton/man => man}/toRMatrix.Rd | 36 +-- maven-project/.gitignore | 12 + maven-project/LICENSE | 1 + maven-project/NOTICE | 1 + maven-project/R-skeleton/DESCRIPTION | 1 + maven-project/R-skeleton/NAMESPACE | 1 + maven-project/R-skeleton/R | 1 + maven-project/R-skeleton/inst | 1 + maven-project/R-skeleton/man | 1 + maven-project/R-skeleton/vignettes | 1 + .../R-test}/basic-MTclassification.R | 0 .../R-test}/basic-MTregression.R | 0 .../R-test}/basic-bagging-classification.R | 0 .../R-test}/basic-classification.R | 0 .../R-test}/basic-input-na-classification.R | 0 .../R-test}/basic-quantile-regression.R | 0 .../R-test}/basic-regression.R | 0 .../R-test}/basic-weighted-classification.R | 0 .../R-test}/basic-weighted-regression.R | 0 .../R-test}/data-set-regression.R | 0 {R-test => maven-project/R-test}/data-set.R | 0 .../R-test}/large-scale-large-dim.R | 0 .../R-test}/large-scale-test.R | 0 maven-project/README.md | 1 + maven-project/build.sh | 35 +++ build.xml => maven-project/build.xml | 0 maven-project/development.md | 1 + pom.xml => maven-project/pom.xml | 6 +- .../org/extratrees/AbstractBinaryTree.java | 0 .../java/org/extratrees/AbstractTrees.java | 0 .../main/java/org/extratrees/Aggregator.java | 0 .../main/java/org/extratrees/BinaryTree.java | 0 .../main/java/org/extratrees/ExtraTrees.java | 0 .../java/org/extratrees/FactorBinaryTree.java | 0 .../java/org/extratrees/FactorExtraTrees.java | 0 .../org/extratrees/QuantileBinaryTree.java | 0 .../org/extratrees/QuantileExtraTrees.java | 0 .../main/java/org/extratrees/QuickSelect.java | 0 .../java/org/extratrees/ShuffledIterator.java | 0 .../java/org/extratrees/TaskCutResult.java | 0 .../java/org/extratrees/data/Array2D.java | 0 .../org/extratrees/data/CSparseMatrix.java | 0 .../main/java/org/extratrees/data/Matrix.java | 0 .../main/java/org/extratrees/data/Row.java | 0 .../java/org/extratrees/AllFeatureTests.java | 0 .../java/org/extratrees/BenchmarkRange.java | 0 .../java/org/extratrees/BenchmarkTests.java | 0 .../java/org/extratrees/ExtraTreeTests.java | 0 .../test/java/org/extratrees/FactorTests.java | 0 .../java/org/extratrees/MultitaskTests.java | 0 .../test/java/org/extratrees/NATests.java | 0 .../java/org/extratrees/QuantileTests.java | 0 .../java/org/extratrees/QuickSelectTests.java | 0 .../org/extratrees/SerializationTests.java | 0 .../java/org/extratrees/SetSeedTests.java | 0 .../java/org/extratrees/ShuffleTests.java | 0 .../java/org/extratrees/SparseMartixTest.java | 0 .../test/java/org/extratrees/SubsetTests.java | 0 .../src}/test/java/org/extratrees/Timer.java | 0 .../vignettes => vignettes}/extraTrees.Rnw | 268 +++++++++--------- 90 files changed, 549 insertions(+), 237 deletions(-) create mode 100644 .Rbuildignore create mode 100644 .gitattributes rename R-skeleton/DESCRIPTION => DESCRIPTION (100%) rename R-skeleton/NAMESPACE => NAMESPACE (97%) rename {R-skeleton/R => R}/extraTrees.R (93%) rename {R-skeleton/R => R}/extraTrees.default.R (100%) rename {R-skeleton/R => R}/onLoad.R (97%) rename {R-skeleton/R => R}/predict.extraTrees.R (100%) rename {R-skeleton/R => R}/print.extraTrees.R (100%) rename {R-skeleton/R => R}/setMemory.R (100%) rename {R-skeleton/inst => inst}/CHANGELOG (100%) rename {R-skeleton/inst => inst}/CITATION (100%) create mode 100644 inst/java/ExtraTrees.jar rename {R-skeleton/inst => inst}/tests/test-all.R (100%) rename {R-skeleton/inst => inst}/tests/testthat/test-classification.r (100%) rename {R-skeleton/inst => inst}/tests/testthat/test-multitask.r (100%) rename {R-skeleton/inst => inst}/tests/testthat/test-na.r (100%) rename {R-skeleton/inst => inst}/tests/testthat/test-quantile.r (100%) rename {R-skeleton/inst => inst}/tests/testthat/test-regression.r (100%) rename {R-skeleton/inst => inst}/tests/testthat/test-sparse-input.r (100%) rename {R-skeleton/inst => inst}/tests/testthat/test-weights.r (100%) rename {R-skeleton/man => man}/extraTrees.Rd (100%) rename {R-skeleton/man => man}/predict.extraTrees.Rd (100%) rename {R-skeleton/man => man}/prepareForSave.Rd (100%) rename {R-skeleton/man => man}/selectTrees.Rd (100%) rename {R-skeleton/man => man}/setJavaMemory.Rd (96%) rename {R-skeleton/man => man}/toJavaCSMatrix.Rd (100%) rename {R-skeleton/man => man}/toJavaMatrix.Rd (96%) rename {R-skeleton/man => man}/toJavaMatrix2D.Rd (97%) rename {R-skeleton/man => man}/toRMatrix.Rd (96%) create mode 100644 maven-project/.gitignore create mode 120000 maven-project/LICENSE create mode 120000 maven-project/NOTICE create mode 120000 maven-project/R-skeleton/DESCRIPTION create mode 120000 maven-project/R-skeleton/NAMESPACE create mode 120000 maven-project/R-skeleton/R create mode 120000 maven-project/R-skeleton/inst create mode 120000 maven-project/R-skeleton/man create mode 120000 maven-project/R-skeleton/vignettes rename {R-test => maven-project/R-test}/basic-MTclassification.R (100%) rename {R-test => maven-project/R-test}/basic-MTregression.R (100%) rename {R-test => maven-project/R-test}/basic-bagging-classification.R (100%) rename {R-test => maven-project/R-test}/basic-classification.R (100%) rename {R-test => maven-project/R-test}/basic-input-na-classification.R (100%) rename {R-test => maven-project/R-test}/basic-quantile-regression.R (100%) rename {R-test => maven-project/R-test}/basic-regression.R (100%) rename {R-test => maven-project/R-test}/basic-weighted-classification.R (100%) rename {R-test => maven-project/R-test}/basic-weighted-regression.R (100%) rename {R-test => maven-project/R-test}/data-set-regression.R (100%) rename {R-test => maven-project/R-test}/data-set.R (100%) rename {R-test => maven-project/R-test}/large-scale-large-dim.R (100%) rename {R-test => maven-project/R-test}/large-scale-test.R (100%) create mode 120000 maven-project/README.md create mode 100755 maven-project/build.sh rename build.xml => maven-project/build.xml (100%) create mode 120000 maven-project/development.md rename pom.xml => maven-project/pom.xml (92%) rename {src => maven-project/src}/main/java/org/extratrees/AbstractBinaryTree.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/AbstractTrees.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/Aggregator.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/BinaryTree.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/ExtraTrees.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/FactorBinaryTree.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/FactorExtraTrees.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/QuantileBinaryTree.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/QuantileExtraTrees.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/QuickSelect.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/ShuffledIterator.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/TaskCutResult.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/data/Array2D.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/data/CSparseMatrix.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/data/Matrix.java (100%) rename {src => maven-project/src}/main/java/org/extratrees/data/Row.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/AllFeatureTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/BenchmarkRange.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/BenchmarkTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/ExtraTreeTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/FactorTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/MultitaskTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/NATests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/QuantileTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/QuickSelectTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/SerializationTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/SetSeedTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/ShuffleTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/SparseMartixTest.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/SubsetTests.java (100%) rename {src => maven-project/src}/test/java/org/extratrees/Timer.java (100%) rename {R-skeleton/vignettes => vignettes}/extraTrees.Rnw (97%) diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..95890d7 --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,79 @@ +^appveyor\.yml$ +^azure-pipelines\.yml$ +^bench$ +^.clangd$ +^codecov\.yml$ +^compile_commands.json$ +^CONDUCT\.md$ +^config\.yaml$ +^cran-comments\.md$ +^CRAN-RELEASE$ +^[^/]+.csv +^[^/]+.sh +^data-raw$ +^\.dir-locals\.el$ +^development.md$ +^doc$ +^docker$ +^.dockerignore.*$ +^docs$ +^etc$ +^\.github$ +^\.github/workflows/pkgdown\.yaml$ +^\.github/workflows/pr-commands\.yaml$ +^\.github/workflows/R-CMD-check\.yaml$ +^\.gitlab$ +^home$ +^\.httr-oauth$ +^inst/bench$ +^inst/db$ +^inst/extdata/ext$ +^inst/extdata/int$ +^inst/extdata/tmp$ +^inst/rcon$ +^Jenkinsfile.*$ +^LICENSE\.md$ +.*log$ +^logo\.png$ +^logs$ +^maven-project$ +^Makefile.*$ +^Makefile$ +^man-roxygen$ +^Meta$ +^\.mypy_cache$ +^notes$ +^pkgdown$ +^_pkgdown\.yml$ +^poetry\.lock$ +^Project\.toml$ +^pyproject\.toml$ +^\.python-version$ +^rcon$ +^renv$ +^renv\.lock$ +^.renvignore$ +^README-.*\.png$ +^README\.Rmd$ +^resources\.txt$ +^revdep$ +^Rplots.* +^.Rprofile$ +^\.\.Rcheck$ +^.*\.Rproj$ +^\.Rproj\.user$ +^sanitize\.sh$ +^script\.R$ +^setup\.cfg$ +^setup\.py$ +^src/\.clang-format$ +^src/\.ycm_extra_conf\.pyc?$ +^TAGS$ +^_targets$ +^_targets\.R$ +^temp$ +^travis$ +^travis/check_format\.sh$ +^\.travis\.yml$ +^vignettes/rsconnect$ +^.vimrc$ diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0ce825c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,39 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto eol=lf + +*.sh text eol=lf +*.bat text eol=crlf +*.cmd text eol=crlf +pom.xml text eol=lf +*.java text eol=lf +*.scala text eol=lf +*.xml text eol=lf +*.properties text eol=lf + +# Denote all files that are truly binary and should not be modified. +*.gpg binary +*.png binary +*.jpg binary +*.gif binary +*.jpeg binary +*.zip binary +*.phar binary +*.ttf binary +*.woff binary +*.woff2 binary +*.eot binary +*.ico binary +*.mo binary +*.pdf binary +*.xsd binary +*.ts binary +*.exe binary + +*.pt binary +*.pickle binary + +*.docx binary +*.xslx binary +*.pptx binary +/NEWS.md merge=union +/.Rbuildignore merge=union diff --git a/.gitignore b/.gitignore index 89ae616..78add95 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,149 @@ -/build -/.classpath -/.project -/.settings -/target +**/.settings/ +**/.classpath +**/.project +**/.metadata +#**/bin/ +**/*.2delete +**/target/ +**/build/ +*.egg-info +.idea/ +*.iml +*.eml + + +# Ignore all dotfiles... +#.* + +.#* + + + + +# except for .gitignore +!.gitignore +!.gitattributes + +!.dockerignore +!.travis.yml + + +!.python-version + + +# python +venv/ + + +################### +# Compiled source # +################### +*.com +*.class +docs +/src/*.o +/src/*.o-* +/src/*.d +/src/*.so + +*.dll +*.exe +*.o +*.so + + +############ +# setup.py # +############ + +/build/ +/dist/ + +*.pyc +*.egg +*.whl + +*.egg-info/ + +########## +# pytest # +########## + +/.pytest_cache/ + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso + +### *.jar + +*.rar +*.tar +#*.zip + +# Logs and databases # +###################### +*.log +*.tlog +*.sqlite +/logs/ + + +# OS generated files # +###################### +.DS_Store* +ehthumbs.db +Icon? +Thumbs.db + + +# general *~ + +# Eclipse +.settings +.project +.classpath + +# IDEA +/.idea +/.idea_modules + +# Sublime +*.sublime-project +*.sublime-workspace + +# SPARK +metastore_db/ +/doc/_build/ +*.~undo-tree~ +.RData +.Rproj.user +..Rcheck .Rhistory -*.class -# Package Files # -*.jar -*.war -*.ear +Rplots.* +inst/doc +.httr-oauth +vignettes/*.R +.DS_Store +/clion-test.R +/BROWSE +/GPATH +/GRTAGS +/GTAGS +/TAGS +/.dir-locals.el +.obsidian/ +/issues +/home +/logs +/temp +/.drake +bench-libs +doc +Meta diff --git a/R-skeleton/DESCRIPTION b/DESCRIPTION similarity index 100% rename from R-skeleton/DESCRIPTION rename to DESCRIPTION diff --git a/R-skeleton/NAMESPACE b/NAMESPACE similarity index 97% rename from R-skeleton/NAMESPACE rename to NAMESPACE index 0ce6687..0a34b4b 100644 --- a/R-skeleton/NAMESPACE +++ b/NAMESPACE @@ -1,7 +1,7 @@ -import("rJava") -export(extraTrees, toRMatrix, toJavaMatrix, toJavaCSMatrix, toJavaMatrix2D, selectTrees, setJavaMemory, prepareForSave) -S3method(predict, extraTrees) -S3method(print, extraTrees) -S3method(extraTrees, default) - - +import("rJava") +export(extraTrees, toRMatrix, toJavaMatrix, toJavaCSMatrix, toJavaMatrix2D, selectTrees, setJavaMemory, prepareForSave) +S3method(predict, extraTrees) +S3method(print, extraTrees) +S3method(extraTrees, default) + + diff --git a/R-skeleton/R/extraTrees.R b/R/extraTrees.R similarity index 93% rename from R-skeleton/R/extraTrees.R rename to R/extraTrees.R index 739a925..5c3d1c9 100644 --- a/R-skeleton/R/extraTrees.R +++ b/R/extraTrees.R @@ -1,4 +1,4 @@ -extraTrees <- function(x, ...) UseMethod("extraTrees", x) - - - +extraTrees <- function(x, ...) UseMethod("extraTrees", x) + + + diff --git a/R-skeleton/R/extraTrees.default.R b/R/extraTrees.default.R similarity index 100% rename from R-skeleton/R/extraTrees.default.R rename to R/extraTrees.default.R diff --git a/R-skeleton/R/onLoad.R b/R/onLoad.R similarity index 97% rename from R-skeleton/R/onLoad.R rename to R/onLoad.R index d848932..127e7d7 100644 --- a/R-skeleton/R/onLoad.R +++ b/R/onLoad.R @@ -1,3 +1,3 @@ -.onLoad <- function(libname, pkgname) { - .jpackage(pkgname, lib.loc = libname) +.onLoad <- function(libname, pkgname) { + .jpackage(pkgname, lib.loc = libname) } \ No newline at end of file diff --git a/R-skeleton/R/predict.extraTrees.R b/R/predict.extraTrees.R similarity index 100% rename from R-skeleton/R/predict.extraTrees.R rename to R/predict.extraTrees.R diff --git a/R-skeleton/R/print.extraTrees.R b/R/print.extraTrees.R similarity index 100% rename from R-skeleton/R/print.extraTrees.R rename to R/print.extraTrees.R diff --git a/R-skeleton/R/setMemory.R b/R/setMemory.R similarity index 100% rename from R-skeleton/R/setMemory.R rename to R/setMemory.R diff --git a/R-skeleton/inst/CHANGELOG b/inst/CHANGELOG similarity index 100% rename from R-skeleton/inst/CHANGELOG rename to inst/CHANGELOG diff --git a/R-skeleton/inst/CITATION b/inst/CITATION similarity index 100% rename from R-skeleton/inst/CITATION rename to inst/CITATION diff --git a/inst/java/ExtraTrees.jar b/inst/java/ExtraTrees.jar new file mode 100644 index 0000000000000000000000000000000000000000..509b1400fb11090b3045f0e4f758a64346a3219a GIT binary patch literal 39523 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 2.1 - 1.6 - 1.6 + 1.7 + 1.7 - \ No newline at end of file + diff --git a/src/main/java/org/extratrees/AbstractBinaryTree.java b/maven-project/src/main/java/org/extratrees/AbstractBinaryTree.java similarity index 100% rename from src/main/java/org/extratrees/AbstractBinaryTree.java rename to maven-project/src/main/java/org/extratrees/AbstractBinaryTree.java diff --git a/src/main/java/org/extratrees/AbstractTrees.java b/maven-project/src/main/java/org/extratrees/AbstractTrees.java similarity index 100% rename from src/main/java/org/extratrees/AbstractTrees.java rename to maven-project/src/main/java/org/extratrees/AbstractTrees.java diff --git a/src/main/java/org/extratrees/Aggregator.java b/maven-project/src/main/java/org/extratrees/Aggregator.java similarity index 100% rename from src/main/java/org/extratrees/Aggregator.java rename to maven-project/src/main/java/org/extratrees/Aggregator.java diff --git a/src/main/java/org/extratrees/BinaryTree.java b/maven-project/src/main/java/org/extratrees/BinaryTree.java similarity index 100% rename from src/main/java/org/extratrees/BinaryTree.java rename to maven-project/src/main/java/org/extratrees/BinaryTree.java diff --git a/src/main/java/org/extratrees/ExtraTrees.java b/maven-project/src/main/java/org/extratrees/ExtraTrees.java similarity index 100% rename from src/main/java/org/extratrees/ExtraTrees.java rename to maven-project/src/main/java/org/extratrees/ExtraTrees.java diff --git a/src/main/java/org/extratrees/FactorBinaryTree.java b/maven-project/src/main/java/org/extratrees/FactorBinaryTree.java similarity index 100% rename from src/main/java/org/extratrees/FactorBinaryTree.java rename to maven-project/src/main/java/org/extratrees/FactorBinaryTree.java diff --git a/src/main/java/org/extratrees/FactorExtraTrees.java b/maven-project/src/main/java/org/extratrees/FactorExtraTrees.java similarity index 100% rename from src/main/java/org/extratrees/FactorExtraTrees.java rename to maven-project/src/main/java/org/extratrees/FactorExtraTrees.java diff --git a/src/main/java/org/extratrees/QuantileBinaryTree.java b/maven-project/src/main/java/org/extratrees/QuantileBinaryTree.java similarity index 100% rename from src/main/java/org/extratrees/QuantileBinaryTree.java rename to maven-project/src/main/java/org/extratrees/QuantileBinaryTree.java diff --git a/src/main/java/org/extratrees/QuantileExtraTrees.java b/maven-project/src/main/java/org/extratrees/QuantileExtraTrees.java similarity index 100% rename from src/main/java/org/extratrees/QuantileExtraTrees.java rename to maven-project/src/main/java/org/extratrees/QuantileExtraTrees.java diff --git a/src/main/java/org/extratrees/QuickSelect.java b/maven-project/src/main/java/org/extratrees/QuickSelect.java similarity index 100% rename from src/main/java/org/extratrees/QuickSelect.java rename to maven-project/src/main/java/org/extratrees/QuickSelect.java diff --git a/src/main/java/org/extratrees/ShuffledIterator.java b/maven-project/src/main/java/org/extratrees/ShuffledIterator.java similarity index 100% rename from src/main/java/org/extratrees/ShuffledIterator.java rename to maven-project/src/main/java/org/extratrees/ShuffledIterator.java diff --git a/src/main/java/org/extratrees/TaskCutResult.java b/maven-project/src/main/java/org/extratrees/TaskCutResult.java similarity index 100% rename from src/main/java/org/extratrees/TaskCutResult.java rename to maven-project/src/main/java/org/extratrees/TaskCutResult.java diff --git a/src/main/java/org/extratrees/data/Array2D.java b/maven-project/src/main/java/org/extratrees/data/Array2D.java similarity index 100% rename from src/main/java/org/extratrees/data/Array2D.java rename to maven-project/src/main/java/org/extratrees/data/Array2D.java diff --git a/src/main/java/org/extratrees/data/CSparseMatrix.java b/maven-project/src/main/java/org/extratrees/data/CSparseMatrix.java similarity index 100% rename from src/main/java/org/extratrees/data/CSparseMatrix.java rename to maven-project/src/main/java/org/extratrees/data/CSparseMatrix.java diff --git a/src/main/java/org/extratrees/data/Matrix.java b/maven-project/src/main/java/org/extratrees/data/Matrix.java similarity index 100% rename from src/main/java/org/extratrees/data/Matrix.java rename to maven-project/src/main/java/org/extratrees/data/Matrix.java diff --git a/src/main/java/org/extratrees/data/Row.java b/maven-project/src/main/java/org/extratrees/data/Row.java similarity index 100% rename from src/main/java/org/extratrees/data/Row.java rename to maven-project/src/main/java/org/extratrees/data/Row.java diff --git a/src/test/java/org/extratrees/AllFeatureTests.java b/maven-project/src/test/java/org/extratrees/AllFeatureTests.java similarity index 100% rename from src/test/java/org/extratrees/AllFeatureTests.java rename to maven-project/src/test/java/org/extratrees/AllFeatureTests.java diff --git a/src/test/java/org/extratrees/BenchmarkRange.java b/maven-project/src/test/java/org/extratrees/BenchmarkRange.java similarity index 100% rename from src/test/java/org/extratrees/BenchmarkRange.java rename to maven-project/src/test/java/org/extratrees/BenchmarkRange.java diff --git a/src/test/java/org/extratrees/BenchmarkTests.java b/maven-project/src/test/java/org/extratrees/BenchmarkTests.java similarity index 100% rename from src/test/java/org/extratrees/BenchmarkTests.java rename to maven-project/src/test/java/org/extratrees/BenchmarkTests.java diff --git a/src/test/java/org/extratrees/ExtraTreeTests.java b/maven-project/src/test/java/org/extratrees/ExtraTreeTests.java similarity index 100% rename from src/test/java/org/extratrees/ExtraTreeTests.java rename to maven-project/src/test/java/org/extratrees/ExtraTreeTests.java diff --git a/src/test/java/org/extratrees/FactorTests.java b/maven-project/src/test/java/org/extratrees/FactorTests.java similarity index 100% rename from src/test/java/org/extratrees/FactorTests.java rename to maven-project/src/test/java/org/extratrees/FactorTests.java diff --git a/src/test/java/org/extratrees/MultitaskTests.java b/maven-project/src/test/java/org/extratrees/MultitaskTests.java similarity index 100% rename from src/test/java/org/extratrees/MultitaskTests.java rename to maven-project/src/test/java/org/extratrees/MultitaskTests.java diff --git a/src/test/java/org/extratrees/NATests.java b/maven-project/src/test/java/org/extratrees/NATests.java similarity index 100% rename from src/test/java/org/extratrees/NATests.java rename to maven-project/src/test/java/org/extratrees/NATests.java diff --git a/src/test/java/org/extratrees/QuantileTests.java b/maven-project/src/test/java/org/extratrees/QuantileTests.java similarity index 100% rename from src/test/java/org/extratrees/QuantileTests.java rename to maven-project/src/test/java/org/extratrees/QuantileTests.java diff --git a/src/test/java/org/extratrees/QuickSelectTests.java b/maven-project/src/test/java/org/extratrees/QuickSelectTests.java similarity index 100% rename from src/test/java/org/extratrees/QuickSelectTests.java rename to maven-project/src/test/java/org/extratrees/QuickSelectTests.java diff --git a/src/test/java/org/extratrees/SerializationTests.java b/maven-project/src/test/java/org/extratrees/SerializationTests.java similarity index 100% rename from src/test/java/org/extratrees/SerializationTests.java rename to maven-project/src/test/java/org/extratrees/SerializationTests.java diff --git a/src/test/java/org/extratrees/SetSeedTests.java b/maven-project/src/test/java/org/extratrees/SetSeedTests.java similarity index 100% rename from src/test/java/org/extratrees/SetSeedTests.java rename to maven-project/src/test/java/org/extratrees/SetSeedTests.java diff --git a/src/test/java/org/extratrees/ShuffleTests.java b/maven-project/src/test/java/org/extratrees/ShuffleTests.java similarity index 100% rename from src/test/java/org/extratrees/ShuffleTests.java rename to maven-project/src/test/java/org/extratrees/ShuffleTests.java diff --git a/src/test/java/org/extratrees/SparseMartixTest.java b/maven-project/src/test/java/org/extratrees/SparseMartixTest.java similarity index 100% rename from src/test/java/org/extratrees/SparseMartixTest.java rename to maven-project/src/test/java/org/extratrees/SparseMartixTest.java diff --git a/src/test/java/org/extratrees/SubsetTests.java b/maven-project/src/test/java/org/extratrees/SubsetTests.java similarity index 100% rename from src/test/java/org/extratrees/SubsetTests.java rename to maven-project/src/test/java/org/extratrees/SubsetTests.java diff --git a/src/test/java/org/extratrees/Timer.java b/maven-project/src/test/java/org/extratrees/Timer.java similarity index 100% rename from src/test/java/org/extratrees/Timer.java rename to maven-project/src/test/java/org/extratrees/Timer.java diff --git a/R-skeleton/vignettes/extraTrees.Rnw b/vignettes/extraTrees.Rnw similarity index 97% rename from R-skeleton/vignettes/extraTrees.Rnw rename to vignettes/extraTrees.Rnw index 54cd009..1e612aa 100644 --- a/R-skeleton/vignettes/extraTrees.Rnw +++ b/vignettes/extraTrees.Rnw @@ -1,134 +1,134 @@ -\documentclass[a4paper, 11pt]{article} -\usepackage[OT1]{fontenc} -\usepackage{url} -\usepackage{Sweave} -\begin{document} - -% \VignetteIndexEntry{extraTrees} - -\title{Package for ExtraTrees method for classification and regression} -\author{Jaak Simm and Ildefons Magrans de Abril} -\date{2013-10-05} - -\maketitle - -\tableofcontents - -\section{Introduction} - -This document provides detailed guidance on using the package \texttt{extraTrees}. - -\section{Training and predicting} - -Usage of \texttt{extraTrees} was made similar to \texttt{randomForest} package as -ExtraTrees (extremely randomized trees) method is similar RandomForest. The main -difference is that when at each node RandomForest chooses the best cutting threshold -for the feature, ExtraTrees instead chooses the cut (uniformly) randomly. Similarly to -RandomForest the feature with the biggest gain (or best score) is chosen after the cutting -threshold has been fixed. - -This package includes an extension to ExtraTrees that we found useful in some experiments: -instead of a single random cut we choose \textbf{several} random cuts for each feature. -This reduces the probability of making very poor cuts but still maintains the stochastic -cutting approach of ExtraTrees. Using more than one cut (e.g., 3-5 cuts) can improve -the accuracy, usually when the standard ExtraTrees performs worse than RandomTrees. - -A simple usage example is given in Figure \ref{fig:basic.example}. Try changing the value of numRandomCuts to 5 and see how the performance changes. For some data also the value of mtry (the number of chosen features at each node) should be increased. -\begin{figure} -\begin{verbatim} -library(extraTrees) -## train and test data: -n <- 1000 -p <- 10 -f <- function(x) { - (x[,1]>0.5) + 0.8*(x[,2]>0.6) + 0.5*(x[,3]>0.4) + 0.2*x[,5] + - 0.1*runif(nrow(x)) -} -x <- matrix(runif(n*p), n, p) -y <- as.numeric(f(x)) -xtest <- matrix(runif(n*p), n, p) -ytest <- f(xtest) - -## extraTrees: -et <- extraTrees(x, y, numRandomCuts=1) -yhat <- predict(et, xtest) -yerr <- mean( (ytest-yhat)^2 ) -print( sprintf("Squared error: %f", yerr) ) -\end{verbatim} -\caption{Example of using \texttt{extraTrees} with 1 cut (the default).} -\label{fig:basic.example} -\end{figure} - - -\paragraph{\texttt{METHODS}} - -There two main methods: -\begin{itemize} -\item \texttt{extraTrees} that does the training, -\item \texttt{predict} that does the prediction after the trees have been trained. -\end{itemize} - -For classification ExtraTrees at each node chooses the cut based on minimizing the Gini impurity index and for regression the variance. - - -\section{Large scale usage} -Although ExtraTrees is quite fast (about 10 faster than randomForest -on the same data and number of trees), there are cases when the -data set is still too big for the default setup. - -\subsection{Increasing allocated memory} -If your data has high number of data points and/or -high number of dimensions, then you can run out of Java memory. -This causes following error: -\begin{verbatim} - java.lang.OutOfMemoryError: Java heap space -\end{verbatim} -To solve that you need to increase the memory by supplying "-Xmx1g" for 1GB -or "-Xmx4g" for 4GB in R's Java options before loading \texttt{extraTrees}: -\begin{verbatim} - options( java.parameters = "-Xmx1g" ) - library(extraTrees) -\end{verbatim} -This is shown in the first lines of Figure \ref{fig:large.scale}. -Make sure your machine -has enough free memory available before you do that. - -\subsection{Using multiple cores} -Secondly, if the running time is too long you can use multi-core computation -by increasing the \texttt{numThreads} option (default is 1) in \texttt{extraTrees}. -This is shown the last lines in Figure \ref{fig:large.scale}. - -\begin{figure} -\begin{verbatim} -## To solve the problem give more memory to Java. -## Using 1GB Java memory for extraTrees (specified by 1g): -options( java.parameters = "-Xmx1g" ) -library(extraTrees) -## train and test data: -n <- 1000 -p <- 10 -f <- function(x) { - (x[,1]>0.5) + 0.8*(x[,2]>0.6) + 0.5*(x[,3]>0.4) + 0.2*x[,5] + - 0.1*runif(nrow(x)) -} -x <- matrix(runif(n*p), n, p) -y <- as.numeric(f(x)) -xtest <- matrix(runif(n*p), n, p) -ytest <- f(xtest) - -## extraTrees with 1 CPU thread (the default): -system.time({et <- extraTrees(x, y, numThreads=1)}) -## extraTrees with 2 CPU thread: -system.time({et <- extraTrees(x, y, numThreads=2)}) -\end{verbatim} -\caption{Example of how to use \texttt{extraTrees} in large scale settings.} -\label{fig:large.scale} -\end{figure} - - -%\section{Acknowledgements} - -%We would like thank Ildefons Magrans de Abril for suggesting -%making this R package. - -\end{document} +\documentclass[a4paper, 11pt]{article} +\usepackage[OT1]{fontenc} +\usepackage{url} +\usepackage{Sweave} +\begin{document} + +% \VignetteIndexEntry{extraTrees} + +\title{Package for ExtraTrees method for classification and regression} +\author{Jaak Simm and Ildefons Magrans de Abril} +\date{2013-10-05} + +\maketitle + +\tableofcontents + +\section{Introduction} + +This document provides detailed guidance on using the package \texttt{extraTrees}. + +\section{Training and predicting} + +Usage of \texttt{extraTrees} was made similar to \texttt{randomForest} package as +ExtraTrees (extremely randomized trees) method is similar RandomForest. The main +difference is that when at each node RandomForest chooses the best cutting threshold +for the feature, ExtraTrees instead chooses the cut (uniformly) randomly. Similarly to +RandomForest the feature with the biggest gain (or best score) is chosen after the cutting +threshold has been fixed. + +This package includes an extension to ExtraTrees that we found useful in some experiments: +instead of a single random cut we choose \textbf{several} random cuts for each feature. +This reduces the probability of making very poor cuts but still maintains the stochastic +cutting approach of ExtraTrees. Using more than one cut (e.g., 3-5 cuts) can improve +the accuracy, usually when the standard ExtraTrees performs worse than RandomTrees. + +A simple usage example is given in Figure \ref{fig:basic.example}. Try changing the value of numRandomCuts to 5 and see how the performance changes. For some data also the value of mtry (the number of chosen features at each node) should be increased. +\begin{figure} +\begin{verbatim} +library(extraTrees) +## train and test data: +n <- 1000 +p <- 10 +f <- function(x) { + (x[,1]>0.5) + 0.8*(x[,2]>0.6) + 0.5*(x[,3]>0.4) + 0.2*x[,5] + + 0.1*runif(nrow(x)) +} +x <- matrix(runif(n*p), n, p) +y <- as.numeric(f(x)) +xtest <- matrix(runif(n*p), n, p) +ytest <- f(xtest) + +## extraTrees: +et <- extraTrees(x, y, numRandomCuts=1) +yhat <- predict(et, xtest) +yerr <- mean( (ytest-yhat)^2 ) +print( sprintf("Squared error: %f", yerr) ) +\end{verbatim} +\caption{Example of using \texttt{extraTrees} with 1 cut (the default).} +\label{fig:basic.example} +\end{figure} + + +\paragraph{\texttt{METHODS}} + +There two main methods: +\begin{itemize} +\item \texttt{extraTrees} that does the training, +\item \texttt{predict} that does the prediction after the trees have been trained. +\end{itemize} + +For classification ExtraTrees at each node chooses the cut based on minimizing the Gini impurity index and for regression the variance. + + +\section{Large scale usage} +Although ExtraTrees is quite fast (about 10 faster than randomForest +on the same data and number of trees), there are cases when the +data set is still too big for the default setup. + +\subsection{Increasing allocated memory} +If your data has high number of data points and/or +high number of dimensions, then you can run out of Java memory. +This causes following error: +\begin{verbatim} + java.lang.OutOfMemoryError: Java heap space +\end{verbatim} +To solve that you need to increase the memory by supplying "-Xmx1g" for 1GB +or "-Xmx4g" for 4GB in R's Java options before loading \texttt{extraTrees}: +\begin{verbatim} + options( java.parameters = "-Xmx1g" ) + library(extraTrees) +\end{verbatim} +This is shown in the first lines of Figure \ref{fig:large.scale}. +Make sure your machine +has enough free memory available before you do that. + +\subsection{Using multiple cores} +Secondly, if the running time is too long you can use multi-core computation +by increasing the \texttt{numThreads} option (default is 1) in \texttt{extraTrees}. +This is shown the last lines in Figure \ref{fig:large.scale}. + +\begin{figure} +\begin{verbatim} +## To solve the problem give more memory to Java. +## Using 1GB Java memory for extraTrees (specified by 1g): +options( java.parameters = "-Xmx1g" ) +library(extraTrees) +## train and test data: +n <- 1000 +p <- 10 +f <- function(x) { + (x[,1]>0.5) + 0.8*(x[,2]>0.6) + 0.5*(x[,3]>0.4) + 0.2*x[,5] + + 0.1*runif(nrow(x)) +} +x <- matrix(runif(n*p), n, p) +y <- as.numeric(f(x)) +xtest <- matrix(runif(n*p), n, p) +ytest <- f(xtest) + +## extraTrees with 1 CPU thread (the default): +system.time({et <- extraTrees(x, y, numThreads=1)}) +## extraTrees with 2 CPU thread: +system.time({et <- extraTrees(x, y, numThreads=2)}) +\end{verbatim} +\caption{Example of how to use \texttt{extraTrees} in large scale settings.} +\label{fig:large.scale} +\end{figure} + + +%\section{Acknowledgements} + +%We would like thank Ildefons Magrans de Abril for suggesting +%making this R package. + +\end{document}