From 551b81a7c547121aba73253e718fc7959c0fbda6 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 27 Jan 2021 11:38:00 +0100 Subject: [PATCH 01/58] Docker image for HaSa --- docker/build_docker.sh | 19 +++++++++++++++++++ docker/context/hasa.docker | 29 +++++++++++++++++++++++++++++ docker/context/install.R | 19 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100755 docker/build_docker.sh create mode 100644 docker/context/hasa.docker create mode 100644 docker/context/install.R diff --git a/docker/build_docker.sh b/docker/build_docker.sh new file mode 100755 index 0000000..9e713d5 --- /dev/null +++ b/docker/build_docker.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +context_dir="./context" +dockerfile="hasa.docker" +runner_os="ubuntu" +runner_iname="hasa_runner" +runner_version="latest" +runner_tag="${runner_os}_${runner_iname}:${runner_version}" +container_name="hasa" +input_data_folder="/tmp/hasa" + +#Check if image exists +if [ $(sudo docker images | grep ${runner_iname} | wc -l) == 0 ] +then + # build docker image + sudo docker build -f ${context_dir}/${dockerfile} -m 20G -t ${runner_tag} ${context_dir} +else + echo "It already exists a Docker image with the name ${runner_tag}!!!" +fi diff --git a/docker/context/hasa.docker b/docker/context/hasa.docker new file mode 100644 index 0000000..ac1bdb2 --- /dev/null +++ b/docker/context/hasa.docker @@ -0,0 +1,29 @@ +FROM ubuntu:20.04 +RUN apt-get update -y && \ + echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \ + apt-get install -y -q dialog apt-utils && \ + apt-get install libudunits2-dev build-essential bash-completion automake -y && \ + apt-get install cmake zlib1g-dev libpng-dev libjpeg-dev -y && \ + apt-get install wget vim zip unzip curl git jq apt-rdepends -y && \ + apt-get install strace bzip2 cron make gcc -y +# add user hasa +RUN /bin/bash -i -c "\ + groupadd -g 1000 hasa && \ + useradd -g 1000 -u 1000 -m -s $(which bash) hasa && \ + cat /root/.bashrc > /home/hasa/.bashrc \ +" +# install dependencies +RUN apt-get update -y && \ + apt-get install -y proj-bin gdal-bin libgdal-dev +# install R +RUN /bin/bash -i -c "\ + apt-get install -y dirmngr gnupg apt-transport-https ca-certificates software-properties-common && \ + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 && \ + add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' && \ + apt-get install -y r-base \ +" +# install HaSa +COPY install.R /home/hasa/install.R +RUN /bin/bash -i -c "\ + Rscript /home/hasa/install.R \ +" diff --git a/docker/context/install.R b/docker/context/install.R new file mode 100644 index 0000000..d79f990 --- /dev/null +++ b/docker/context/install.R @@ -0,0 +1,19 @@ +install.packages("remotes") +install.packages("shiny") +install.packages("https://cran.r-project.org/src/contrib/Archive/BH/BH_1.69.0-1.tar.gz", repos=NULL, type="source") +install.packages("https://cran.r-project.org/src/contrib/Archive/sf/sf_0.8-1.tar.gz", repos=NULL, type="source", dependencies=TRUE) +install.packages("https://cran.r-project.org/src/contrib/Archive/sp/sp_1.4-1.tar.gz", repos=NULL, type="source", dependencies=TRUE) +install.packages("https://cran.r-project.org/src/contrib/Archive/rgdal/rgdal_1.4-8.tar.gz", repos=NULL, type="source") + +library(remotes) + +remotes::install_git( + "https://git.gfz-potsdam.de/habitat-sampler/HabitatSampler.git", + ref = "master", + subdir = "R-package", + dependencies = NA, + upgrade=FALSE, + build = TRUE, + build_manual = TRUE, + build_vignettes = TRUE +) -- GitLab From 0f511d228983bb734ad8822c14d858caf9dcc6e5 Mon Sep 17 00:00:00 2001 From: Romulo Pereira Goncalves Date: Wed, 27 Jan 2021 11:48:03 +0100 Subject: [PATCH 02/58] Add README --- docker/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 docker/README.md diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..51a321e --- /dev/null +++ b/docker/README.md @@ -0,0 +1,19 @@ +# Docker image for HaSa + +Scripts to build and create a Docker image. + +## Build Docker image + +### Operating system + +The image uses `Ubuntu 20.04` OS image as base image. All the packages are install using the package management tool `apt-get`. +The dependecy list is defined in the docker file, `context/hasa.docker` + +### R + +The image uses the latest version of `R` available for `Ubuntu 20.04`. + +### HaSa + +The `HaSa` R package depends on `velox-v0.2.0`. To install `velox-v0.2.0` it is necessary to pin the version of some R packages: `BH`, `sp`, `sf`, and `rgdal`. +All the dependencies and installation command for `HaSa` are defined in `context/install.R`. -- GitLab From 670c02864e9edec88869389da6b935d41b000f20 Mon Sep 17 00:00:00 2001 From: Romulo Pereira Goncalves Date: Wed, 27 Jan 2021 14:10:37 +0100 Subject: [PATCH 03/58] Documentation on how to start a docker container --- docker/README.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/docker/README.md b/docker/README.md index 51a321e..04ccdc0 100644 --- a/docker/README.md +++ b/docker/README.md @@ -17,3 +17,60 @@ The image uses the latest version of `R` available for `Ubuntu 20.04`. The `HaSa` R package depends on `velox-v0.2.0`. To install `velox-v0.2.0` it is necessary to pin the version of some R packages: `BH`, `sp`, `sf`, and `rgdal`. All the dependencies and installation command for `HaSa` are defined in `context/install.R`. + +## Start a docker container + +The user can start a docker container using the script `start_docker.sh`. In case the container exists, the script will stop and remove the old container and start a new one. Before the user runs the script it is necessary to set the `input` directory (the root directory for the remote sensing images and reference data), `tmp` directory (directory for the intermediate results) and `output` directory (root directory to store the results). These directories are mounted inside the docker containers as `/home/hasa/input/`, `/home/hasa/tmp/`, `/home/hasa/output/`. + +Once the script is initiate, the user will see the following prompt: +```bash +Starting HaSa container, please add the input files to /home/romulo/gitlab/HabitatSampler/demo/Data and read the results from the /home/romulo/gitlab/HabitatSampler/demo/Data + + +####### +This is a shell were you can use HaSa. +To start the R shell run the command: R +####### +hasa@9665b07ffc08:~$ +``` + +Once the command `R` is executed the user gets the following prompt: +```bash +hasa@9665b07ffc08:~$ R + +R version 4.0.3 (2020-10-10) -- "Bunny-Wunnies Freak Out" +Copyright (C) 2020 The R Foundation for Statistical Computing +Platform: x86_64-pc-linux-gnu (64-bit) + +R is free software and comes with ABSOLUTELY NO WARRANTY. +You are welcome to redistribute it under certain conditions. +Type 'license()' or 'licence()' for distribution details. + +R is a collaborative project with many contributors. +Type 'contributors()' for more information and +'citation()' on how to cite R or R packages in publications. + +Type 'demo()' for some demos, 'help()' for on-line help, or +'help.start()' for an HTML browser interface to help. +Type 'q()' to quit R. + +> +``` + +To use `HaSa` the user only needs to load it: +```R +> library(HaSa) + +Attaching package: 'HaSa' + +The following object is masked from 'package:graphics': + + clip + +> HaSa:: +HaSa::clip HaSa::multi_Class_Sampling HaSa::plot_results HaSa::Example_Reference_Points HaSa::Sentinel_Stack_2018 +HaSa::iplot HaSa::write_Out_Samples HaSa::.__C__Habitat HaSa::Example_Reference_Table +> HaSa:: +``` + +The message `The following object is masked from 'package:graphics':` means that there is a package called `graphics` which has a function with the same name. A detail explaination can be found in [here](https://stackoverflow.com/questions/39137110/what-does-the-following-object-is-masked-from-packagexxx-mean). -- GitLab From 472488a2357d9e5f0e6c3c7cb6d03c41716348d5 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 27 Jan 2021 14:11:41 +0100 Subject: [PATCH 04/58] Script to start a docker container. --- docker/start_docker.sh | 45 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100755 docker/start_docker.sh diff --git a/docker/start_docker.sh b/docker/start_docker.sh new file mode 100755 index 0000000..fab0e71 --- /dev/null +++ b/docker/start_docker.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# HaSa configuration +input_dir="" +tmp_dir="" +output_dir="" + +# Docker container related +jupyter_notebook="false" +container_name="hasa" +runner_os="ubuntu" +runner_iname="hasa_runner" +runner_version="latest" +runner_tag="${runner_os}_${runner_iname}:${runner_version}" +out_data_folder="/home/hasa/output" +in_data_folder="/home/hasa/input" +tmp_data_folder="/home/hasa/tmp" + +if [ "$input_dir" == "" ] +then + echo "Please define the input_dir" + exit +fi + +if [ "$tmp_dir" == "" ] +then + echo "Please define the tmp_dir" + exit +fi + +if [ "$output_dir" == "" ] +then + echo "Please define the output_dir" + exit +fi + + +sudo docker rm -f ${container_name} +echo "Starting HaSa container, please add the input files to ${input_dir} and read the results from the ${output_dir}" +sudo docker run -it --name ${container_name} -u 1000:1000 \ +-v ${input_dir}:${in_data_folder}:ro \ +-v ${tmp_dir}:${tmp_data_folder} \ +-v ${output_dir}:${out_data_folder} ${runner_tag} \ +bash -i -c "cd /home/hasa; echo "";echo "";echo '#######';echo 'This is a shell were you can use HaSa.'; echo 'To start the R shell run the command: R';echo '#######'; bash" + -- GitLab From e358a5451ed193b29cc246d2df448ef137c3a885 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 27 Jan 2021 14:14:43 +0100 Subject: [PATCH 05/58] Improve the text about starting a docker container. --- docker/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/README.md b/docker/README.md index 04ccdc0..0fc8e3e 100644 --- a/docker/README.md +++ b/docker/README.md @@ -7,7 +7,7 @@ Scripts to build and create a Docker image. ### Operating system The image uses `Ubuntu 20.04` OS image as base image. All the packages are install using the package management tool `apt-get`. -The dependecy list is defined in the docker file, `context/hasa.docker` +The dependency list is defined in the docker file, `context/hasa.docker` ### R @@ -20,7 +20,7 @@ All the dependencies and installation command for `HaSa` are defined in `context ## Start a docker container -The user can start a docker container using the script `start_docker.sh`. In case the container exists, the script will stop and remove the old container and start a new one. Before the user runs the script it is necessary to set the `input` directory (the root directory for the remote sensing images and reference data), `tmp` directory (directory for the intermediate results) and `output` directory (root directory to store the results). These directories are mounted inside the docker containers as `/home/hasa/input/`, `/home/hasa/tmp/`, `/home/hasa/output/`. +The user can start a docker container using the script `start_docker.sh`. In case the container exists, the script will stop and remove the old container and start a new one. Before the user runs the script it is necessary to set the variables `input_dir` (path to the root directory containing the remote sensing images and reference data), `tmp_dir` ( path to the directory for the intermediate results) and `output_dir` (path to the root directory where the results will be stored). These directories are mounted inside the docker containers as `/home/hasa/input/`, `/home/hasa/tmp/`, `/home/hasa/output/`. Once the script is initiate, the user will see the following prompt: ```bash @@ -73,4 +73,4 @@ HaSa::iplot HaSa::write_Out_Samples HaSa::.__C__Habi > HaSa:: ``` -The message `The following object is masked from 'package:graphics':` means that there is a package called `graphics` which has a function with the same name. A detail explaination can be found in [here](https://stackoverflow.com/questions/39137110/what-does-the-following-object-is-masked-from-packagexxx-mean). +The message `The following object is masked from 'package:graphics':` means that there is a package called `graphics` which has a function with the same name. A detail explanation can be found in [here](https://stackoverflow.com/questions/39137110/what-does-the-following-object-is-masked-from-packagexxx-mean). -- GitLab From e7a67531100e0b6772228d967a54fe0ca3069530 Mon Sep 17 00:00:00 2001 From: Romulo Pereira Goncalves Date: Wed, 27 Jan 2021 14:53:05 +0100 Subject: [PATCH 06/58] Information on how to start a Jupyter-lab --- docker/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docker/README.md b/docker/README.md index 0fc8e3e..a096fdf 100644 --- a/docker/README.md +++ b/docker/README.md @@ -22,6 +22,11 @@ All the dependencies and installation command for `HaSa` are defined in `context The user can start a docker container using the script `start_docker.sh`. In case the container exists, the script will stop and remove the old container and start a new one. Before the user runs the script it is necessary to set the variables `input_dir` (path to the root directory containing the remote sensing images and reference data), `tmp_dir` ( path to the directory for the intermediate results) and `output_dir` (path to the root directory where the results will be stored). These directories are mounted inside the docker containers as `/home/hasa/input/`, `/home/hasa/tmp/`, `/home/hasa/output/`. + +By default the use will get a bash prompt. However, it is also possible to get a `jupyter-lab` running at `localhost:8080`. + +### Bash prompt + Once the script is initiate, the user will see the following prompt: ```bash Starting HaSa container, please add the input files to /home/romulo/gitlab/HabitatSampler/demo/Data and read the results from the /home/romulo/gitlab/HabitatSampler/demo/Data @@ -74,3 +79,7 @@ HaSa::iplot HaSa::write_Out_Samples HaSa::.__C__Habi ``` The message `The following object is masked from 'package:graphics':` means that there is a package called `graphics` which has a function with the same name. A detail explanation can be found in [here](https://stackoverflow.com/questions/39137110/what-does-the-following-object-is-masked-from-packagexxx-mean). + +### Jupyter-lab + +To start a `jupyter-lab` the user needs to set the variable `jupyter_lab` to `TRUE` in the `start_container.sh` script. Once set the user only needs to re-run the script and open in a web-browser the link `localhost:8080`. For more information on how to use jupyter_lab, please refer to its [manual](https://jupyterlab.readthedocs.io/en/stable/). -- GitLab From fb6db09846cd1bff6636e9aae2126832a5f079b1 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 27 Jan 2021 14:55:04 +0100 Subject: [PATCH 07/58] ispell --- demo/README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/demo/README.md b/demo/README.md index 76e8155..3113c76 100644 --- a/demo/README.md +++ b/demo/README.md @@ -14,7 +14,7 @@ The demo shows how to classify 7 classes using a Sentinel 2 image. 1.a.2) Satellite time series stack -> clip via R routine 1.b.1) Reference Spectra as table (rows=habitats, columns=spectral wavebands) \ - 1.b.2) Reference Point Shape -> extract spectral wavebands from Satellite time series stack via R routine (change projection if neccessary) + 1.b.2) Reference Point Shape -> extract spectral wavebands from Satellite time series stack via R routine (change projection if necessary) 1.c.1) create SpatialPolygonsDataFrame from satellite time series stack extent for setting sampling boundaries \ 1.c.2) define RGB channels for image plot \ @@ -22,7 +22,7 @@ The demo shows how to classify 7 classes using a Sentinel 2 image. 1.c.4) create vector with class names in the order of reference spectra (rows = habitats) -## Parametrization +## Parameterization 2) Habitat sampling\ 2.a.1) Execute R function `multi_Class_Sampling`. @@ -40,7 +40,7 @@ The demo shows how to classify 7 classes using a Sentinel 2 image. area # SpatialPolygonsDataFrame from satellite time series stack extent mtry # number of predictor used at random forest splitting nodes (suggest: mtry << n predictors) last # only true for one class classifier ("TRUE" or "FALSE"; suggest: "F") - seed # set seed for reproducable results (suggest: 3) + seed # set seed for reproducible results (suggest: 3) init.seed # "sample" for new or use Run@seeds to reproduce previous steps outPath # output path for saving results step # at which step should the procedure start (see 2.b.1) (suggest: 1 at the beginning) @@ -56,7 +56,7 @@ The demo shows how to classify 7 classes using a Sentinel 2 image. ### Remarks **remark 1)** -The results from previous steps are reproducable when using the same seed value and int.seed=Run@seeds (e.g. Run02@seeds) in consequence, init.sample for regular sampling determines an invariant sample distribution, use random sampling or vary init.sample to get varying sample distributions. +The results from previous steps are reproducible when using the same seed value and int.seed=Run@seeds (e.g. Run02@seeds) in consequence, init.sample for regular sampling determines an invariant sample distribution, use random sampling or vary init.sample to get varying sample distributions. **remark 2)** Regular sampling is faster. @@ -73,22 +73,22 @@ The R object Run holds slots of: layer # raster layer of habitat type probability mod_all # all classifiers from nb_models class_ind # predictive distance metric for all classes - seeds # seeds to reproduce respecitve step/habitat type sampling + seeds # seeds to reproduce respective step/habitat type sampling ``` **remark 5)** -With the clause `if multiTest > 1` the user will get multiple maps and will be ask to enter the number of the probability distribution that is apropriate. +With the clause `if multiTest > 1` the user will get multiple maps and will be ask to enter the number of the probability distribution that is appropriate. ## Executing ### Step 1 -1) An interactive map is plotted in a web browser (e.g. firefox for linux), containing: +1) An interactive map is plotted in a web browser (e.g. Firefox for linux), containing: * background map * RGB image * selected habitat type map - * probaility threshold on mouse hover + * probability threshold on mouse hover * predictive distance 2) The user has to decide to extract this habitat type on the basis of a threshold (**2.1**) or to sample again (**2.2**) \ @@ -99,10 +99,10 @@ With the clause `if multiTest > 1` the user will get multiple maps and will be a * probability map - *.kml, *.png, geocoded *.tif * threshold list - R Binary * leaflet interactive web interface - *.html - After habitat extraction is done the user have to decide to adjust starting number of samples and number of models or proceed automaticlay to next step enter sample/model adjsutement (../..) or auto (0) in R console. + After habitat extraction is done the user have to decide to adjust starting number of samples and number of models or proceed automatically to next step enter sample/model adjustment (../..) or auto (0) in R console. - 2.2 Enter 0 in R console, the user have to decide to adjust starting number of samples and number of models or proceed automaticlay to new sampling enter - sample/model adjustement (../..) or auto (0) in R console. Proceed with **1** until decision (**2.1**) has made. + 2.2 Enter 0 in R console, the user have to decide to adjust starting number of samples and number of models or proceed automatically to new sampling enter + sample/model adjustment (../..) or auto (0) in R console. Proceed with **1** until decision (**2.1**) has made. ### Step 2...N -- GitLab From ff27d88e3bca068306121088b855cd349a87f78d Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 27 Jan 2021 15:07:01 +0100 Subject: [PATCH 08/58] Install Jupyter-lab and IRkernel --- docker/context/hasa.docker | 14 +++++++++++++- docker/context/install.R | 8 +++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/docker/context/hasa.docker b/docker/context/hasa.docker index ac1bdb2..8b026c5 100644 --- a/docker/context/hasa.docker +++ b/docker/context/hasa.docker @@ -22,7 +22,19 @@ RUN /bin/bash -i -c "\ add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' && \ apt-get install -y r-base \ " -# install HaSa +# install Python and pip +RUN /bin/bash -i -c "\ + apt-get install -y software-properties-common && \ + add-apt-repository ppa:deadsnakes/ppa && \ + apt-get update -y && \ + apt-get install -y python3.8 && \ + apt-get install -y python3-pip \ +" +# install jupyter-lab and IRkernel +RUN /bin/bash -i -c "\ + pip3 install jupyterlab \ +" +# install IRkernel and HaSa COPY install.R /home/hasa/install.R RUN /bin/bash -i -c "\ Rscript /home/hasa/install.R \ diff --git a/docker/context/install.R b/docker/context/install.R index d79f990..b91953d 100644 --- a/docker/context/install.R +++ b/docker/context/install.R @@ -1,3 +1,9 @@ +# Install IRkernel +install.packages("devtools") +devtools::install_github("IRkernel/IRkernel") +IRkernel::installspec() + +# Install Hasa dependencies install.packages("remotes") install.packages("shiny") install.packages("https://cran.r-project.org/src/contrib/Archive/BH/BH_1.69.0-1.tar.gz", repos=NULL, type="source") @@ -5,8 +11,8 @@ install.packages("https://cran.r-project.org/src/contrib/Archive/sf/sf_0.8-1.tar install.packages("https://cran.r-project.org/src/contrib/Archive/sp/sp_1.4-1.tar.gz", repos=NULL, type="source", dependencies=TRUE) install.packages("https://cran.r-project.org/src/contrib/Archive/rgdal/rgdal_1.4-8.tar.gz", repos=NULL, type="source") +# Install HaSa library(remotes) - remotes::install_git( "https://git.gfz-potsdam.de/habitat-sampler/HabitatSampler.git", ref = "master", -- GitLab From f5a8fe9f5dea91a72de0ff03a8f86d6e8c4e7e65 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 27 Jan 2021 15:56:10 +0100 Subject: [PATCH 09/58] Instructions to load the demo notebook. --- docker/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/README.md b/docker/README.md index a096fdf..9f249a2 100644 --- a/docker/README.md +++ b/docker/README.md @@ -83,3 +83,5 @@ The message `The following object is masked from 'package:graphics':` means that ### Jupyter-lab To start a `jupyter-lab` the user needs to set the variable `jupyter_lab` to `TRUE` in the `start_container.sh` script. Once set the user only needs to re-run the script and open in a web-browser the link `localhost:8080`. For more information on how to use jupyter_lab, please refer to its [manual](https://jupyterlab.readthedocs.io/en/stable/). + +The `jupyter-lab` will open directly into the `demo/` directory of HaSa repository. The use should load the notebook `HabitatSamplerDocker.ipynb` to run the demo. -- GitLab From 52480309137ab5a16b3ca4a013fc11cfc176dd3e Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 27 Jan 2021 15:57:29 +0100 Subject: [PATCH 10/58] Make sure we install shiny before the other dependencies. Install IRkernel for all users. --- docker/context/install.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/context/install.R b/docker/context/install.R index b91953d..037d435 100644 --- a/docker/context/install.R +++ b/docker/context/install.R @@ -1,11 +1,11 @@ # Install IRkernel +install.packages("shiny") install.packages("devtools") devtools::install_github("IRkernel/IRkernel") -IRkernel::installspec() +IRkernel::installspec(user = FALSE) # Install Hasa dependencies install.packages("remotes") -install.packages("shiny") install.packages("https://cran.r-project.org/src/contrib/Archive/BH/BH_1.69.0-1.tar.gz", repos=NULL, type="source") install.packages("https://cran.r-project.org/src/contrib/Archive/sf/sf_0.8-1.tar.gz", repos=NULL, type="source", dependencies=TRUE) install.packages("https://cran.r-project.org/src/contrib/Archive/sp/sp_1.4-1.tar.gz", repos=NULL, type="source", dependencies=TRUE) -- GitLab From d7fb3f7b8f80133c30aab8efb39e7d9aa6199f77 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 27 Jan 2021 15:58:29 +0100 Subject: [PATCH 11/58] Start a docker container and launch a Jupyter-lab. Improve the script so the user knows where new information should be added. --- docker/start_docker.sh | 44 ++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/docker/start_docker.sh b/docker/start_docker.sh index fab0e71..643e9e4 100755 --- a/docker/start_docker.sh +++ b/docker/start_docker.sh @@ -1,12 +1,20 @@ #!/bin/bash +# variables to bet set by the user +input_dir="/home/romulo/gitlab/HabitatSampler/demo/Data" +tmp_dir="/home/romulo/gitlab/HabitatSampler/demo/Data" +output_dir="/home/romulo/gitlab/HabitatSampler/demo/Data" +jupyter_notebook="TrUE" + + +########################################## +# DO NOT CHANGE ANYTHING FROM HERE ON!!! # +########################################## + # HaSa configuration -input_dir="" -tmp_dir="" -output_dir="" +demo_dir="$(realpath ../demo/)" # Docker container related -jupyter_notebook="false" container_name="hasa" runner_os="ubuntu" runner_iname="hasa_runner" @@ -15,6 +23,10 @@ runner_tag="${runner_os}_${runner_iname}:${runner_version}" out_data_folder="/home/hasa/output" in_data_folder="/home/hasa/input" tmp_data_folder="/home/hasa/tmp" +demo_data_folder="/home/hasa/demo" +demo_data_foler="$(realpath ../demo/)" +jupyter_lab_port=8888 +docker_jupyterlab_port=8888 if [ "$input_dir" == "" ] then @@ -36,10 +48,22 @@ fi sudo docker rm -f ${container_name} -echo "Starting HaSa container, please add the input files to ${input_dir} and read the results from the ${output_dir}" -sudo docker run -it --name ${container_name} -u 1000:1000 \ --v ${input_dir}:${in_data_folder}:ro \ --v ${tmp_dir}:${tmp_data_folder} \ --v ${output_dir}:${out_data_folder} ${runner_tag} \ -bash -i -c "cd /home/hasa; echo "";echo "";echo '#######';echo 'This is a shell were you can use HaSa.'; echo 'To start the R shell run the command: R';echo '#######'; bash" +echo "Starting HaSa container, please add the input files to ${input_dir} and read the results from the ${output_dir}" +if [ "${jupyter_notebook,,}" = "true" ] +then + sudo docker run -it --name ${container_name} \ + -p $jupyter_lab_port:$docker_jupyterlab_port \ + -v ${input_dir}:${in_data_folder}:ro \ + -v ${tmp_dir}:${tmp_data_folder} \ + -v ${output_dir}:${out_data_folder} \ + -v ${demo_dir}:${demo_data_folder} ${runner_tag} \ + bash -i -c "cd /home/hasa; jupyter-lab --ip 0.0.0.0 --no-browser --allow-root demo/" +else + sudo docker run -it --name ${container_name} -u 1000:1000 \ + -v ${input_dir}:${in_data_folder}:ro \ + -v ${tmp_dir}:${tmp_data_folder} \ + -v ${output_dir}:${out_data_folder} \ + -v ${demo_dir}:${demo_data_folder} ${runner_tag} \ + bash -i -c "cd /home/hasa; echo "";echo "";echo '#######';echo 'This is a shell were you can use HaSa.'; echo 'To start the R shell run the command: R';echo '#######'; bash" +fi -- GitLab From f893baa7091d3a239465260c3f9efaa5b9384d28 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 27 Jan 2021 16:01:49 +0100 Subject: [PATCH 12/58] Notebook for the Docker container. --- demo/HabitatSamplerDocker.ipynb | 1002 +++++++++++++++++++++++++++++++ 1 file changed, 1002 insertions(+) create mode 100644 demo/HabitatSamplerDocker.ipynb diff --git a/demo/HabitatSamplerDocker.ipynb b/demo/HabitatSamplerDocker.ipynb new file mode 100644 index 0000000..87e27e8 --- /dev/null +++ b/demo/HabitatSamplerDocker.ipynb @@ -0,0 +1,1002 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# HabitatSampler" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load HaSa\n", + "\n", + "We load HaSa library and some of its dependencies" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading required package: sp\n", + "\n", + "rgdal: version: 1.4-8, (SVN revision 845)\n", + " Geospatial Data Abstraction Library extensions to R successfully loaded\n", + " Loaded GDAL runtime: GDAL 3.0.4, released 2020/01/28\n", + " Path to GDAL shared files: \n", + " GDAL binary built with GEOS: TRUE \n", + " Loaded PROJ.4 runtime: Rel. 6.3.1, February 10th, 2020, [PJ_VERSION: 631]\n", + " Path to PROJ.4 shared files: (autodetected)\n", + " Linking to sp version: 1.4-1 \n", + "\n", + "Checking rgeos availability: TRUE\n", + "\n", + "\n", + "Attaching package: ‘spatialEco’\n", + "\n", + "\n", + "The following object is masked from ‘package:raster’:\n", + "\n", + " shift\n", + "\n", + "\n", + "randomForest 4.6-14\n", + "\n", + "Type rfNews() to see new features/changes/bug fixes.\n", + "\n", + "\n", + "Attaching package: ‘randomForest’\n", + "\n", + "\n", + "The following object is masked from ‘package:spatialEco’:\n", + "\n", + " combine\n", + "\n", + "\n", + "\n", + "Attaching package: ‘e1071’\n", + "\n", + "\n", + "The following object is masked from ‘package:raster’:\n", + "\n", + " interpolate\n", + "\n", + "\n", + "Loading required package: usethis\n", + "\n", + "rgeos version: 0.5-5, (SVN revision 640)\n", + " GEOS runtime version: 3.8.0-CAPI-1.13.1 \n", + " Linking to sp version: 1.4-1 \n", + " Polygon checking: TRUE \n", + "\n", + "\n", + "\n", + "Attaching package: ‘HaSa’\n", + "\n", + "\n", + "The following object is masked from ‘package:graphics’:\n", + "\n", + " clip\n", + "\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "
    \n", + "\t
  1. \n", + "
    1. 'rgdal'
    2. 'sp'
    3. 'stats'
    4. 'graphics'
    5. 'grDevices'
    6. 'utils'
    7. 'datasets'
    8. 'methods'
    9. 'base'
    \n", + "
  2. \n", + "\t
  3. \n", + "
    1. 'raster'
    2. 'rgdal'
    3. 'sp'
    4. 'stats'
    5. 'graphics'
    6. 'grDevices'
    7. 'utils'
    8. 'datasets'
    9. 'methods'
    10. 'base'
    \n", + "
  4. \n", + "\t
  5. \n", + "
    1. 'maptools'
    2. 'raster'
    3. 'rgdal'
    4. 'sp'
    5. 'stats'
    6. 'graphics'
    7. 'grDevices'
    8. 'utils'
    9. 'datasets'
    10. 'methods'
    11. 'base'
    \n", + "
  6. \n", + "\t
  7. \n", + "
    1. 'spatialEco'
    2. 'maptools'
    3. 'raster'
    4. 'rgdal'
    5. 'sp'
    6. 'stats'
    7. 'graphics'
    8. 'grDevices'
    9. 'utils'
    10. 'datasets'
    11. 'methods'
    12. 'base'
    \n", + "
  8. \n", + "\t
  9. \n", + "
    1. 'randomForest'
    2. 'spatialEco'
    3. 'maptools'
    4. 'raster'
    5. 'rgdal'
    6. 'sp'
    7. 'stats'
    8. 'graphics'
    9. 'grDevices'
    10. 'utils'
    11. 'datasets'
    12. 'methods'
    13. 'base'
    \n", + "
  10. \n", + "\t
  11. \n", + "
    1. 'e1071'
    2. 'randomForest'
    3. 'spatialEco'
    4. 'maptools'
    5. 'raster'
    6. 'rgdal'
    7. 'sp'
    8. 'stats'
    9. 'graphics'
    10. 'grDevices'
    11. 'utils'
    12. 'datasets'
    13. 'methods'
    14. 'base'
    \n", + "
  12. \n", + "\t
  13. \n", + "
    1. 'devtools'
    2. 'usethis'
    3. 'e1071'
    4. 'randomForest'
    5. 'spatialEco'
    6. 'maptools'
    7. 'raster'
    8. 'rgdal'
    9. 'sp'
    10. 'stats'
    11. 'graphics'
    12. 'grDevices'
    13. 'utils'
    14. 'datasets'
    15. 'methods'
    16. 'base'
    \n", + "
  14. \n", + "\t
  15. \n", + "
    1. 'velox'
    2. 'devtools'
    3. 'usethis'
    4. 'e1071'
    5. 'randomForest'
    6. 'spatialEco'
    7. 'maptools'
    8. 'raster'
    9. 'rgdal'
    10. 'sp'
    11. 'stats'
    12. 'graphics'
    13. 'grDevices'
    14. 'utils'
    15. 'datasets'
    16. 'methods'
    17. 'base'
    \n", + "
  16. \n", + "\t
  17. \n", + "
    1. 'rgeos'
    2. 'velox'
    3. 'devtools'
    4. 'usethis'
    5. 'e1071'
    6. 'randomForest'
    7. 'spatialEco'
    8. 'maptools'
    9. 'raster'
    10. 'rgdal'
    11. 'sp'
    12. 'stats'
    13. 'graphics'
    14. 'grDevices'
    15. 'utils'
    16. 'datasets'
    17. 'methods'
    18. 'base'
    \n", + "
  18. \n", + "\t
  19. \n", + "
    1. 'leaflet'
    2. 'rgeos'
    3. 'velox'
    4. 'devtools'
    5. 'usethis'
    6. 'e1071'
    7. 'randomForest'
    8. 'spatialEco'
    9. 'maptools'
    10. 'raster'
    11. 'rgdal'
    12. 'sp'
    13. 'stats'
    14. 'graphics'
    15. 'grDevices'
    16. 'utils'
    17. 'datasets'
    18. 'methods'
    19. 'base'
    \n", + "
  20. \n", + "\t
  21. \n", + "
    1. 'htmlwidgets'
    2. 'leaflet'
    3. 'rgeos'
    4. 'velox'
    5. 'devtools'
    6. 'usethis'
    7. 'e1071'
    8. 'randomForest'
    9. 'spatialEco'
    10. 'maptools'
    11. 'raster'
    12. 'rgdal'
    13. 'sp'
    14. 'stats'
    15. 'graphics'
    16. 'grDevices'
    17. 'utils'
    18. 'datasets'
    19. 'methods'
    20. 'base'
    \n", + "
  22. \n", + "\t
  23. \n", + "
    1. 'HaSa'
    2. 'htmlwidgets'
    3. 'leaflet'
    4. 'rgeos'
    5. 'velox'
    6. 'devtools'
    7. 'usethis'
    8. 'e1071'
    9. 'randomForest'
    10. 'spatialEco'
    11. 'maptools'
    12. 'raster'
    13. 'rgdal'
    14. 'sp'
    15. 'stats'
    16. 'graphics'
    17. 'grDevices'
    18. 'utils'
    19. 'datasets'
    20. 'methods'
    21. 'base'
    \n", + "
  24. \n", + "
\n" + ], + "text/latex": [ + "\\begin{enumerate}\n", + "\\item \\begin{enumerate*}\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'maptools'\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'spatialEco'\n", + "\\item 'maptools'\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'randomForest'\n", + "\\item 'spatialEco'\n", + "\\item 'maptools'\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'e1071'\n", + "\\item 'randomForest'\n", + "\\item 'spatialEco'\n", + "\\item 'maptools'\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'devtools'\n", + "\\item 'usethis'\n", + "\\item 'e1071'\n", + "\\item 'randomForest'\n", + "\\item 'spatialEco'\n", + "\\item 'maptools'\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'velox'\n", + "\\item 'devtools'\n", + "\\item 'usethis'\n", + "\\item 'e1071'\n", + "\\item 'randomForest'\n", + "\\item 'spatialEco'\n", + "\\item 'maptools'\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'rgeos'\n", + "\\item 'velox'\n", + "\\item 'devtools'\n", + "\\item 'usethis'\n", + "\\item 'e1071'\n", + "\\item 'randomForest'\n", + "\\item 'spatialEco'\n", + "\\item 'maptools'\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'leaflet'\n", + "\\item 'rgeos'\n", + "\\item 'velox'\n", + "\\item 'devtools'\n", + "\\item 'usethis'\n", + "\\item 'e1071'\n", + "\\item 'randomForest'\n", + "\\item 'spatialEco'\n", + "\\item 'maptools'\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'htmlwidgets'\n", + "\\item 'leaflet'\n", + "\\item 'rgeos'\n", + "\\item 'velox'\n", + "\\item 'devtools'\n", + "\\item 'usethis'\n", + "\\item 'e1071'\n", + "\\item 'randomForest'\n", + "\\item 'spatialEco'\n", + "\\item 'maptools'\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'HaSa'\n", + "\\item 'htmlwidgets'\n", + "\\item 'leaflet'\n", + "\\item 'rgeos'\n", + "\\item 'velox'\n", + "\\item 'devtools'\n", + "\\item 'usethis'\n", + "\\item 'e1071'\n", + "\\item 'randomForest'\n", + "\\item 'spatialEco'\n", + "\\item 'maptools'\n", + "\\item 'raster'\n", + "\\item 'rgdal'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\end{enumerate}\n" + ], + "text/markdown": [ + "1. 1. 'rgdal'\n", + "2. 'sp'\n", + "3. 'stats'\n", + "4. 'graphics'\n", + "5. 'grDevices'\n", + "6. 'utils'\n", + "7. 'datasets'\n", + "8. 'methods'\n", + "9. 'base'\n", + "\n", + "\n", + "\n", + "2. 1. 'raster'\n", + "2. 'rgdal'\n", + "3. 'sp'\n", + "4. 'stats'\n", + "5. 'graphics'\n", + "6. 'grDevices'\n", + "7. 'utils'\n", + "8. 'datasets'\n", + "9. 'methods'\n", + "10. 'base'\n", + "\n", + "\n", + "\n", + "3. 1. 'maptools'\n", + "2. 'raster'\n", + "3. 'rgdal'\n", + "4. 'sp'\n", + "5. 'stats'\n", + "6. 'graphics'\n", + "7. 'grDevices'\n", + "8. 'utils'\n", + "9. 'datasets'\n", + "10. 'methods'\n", + "11. 'base'\n", + "\n", + "\n", + "\n", + "4. 1. 'spatialEco'\n", + "2. 'maptools'\n", + "3. 'raster'\n", + "4. 'rgdal'\n", + "5. 'sp'\n", + "6. 'stats'\n", + "7. 'graphics'\n", + "8. 'grDevices'\n", + "9. 'utils'\n", + "10. 'datasets'\n", + "11. 'methods'\n", + "12. 'base'\n", + "\n", + "\n", + "\n", + "5. 1. 'randomForest'\n", + "2. 'spatialEco'\n", + "3. 'maptools'\n", + "4. 'raster'\n", + "5. 'rgdal'\n", + "6. 'sp'\n", + "7. 'stats'\n", + "8. 'graphics'\n", + "9. 'grDevices'\n", + "10. 'utils'\n", + "11. 'datasets'\n", + "12. 'methods'\n", + "13. 'base'\n", + "\n", + "\n", + "\n", + "6. 1. 'e1071'\n", + "2. 'randomForest'\n", + "3. 'spatialEco'\n", + "4. 'maptools'\n", + "5. 'raster'\n", + "6. 'rgdal'\n", + "7. 'sp'\n", + "8. 'stats'\n", + "9. 'graphics'\n", + "10. 'grDevices'\n", + "11. 'utils'\n", + "12. 'datasets'\n", + "13. 'methods'\n", + "14. 'base'\n", + "\n", + "\n", + "\n", + "7. 1. 'devtools'\n", + "2. 'usethis'\n", + "3. 'e1071'\n", + "4. 'randomForest'\n", + "5. 'spatialEco'\n", + "6. 'maptools'\n", + "7. 'raster'\n", + "8. 'rgdal'\n", + "9. 'sp'\n", + "10. 'stats'\n", + "11. 'graphics'\n", + "12. 'grDevices'\n", + "13. 'utils'\n", + "14. 'datasets'\n", + "15. 'methods'\n", + "16. 'base'\n", + "\n", + "\n", + "\n", + "8. 1. 'velox'\n", + "2. 'devtools'\n", + "3. 'usethis'\n", + "4. 'e1071'\n", + "5. 'randomForest'\n", + "6. 'spatialEco'\n", + "7. 'maptools'\n", + "8. 'raster'\n", + "9. 'rgdal'\n", + "10. 'sp'\n", + "11. 'stats'\n", + "12. 'graphics'\n", + "13. 'grDevices'\n", + "14. 'utils'\n", + "15. 'datasets'\n", + "16. 'methods'\n", + "17. 'base'\n", + "\n", + "\n", + "\n", + "9. 1. 'rgeos'\n", + "2. 'velox'\n", + "3. 'devtools'\n", + "4. 'usethis'\n", + "5. 'e1071'\n", + "6. 'randomForest'\n", + "7. 'spatialEco'\n", + "8. 'maptools'\n", + "9. 'raster'\n", + "10. 'rgdal'\n", + "11. 'sp'\n", + "12. 'stats'\n", + "13. 'graphics'\n", + "14. 'grDevices'\n", + "15. 'utils'\n", + "16. 'datasets'\n", + "17. 'methods'\n", + "18. 'base'\n", + "\n", + "\n", + "\n", + "10. 1. 'leaflet'\n", + "2. 'rgeos'\n", + "3. 'velox'\n", + "4. 'devtools'\n", + "5. 'usethis'\n", + "6. 'e1071'\n", + "7. 'randomForest'\n", + "8. 'spatialEco'\n", + "9. 'maptools'\n", + "10. 'raster'\n", + "11. 'rgdal'\n", + "12. 'sp'\n", + "13. 'stats'\n", + "14. 'graphics'\n", + "15. 'grDevices'\n", + "16. 'utils'\n", + "17. 'datasets'\n", + "18. 'methods'\n", + "19. 'base'\n", + "\n", + "\n", + "\n", + "11. 1. 'htmlwidgets'\n", + "2. 'leaflet'\n", + "3. 'rgeos'\n", + "4. 'velox'\n", + "5. 'devtools'\n", + "6. 'usethis'\n", + "7. 'e1071'\n", + "8. 'randomForest'\n", + "9. 'spatialEco'\n", + "10. 'maptools'\n", + "11. 'raster'\n", + "12. 'rgdal'\n", + "13. 'sp'\n", + "14. 'stats'\n", + "15. 'graphics'\n", + "16. 'grDevices'\n", + "17. 'utils'\n", + "18. 'datasets'\n", + "19. 'methods'\n", + "20. 'base'\n", + "\n", + "\n", + "\n", + "12. 1. 'HaSa'\n", + "2. 'htmlwidgets'\n", + "3. 'leaflet'\n", + "4. 'rgeos'\n", + "5. 'velox'\n", + "6. 'devtools'\n", + "7. 'usethis'\n", + "8. 'e1071'\n", + "9. 'randomForest'\n", + "10. 'spatialEco'\n", + "11. 'maptools'\n", + "12. 'raster'\n", + "13. 'rgdal'\n", + "14. 'sp'\n", + "15. 'stats'\n", + "16. 'graphics'\n", + "17. 'grDevices'\n", + "18. 'utils'\n", + "19. 'datasets'\n", + "20. 'methods'\n", + "21. 'base'\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "[[1]]\n", + "[1] \"rgdal\" \"sp\" \"stats\" \"graphics\" \"grDevices\" \"utils\" \n", + "[7] \"datasets\" \"methods\" \"base\" \n", + "\n", + "[[2]]\n", + " [1] \"raster\" \"rgdal\" \"sp\" \"stats\" \"graphics\" \"grDevices\"\n", + " [7] \"utils\" \"datasets\" \"methods\" \"base\" \n", + "\n", + "[[3]]\n", + " [1] \"maptools\" \"raster\" \"rgdal\" \"sp\" \"stats\" \"graphics\" \n", + " [7] \"grDevices\" \"utils\" \"datasets\" \"methods\" \"base\" \n", + "\n", + "[[4]]\n", + " [1] \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \"sp\" \n", + " [6] \"stats\" \"graphics\" \"grDevices\" \"utils\" \"datasets\" \n", + "[11] \"methods\" \"base\" \n", + "\n", + "[[5]]\n", + " [1] \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \n", + " [6] \"sp\" \"stats\" \"graphics\" \"grDevices\" \"utils\" \n", + "[11] \"datasets\" \"methods\" \"base\" \n", + "\n", + "[[6]]\n", + " [1] \"e1071\" \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \n", + " [6] \"rgdal\" \"sp\" \"stats\" \"graphics\" \"grDevices\" \n", + "[11] \"utils\" \"datasets\" \"methods\" \"base\" \n", + "\n", + "[[7]]\n", + " [1] \"devtools\" \"usethis\" \"e1071\" \"randomForest\" \"spatialEco\" \n", + " [6] \"maptools\" \"raster\" \"rgdal\" \"sp\" \"stats\" \n", + "[11] \"graphics\" \"grDevices\" \"utils\" \"datasets\" \"methods\" \n", + "[16] \"base\" \n", + "\n", + "[[8]]\n", + " [1] \"velox\" \"devtools\" \"usethis\" \"e1071\" \"randomForest\"\n", + " [6] \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \"sp\" \n", + "[11] \"stats\" \"graphics\" \"grDevices\" \"utils\" \"datasets\" \n", + "[16] \"methods\" \"base\" \n", + "\n", + "[[9]]\n", + " [1] \"rgeos\" \"velox\" \"devtools\" \"usethis\" \"e1071\" \n", + " [6] \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \n", + "[11] \"sp\" \"stats\" \"graphics\" \"grDevices\" \"utils\" \n", + "[16] \"datasets\" \"methods\" \"base\" \n", + "\n", + "[[10]]\n", + " [1] \"leaflet\" \"rgeos\" \"velox\" \"devtools\" \"usethis\" \n", + " [6] \"e1071\" \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \n", + "[11] \"rgdal\" \"sp\" \"stats\" \"graphics\" \"grDevices\" \n", + "[16] \"utils\" \"datasets\" \"methods\" \"base\" \n", + "\n", + "[[11]]\n", + " [1] \"htmlwidgets\" \"leaflet\" \"rgeos\" \"velox\" \"devtools\" \n", + " [6] \"usethis\" \"e1071\" \"randomForest\" \"spatialEco\" \"maptools\" \n", + "[11] \"raster\" \"rgdal\" \"sp\" \"stats\" \"graphics\" \n", + "[16] \"grDevices\" \"utils\" \"datasets\" \"methods\" \"base\" \n", + "\n", + "[[12]]\n", + " [1] \"HaSa\" \"htmlwidgets\" \"leaflet\" \"rgeos\" \"velox\" \n", + " [6] \"devtools\" \"usethis\" \"e1071\" \"randomForest\" \"spatialEco\" \n", + "[11] \"maptools\" \"raster\" \"rgdal\" \"sp\" \"stats\" \n", + "[16] \"graphics\" \"grDevices\" \"utils\" \"datasets\" \"methods\" \n", + "[21] \"base\" \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "libraries <- c(\"rgdal\",\"raster\",\"maptools\",\"spatialEco\",\"randomForest\",\"e1071\",\"devtools\",\"velox\",\"rgeos\",\"leaflet\",\"htmlwidgets\", \"HaSa\")\n", + "lapply(libraries, library, character.only = TRUE)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "wd<-\"./\"\n", + "dataPath<-\"./Data/\"\n", + "outPath<-paste(wd,\"Data/Results/\",sep=\"\")\n", + "rasterOptions(tmpdir=\"./RasterTmp/\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Demo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## **1. Prepare Input Data**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.1 - Satellite time series stack" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "a1<-brick(paste(dataPath,\"SentinelStack_2018.tif\",sep=\"\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.2 - Reference data\n", + "\n", + "The reference data is either passed as table **a)** or as shapefile **b)**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.2.a\n", + "\n", + "Reference Spectra as table (rows=habitats, columns=spectral wavebands) " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "ref<-read.table(paste(dataPath,\"Example_Reference_table.txt\", sep=\"\"),header=T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.2.b\n", + "\n", + "Reference Point Shape -> extract spectral wavebands from Satellite time series stack via R routine (change projection if neccessary)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OGR data source with driver: ESRI Shapefile \n", + "Source: \"/home/hasa/demo/Data/Example_Reference_Points.shp\", layer: \"Example_Reference_Points\"\n", + "with 7 features\n", + "It has 2 fields\n" + ] + } + ], + "source": [ + "shp<-readOGR(paste(dataPath,\"Example_Reference_Points.shp\", sep=\"\"))\n", + "proj4string(shp)<- \"+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0\"\n", + "shp<-spTransform(shp,CRS( \"+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0\"))\n", + "ref<-as.data.frame(extract(a1,shp))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.3 Plot configuration" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.3.1\n", + "Create SpatialPolygonsDataFrame from satellite time series stack extent for setting sampling boundaries." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "p <- as(extent(a1), 'SpatialPolygons') \n", + "p <- SpatialPolygonsDataFrame(p, data.frame( ID=1:length(p)))\n", + "proj4string(p)<-proj4string(a1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.3.2\n", + "Define RGB channels for image plot." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n5LXXynZxqV8MwD+eXifbXTmlqt/61i2y3dwaZs8oB43vWipH7dZIq2wXVpbzRc4+e4Jsh0ro\naKSVKpOivFocXlJ59IcHV8r22veek+1VnRSkiyb28kUsB72ou5VWl3UrGbuCIjojVoae8mZp\nQyOWWqKPxRzDOq05lKf8xcwTondENkzH1sXe+LEu5U98761YIdvfuJaqD/510VMCjkZvbaXL\n8aWXXjIMY8aMGfJ/Ro8e7XA43nvvvf679WloaLjllluuvfbamTNnHvbFVq5c2draeumll+bn\n5//pT3+aN2/e/fffv2LFCkuteXhYfV/LeTyeT6UbAAAAgP04x4wZ0xeeq6+vf+WVV2bOnPnU\nUzQirqqqmj9//j333NN/NyGEaZqzZ88uKCh4+OGHj/Ri7733nhCiuLh4/Pjx/Cu9KVOmHPId\n3iEsy3rmmWeEELNmzepnZwbYDQAAAMCWnKZpPvvss30PRo0addVVV5WUKHd6ufvuu+vq6ubM\nmdN/twULFrz55pvLly+XibePa29vF0I8/vjjw4cPX7Vq1amnnrp3797bbrvt1Vdfvfzyy1et\nWnWkBefPn7927dqvfe1r55133pH6DLwb19jYeOGFFyaTyX76pFKpe++9d4ArBAAAAPhXcc6Z\nM+eGG24oKyvbvn37nXfeeeWVV27evPn++++XPebPnz9//vw77rijn26bN2+eN2/enDlzzj//\n/H5eLJfLCSE0TVu6dOno0aOFEOPGjVuyZMnIkSNff/31999//9RTT/34Uo899tj8+fMnTpy4\naNGiflY+wG6HKC0tve2227LZbD99du/e3c+zAAAAAF8Qzp/+9Kd9rYkTJy5dunTUqFEPPvjg\n9ddfX1tbK4RYvnz5vffee8UVV/TTzbKsq6++urKy8qGHHur/xQoLC4UQo0eP7hvV9QkEAuef\nf/5vf/vbww7sFixYcPvtt59yyimvvvpqXl6eOIIBdvs4j8dzLUvgHtaaNWu2bNnSfx+APlfd\nRlPFC5qURHnwJCqWO+t0mjyxs4UK56566w2+SLSRygUXVwyV7WShUiZUsMq7PlZ1vKJCucm3\nadBTVpji9sECmh/gKVbKCIs9dP/viEZB6UK1tnkkTi/UlaCodSH7lcnwKtvcnWR3HGcTFIpC\nSuy6s4uO4R6L1jxMLdtaYtDK29mmNW/aINvRuFLF18jQEfBl2dQBNaCrZWnb0imaJGH5Ka1/\n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\n4LnrfO973zt48OCTnkoQBEEQBOGZha/3zudf/OIXx3F8//33n/mTL33pS0qpa6+99hzV4jje\nv3//iRMnyuWy9ijvf//7lVIf/ehHNU1797vffebAMwrdGdOOcuTIEaXUnj17fqSznU/bBEEQ\nBEEQnjs8dq/YlZUVpZTjnHVuhsOhUmp19bHRNbSaruvvete7HlPh4MGDd9555+WXX37VVVe9\n7GUvO/OHr3rVq5RSN998M/130sXFxf3798/Ozp55sTv/s51P2wRBEARBEJ47mPPz85s2bTrz\nwxe/+MXbb7+9UCi85CVn829f9rKX/cVf/MWf/MmfXH/99U9UTdf1T3ziE4857x//8R/feeed\n11133e/93u9lf3jllVdeffXVd99991//9V//4i/+olIqSZLf/u3fTpLkhhtuOOPYnf/Zzqdt\nzyy5OpTVmOwT3ya7pFe2MH3VIRmVmkFydz323epSZy0rpxY82dIudjZjHUZ5sI5QmPUKcgEr\ndbZR/XARRrNFROPHJGnaOawqyA3RgCQPQX7CYH9toKGphTy05bmYydFxgh7wfKjWro83eKtg\n0EPyOjqqOIslDtUaW3lTm8LyERpt2jkwR6t1ydfYh+5F2+ZeCr1dLbHVG14OP8bTZIWExnpA\no5mfxG7euAnbilcH7C8kqYOpUqpj6UC3w/cvJ2spTLLluRdXaLXiOBZGlAZk1MhyAa3H82B9\nYmHrmF29HF+9oaGdYQtzwKjhcJvtHq40C2coxBj0wGENoBPPNtFOl+XRqnwRRw3IFoXtdczh\n4mY2bXIRzHef9HMzYINbaKEJHbKwJPRJyLbNU51T9MDgNBraCpmFsm8LVj9s3/2yrLxlBxpm\nK58ecvdtcEI6RSyoKk+xpM9OC88HvYyzVQ02ahHR7YM+OofGTZsGCyjOExs5JSsxGo0+rdYP\nybKMEj7Fa6Fv253j9JCGu5CVt00i+Dev2LwhmeXKKuMxMpFji34isuTCNdCHxgCXaZZZ31o5\nnG1AAn7zNbbGYmMRT5W8or86r43XPYU7YowdruizO5jAurcNu66k1cx7v4kyuZw+iUl3XfbA\nnp7AgPbIs7cYsgfUkKwykQUTz2rMffv2veENb5ienn744Ye/9rWvKaVuuummbC3qz//8z3/i\nE5+49dZbz13t/PnkJz95zTXXvPOd7/z85z+/ffv222+//Z577nnRi170G7/xGz/qqZ7ytgmC\nIAiCIDyrMS+55JIvfelLnufV6/U3vvGN73vf+878g+kZDMO4+eab//RP//Szn/3sOaqdP5de\neuk999xz4403fv3rX//KV76yadOmD3zgAx/4wAfy+fyTH8x5ytsmCIIgCILwrMa86667zl3D\ntu33v//9Z5YvnD/ve9/73ve+9z3ur3bu3PnpT3/6KTnbv61tgiAIgiAII8ljF08ITyHRAKJD\nqkNOsUwYRWHIcjV1C3mkJZLuGi/z3W/7ME1iYrqEXR7umsP42kQBWTuCHOPkRcxNqRdIOGoD\nOojJN/INKzjKTojURXZzt7awzNLLJhHgWZqE8zHJE3FXHzmZlb8XQF0qxNNZOS3zTGMSdbu1\nfmlW7scrtFpyBIbT8mn0Zzthkl/Sh8w3JPuUGyewfbi7xJJmQxsiV64I6yXWWUxoSLJeq1tg\nPs1uRs907zxJD/GI32N1Sc5qwBSzOM2RX2HaFFjXqtIUNn2ZIic4eWx/Vm7FzM7JldADxRxm\nXbTCNn3vkoMqBYxaKY8WBB7rDauEqVIcov1+m+mDaYip0jgNkUtzmfs1JHMgZ5KoW5I9vrrM\nHLspG40OSDWtw86sarA2rQTj7hGLK46ZX6V7+PeHMt3qvsZ81vFNCKOe3otPGS9sysqDnWv0\nEPeeR3DmCJczWWa51sebS1nZJJYk9S+VUh4JpPUM9HNCRLahweZDwUI1m7iMh06yaPS8jgEt\n+Civ1zBt/HHmBY5NEffLhEgzbLD5MNDwIPVDWGXpKpvrZg7tJMHDyi5h3oeK59I3cKXr5O5Y\ne5Dd7MGL0Tl5nd4FtG8f8z9WnK7MlUEK7eiU3CuT28dptSkTrvBqby4rxz6us2TyCWngltRC\nfE4zZI/1lcOPXYkoPEs5L99TEARBEARB+PFHvrETBEEQhGecSKnvaeqEUquOVUrS2Sj+iTQt\nPflxgsCRFztBEARBeAZZVOr3dPVZpc6mTRVySimVqlwU/WS18rJO98l3URKEDHmxezpJibTR\nIWpIBOVCW2Lb1G7ZsS0rDxJU65aZHmQWoK1EeTgfTshEk3IRDei2ycbeZMPs9eNsP/tT87Au\ntBwO37abbUSdI1JRYOBs4wFm1PZLL6aHbN0wm5V7xw9n5UcOLdNqKx6MlsI4CaUjPZCeYtrN\nSgcddXIOQV/tDs/WilHNLKLTcmV2F8RkL2+zBFOnM8TZojwbtXKRxLARY8+w2KhRx65Yh2DU\nOI1wr4VjTHPJX7w9K7tDVON5ZCqvE7eShJMlOqvn/gCd84hJA8HIZuQ8km1IghXTAGdLucRj\na7jSfBGT0zJxtjBk+XDuCjQin5xMs5lAWaiSVLwBnKqwyCzDIRHODNI7QRWDW9XZ3WGQiLhB\nCzPKyXHtlUzvxoB6UPCr8iYb6NoOTPUdz9+dlb2Ti7Sa2giXzj+JzlkrItFta52JqpdMIPLw\nkVOYKjPXsP/xb1iAyLVOIuXyj8kSJJLZoEym9DqKBsm0U0p5CfpTV/iV1WfOZVzEj8MInzKe\nEv0xZvdd0sUdMeijzV7I7rXQJ5IcMSMDh42aZmJ2UfO4TMxO12KXpgck2bGJdt713ftotV17\n4f9t3AQvUPfw1VqX3/jVOubD8yZ/2LH7pFLvVWrwQ3+uNOVb5r/85LX/moTvS4Z/oJShlDp9\nL9qz/q8Qf1vkJjJ4p+WKeJAWSBjkwz946Ic/VBgB5MVOEARBEJ4RPqgU9mFSrlI/UGpFqZpS\nVyh19i+ZiW79N01/OPa/oJT1+KcRBIIsnhAEQRCEC88n8Fa3rNQvKzWh1CuU+jmlflKpGaXe\noNSDZ3+vGV/Rnf/9mWqo8OxCXuwEQRAE4QKzoNR7zxbvV+oqpT6uFP0X1FipLyl1tVKfO/sH\nuvk/NOOWC9xK4dmIvNgJgiAIwgXmvyrlKqXUslLXKbX4BLU8pd6m1PfO/qTbv3NhGic8qxHH\n7mnELJOcUmKx6yTRN+cwgXcYYemAZUGn0GNmwYcB3GRrCFHX5mssTi0T2TyGaFyvwAHXByyO\n1SpDLr7o+fuy8tZN+2i1kwew5GKhDdfaysN8D07fQw9Z+c4dWXl1Fc7v8TLzfOMA7dm2CUr4\n4DDWLrgRS22N+vCO+xaZ0uMsW7VioQfCCEOQmMz7dkkXFkzI0fVV/MKzevSQIE8GlHj0lZgN\nxxKJA/UaGJoxG9Vm97DUVj0PI9vXYUD3YpatahhoQJ/sX27w7OW0ig8NQhxikOeAxb3viGSr\n0mBtfVOZVnMWUc3tkRRfH6q44bPhMDWMWpjgV9ZjslXJSiO/hDsijJlsNCQXGjawFkQne8MP\n+TqAAVk8YenoAb6bvEr8FtpMOm18B9a1jNvsmGJARP4eHgLGGrvXluZxg3xtEd1euwR6/us3\nP48eMrYHQcTDdaQQj3cqtFqjhNExepjeERsBlSdR0hMd9Iavo15UZMNhDcniCZJG3nLXabVq\nHXNVi1BtfohFKrrL7rtwSJYWlVFO+TqhgOYt2xjQdMgWT0RkXYgd4aEUJrihKiU2h/UU87ZH\nlmicXmVPm3/9X9/MyoMSGmOnmOq6zf7Hum3j5qw8++4blFJKDceKf3c2H/pDT/xWd4ahUv9F\nqXuU0pWm3/fy11w/6J1dynbb39+a1WqS5Reezu7iaQtPlTu+f+c5P0wYBeQbO0EQBEG4cFjG\ndzWto5RSfaX+9jwOuF+pR/f+rE/ec86qgiAvdoIgCIJwAdH1Y2dLdynyxfE5+dbZ/+YLK+eq\nJgjyYicIgiAIFxJdezSD8Pxf0h6taTntc9YTBHHsnk68DiSSpEjCPFuwylKDqSEBUVhyBsqm\nYnqQQxJxTYuKM+xvfzkimujE2OsYaNhEwF7uyxuns/L4BHI1jz3MUjoX5xGO2qyRSN4BjKKV\nB5ibkiR4HhVNVNu8kW1xvXoU+ppeICZcG46dNcHsnHWSKDs7i44aNlmGbUgieaMB5JiU74xe\nSNBRcYL+XKH7xOeYrKS1iZNEwp8TnQ2uSVJ840EH7Sext7bFdhDaVCSHjMGj6q2zHOOA6IMp\n8dXMhE2byMClFYmrpNN83T6bQiyRNyVzOGESj0ZswgHpqBpxAftxTA8JyhC8aiReOEx58rCO\najmXTHuXjVo6iYYS2UmVyNbq7qBJD/HIFVgGfuhxEy1HZtdmEz0Qk0trrjCXUdMx1QOfZO36\nbD701iF1HRt8Oys76xDppl9RoIdMJ7sxHRkAACAASURBVPjRjjCa3YSNmlknm74T+U0vsdmV\nI/qaH6Ixfkr8S5/1c2jgJhr28KG9lFmnJWssKzeOwQUMiXY87bAkat3E5TS6OLMx5M4jeWAG\nJqZKkVtlDpEm9RzKJRLfXWiyTGCT3NQ5De10eWD1XAN3bs5Ff9aJsBdxnXTBx+vbXY/cr5Ta\nMtW/5IwmV1Pny6M1teFMOdx5prxIQr8HJIc5X2Z9K17dcw35xk4QBEEQLhz+8NG/P19+3v8T\nvursf0Nv5ulokjBKyIudIAiCIFw4Wr0r09RUSqmNSr3qPA6YUeo1Z4vdtRc9fQ0TRgN5sRME\nQRCEC0cYlxvdF5/94Q8UF20ej99X6uw/Dm8YNK94GlsmjATi2D2NBDHytKIm7t0wJtuH55ka\nooZEVangK/f6BqbaeB6Es04LZS1hGlMlB9XGnCaG1pCIMjbz1YrEcDryfXh1ixFzaDSHZsJB\ngrEjnDlusoA6ZwsaUKlCLenNdWi10ICekiwvZ+VmiexlbjGjqJgnYmIMuSdKmYjmkL7pFol2\nY7BO8xN0iNeELKXR3ei59mP6GMQCsZj6faba2CkkGIOE5w00XI67zhqTm8DpLJv4OMUNtFpA\ngv10sv15lLDBtaktROaGTzLAUo3lhuW0x08Ui3yXVtN19IhDNKbIwXSyh+yvkUYX7dRCdJTm\nsE4bz6PbuwGZUTqziKot9GGXbHOuF3B4Ps9kqVSRdg6IJOexW1LPkfzCPs7glUgooGIkMa40\nWIBhVmCjoeIKOq03xFx1lkkq4UqDHlLdsS0rWxOIu1MhS8ibsKEZDoimmYvY4LZ8GFq9FNW6\nBqpprM9U6uOD9BT9PF7aRKs5LTK4ROWrksk5jNiNnw8gqVWIsOZFrNd0EkaYECO5bLPZpdE9\nVcklJCF+aHpsFYIR42z5PMTfaR53V5pGNX8BZ+sOMTmTJrM5l8fx9D7knzhTaJ9401su/65S\nqbpSqU8o9b8pxacHeK9S78x+uHHmoo3ZD694LV7yjPt+kJXvuPPgE5xLeE4g39gJgiAIwgVl\npb8rUL9y9oe3K3WLUhf9UKUppT6h1B9nP79EqXdfoPYJz2bkGztBEARBuNB46o8N9YipvqmU\nUtcqdUCp25W6TallpepKXaXU65TCl31blfq8UtYTnk4QHkVe7ARBEAThwmP11ZcL6gZb/U+l\nlDKUeqVSr3zcmi9W6vNKyXpY4byQF7unkSLZyrBPHB5rBuLUMOWKWwu6jjMJnSUs5mk1M8GP\nNQeizHqLGTE+2fayRuLZ8iQmqsenQM+CEDM9TkS0Beb3NrtoW47kP4VExYt52pyuQepaPgYn\nLIiYj1LctTMrDxyoQqmFPC4aeaWUyvno3COtUzhEZ9XoVqdGGa5PnOdJXS5xvEgxzZNLJklp\nSilHQ0d1yN67acjOHJOOCmI0RiN6U5Jj2VqDFahX9RrOfOU2pjQdOQxbqE3i+uyUjVpCVLaQ\nbDGcEguJZgcqpQwf8yFPfmVwrcx18Cud9IaVI7t5amw+BDrOPCS76Po8I1ClJIuRHKJFzCrr\nDolZSDZm9j0STsaHI2fjVwOS3JZorFqH/GTUcDlVomlGAd/2tIm7ICXOaDT2mBg5HOWT/YKH\nCpFy3Tw78wsN3PjLRKBcXVym1ba/DJssj52CytYIWrSaSfrT0dDOCumNUGcPiKFO7oISiRic\nYLdE0INwZs9go9K0j8MDbqpOTyE1MyVRiGbK7ogceabFZNFBEDxh/iJ5DKtyDkNQMNgGu0Ud\nbc7XSZvjLq22/CCsx4FHJmQFI6gZbA4XSWSjRdIcdaWUcnz1qUj9dE59QFePK8ZNK3WjUr+c\nfVe3YTOiRp//qmuz8sf+/K8e73DhuYi82AmCIAjCM0ak3tRXb6yo+5T6slJHlVpValypTUq9\nRqmXyz+/Cj8q8mInCIIgCM8smlJXKnXlM90MYRSQVbGCIAiCIAgjgrzYCYIgCIIgjAjyT7FP\nIzbZP9u0YJsbROLW88yfKJUhRK8HWFVQGbA41hIxcE/FOINmss3ICyTVuL2A9QpNEslbslkD\nfAuqda+GJMwpj0WbemQhQnEaQanePNYutALWGDeFuB0SDb+8czettp1cacWGKm6TzeBPukxn\nppG+ThH9zNNYlUpIDC8J2+0mzHTWyKoCo4jhIAOowh5bpBKRaiYJ+E1Z01SkcGaLrDYok3zg\nSGMSelTA6Hh5/GqivoVWO1Key8qJj8YY6+zSjAn0p0OWNZgeri3pMAndIvG2fRePi3aHde5w\nClPNtFAtTdEAb8DOrEh0sFkgK05c1mk2WT1gkxunp7HZldg4yjZwZp1MglBjKz4qRN7POZhd\nTZetV4g76IHqdpRDcnd7imUaFzdDvVfrmKtuzDqtYOFDiyTV2SLxwto6O+SBEpYQpRO4UxpL\nbAXS1BFcgk7uiDa/JWPSniJZnpUjycNuzBap5MgyF0UCn52YjRqJAVaVAtpZMyaycmGSPdPC\nAH0YkJx2x2DD0XWRx26m6EC9ws62uYLLKZSRNlyyUa045dBD/AUsVFpYmMvKvYBNG508RnQT\nc8CJyJ2SY22uFSezsraChj18cI5We+El23Bm9YTcfvcdWfltP/uOJ64oPHeRb+wEQRAEQRBG\nBHmxEwRBEARBGBHkxU4QBEEQBGFEEMfuaSQi+1LXHUhIA5t4KtxNaZAAz4jsGV8q92m1Vgo9\nqKThDKbOdBA3QLWwgg8ds6HaDPusAT7ZGT22IfT0uswqM8k257kcHLtuGZdZsnlkKHH58pPY\nV3uizRqw6sIWOtxF7m5Cgn9VmR2ik3zdQg5609BlRhFxz1RCNn2v1pnW1lt/zJbuZ7HJJWsJ\nC/41Q7TH90n0Mf+LkxnQFFwi+RH5zGJXpgyTmENLkBQf8ddotekqbMhGawWNsZlFlCfRuxUL\nrk8YoJpRZ4d0dRL823ezcoFHa5X6mJ++iUurk9zg1SGztWKipQ18qHhjZMd0pZRObMhWj+iD\nbGd2RVw+FZHc3TiHj/GGzIQzYxxjEymMbzqvSqQHeg30QMmsZeUpi82Hdoop1PHQ5/kiE+Yc\num89OURzEKJbKrPecMmdu0/DPgSHu4/Qao+s4Uq3FIhYeXyFVmuWcNVTY7iLTZIl7jZZpnFc\nQLWIPHlcj9mcsU58UIVD9FyBHNKhh3irpAdmcHihxHqgYOCO2DCBhOFqwoU5RVzbFVxCk2Qa\nm1NVekhvCQHFLWLxail7PqSzmHmWjylNn0KTm3bQQ6aaaNsDt96alfcfv59WUxO/nhVnpzFq\n+7/1bVrrule+WgnCOZFv7ARBEARBEEYEebETBEEQBEEYEeTFThAEQRAEYUQQx+5pxCVbg0cF\ndHVINlbPRUyqSgw4NL4GuSTIM4WlGuBsfRtuRxizMKehAbcj9dCYXpvEsxXZHJgi4V47t+7M\nyqbt0Wp3HbsbbV7BLt1FHW2OyhP0kFoeV2r10bBui6l4nQkSjrW0kJV12s4aU5q8Pv5+Eizg\n0kKb2VJ6AT/mSHpfLmGd1vGIzgjRRWkBqpkW+xtRFJPYsABtK/GkrjiCoaU7ZNN3D30bjbFL\naxk4ZNWBV3eFxfp2205soL7qI0rQcJkvGJGEtiaxiBJixW3etpEeYhPDaqWPMxccHn/okg3U\nE/yqQfa579ZZb0yNQV1yiEBp8fC/kGTsmdM4g6Hxwe2SjMAcLoeqX0bERm1IvDzDQZlnQSqd\nyHx9EmlmjpEbatmlh3hkQHOkbxWX/FY9omO28KtSCLf18D0P0kOSyQ1ZecNVl6N8GZO6Gqeg\nr1kzmCr5CearWV3cev0A992GMty1Up7ZvV0LQ2ARtTROWK/NTOEM0xObs3JzbRHXYtXoIdOb\nUE7LuPE2bZym1ZQPTfA4iWk8lazTWskKRiRKcZkNkvqpDvOgzUEDH0L8y0HAXMB6A3O1nkdC\nXjyLB1TzwEP0kCMNnLm0mzRgjtl7L/o/P6gej00i1Qk/IvKNnSAIgiAIwoggL3aCIAiCIAgj\ngrzYCYIgCIIgjAjyYicIgiAIgjAiyOKJp5E0h1UFNBgzIcnDW3JMlrfHkE2qhXB7Xb9HqxVm\ntqEaccA1m8UIGyRr1x6Dg1wmprlp8ExjoqTPH4KnXLNLtJo+DWvY0XEJ4wns7NYSM8q7ZZKC\nm+Bj/LBNq9kruOoesbNLubGsXO+wTkt8yNGBRqRpnpCsF9E5/RBn6K2w4FxF+yOPjrKhg6uE\na/h9E0J0ZQyH6FzD93UcRTJ0lVmHnz89w1TxxkmI2y2D5MGmrG/HZuDUbzyBjppbnafVXGLr\nBxau0+ig/YtH2UwraZhdqY753Fpn6wCCIa7HGcevNB1PmLrJnjZGE2cOQwxB22QpvjbJWC6S\ngGUtZUsxghwupzdENTvBp8SPSUgmt2Gax9l0ZrSrlCQkxzEdAqyQKOXYgo9imaQiKzTAX2C3\nZ4/Mj8lxTMigj1Uy951iaxe2VvBBZecVWfnyDVtotZvv/VZWHl6KuVFssvUK+SZWw9hkCBLS\n52HKU50HaICh0xVd7PkwuwsLJvZsvygrDxq4i5bnmvSQlQEmXhxjpuXHNtFqQxfDMXzw4azc\ns7u0muni3u+R5wOdNuuKzTSLPDytFXKndI/SaosuOqS+ExnRegPlb3z9X5QgPHPIN3aCIAiC\nIAgjgrzYCYIgCIIgjAjyYicIgiAIgjAiiGP3NLK+Au9negZ2i0v23h6aTBXyyRbXaghrxDvF\ndLF1Ehc8XYIT1O0zX608jmzSXAU7Xq8eRUyoW2XRx6UK5LnUh+lS2jBFq80s4myBgWptshm8\n43DFLIdD+iSQNigwO6fo4KpLHbq1Oy7ZHTDvpxfjbE4B3kwhx6p5HqqZCi6gzv96o5VgOzkk\niDhKiEaWsnTcSoL7yE/xKZrP+jYlOcaDSXzK5m17snKVW5Lr+mpWtohMud5lu7kfO4kE1OI2\nhBXry3O0mkUSszUTlxaaREQL1+ghqwmqDcghJe4n2TU0WyPCmU1UwGHAFDfLRgitQeK7S3qe\nVsuRkG0VYg4sLDL5LFWYbBYJf86RwdUS1reRiR9jB+W8zy4tDtE5JaLimT5G0C6yu9ip4Mfi\nOC5tcrZCq602TuAQC3fBCkmiTsdYY8IW+vC+w8guftV1F9Fqk7egBzpLJIm6wAKK6zXIne0e\n+rYwO4lTTWygh3g+LmdiMw63+0zV9dp4Xh3b/wD+fB2fst5kI7imMFeqRcyB1vxJWi0iaqNp\n4kM1jzWAaJaqOI5LcOj/8iqsAYaGX601STQ6UaWVUkcPLitB+PFGvrETBEEQBEEYEeTFThAE\nQRAEYUSQFztBEARBEIQRQRy7C4QbwQGKdBgw0ZDZWpYGO8e2IMRY29greL4C0WQsreMXpTqt\nRkw8dfDgMZzNxodWtrHYLp0IRgurMPacQYtWK+aQfKaFCE7r5Umo3izbJ147RHbp1vApaYOd\nOZjFr8wCztDvQBXqp9zec6ixh45KSRyXUsogu3eTrlUOGwEV2iRx0MUhngsNy7eZPJconCKI\naKQZjxXUcTkTNehWdgP9fKDHFLcgJqlyGg73PKYHPXLsQFZ+8d59OHO1Sqv5fQyBT4Q/M8Vz\nIEnYpQXk0nJEStM2skeHYxCpy0cP+CQrruCzsLeqjR97JGBPr7E5PFnCB3WbGI7ZEmunN8AH\nRVVyf5HJla+x4TBJtKRewoRIfI9W0zTabExObQD1yl9nsYItMu75DRtxZoNJn33i/A3b+NDc\nFEZtImL93DiG3eW/ffg4/rxxNa1mzcKUDVqYQrv2bqXVkhJUti1lYkB6mJzBRqbllRah56oA\nt+HyyiKtFtfRgPoEMvZiIteWyuzSckNMb6eGNEc/Zn3baRPjrYy2pUM2H6a3QBOcIZpjI8CE\n+Myff1YJwigi39gJgiAIgiCMCPJiJwiCIAiCMCLIi50gCIIgCMKIII7dBSLKk3Av8j4dBR1W\nrQgLJ2xBb9JdFu4VklA3NYWEvGKORYUtNRG55NTInpsOvDqjz9yUlYjs2FiCzrIULNFqJQtn\nS9fhe5VJWl7UZNl7QR9bQ6YV+DSxznrAicmZY7TNUfhzzWKOnd8jl2Cg00KHddok2Ya142A4\nrAZLwAq76NvAQTuLRYxaHLIGBAYxySyMYDFikh9R7JRG9mDtkGEyuSqUc/ChPpW9XOYvBg3E\n2nV278jKY/YEreb7GIKwQPqzBnUsGfAGaLg008aH9vgepl0yUkYdPeBEZAQDFsk2F+ByNLIn\nrxkwy9BJ4XstdiAj+my7YDVeQUcFIfn7KtExg5A5djYZQy+GwWmlfE9bsvmvR25Jg3Ugu+8S\nEqrXbM5l5eXhYdZo8vidKmCuxmsQbVtDJvw5Hm7JoIT7y/XZpsBveuV/yMpLh9G2SoXl7bWW\nMPGOniIqmw0Xc3zAAiy7TQxBZOLODQbsZt9zEby6HRuxb+xCE4PbNtjXCp5HpjQpOuWNtNqY\ngza3TiFtzj99gFb73Nf3K0F4riLf2AmCIAiCIIwI8mInCIIgCIIwIsiLnSAIgiAIwoggL3aC\nIAiCIAgjgiyeuEDEKcxxy4Nb7QZ88+xl7OauiOicC9k6gKCHo9oKOnPssrO5fZjXE1vgINtd\nqOIBE8pVQSMaONnNPWgt0GorOhpnkNzXxRCNyQUsjtXaQtx5klurD9g6AHeIS7BJOG3Ogaue\nDNm23DrZwz4hm9aXCzVabSJCkLJxGrJ5e8jWASQx2maU0ebhgITocr++TrYP98nyF1Nnf3Ei\nv1FBgjO7MebDoMOzl2kScp4MVZ/Z+gFJ6x2so3MmiyVabZnsYV8gSdSJgcOjPFuVEIZw6s06\n+nPWY2ssuhPow+48OsolAcnOHtaYsS46LVjHVccxG9yFDhpQVPhQy2J3xDDBtCELTlS5hkte\nMlhCsk7WhdgFlGseW+TR7ZLVMDZZ20RGo5OwUSM3hyqQNusVdkeEOqa0rZPnQwc90HLYTBvO\n4tSTNuJ5F0/3aLWTG8nCju9i2dPRiI1akyRjryysZuXcOOKFqxNj9JCohOnhhujzgs0GN+jj\nCfPwkSNZuefhieSU2KMn0sgilXmkqf/t//e7ShCEHwX5xk4QBEEQBGFEkBc7QRAEQRCEEUFe\n7ARBEARBEEYEcewuEDUdQomrkf3X88wwm5yBN2MZRMFZZg7Ncgu20PEWfJQtG9gm3+U6wl0L\nJXyQ5WCH7ObCQ/SQVgS/x6B2DTNtVEzsvdTALCr6uLQ+j5Cl5lIuQvtzLjOfhsS8iYc4m2sh\nAdWI2CG5Cj7JLKJcttn+5asnYBQ11lBWZeZUFXWcgcTWqsEQWlsxYXpQkkcP2EOcLeLtdMke\n8K0AUppHZC+rwDSs1EMP2HnMByvPqgWopQ4tQR/csftiWk2rISB3uAwtzAtxfOyzv+xZpDcG\npzE31htsa3ZnG4m/LuNsUYUYZmGRHhIP0Tkhscq0SSbP2WTe6MSrq5lserV7JM2b/Hmg0LdF\nixlmxMZUtoIiNtDYfAg9XGlMIprDAQyzeo4lUbskrTckZxuvslHzE0wbl7h0hoYzl3Q2hSJy\n1WmCswVJi1azHkDC8GkSAO6tsKdNsYL+HOvMZOVmH5OzbTJt1+nhxveJKWvbbNosHTuUlR86\nCm/YuWp7Vr79f31SCYLwNCDf2AmCIAiCIIwI8mInCIIgCIIwIsiLnSAIgiAIwoggjt0FYuAT\nK4uYOk7MhJ6oj1ftkERwqTIzXVQE72eYwHqp6Oxsgx5ixFbWYelVxtGYwGG7dztj8NKoONTh\neXt6AvUnjqE3ESVMKZZspbSIZNeR3C9jnE1Cs0bUqz4uJ43x5wkXE6u5clZ2F2EUNdZY9t6Q\n7lO+AbpVLmGCVDHByRNiO6VFkmnXZ232iFlYjDCCHv+LU9/EJUQ2ypZLcvi44OUQ5a5ioezy\nG9dI0YA0hG6VtBu0Wq4AQ2u9jPmge6TPh6wBBkluUw1Us+vMVzNM9GG+hPKgCXnO2s4mRLSw\niA8lYW9Bn2XCTZXQh5aFKdTtsiS/iMyuyMSvrAoaU9BYr3XaJD6QRLJpHhModdLqUKGalZLR\nzDEvsEx/0DGdhha/JYhZaLhkcpLP13XWmCL50HyORN+FzN7zQvzq2hvelZUXj63Sai+6FM+H\n5ZsfyMr3HYIht7LGOs2ZmcjKV9n4lPnTy7TaF7/1j0oQhGcI+cZOEARBEARhRJAXO0EQBEEQ\nhBFBXuwEQRAEQRBGBHmxEwRBEARBGBFk8cQFwqKCfhtyd1RgOatOgmjQYUrSUPmu85UaZO04\nwuKJTtqh1YwePPrBPLzpdgNRsXqBxcYWiGw+TrJR04Ap7Yki5jix2EOq1JMMYKVUGkG1DshF\n50vszGGAK9VIr+XIRvXj9Rw9ZO0kxHO3R5dvdGk1ReOKyVIQU6OHqCQPXT0k28YbDkl4Ttnf\niOhyg3WyGoZeslKqbpHLJosn+i5Ne2ZnNsmCiUgjDWDRy8ohacFtsv96L2VLXqbKiIcdrGOm\naWV86ICvv7FITxeraLNfZS2wSQPcI/ihT5Kcd++r00Pc3SgPjiBUuVBhPZCQidcjV6NpbFVB\neRx3RGSgn3Mp/rwZevSQJMHENcZwaTpfmVIskLUgKclbHqIceSxGOByibQZZyeGeYrfEcIjr\nMccxuFXSftdnw1HWcbZBiEM8hzVgNUVA8Ut2bczKScR64Mg8Zldh246sPF3A2czTR+khcR/j\n/uf/88+UIAg/fsg3doIgCIIgCCOCvNgJgiAIgiCMCPJiJwiCIAiCMCKIY3eB0MiG2WFMXCtu\na1kku9giVplqMnku2lTJyn4Xg+ipPq3mbCK5qWSXcUX2NddN5th1V2Hh5Cbxq8rMJlptvb2U\nleMa/txsQHeLmc/DiMmVRUyxUzox3qwpBKhWSOxta5nl7roBxCNtGn+e8gZo6DNlkA9l+qNS\nMdHabJLW64cYwcRhglfs4sfJPAY3X2EuYEocr26X2FqkBVyKU2kRZx76OGTosnhe29JJmbiM\nMbMMixPbsvLUEvq21UU1s81aYBD/sFslV52wR0cU4ageGUGdtL9tskzjLXlIXSvJ6awcdphV\nVijhjoj///buPTjK6o7/+NlLdrNJIOQCSQiYJmDAKiGAA8koDghWQRigUxWMU4xKTadV6TCt\nw00NVsaZVu38rDpGNFh1CmMhiEpFJMEyggXCRdBwi1zkEggQYja3vf7+2F/3nGcJy27CL5HD\n+/XX5tmz5znPk7Pwye73OY+ykrPFa6iMbFHKGf0WWQeWaZblYu1thvea16aUCSrrbzcYx+lX\nFtO2qmsHp8sT6G8xnDSnW74NYyxKvV262kokNstD89vlrPNalV96q+FsuG1yRqUqa1nbmwxL\ndu/77Kvg4//TS55ny75jarPTP8g1om3x8s3+6VcrBYBrFp/YAQAAaIJgBwAAoAmCHQAAgCao\nsesmdmVRutZEWZHjiDdka7tbuU37BVnrY0s2LBtmV5ezUlZuq88wlJXdlCwL41LPy6q4H5Nl\nEY/JWFPld8nezil3cDd/b1hvTyTL+h63V5aIxbtlQZI91lAepK5x12yXR211GUqaRLy8hbrv\npBzbKb9yl3RhqDCz9JbTOEFZYK/ZYhxArGxmVSqffC2GAbjb5Rlos8mX2C3yMM0uQ12eP1a5\nhXyyUjBnLKBsVtYka7bKcZqccruhdk+IGOVu7k3KWnEOq3F5szilZ+XcnDljuDV7n9h+wccN\nrbJa62L7eTmAdMMv2quUXrmUm9bHtxlOmrNVuQm9TZ4BW4Y8zPPJhhXRrIeTlJfI6W1pb1Kb\n1SvrGibY5ZgtvQzn1qksJuh2yUl41iwHZrdY1Je47PIX7VfWCLT0EgbtckdxHqWUzexWHhoG\nY1FKMNtd8nzGuYy/XuUNYlNq7Hzt8qS5exnOs7LAnPAIZYW/RsM7IiYjIfj4BqecAz+0nleb\nbdj9iQCgHT6xAwAA0ATBDgAAQBMEOwAAAE0Q7AAAADTBxRPdJEG9SXm7rKE2G2+mLo7Lqx/M\nyhUSSYN+prYyK7eN9/U/GXwcI4yr/Xrlj5Y0uTpqQktD8LE1zhDuzSnyJa5meb2CJ86wHqxF\nKeoXZ+Q4e+XI1YqdsYa6b4tSOd7LphSBn1SvihDOY7J23qQ8E6estewyXhQRkyALz91OOU6P\noVZeiGb5lEUp0G8xLlDs8cveHT6lWF65rMR90TBmU4uyjrFyLUurMNyaXe3Mq5TR91bG2eww\nnDSPcgzJqbIM3+8zXPLSoOzIrd6o3rjc8fHDch3gYT/PCj4+vbc++Phiq6HA33dezoekXnIA\n7T7DfPD55Ant00/edT4xXi7V23y4RX1Js7K+rqVNjt9lWGpXtCrXKCQqKw+bzIaFtR1O2Xm8\nXb47mp3ybLR5DetFmxKUI3XJAcS7DO8Iv0n+2O6WJ9RmVq5AijFMNb9bHoM7WdlJu+Gk2drk\nqxx2OQvdJuUSKKvhdJw6ckYAQFh8YgcAAKAJgh0AAIAmCHYAAACaoMaumzRZZSGa/3tZD+Rs\nMZQ0tXtkRZGjl3I39yZDtVRzrSxpcvWW5UH+Hw2Lu7b7ZC1dskkWG7Wel4NpNRuK/Hx2WboU\n55UDaL1gWPrYHSuHbU2Rfx54LjTKxx5DFdSAfnLRVOdpOc56l7F6T7YSyQ5Z1OVUbkdvbjGu\nNGuVP1qUKR3jNZS4uZX1in1KtZXZbugtRilyi7HLE9WilNW5fYbKJ1sfeTYcSgGlN95QvmeP\nkb/3GGUELocyZp+hStKirFVr8Sn3hu/tUJu118nBeevUqWJYtzb2RtnMZJOH0NIqz7Pd+qP6\nkvPKOsCWGJvy2DBvY3snBh8np8jDcZ6Wh9PmNNauZcqnYhOVZYTbEtRmJr88BI+y+LKrwak2\nsyTL8xnTro5N/tI9dsPZMFvkOP3KCsM+Y1nbxXONAgCuHXxiBwAAoAmCHQAAgCYIdgAAAJqg\nxq6bNLbKG6hb+8kaoBiLocLMS4LGPwAAGrZJREFUo9yY3ONTKuFO/KA2syiFR72VG9V7vIai\nrqZ6WR7kSk4NPvb5ZEmTqe2i+hJfm6yjalEK+9yGmi6h3ije4ZU1SX6XrFDzNxvqAg8oa7/5\nzfIwbVmGSWhrkT243PKx3SL3YjIudeb1yUI0X5ysqXK2Gda7U9ZNE1al+s7fZCjFE8my91bl\nNVblzeLtY1htzqz8ZLcqtYwmw6G1+eVJdFiVp9yyftHUaqixs/XtHXzsbFcO7bBhIT3hlKfa\n2kf2HGuYXMJ+Xs6HC6fl/eB9DjkhG88aTppfKTn0JynH6TUud6ec6hMuuRdbm7KoXoZhDrW0\nyorD+mMNAgBwNfCJHQAAgCYIdgAAAJog2AEAAGiCGrtu0lYjq6DSh8jTbjXeg7XBK2uSvI3K\n4l5mQ1GXPUat0pPNPBbjPStNsnqsX7xyy8sWWSPXaDUuUKfcUNWcJiv2EiyGQjTTj7Kmyh8r\nezPb5GEm2gx/Nrh98hB8ar1ao+HQWoR6C065PcmvVB96DS+56FPuYarcxNZsPBupCXKpM2eM\nUtZmHIBXWb3PpayIZmuX1W++GEMhmnpT2ialeM7kNTRLUg7Ho9zVt90kDy0hrZf6Etc5eT6d\nylKCFuPae77+cpwJTXI3FovhDX7mvGGNOgCAfvjEDgAAQBMEOwAAAE0Q7AAAADRBsAMAANAE\nF0/0gFbl+oAf/YZVfO2tstw+xi+r4G3GYnmX16w8Vq42iDU0c7jlGrDNjXINWKdJvqTZaSjw\nj4mTjz0e5Smz4W+AOKGsW6v0YDbLnt3G2eW1KYv9euWlGF6f4dqFBJt6lYY8nAseeYWBt8kw\nZnOmHFvCj3IAVuNCxm4he/DZ5FPmOMMArMovxK8ctEn5dcT6DMvzxijrGF88abgYBQCA7sQn\ndgAAAJog2AEAAGiCYAcAAKAJaux6gKVdydPGCrN2pRDNZZFPedoM6wPbeinldx75VHuz4Rby\n7X6l4s3dHHwc21vejj0hwVAu5vbJsXldsmdfq2GcLpdsZvfJnZqVMVuNSx+LZlkwpyxpLHpZ\nbWorp7KocqtyclxNyh5thlLC5m9bBAAA4BM7AAAAbRDsAAAANEGwAwAA0AQ1dj2g3SaL0uIN\npWuiWRbCCX+7rDZzGerQhN8uH5vk+nTCazXez14pn3MrtWuWRPn6+FjDS5rPycXerA5ZytZU\n6xEAAOCnjU/sAAAANGGeMGHCgAEDHA5HTk7Offfdt3Xr1pAWfr+/oqIifDOv17tkyZJJkyZl\nZWXFxcUlJyePGDGitLT0woULarP333/fdHler9e4Z7Fx48bp06enpaXZ7faBAwdOmzZt06ZN\nIW1qa2uLiorS09NjY2NvvPHGRYsWtbRwjSQAALgemRITE6dOnZqSknLw4MH169f7/f7y8vLZ\ns2cHW/zud797/fXXwzdra2tzOBzp6em5ubn9+vVzOp3V1dX19fX9+/ffsmVLVlZWoNnWrVvf\nfPPNkBHU1NRs27Zt/PjxlZWV6vb58+e/+OKLdru9oKAgLS2tvr7+m2++KSkp+fOf/xxss2/f\nvrFjxzY2Nk6ZMiUnJ2fz5s07d+4sKCiorKx0OBziKtmyZcu33347Z86cq9VhfK78oNQU8lWs\nehcv5d5WZuNXsTF2+V1qbIPswms1fGHarn4Va5U9J9yQIgfTbliURP0qVv08t6nWcOszAADw\nE2Q6efJk//79Az989NFH06dPHzhw4PHjxwNbvv/++0GDBqWmpu7ZsydMM7/ff/z48WCAE0K4\nXK5HHnnkgw8+mDNnTllZWZgRTJ48+d///veKFSseeOCB4Mby8vJHHnmksLDwww8/zMzMDGz0\n+XwNDQ0pKTKUjBkzZtu2beXl5Q8//HCgwUMPPfTPf/7z+eefX7RoUdfOjESwEwQ7AACuBSa/\nX/5/7/P57HZ7TExM8NvMjRs3Tpw4cfLkyZ9++mmYZh368ssvx40bN27cuKqqqsu1OXbsWE5O\nTkpKyokTJ2y2/xdeXC5XVlZWU1NTbW1tWlra5V67c+fOUaNG5efn79q1K7jx5MmTN9xwQ//+\n/Y8fP24ymS732qhc9WAXO1S5Ub3xKed+vwAAAOgUa11dXXp6euCHdevWeTyeKVOmBJ8eOnSo\nxWLZvn17+GYdWrVqlRBi+PDhYdqUlZX5fL7i4uJgqhNCVFZW1tXVFRUVJSYmrly5ct++fQ6H\nY8yYMXfeeaea1QJf3U6aNEntMDMzMy8vb/fu3QcPHhwyZEgkpwAAAEAP1ptuuilQPHfo0KH1\n69ffe++9b731VvDpzMzM0tLSRYsWhW8WNHfu3La2tsbGxh07dhw+fDgvL2/hwoWX27fH43nn\nnXdMJlPIh2Hbt28XQqSkpOTl5R06dCi4vbCwsKKiIvgZ3oEDB4QQl6a33Nxcgh0AALgOWX0+\n33vvvRf4YciQIUVFRampqWqLhQsX5uTklJSUhG8WsGzZsub/LcV2zz33LF++vG/fvpfb90cf\nfVRXVzdx4sTBgwer28+ePSuEeO211wYPHlxVVXXrrbceOXJk3rx5GzZsmDlzZvCL3cbGRiFE\nYmJiSLd9+vQRQly8eDGS4z99+vT999/f2toapk1zc/NDDz3k9/uv1ne7OTcMCj62hGkHAAAQ\nDWtJSclvf/vbfv367d+/f/78+Q8++ODevXuXLl0abFFaWlpaWvrHP/4xfLMAp9Pp9/vPnDnz\n5ZdfPv300/n5+Z9++unIkSM73HfgCtnHH388ZHtg3ROTybRmzZqhQ4cKIYYNG1ZRUZGbm7tp\n06YdO3bceuutYQ4pUDUYYQhLTEycMWOG2+0O08btdtfW1l6tVCeE+O7zw1erKwAAAMmvaGlp\nGThwoMViOXr0aGDL+vXrhRCzZs0K36xD+/btE0Lk5eV1+GwgKqWlpblcrpCnFixYIIS45ZZb\nQrYHVld54403Aj8+9thjQojly5eHNLv//vuFEGvXrg0zNgAAAP0Y7jzhcDgKCgq8Xu/u3bsD\nWwIXw44fPz58sw7dfPPNGRkZ33zzTUNDw6XPlpWV+f3+Rx55JCYmJuSpQG1c4BtVVWBLW1ub\n2ixQaacKlOXl5uaGGRsAAIB+Qm8pdubMGSGE/X/LpLlcLvG/orcwzTrU1NQUeKHVGnpHWrfb\nXV5efullEwETJkwwmUz79+8P+YZ07969Qojs7OzAj3feeacQ4rPPPlPbnDp1as+ePZmZmQQ7\nAABwvTGfOHEi+MPHH3+8efPmuLi4wsLCwJaxY8cKIf7+97+Hb/b111/v2bNH7ff8+fO//vWv\nvV7vHXfc0atXr5C9VlRUnD179he/+EUwpakyMzNnzJhx7ty5F154Ibjxk08+qaysTE1NnThx\nYmDLyJEjR48evWvXrn/84x+BLT6f709/+pPP5yspKbmKJXEAAADXBFN8fPyUKVPS0tJqamo2\nbNgghHjjjTdKSkoCT3u93rvuuquqqip8sxdffHH+/Pk5OTnZ2dlJSUl1dXXV1dWtra0ZGRmV\nlZWBCyBUEyZMqKysXL169YwZMzoc1qlTp2677bajR48WFhaOHDny2LFj69ats1gsH3744bRp\n04LN9u3bd/vttzc1NU2dOjU7O3vz5s3V1dVjxoypqqq6ircUAwAAuCaYRo8e/d1337W2tiYn\nJxcUFMydOzfwFWeQy+V67bXXVqxYEaZZTU3N22+/vWnTpmPHjjU0NCQkJAwZMmTy5MlPPvlk\nUlJSyC4PHTo0ZMiQ9PT048ePX/otbdC5c+eWLFmydu3aU6dO9e7d+4477liwYMGl18PW1tYu\nXrz4iy++aGxsHDBgwMyZMxcsWBAfH9/lMwMAAHCNMdxSDAAAANeu0IsnAAAAcI0i2AEAAGiC\nYAcAAKAJgh0AAIAmCHYAAACaINgBAABogmAHAACgCYIdAACAJgh2AAAAmiDYAQAAaIJgBwAA\noAmCHQAAgCYIdgAAAJog2AEAAGiCYAcAAKAJgh0AAIAmCHYAAACaINgBAABogmAHAACgCYId\nAACAJgh2AAAAmiDYAQAAaIJgBwAAoAmCHQAAgCYIdgAAAJog2AEAAGiCYAcAAKAJgh0AAIAm\nCHYAAACaINgBAABogmAHAACgCYIdAACAJgh2AAAAmiDYAQAAaIJgBwAAoAmCHQAAgCYIdgAA\nAJog2AEAAGiCYAcAAKAJgh0AAIAmCHYAAACaINgBAABogmAHAACgCYIdAACAJgh2AAAAmiDY\nAQAAaIJgBwAAoAmCHQAAgCYIdgAAAJog2AEAAGiCYAcAAKAJgh0AAIAmCHYAAACaINgBAABo\nwtrTA7gG1NbWDh061OPx9PRAAADAT0VlZeX48eN7ehShCHZXNmjQoB07dhDsrnN79+4tLi7e\nsmWLzWbr6bGgxzz77LMWi+WZZ57p6YGgJy1ZssTr9ZaWlvb0QNBj2tvbb7vttri4uJ4eSAcI\ndhEZPnx4Tw8BPcztdgshRowYERsb29NjQY9JSUmxWq2jRo3q6YGgJ6Wmpno8HqbB9ay1tbWn\nh3BZ1NgBAABogmAHAACgCYIdAACAJgh2AAAAmiDYAQAAaIJgBwAAoAmCHQAAgCYIdgAAAJog\n2AEAAGiCO08AEbHZbBaLxWKx9PRA0JNsNpvVyj+b1zubzWY287HIdS3w38FP8w6TJr/f39Nj\nAK4N33//fU5OTk+PAj2poaFBCJGUlNTTA0FPYhpA/IT/RyDYAQAAaIIPkwEAADRBsAMAANAE\nwQ4AAEATBDsAAABNEOwAAAA0QbADAADQBMEOAABAEwQ7AAAATRDsAAAANEGwAwAA0ATBDgAA\nQBMEOwAAAE0Q7AAAADRBsAMAANAEwQ4AAEATBDtcq95//33T5Xm93g5f9fHHHwcaLFq0qMMG\nGzdunD59elpamt1uHzhw4LRp0zZt2hRtM6/Xu2TJkkmTJmVlZcXFxSUnJ48YMaK0tPTChQth\njuiKY8Olru40iKq32traoqKi9PT02NjYG2+8cdGiRS0tLWqDaKdBhHMPl+rBaXDF3qKaBsuX\nLy8sLOzVq1dcXFx+fv7f/vY3j8fT2bNy3empaeD3+ysqKiZMmDBgwACHw5GTk3Pfffdt3bo1\nzFDD/Gu/evXqJ5544rbbbktISDCZTDNnzoz2PFijfQHwEzFo0KDZs2eHbKypqdm2bdv48eMt\nFsulL6mvr58zZ05CQoLT6eywz/nz57/44ot2u72goCAtLa2+vv6rr74aNmzYuHHjomrmdruf\nffbZ9PT03Nzc0aNHO53O6urq5557rqysbMuWLVlZWZ0YGzp0dadB5L3t27dv7NixjY2NU6ZM\nycnJ2bx58wsvvLBx48bKykqHwxFoE9U0iHDuoUM9NQ0i6S3yaVBcXLx8+fLk5ORp06bFx8dX\nVlb+4Q9/+PLLL1etWmU28ynMlfXUNPj973//+uuvJyYmTp06NSUl5eDBg6tXr161alV5efml\nPYTfqRBi6dKl1dXVvXv3zszMPHjwYCQHHsoPaGTSpElCiBUrVnT47PTp0zMyMhYvXiyEWLhw\nYciz77zzjhCisLDwxIkTwY1er/fcuXPRNvP5fEePHlVf1d7eXlRUJISYM2dOJ8aGqHRlGkTY\n2+jRo4UQ5eXlgR+9Xu+sWbOEEM8//3ywTeTTIMK5h6h0wzSIpLcIp8HHH38shMjKyjp9+nRg\nS1tb2+TJk4UQb7/99hWHh8v5/z0NamtrhRCpqaknT54MblyzZo0QYuDAgZ3YaVVV1aFDh3w+\nX2BKPPDAA1c+SCOCHfRx9OhRs9nct2/f9vb2S58N/N/5ySefvPLKK5e+ndrb29PT0+Pj4+vq\n6sLsIsJmHQp8rTZu3Lhox4aodGUaRNhbdXW1ECI/P19teeLECbPZPGDAAJ/PF6bDS6dBVyYV\nLqcbpkGne/N3NA2Ki4uFEK+++qrabM+ePUKIESNGXLFDdKgbpsEXX3whhJg8ebLa0uv1Wq1W\nh8PRlZ12Otjx6S70UVZW5vP5iouLbTZbyFNHjx596qmniouL77333g5fW1lZWVdXN3369MTE\nxJUrVy5evHjp0qUbN270+/2daNahVatWCSGGDx8e7dgQla5Mgwh7q6ysFEIE/nYPyszMzMvL\nO3HiRPhvTy6dBl2ZVLicbpgGne5NdDQN6urqhBCDBg1Smw0ePFgIsWvXroaGhsg7R1A3TIOh\nQ4daLJbt27cHfoMB69at83g8d999d9d32gnU2EETHo/nnXfeMZlMc+bMCXnK5/PNnj27T58+\ngb+QOrR9+3YhREpKSl5e3qFDh4LbCwsLKyoq0tLSomoWNHfu3La2tsbGxh07dhw+fDgvL2/h\nwoXRjg2R6+I0iLC3AwcOCCGGDBkS0j43N3f37t0HDx4MeSr8NIh2UuGKumcaRNtb+GmQmpoq\nhDhy5Ij6kuCPBw4cKCgoiHDACOieaZCZmVlaWrpo0aKbbropUGN36NCh9evX33vvvW+99VYX\nd9o5BDto4qOPPqqrq5s4cWLgb1zVSy+99J///Ofzzz9PTEy83MvPnj0rhHjttdcGDx5cVVV1\n6623HjlyZN68eRs2bJg5c2ZVVVVUzYKWLVvW3NwceHzPPfcsX768b9++0Y4NkeviNIiwt8bG\nRiHEpf306dNHCHHx4sWQ7eGnQbSTClfUPdMg2t7CT4MpU6a89957L7/88syZM5OTk4UQHo/n\nmWeeCTzLJ3ad0G3TYOHChTk5OSUlJe+9915gy5AhQ4qKigJhvSs77Ry+ioUm3nzzTSHE448/\nHrJ97969ixcvLikpueuuu8K8PHDtuslkWrNmzbhx4xISEoYNG1ZRUdG/f/9Nmzbt2LEjqmZB\nTqfT5/OdPn16xYoVNTU1+fn5O3fujHZsiFwXp0GEvV1O4MtTk8kUsj38NIh2UuGKumcaRNtb\n+Gnwq1/9aurUqbW1tT//+c9/85vfzJ07Nz8/f926dYEY0eEVnQiv2/41KC0tLSoqKikpOXLk\nSHNzc3V1dVZW1oMPPrhgwYIu7rSToi3KA36CamtrTSZTWlqay+VSt/t8vuHDh2dnZzc1NQU3\ndliyGngH3nLLLSE9By5Wf+ONN6Jq1qF9+/YJIfLy8qIdGyLU9WkQSW9+v/+xxx4TQixfvjxk\n+/333y+EWLt2bZhBhkwDf9cmFS7VPdOgi+/fS6eB3+93u90vv/xyfn5+bGxsQkLC3XffvW3b\ntsD117t27bpin1B1278G69evF0LMmjVL3djS0jJw4ECLxRK4ILpzO+WqWFzXnn76aSHE/Pnz\nQ7a73e7wf9g8+uijgZbvvvuuEOL2228P6eGpp54SQrzyyitRNbucjIwMIcSFCxeiGhsi1PVp\nEElvfr//L3/5S4dPjRgxQgixf//+8ONUp4G/y5MKIbpnGnT9/RsyDTr0448/2mw2h8NxaZ5A\neN32r8GTTz4phCgrKwvZft999wkh1qxZ0+mddjrYUWOHa57b7S4vL++wQtZsNj/66KMhG7/9\n9tuvv/46Pz9/1KhRY8eODWycMGGCyWTav3+/2+2OiYkJNt67d68QIjs7O6pmHWpqagpUU1mt\n1qjGhkhclWkQSW9CiDvvvFMI8dlnny1dujS48dSpU3v27MnMzMzNzQ0zzpBpILo2qRCi26ZB\nF9+/l06DDpWVlblcrtmzZ6sTA1fUnf8auFwu8b9KWdWZM2eEEHa7vXM77ZJokyDwU7Ny5Uoh\nxN133x1h+8t9AP7LX/5SCPHss88GtwT+YEpNTXU6nVE127p16+7du9XOz507N336dCHEHXfc\n0Ymx4Yqu1jSIsLfAF2Tvvvtu4Eev1xtYclZdoDjyaRDh3MMVdfM0iKS3yKfBgQMH1EUQKyoq\nHA5HQkJCbW1thANAQHdOgw8++EAIkZ6e/sMPPwQ3rl271mQyxcXFXbx4sXM79fOJHa5n0Va4\nX86rr766c+fO0tLSzz//fOTIkceOHVu3bl1MTMyyZcvi4+OjarZp06b58+fn5ORkZ2cnJSXV\n1dVVV1e3trZmZGQERour7mpNgwh7e/vtt2+//fbi4uLVq1dnZ2dv3ry5urp6zJgx8+bNC7aJ\nfBpEOPdwRd08DSIR+TR48MEHz5w5c/PNN/fq1aumpubbb7+Ni4v717/+lZOT06XDuP505zR4\n4IEHli1bVlVVNXTo0ClTpqSlpdXU1GzYsEEI8dJLL3XiAtjVq1evXbtWCHHixAkhxH//+9+H\nH35YCJGamvrXv/41oi6iTYLAT8rBgwdNJlNGRobb7Y7wJWH+Tqqvr3/iiSeysrJiYmJSUlJm\nzJixffv2TjT77rvv5s2bN2rUqNTUVIvFkpiYOHr06Oeeey58PU34sSGMqzsNIuzt8OHDs2bN\n6tu3r81my8nJWbBgQcina1FNgwjnHsLokWlwxd4inwavvvpqQUFBUlKSzWb72c9+9vjjjx85\nciTCXSOo+6dBe3v7yy+/PHr06ISEBIvF0rdv36lTpwbWGO/ETkPWOg3KysqK8HBMfhY3BwAA\n0ALr2AEAAGiCYAcAAKAJgh0AAIAmCHYAAACaINgBAABogmAHAACgCYIdAACAJgh2AAAAmiDY\nAQAAaIJgBwAAoAmCHQAAgCYIdgAAAJog2AEAAGiCYAcAAKAJgh0AAIAmCHYAAACaINgBAABo\ngmAHAACgCYIdAACAJgh2AAAAmiDYAQAAaIJgBwAAoAmCHQAAgCYIdgAAAJog2AEAAGiCYAcA\nAKAJgh0AAIAmCHYAAACaINgBAABogmAHAACgCYIdAACAJgh2AAAAmiDYAQAAaIJgBwAAoAmC\nHQAAgCYIdgAAAJog2AEAAGiCYAcAAKAJgh0AAIAmCHYAAACaINgBAABogmAHAACgCYIdAACA\nJgh2AAAAmiDYAQAAaIJgBwAAoAmCHQAAgCYIdgAAAJog2AEAAGiCYAcAAKAJgh0AAIAmCHYA\nAACaINgBAABogmAHAACgCYIdAACAJgh2AAAAmiDYAQAAaIJgBwAAoAmCHQAAgCYIdgAAAJog\n2AEAAGiCYAcAAKAJgh0AAIAmCHYAAACaINgBAABogmAHAACgCYIdAACAJgh2AAAAmiDYAQAA\naIJgBwAAoAmCHQAAgCYIdgAAAJog2AEAAGiCYAcAAKAJgh0AAIAmCHYAAACaINgBAABogmAH\nAACgif8Lkzd10ZOO05sAAAAASUVORK5CYII=", + "text/plain": [ + "plot without title" + ] + }, + "metadata": { + "image/png": { + "height": 420, + "width": 420 + } + }, + "output_type": "display_data" + } + ], + "source": [ + "r=19; g=20; b=21;\n", + "plotRGB(a1,r=r,g=g,b=b,stretch=\"lin\", axes=T)\n", + "plot(shp,pch=21,bg=\"red\",col=\"yellow\",cex=1.9,lwd=2.5,add=T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.3.3\n", + "Define color Palette for habitat type probability plot." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "col<-colorRampPalette(c(\"lightgrey\",\"orange\",\"yellow\",\"limegreen\",\"forestgreen\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.3.4\n", + "Create vector with class names in the order of reference spectra (rows = habitats)." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "classNames<-c(\"deciduous\",\"coniferous\",\"heather_young\",\"heather_old\",\"heather_shrub\",\"bare_ground\",\"xeric_grass\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## **2 Habitat Sampling**" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"init.samples = 50 models = 200\"\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning message in parallel::mclapply(1:nb_mean, model_opt_r, raster = raster, sample_type = sample_type, :\n", + "“all scheduled cores encountered errors in user code”\n" + ] + }, + { + "ename": "ERROR", + "evalue": "Error in res[[k = k]][[\"points\"]]: subscript out of bounds\n", + "output_type": "error", + "traceback": [ + "Error in res[[k = k]][[\"points\"]]: subscript out of bounds\nTraceback:\n", + "1. HaSa::multi_Class_Sampling(in.raster = a1, init.samples = 50, \n . sample_type = \"regular\", nb_models = 200, nb_it = 10, buffer = 15, \n . reference = ref, model = \"rf\", mtry = 10, last = F, seed = 3, \n . init.seed = \"sample\", outPath = outPath, step = 1, classNames = classNames, \n . n_classes = 7, multiTest = 1, RGB = c(19, 20, 21), overwrite = TRUE, \n . parallel_mode = TRUE)", + "2. sample_nb(raster = in.raster, nb_samples = seq(init.samples, \n . init.samples, init.samples), sample_type = sample_type, nb_mean = nb_models, \n . nb_it = nb_it, buffer = buffer, reference = reference, model = model, \n . area = area, mtry = mtry, last = last, seed = seed, init.seed = init.seed, \n . parallel_mode = parallel_mode)" + ] + } + ], + "source": [ + "HaSa::multi_Class_Sampling(\n", + " in.raster = a1,\n", + " init.samples = 50,\n", + " sample_type = \"regular\",\n", + " nb_models = 200,\n", + " nb_it = 10,\n", + " buffer = 15,\n", + " reference = ref,\n", + " model = \"rf\",\n", + " mtry = 10,\n", + " last = F,\n", + " seed = 3,\n", + " init.seed = \"sample\",\n", + " outPath = outPath, \n", + " step = 1,\n", + " classNames = classNames,\n", + " n_classes = 7,\n", + " multiTest = 1,\n", + " RGB = c(19,20,21),\n", + " overwrite=TRUE,\n", + " parallel_mode=TRUE)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## **3. Plot results**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_results(inPath=outPath)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "R", + "language": "R", + "name": "ir" + }, + "language_info": { + "codemirror_mode": "r", + "file_extension": ".r", + "mimetype": "text/x-r-source", + "name": "R", + "pygments_lexer": "r", + "version": "4.0.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} -- GitLab From d4d929ed38579e1df9ba41f7dc3c421f6b2a68a8 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Thu, 28 Jan 2021 15:11:59 +0100 Subject: [PATCH 13/58] Install more dependencies. --- docker/context/hasa.docker | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docker/context/hasa.docker b/docker/context/hasa.docker index 8b026c5..a943ef1 100644 --- a/docker/context/hasa.docker +++ b/docker/context/hasa.docker @@ -14,7 +14,7 @@ RUN /bin/bash -i -c "\ " # install dependencies RUN apt-get update -y && \ - apt-get install -y proj-bin gdal-bin libgdal-dev + apt-get install -y libprotobuf-dev proj-bin gdal-bin libgdal-dev jq libv8-dev # install R RUN /bin/bash -i -c "\ apt-get install -y dirmngr gnupg apt-transport-https ca-certificates software-properties-common && \ @@ -30,6 +30,10 @@ RUN /bin/bash -i -c "\ apt-get install -y python3.8 && \ apt-get install -y python3-pip \ " +# install Python dependencies +RUN /bin/bash -i -c "\ + pip3 install geojson \ +" # install jupyter-lab and IRkernel RUN /bin/bash -i -c "\ pip3 install jupyterlab \ -- GitLab From 74b57e0ed291ba92ced4bde8c478c0b818a7cbbd Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Thu, 28 Jan 2021 15:56:29 +0100 Subject: [PATCH 14/58] More dependencies --- docker/context/hasa.docker | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/context/hasa.docker b/docker/context/hasa.docker index a943ef1..07a6b0c 100644 --- a/docker/context/hasa.docker +++ b/docker/context/hasa.docker @@ -14,7 +14,7 @@ RUN /bin/bash -i -c "\ " # install dependencies RUN apt-get update -y && \ - apt-get install -y libprotobuf-dev proj-bin gdal-bin libgdal-dev jq libv8-dev + apt-get install -y libjq-dev, protobuf-compiler, libprotobuf-dev proj-bin gdal-bin libgdal-dev jq libv8-dev # install R RUN /bin/bash -i -c "\ apt-get install -y dirmngr gnupg apt-transport-https ca-certificates software-properties-common && \ -- GitLab From e737766ecbda8b98fc0db4fea15cce5153039472 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Thu, 28 Jan 2021 16:59:36 +0100 Subject: [PATCH 15/58] More dependencies and increase versions. --- docker/context/hasa.docker | 2 +- docker/context/install.R | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/context/hasa.docker b/docker/context/hasa.docker index 07a6b0c..45885cc 100644 --- a/docker/context/hasa.docker +++ b/docker/context/hasa.docker @@ -14,7 +14,7 @@ RUN /bin/bash -i -c "\ " # install dependencies RUN apt-get update -y && \ - apt-get install -y libjq-dev, protobuf-compiler, libprotobuf-dev proj-bin gdal-bin libgdal-dev jq libv8-dev + apt-get install -y libjq-dev, protobuf-compiler, libprotobuf-dev proj-bin gdal-bin libgdal-dev jq libv8-dev pandoc # install R RUN /bin/bash -i -c "\ apt-get install -y dirmngr gnupg apt-transport-https ca-certificates software-properties-common && \ diff --git a/docker/context/install.R b/docker/context/install.R index 037d435..39c7cf1 100644 --- a/docker/context/install.R +++ b/docker/context/install.R @@ -8,8 +8,8 @@ IRkernel::installspec(user = FALSE) install.packages("remotes") install.packages("https://cran.r-project.org/src/contrib/Archive/BH/BH_1.69.0-1.tar.gz", repos=NULL, type="source") install.packages("https://cran.r-project.org/src/contrib/Archive/sf/sf_0.8-1.tar.gz", repos=NULL, type="source", dependencies=TRUE) -install.packages("https://cran.r-project.org/src/contrib/Archive/sp/sp_1.4-1.tar.gz", repos=NULL, type="source", dependencies=TRUE) -install.packages("https://cran.r-project.org/src/contrib/Archive/rgdal/rgdal_1.4-8.tar.gz", repos=NULL, type="source") +install.packages("https://cran.r-project.org/src/contrib/Archive/sp/sp_1.4-4.tar.gz", repos=NULL, type="source", dependencies=TRUE) +install.packages("https://cran.r-project.org/src/contrib/Archive/rgdal/rgdal_1.5-12.tar.gz", repos=NULL, type="source") # Install HaSa library(remotes) -- GitLab From 26a4661b4cfca9e54b4f6731e1352d5b5595e12a Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Thu, 28 Jan 2021 17:07:50 +0100 Subject: [PATCH 16/58] Let's use crs instead of proj4string --- R-package/R/model_opt.r | 6 ++++-- R-package/R/outer_procedure.r | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/R-package/R/model_opt.r b/R-package/R/model_opt.r index 394663f..9439896 100644 --- a/R-package/R/model_opt.r +++ b/R-package/R/model_opt.r @@ -149,7 +149,8 @@ model_opt_r <- function(k, pbtn1 <- as.data.frame(cbind(classes[d1], matrix(p1, ncol = 2))) sp::coordinates(pbtn1) <- c("V2", "V3") - sp::proj4string(pbtn1) <- sp::proj4string(pbt) + #sp::proj4string(pbtn1) <- sp::proj4string(pbt) + crs(pbtn1) <- crs(pbt) poly <- rgeos::gBuffer(spgeom = pbtn1, width = buffer, @@ -212,7 +213,8 @@ model_opt_r <- function(k, pbtn2 <- as.data.frame(cbind(classes[d2], matrix(p2, ncol = 2))) sp::coordinates(pbtn2) <- c("V2", "V3") - sp::proj4string(pbtn2) <- sp::proj4string(pbt) + #sp::proj4string(pbtn2) <- sp::proj4string(pbt) + crs(pbtn2) <- crs(pbt) poly <- rgeos::gBuffer(spgeom = pbtn2, width = buffer, diff --git a/R-package/R/outer_procedure.r b/R-package/R/outer_procedure.r index eb81359..a3124b5 100644 --- a/R-package/R/outer_procedure.r +++ b/R-package/R/outer_procedure.r @@ -92,7 +92,8 @@ multi_Class_Sampling <- function(in.raster, input_raster <- in.raster area <- as(raster::extent(in.raster), 'SpatialPolygons') area <- sp::SpatialPolygonsDataFrame(area, data.frame(ID = 1:length(area))) - sp::proj4string(area) <- sp::proj4string(in.raster) + #sp::proj4string(area) <- sp::proj4string(in.raster) + crs(area) <- crs(in.raster) col <- colorRampPalette(c("lightgrey", "orange", -- GitLab From 4993965c423e887772ddba771de1b130e265c22c Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Thu, 28 Jan 2021 17:19:57 +0100 Subject: [PATCH 17/58] Fix the list: remove commas. --- docker/context/hasa.docker | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/context/hasa.docker b/docker/context/hasa.docker index 45885cc..0fe2ce2 100644 --- a/docker/context/hasa.docker +++ b/docker/context/hasa.docker @@ -14,7 +14,7 @@ RUN /bin/bash -i -c "\ " # install dependencies RUN apt-get update -y && \ - apt-get install -y libjq-dev, protobuf-compiler, libprotobuf-dev proj-bin gdal-bin libgdal-dev jq libv8-dev pandoc + apt-get install -y libjq-dev protobuf-compiler libprotobuf-dev proj-bin gdal-bin libgdal-dev jq libv8-dev pandoc # install R RUN /bin/bash -i -c "\ apt-get install -y dirmngr gnupg apt-transport-https ca-certificates software-properties-common && \ -- GitLab From 1b97a5fe868ae9d021c8f0320d8169a3932a4d02 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Thu, 28 Jan 2021 18:00:22 +0100 Subject: [PATCH 18/58] Install and be able to open firefox. --- docker/context/hasa.docker | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docker/context/hasa.docker b/docker/context/hasa.docker index 0fe2ce2..c833dcb 100644 --- a/docker/context/hasa.docker +++ b/docker/context/hasa.docker @@ -43,3 +43,7 @@ COPY install.R /home/hasa/install.R RUN /bin/bash -i -c "\ Rscript /home/hasa/install.R \ " +# install Firefox +RUN apt-get -y install firefox +RUN apt-get -y install xauth +EXPOSE 8887 -- GitLab From 6b6de54d750de5e51d1ee577e31330ebdf961eb5 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Thu, 28 Jan 2021 21:11:58 +0100 Subject: [PATCH 19/58] Do not make readonly since they can be the same directory. Remove hard-coded paths --- docker/start_docker.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docker/start_docker.sh b/docker/start_docker.sh index 643e9e4..c271910 100755 --- a/docker/start_docker.sh +++ b/docker/start_docker.sh @@ -1,9 +1,9 @@ #!/bin/bash # variables to bet set by the user -input_dir="/home/romulo/gitlab/HabitatSampler/demo/Data" -tmp_dir="/home/romulo/gitlab/HabitatSampler/demo/Data" -output_dir="/home/romulo/gitlab/HabitatSampler/demo/Data" +input_dir="" +tmp_dir="" +output_dir="" jupyter_notebook="TrUE" @@ -54,14 +54,14 @@ if [ "${jupyter_notebook,,}" = "true" ] then sudo docker run -it --name ${container_name} \ -p $jupyter_lab_port:$docker_jupyterlab_port \ - -v ${input_dir}:${in_data_folder}:ro \ + -v ${input_dir}:${in_data_folder} \ -v ${tmp_dir}:${tmp_data_folder} \ -v ${output_dir}:${out_data_folder} \ -v ${demo_dir}:${demo_data_folder} ${runner_tag} \ bash -i -c "cd /home/hasa; jupyter-lab --ip 0.0.0.0 --no-browser --allow-root demo/" else sudo docker run -it --name ${container_name} -u 1000:1000 \ - -v ${input_dir}:${in_data_folder}:ro \ + -v ${input_dir}:${in_data_folder} \ -v ${tmp_dir}:${tmp_data_folder} \ -v ${output_dir}:${out_data_folder} \ -v ${demo_dir}:${demo_data_folder} ${runner_tag} \ -- GitLab From 6b4699984d6a8a2c8c6bae12cfd51f3063cea281 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Thu, 28 Jan 2021 21:16:09 +0100 Subject: [PATCH 20/58] Add option to plot on a browser or inline. --- R-package/R/outer_procedure.r | 10 +++++++--- R-package/R/plot_interactive.r | 24 ++++++++++++++++++++---- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/R-package/R/outer_procedure.r b/R-package/R/outer_procedure.r index a3124b5..2626273 100644 --- a/R-package/R/outer_procedure.r +++ b/R-package/R/outer_procedure.r @@ -22,6 +22,7 @@ #' @param RGB rgb channel numbers for image plot #' @param overwrite overwrite the results file #' @param parallel_mode run loops using all available cores +#' @param plot_on_browser plot on the browser or inline in a notebook (default TRUE) #' #' @return 4 files per step: @@ -83,7 +84,8 @@ multi_Class_Sampling <- function(in.raster, multiTest = 1, RGB = c(19, 20, 21), overwrite = TRUE, - parallel_mode = FALSE) { + parallel_mode = FALSE, + plot_on_browser = TRUE) { ###first steps: data preparation if (class(reference) == "SpatialPointsDataFrame") { reference <- as.data.frame(raster::extract(in.raster, reference)) @@ -218,7 +220,8 @@ multi_Class_Sampling <- function(in.raster, g = RGB[2], b = RGB[3], acc = acc, - outPath = outPath + outPath = outPath, + plot_on_browser = plot_on_browser ) decision <- @@ -271,7 +274,8 @@ multi_Class_Sampling <- function(in.raster, g = RGB[2], b = RGB[3], acc = acc, - outPath = outPath + outPath = outPath, + plot_on_browser = plot_on_browser ) decision <- diff --git a/R-package/R/plot_interactive.r b/R-package/R/plot_interactive.r index 17c63ef..20c566f 100644 --- a/R-package/R/plot_interactive.r +++ b/R-package/R/plot_interactive.r @@ -10,9 +10,10 @@ #' @param b blue channel (integer) #' @param acc predictive accuracy (integer) #' @param outPath file path for '.html export (character) +#' @param plot_on_browser plot on the browser or inline in a notebook (default TRUE) #' #' @export -iplot <- function(x, y, HaTy, r, g, b, acc, outPath) { +iplot <- function(x, y, HaTy, r, g, b, acc, outPath, plot_on_browser = TRUE) { #x=layerInfo, y=RGB Image ############################################################################## if (exists("color") == F) { @@ -165,8 +166,16 @@ iplot <- function(x, y, HaTy, r, g, b, acc, outPath) { file = paste(outPath, 'leaflet.html', sep = ""), append = TRUE ) - utils::browseURL(paste(outPath, 'leaflet.html', sep = - ""), browser = "firefox") + if (plot_on_browser == TRUE) { + utils::browseURL(paste(outPath, 'leaflet.html', sep = ""), + browser = "firefox") + } else { + html_code = sprintf( + '', + paste(outPath, 'leaflet.html', sep = "") + ) + IRdisplay::display_html(html_code) + } } else { htmlwidgets::saveWidget(mv, selfcontained = FALSE, @@ -176,7 +185,14 @@ iplot <- function(x, y, HaTy, r, g, b, acc, outPath) { file = paste(outPath, 'leaflet.html', sep = ""), append = TRUE ) - utils::browseURL(paste(outPath, 'leaflet.html', sep = "")) + if (plot_on_browser == TRUE) { + utils::browseURL(paste(outPath, 'leaflet.html', sep = "")) + } else { + html_code = sprintf( + '', + paste(outPath, 'leaflet.html', sep = "")) + IRdisplay::display_html(html_code) + } } #cat("", # file = "leaflet.html", -- GitLab From 70bf96d35a818343e983549680559e25dabb77bc Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Thu, 28 Jan 2021 21:16:28 +0100 Subject: [PATCH 21/58] Update documentation for option to plot on a browser or inline. --- R-package/DESCRIPTION | 2 ++ R-package/man/iplot.Rd | 4 +++- R-package/man/multi_Class_Sampling.Rd | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/R-package/DESCRIPTION b/R-package/DESCRIPTION index 5e716ee..63e4751 100644 --- a/R-package/DESCRIPTION +++ b/R-package/DESCRIPTION @@ -15,6 +15,7 @@ Imports: sp (<= 1.4-1), rgdal (<= 1.4-8), raster, + geojsonio, maptools, rgeos, spatialEco, @@ -24,6 +25,7 @@ Imports: velox, leaflet, leafem, + IRdisplay, htmlwidgets Remotes:url::https://cran.r-project.org/src/contrib/Archive/velox/velox_0.2.0.tar.gz Encoding: UTF-8 diff --git a/R-package/man/iplot.Rd b/R-package/man/iplot.Rd index 48a16ae..8ff53f5 100644 --- a/R-package/man/iplot.Rd +++ b/R-package/man/iplot.Rd @@ -4,7 +4,7 @@ \alias{iplot} \title{Plot Habitat Types} \usage{ -iplot(x, y, HaTy, r, g, b, acc, outPath) +iplot(x, y, HaTy, r, g, b, acc, outPath, plot_on_browser = TRUE) } \arguments{ \item{x}{probability image (*rasterObject)} @@ -22,6 +22,8 @@ iplot(x, y, HaTy, r, g, b, acc, outPath) \item{acc}{predictive accuracy (integer)} \item{outPath}{file path for '.html export (character)} + +\item{plot_on_browser}{plot on the browser or inline in a notebook (default TRUE)} } \description{ A quick wrapper to produce an interactive raster map of habitat type probability in a web browser using leaflet diff --git a/R-package/man/multi_Class_Sampling.Rd b/R-package/man/multi_Class_Sampling.Rd index 55a288b..6104675 100644 --- a/R-package/man/multi_Class_Sampling.Rd +++ b/R-package/man/multi_Class_Sampling.Rd @@ -24,7 +24,8 @@ multi_Class_Sampling( multiTest = 1, RGB = c(19, 20, 21), overwrite = TRUE, - parallel_mode = FALSE + parallel_mode = FALSE, + plot_on_browser = TRUE ) } \arguments{ @@ -67,6 +68,8 @@ multi_Class_Sampling( \item{overwrite}{overwrite the results file} \item{parallel_mode}{run loops using all available cores} + +\item{plot_on_browser}{plot on the browser or inline in a notebook (default TRUE)} } \value{ 4 files per step: -- GitLab From cb9400e0df3185141b82f32bb0718b87e8997fb2 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Thu, 28 Jan 2021 21:17:02 +0100 Subject: [PATCH 22/58] Update notebooks to add the latest argument, plot on browser. --- demo/HabitatSampler.ipynb | 623 ++------------------------------ demo/HabitatSamplerDocker.ipynb | 485 ++++++++++++++++--------- 2 files changed, 348 insertions(+), 760 deletions(-) diff --git a/demo/HabitatSampler.ipynb b/demo/HabitatSampler.ipynb index 80fcba6..b86c722 100644 --- a/demo/HabitatSampler.ipynb +++ b/demo/HabitatSampler.ipynb @@ -65,89 +65,18 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "from_sources <- FALSE" + "from_sources <- TRUE" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Downloading git repo https://git.gfz-potsdam.de/habitat-sampler/HabitatSampler.git\n", - "\n", - "'/usr/bin/git' clone --depth 1 --no-hardlinks https://git.gfz-potsdam.de/habitat-sampler/HabitatSampler.git /tmp/RtmpLaI3S7/filede3c1ec5d7e\n", - "\n", - "'/usr/bin/git' fetch origin performance\n", - "\n", - "'/usr/bin/git' checkout FETCH_HEAD\n", - "\n", - "Downloading package from url: https://cran.r-project.org/src/contrib/Archive/velox/velox_0.2.0.tar.gz\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[32m✔\u001b[39m \u001b[38;5;247mchecking for file ‘/tmp/RtmpLaI3S7/remotesde3c5959756f/velox/DESCRIPTION’\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247mpreparing ‘velox’:\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[32m✔\u001b[39m \u001b[38;5;247mchecking DESCRIPTION meta-information\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247mcleaning src\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247mchecking for LF line-endings in source and make files and shell scripts\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247mchecking for empty or unneeded directories\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247mbuilding ‘velox_0.2.0.tar.gz’\u001b[39m\u001b[36m\u001b[39m\n", - " \n", - "\r" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Installing package into ‘/home/romulo/R/x86_64-pc-linux-gnu-library/3.6’\n", - "(as ‘lib’ is unspecified)\n", - "\n", - "Downloading package from url: https://cran.r-project.org/src/contrib/Archive/velox/velox_0.2.0.tar.gz\n", - "\n", - "Skipping velox, it is already being installed\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[32m✔\u001b[39m \u001b[38;5;247mchecking for file ‘/tmp/RtmpLaI3S7/filede3c1ec5d7e/R-package/DESCRIPTION’\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247mpreparing ‘HaSa’:\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[32m✔\u001b[39m \u001b[38;5;247mchecking DESCRIPTION meta-information\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247minstalling the package to build vignettes\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[32m✔\u001b[39m \u001b[38;5;247mcreating vignettes\u001b[39m\u001b[36m\u001b[36m (1.5s)\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247mchecking for LF line-endings in source and make files and shell scripts\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247mchecking for empty or unneeded directories\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247mlooking to see if a ‘data/datalist’ file should be added\u001b[39m\u001b[36m\u001b[39m\n", - "\u001b[38;5;247m─\u001b[39m\u001b[38;5;247m \u001b[39m\u001b[38;5;247mbuilding ‘HaSa_1.1.0.tar.gz’\u001b[39m\u001b[36m\u001b[39m\n", - " \n", - "\r" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Installing package into ‘/home/romulo/R/x86_64-pc-linux-gnu-library/3.6’\n", - "(as ‘lib’ is unspecified)\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "if (from_sources == TRUE) {\n", " wd<-\"./\"\n", @@ -184,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -247,15 +176,6 @@ " Linking to sp version: 1.4-5 \n", " Polygon checking: TRUE \n", "\n", - "\n", - "\n", - "Attaching package: ‘HaSa’\n", - "\n", - "\n", - "The following object is masked from ‘package:graphics’:\n", - "\n", - " clip\n", - "\n", "\n" ] }, @@ -345,7 +265,7 @@ ".list-inline>li {display: inline-block}\n", ".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n", "\n", - "
  1. 'HaSa'
  2. 'htmlwidgets'
  3. 'leaflet'
  4. 'rgeos'
  5. 'velox'
  6. 'devtools'
  7. 'usethis'
  8. 'e1071'
  9. 'randomForest'
  10. 'spatialEco'
  11. 'maptools'
  12. 'raster'
  13. 'rgdal'
  14. 'sp'
  15. 'stats'
  16. 'graphics'
  17. 'grDevices'
  18. 'utils'
  19. 'datasets'
  20. 'methods'
  21. 'base'
\n", + "
  1. 'IRdisplay'
  2. 'htmlwidgets'
  3. 'leaflet'
  4. 'rgeos'
  5. 'velox'
  6. 'devtools'
  7. 'usethis'
  8. 'e1071'
  9. 'randomForest'
  10. 'spatialEco'
  11. 'maptools'
  12. 'raster'
  13. 'rgdal'
  14. 'sp'
  15. 'stats'
  16. 'graphics'
  17. 'grDevices'
  18. 'utils'
  19. 'datasets'
  20. 'methods'
  21. 'base'
\n", "\n", "\n" ], @@ -544,7 +464,7 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", - "\\item 'HaSa'\n", + "\\item 'IRdisplay'\n", "\\item 'htmlwidgets'\n", "\\item 'leaflet'\n", "\\item 'rgeos'\n", @@ -762,7 +682,7 @@ "\n", "\n", "\n", - "12. 1. 'HaSa'\n", + "12. 1. 'IRdisplay'\n", "2. 'htmlwidgets'\n", "3. 'leaflet'\n", "4. 'rgeos'\n", @@ -848,7 +768,7 @@ "[16] \"grDevices\" \"utils\" \"datasets\" \"methods\" \"base\" \n", "\n", "[[12]]\n", - " [1] \"HaSa\" \"htmlwidgets\" \"leaflet\" \"rgeos\" \"velox\" \n", + " [1] \"IRdisplay\" \"htmlwidgets\" \"leaflet\" \"rgeos\" \"velox\" \n", " [6] \"devtools\" \"usethis\" \"e1071\" \"randomForest\" \"spatialEco\" \n", "[11] \"maptools\" \"raster\" \"rgdal\" \"sp\" \"stats\" \n", "[16] \"graphics\" \"grDevices\" \"utils\" \"datasets\" \"methods\" \n", @@ -861,9 +781,9 @@ ], "source": [ "if (from_sources == TRUE) {\n", - " libraries <- c(\"rgdal\",\"raster\",\"maptools\",\"spatialEco\",\"randomForest\",\"e1071\",\"devtools\",\"velox\",\"rgeos\",\"leaflet\",\"htmlwidgets\")\n", + " libraries <- c(\"rgdal\",\"raster\",\"maptools\",\"spatialEco\",\"randomForest\",\"e1071\",\"devtools\",\"velox\",\"rgeos\",\"leaflet\",\"htmlwidgets\", \"IRdisplay\")\n", "} else {\n", - " libraries <- c(\"rgdal\",\"raster\",\"maptools\",\"spatialEco\",\"randomForest\",\"e1071\",\"devtools\",\"velox\",\"rgeos\",\"leaflet\",\"htmlwidgets\", \"HaSa\")\n", + " libraries <- c(\"rgdal\",\"raster\",\"maptools\",\"spatialEco\",\"randomForest\",\"e1071\",\"devtools\",\"velox\",\"rgeos\",\"leaflet\",\"htmlwidgets\", \"IRdisplay\", \"HaSa\")\n", "}\n", "lapply(libraries, library, character.only = TRUE)" ] @@ -877,7 +797,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -910,7 +830,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -937,7 +857,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -955,7 +875,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -993,7 +913,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -1012,7 +932,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -1047,7 +967,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -1064,7 +984,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -1080,7 +1000,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1088,508 +1008,26 @@ "output_type": "stream", "text": [ "[1] \"init.samples = 50 models = 200\"\n", - "[1] \"class=4 difference=0.84\"\n", + "[1] \"class=2 difference=0.76\"\n", "\n" ] }, { - "name": "stdin", - "output_type": "stream", - "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 16\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"n_models = 9\"\n", - "[1] 1\n", - "[1] 2\n", - "[1] 3\n", - "[1] 4\n", - "[1] 5\n", - "[1] 6\n", - "[1] 7\n", - "[1] 8\n", - "[1] 9\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"Habitat 1 Done\"\n", - "[1] \"init.samples = 100 models = 215\"\n", - "[1] \"class=4 difference=0.8\"\n", - "\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 32\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"n_models = 17\"\n", - "[1] 1\n", - "[1] 2\n", - "[1] 3\n", - "[1] 4\n", - "[1] 5\n", - "[1] 6\n", - "[1] 7\n", - "[1] 8\n", - "[1] 9\n", - "[1] 10\n", - "[1] 11\n", - "[1] 12\n", - "[1] 13\n", - "[1] 14\n", - "[1] 15\n", - "[1] 16\n", - "[1] 17\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"Habitat 2 Done\"\n", - "[1] \"init.samples = 150 models = 230\"\n", - "[1] \"class=2 difference=0.92\"\n", - "\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 44\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"n_models = 25\"\n", - "[1] 1\n", - "[1] 2\n", - "[1] 3\n", - "[1] 4\n", - "[1] 5\n", - "[1] 6\n", - "[1] 7\n", - "[1] 8\n", - "[1] 9\n", - "[1] 10\n", - "[1] 11\n", - "[1] 12\n", - "[1] 13\n", - "[1] 14\n", - "[1] 15\n", - "[1] 16\n", - "[1] 17\n", - "[1] 18\n", - "[1] 19\n", - "[1] 20\n", - "[1] 21\n", - "[1] 22\n", - "[1] 23\n", - "[1] 24\n", - "[1] 25\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"Habitat 3 Done\"\n", - "[1] \"init.samples = 200 models = 245\"\n", - "[1] \"class=1 difference=0.96\"\n", - "\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 110\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"n_models = 61\"\n", - "[1] 1\n", - "[1] 2\n", - "[1] 3\n", - "[1] 4\n", - "[1] 5\n", - "[1] 6\n", - "[1] 7\n", - "[1] 8\n", - "[1] 9\n", - "[1] 10\n", - "[1] 11\n", - "[1] 12\n", - "[1] 13\n", - "[1] 14\n", - "[1] 15\n", - "[1] 16\n", - "[1] 17\n", - "[1] 18\n", - "[1] 19\n", - "[1] 20\n", - "[1] 21\n", - "[1] 22\n", - "[1] 23\n", - "[1] 24\n", - "[1] 25\n", - "[1] 26\n", - "[1] 27\n", - "[1] 28\n", - "[1] 29\n", - "[1] 30\n", - "[1] 31\n", - "[1] 32\n", - "[1] 33\n", - "[1] 34\n", - "[1] 35\n", - "[1] 36\n", - "[1] 37\n", - "[1] 38\n", - "[1] 39\n", - "[1] 40\n", - "[1] 41\n", - "[1] 42\n", - "[1] 43\n", - "[1] 44\n", - "[1] 45\n", - "[1] 46\n", - "[1] 47\n", - "[1] 48\n", - "[1] 49\n", - "[1] 50\n", - "[1] 51\n", - "[1] 52\n", - "[1] 53\n", - "[1] 54\n", - "[1] 55\n", - "[1] 56\n", - "[1] 57\n", - "[1] 58\n", - "[1] 59\n", - "[1] 60\n", - "[1] 61\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"Habitat 4 Done\"\n", - "[1] \"init.samples = 250 models = 260\"\n", - "[1] \"class=1 difference=0.96\"\n", - "\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 120\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"n_models = 67\"\n", - "[1] 1\n", - "[1] 2\n", - "[1] 3\n", - "[1] 4\n", - "[1] 5\n", - "[1] 6\n", - "[1] 7\n", - "[1] 8\n", - "[1] 9\n", - "[1] 10\n", - "[1] 11\n", - "[1] 12\n", - "[1] 13\n", - "[1] 14\n", - "[1] 15\n", - "[1] 16\n", - "[1] 17\n", - "[1] 18\n", - "[1] 19\n", - "[1] 20\n", - "[1] 21\n", - "[1] 22\n", - "[1] 23\n", - "[1] 24\n", - "[1] 25\n", - "[1] 26\n", - "[1] 27\n", - "[1] 28\n", - "[1] 29\n", - "[1] 30\n", - "[1] 31\n", - "[1] 32\n", - "[1] 33\n", - "[1] 34\n", - "[1] 35\n", - "[1] 36\n", - "[1] 37\n", - "[1] 38\n", - "[1] 39\n", - "[1] 40\n", - "[1] 41\n", - "[1] 42\n", - "[1] 43\n", - "[1] 44\n", - "[1] 45\n", - "[1] 46\n", - "[1] 47\n", - "[1] 48\n", - "[1] 49\n", - "[1] 50\n", - "[1] 51\n", - "[1] 52\n", - "[1] 53\n", - "[1] 54\n", - "[1] 55\n", - "[1] 56\n", - "[1] 57\n", - "[1] 58\n", - "[1] 59\n", - "[1] 60\n", - "[1] 61\n", - "[1] 62\n", - "[1] 63\n", - "[1] 64\n", - "[1] 65\n", - "[1] 66\n", - "[1] 67\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"Habitat 5 Done\"\n", - "[1] \"init.samples = 300 models = 275\"\n", - "[1] \"class=1 difference=0.96\"\n", - "\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 150\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"n_models = 81\"\n", - "[1] 1\n", - "[1] 2\n", - "[1] 3\n", - "[1] 4\n", - "[1] 5\n", - "[1] 6\n", - "[1] 7\n", - "[1] 8\n", - "[1] 9\n", - "[1] 10\n", - "[1] 11\n", - "[1] 12\n", - "[1] 13\n", - "[1] 14\n", - "[1] 15\n", - "[1] 16\n", - "[1] 17\n", - "[1] 18\n", - "[1] 19\n", - "[1] 20\n", - "[1] 21\n", - "[1] 22\n", - "[1] 23\n", - "[1] 24\n", - "[1] 25\n", - "[1] 26\n", - "[1] 27\n", - "[1] 28\n", - "[1] 29\n", - "[1] 30\n", - "[1] 31\n", - "[1] 32\n", - "[1] 33\n", - "[1] 34\n", - "[1] 35\n", - "[1] 36\n", - "[1] 37\n", - "[1] 38\n", - "[1] 39\n", - "[1] 40\n", - "[1] 41\n", - "[1] 42\n", - "[1] 43\n", - "[1] 44\n", - "[1] 45\n", - "[1] 46\n", - "[1] 47\n", - "[1] 48\n", - "[1] 49\n", - "[1] 50\n", - "[1] 51\n", - "[1] 52\n", - "[1] 53\n", - "[1] 54\n", - "[1] 55\n", - "[1] 56\n", - "[1] 57\n", - "[1] 58\n", - "[1] 59\n", - "[1] 60\n", - "[1] 61\n", - "[1] 62\n", - "[1] 63\n", - "[1] 64\n", - "[1] 65\n", - "[1] 66\n", - "[1] 67\n", - "[1] 68\n", - "[1] 69\n", - "[1] 70\n", - "[1] 71\n", - "[1] 72\n", - "[1] 73\n", - "[1] 74\n", - "[1] 75\n", - "[1] 76\n", - "[1] 77\n", - "[1] 78\n", - "[1] 79\n", - "[1] 80\n", - "[1] 81\n" - ] + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" }, { "name": "stdin", "output_type": "stream", "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 0\n", "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"Habitat 6 Done\"\n", - "[1] \"init.samples = 350 models = 290\"\n", - "[1] \"class=1 difference=0.92\"\n", - "\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 65\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1] \"n_models = 37\"\n", - "[1] 1\n", - "[1] 2\n", - "[1] 3\n", - "[1] 4\n", - "[1] 5\n", - "[1] 6\n", - "[1] 7\n", - "[1] 8\n", - "[1] 9\n", - "[1] 10\n", - "[1] 11\n", - "[1] 12\n", - "[1] 13\n", - "[1] 14\n", - "[1] 15\n", - "[1] 16\n", - "[1] 17\n", - "[1] 18\n", - "[1] 19\n", - "[1] 20\n", - "[1] 21\n", - "[1] 22\n", - "[1] 23\n", - "[1] 24\n", - "[1] 25\n", - "[1] 26\n", - "[1] 27\n", - "[1] 28\n", - "[1] 29\n", - "[1] 30\n", - "[1] 31\n", - "[1] 32\n", - "[1] 33\n", - "[1] 34\n", - "[1] 35\n", - "[1] 36\n", - "[1] 37\n", - "[1] \"Habitat 7 Done\"\n", - "[1] \"Congratulation - you finally made it towards the last habitat\"\n" - ] } ], "source": [ @@ -1613,7 +1051,8 @@ " multiTest = 1,\n", " RGB = c(19,20,21),\n", " overwrite=TRUE,\n", - " parallel_mode=TRUE)" + " parallel_mode=TRUE,\n", + " plot_on_browser = TRUE)" ] }, { diff --git a/demo/HabitatSamplerDocker.ipynb b/demo/HabitatSamplerDocker.ipynb index 87e27e8..cbb7ee3 100644 --- a/demo/HabitatSamplerDocker.ipynb +++ b/demo/HabitatSamplerDocker.ipynb @@ -25,17 +25,25 @@ "name": "stderr", "output_type": "stream", "text": [ - "Loading required package: sp\n", + "Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 7.0.0\n", + "\n", + "WARNING: different compile-time and runtime versions for GEOS found:\n", + "\n", + "Linked against: 3.8.0-CAPI-1.13.1 compiled against: 3.7.0-CAPI-1.11.0\n", + "\n", + "It is probably a good idea to reinstall sf, and maybe rgeos and rgdal too\n", "\n", "rgdal: version: 1.4-8, (SVN revision 845)\n", " Geospatial Data Abstraction Library extensions to R successfully loaded\n", " Loaded GDAL runtime: GDAL 3.0.4, released 2020/01/28\n", " Path to GDAL shared files: \n", - " GDAL binary built with GEOS: TRUE \n", - " Loaded PROJ.4 runtime: Rel. 6.3.1, February 10th, 2020, [PJ_VERSION: 631]\n", - " Path to PROJ.4 shared files: (autodetected)\n", + " GDAL binary built with GEOS: FALSE \n", + " Loaded PROJ.4 runtime: Rel. 7.0.0, March 1st, 2020, [PJ_VERSION: 700]\n", + " Path to PROJ.4 shared files: /home/romulo/gitlab/python-setup-ubuntu/python/opt/share/proj\n", " Linking to sp version: 1.4-1 \n", "\n", + "Warning message:\n", + "“no function found corresponding to methods exports from ‘raster’ for: ‘wkt’”\n", "Checking rgeos availability: TRUE\n", "\n", "\n", @@ -71,9 +79,12 @@ "\n", "Loading required package: usethis\n", "\n", + "Warning message in fun(libname, pkgname):\n", + "“rgeos: versions of GEOS runtime 3.8.0-CAPI-1.13.1\n", + "and GEOS at installation 3.7.0-CAPI-1.11.0differ”\n", "rgeos version: 0.5-5, (SVN revision 640)\n", " GEOS runtime version: 3.8.0-CAPI-1.13.1 \n", - " Linking to sp version: 1.4-1 \n", + " Linking to sp version: 1.4-5 \n", " Polygon checking: TRUE \n", "\n", "\n", @@ -97,91 +108,150 @@ ".list-inline>li {display: inline-block}\n", ".list-inline>li:not(:last-child)::after {content: \"\\00b7\"; padding: 0 .5ex}\n", "\n", - "
  1. 'rgdal'
  2. 'sp'
  3. 'stats'
  4. 'graphics'
  5. 'grDevices'
  6. 'utils'
  7. 'datasets'
  8. 'methods'
  9. 'base'
\n", + "
  1. 'sp'
  2. 'stats'
  3. 'graphics'
  4. 'grDevices'
  5. 'utils'
  6. 'datasets'
  7. 'methods'
  8. 'base'
\n", + "\n", + "\t
  • \n", + "
    1. 'sf'
    2. 'sp'
    3. 'stats'
    4. 'graphics'
    5. 'grDevices'
    6. 'utils'
    7. 'datasets'
    8. 'methods'
    9. 'base'
    \n", + "
  • \n", + "\t
  • \n", + "
    1. 'rgdal'
    2. 'sf'
    3. 'sp'
    4. 'stats'
    5. 'graphics'
    6. 'grDevices'
    7. 'utils'
    8. 'datasets'
    9. 'methods'
    10. 'base'
    \n", + "
  • \n", + "\t
  • \n", + "
    1. 'raster'
    2. 'rgdal'
    3. 'sf'
    4. 'sp'
    5. 'stats'
    6. 'graphics'
    7. 'grDevices'
    8. 'utils'
    9. 'datasets'
    10. 'methods'
    11. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'raster'
    2. 'rgdal'
    3. 'sp'
    4. 'stats'
    5. 'graphics'
    6. 'grDevices'
    7. 'utils'
    8. 'datasets'
    9. 'methods'
    10. 'base'
    \n", + "
    1. 'maptools'
    2. 'raster'
    3. 'rgdal'
    4. 'sf'
    5. 'sp'
    6. 'stats'
    7. 'graphics'
    8. 'grDevices'
    9. 'utils'
    10. 'datasets'
    11. 'methods'
    12. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'maptools'
    2. 'raster'
    3. 'rgdal'
    4. 'sp'
    5. 'stats'
    6. 'graphics'
    7. 'grDevices'
    8. 'utils'
    9. 'datasets'
    10. 'methods'
    11. 'base'
    \n", + "
    1. 'spatialEco'
    2. 'maptools'
    3. 'raster'
    4. 'rgdal'
    5. 'sf'
    6. 'sp'
    7. 'stats'
    8. 'graphics'
    9. 'grDevices'
    10. 'utils'
    11. 'datasets'
    12. 'methods'
    13. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'spatialEco'
    2. 'maptools'
    3. 'raster'
    4. 'rgdal'
    5. 'sp'
    6. 'stats'
    7. 'graphics'
    8. 'grDevices'
    9. 'utils'
    10. 'datasets'
    11. 'methods'
    12. 'base'
    \n", + "
    1. 'randomForest'
    2. 'spatialEco'
    3. 'maptools'
    4. 'raster'
    5. 'rgdal'
    6. 'sf'
    7. 'sp'
    8. 'stats'
    9. 'graphics'
    10. 'grDevices'
    11. 'utils'
    12. 'datasets'
    13. 'methods'
    14. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'randomForest'
    2. 'spatialEco'
    3. 'maptools'
    4. 'raster'
    5. 'rgdal'
    6. 'sp'
    7. 'stats'
    8. 'graphics'
    9. 'grDevices'
    10. 'utils'
    11. 'datasets'
    12. 'methods'
    13. 'base'
    \n", + "
    1. 'e1071'
    2. 'randomForest'
    3. 'spatialEco'
    4. 'maptools'
    5. 'raster'
    6. 'rgdal'
    7. 'sf'
    8. 'sp'
    9. 'stats'
    10. 'graphics'
    11. 'grDevices'
    12. 'utils'
    13. 'datasets'
    14. 'methods'
    15. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'e1071'
    2. 'randomForest'
    3. 'spatialEco'
    4. 'maptools'
    5. 'raster'
    6. 'rgdal'
    7. 'sp'
    8. 'stats'
    9. 'graphics'
    10. 'grDevices'
    11. 'utils'
    12. 'datasets'
    13. 'methods'
    14. 'base'
    \n", + "
    1. 'devtools'
    2. 'usethis'
    3. 'e1071'
    4. 'randomForest'
    5. 'spatialEco'
    6. 'maptools'
    7. 'raster'
    8. 'rgdal'
    9. 'sf'
    10. 'sp'
    11. 'stats'
    12. 'graphics'
    13. 'grDevices'
    14. 'utils'
    15. 'datasets'
    16. 'methods'
    17. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'devtools'
    2. 'usethis'
    3. 'e1071'
    4. 'randomForest'
    5. 'spatialEco'
    6. 'maptools'
    7. 'raster'
    8. 'rgdal'
    9. 'sp'
    10. 'stats'
    11. 'graphics'
    12. 'grDevices'
    13. 'utils'
    14. 'datasets'
    15. 'methods'
    16. 'base'
    \n", + "
    1. 'velox'
    2. 'devtools'
    3. 'usethis'
    4. 'e1071'
    5. 'randomForest'
    6. 'spatialEco'
    7. 'maptools'
    8. 'raster'
    9. 'rgdal'
    10. 'sf'
    11. 'sp'
    12. 'stats'
    13. 'graphics'
    14. 'grDevices'
    15. 'utils'
    16. 'datasets'
    17. 'methods'
    18. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'velox'
    2. 'devtools'
    3. 'usethis'
    4. 'e1071'
    5. 'randomForest'
    6. 'spatialEco'
    7. 'maptools'
    8. 'raster'
    9. 'rgdal'
    10. 'sp'
    11. 'stats'
    12. 'graphics'
    13. 'grDevices'
    14. 'utils'
    15. 'datasets'
    16. 'methods'
    17. 'base'
    \n", + "
    1. 'rgeos'
    2. 'velox'
    3. 'devtools'
    4. 'usethis'
    5. 'e1071'
    6. 'randomForest'
    7. 'spatialEco'
    8. 'maptools'
    9. 'raster'
    10. 'rgdal'
    11. 'sf'
    12. 'sp'
    13. 'stats'
    14. 'graphics'
    15. 'grDevices'
    16. 'utils'
    17. 'datasets'
    18. 'methods'
    19. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'rgeos'
    2. 'velox'
    3. 'devtools'
    4. 'usethis'
    5. 'e1071'
    6. 'randomForest'
    7. 'spatialEco'
    8. 'maptools'
    9. 'raster'
    10. 'rgdal'
    11. 'sp'
    12. 'stats'
    13. 'graphics'
    14. 'grDevices'
    15. 'utils'
    16. 'datasets'
    17. 'methods'
    18. 'base'
    \n", + "
    1. 'leaflet'
    2. 'rgeos'
    3. 'velox'
    4. 'devtools'
    5. 'usethis'
    6. 'e1071'
    7. 'randomForest'
    8. 'spatialEco'
    9. 'maptools'
    10. 'raster'
    11. 'rgdal'
    12. 'sf'
    13. 'sp'
    14. 'stats'
    15. 'graphics'
    16. 'grDevices'
    17. 'utils'
    18. 'datasets'
    19. 'methods'
    20. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'leaflet'
    2. 'rgeos'
    3. 'velox'
    4. 'devtools'
    5. 'usethis'
    6. 'e1071'
    7. 'randomForest'
    8. 'spatialEco'
    9. 'maptools'
    10. 'raster'
    11. 'rgdal'
    12. 'sp'
    13. 'stats'
    14. 'graphics'
    15. 'grDevices'
    16. 'utils'
    17. 'datasets'
    18. 'methods'
    19. 'base'
    \n", + "
    1. 'htmlwidgets'
    2. 'leaflet'
    3. 'rgeos'
    4. 'velox'
    5. 'devtools'
    6. 'usethis'
    7. 'e1071'
    8. 'randomForest'
    9. 'spatialEco'
    10. 'maptools'
    11. 'raster'
    12. 'rgdal'
    13. 'sf'
    14. 'sp'
    15. 'stats'
    16. 'graphics'
    17. 'grDevices'
    18. 'utils'
    19. 'datasets'
    20. 'methods'
    21. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'htmlwidgets'
    2. 'leaflet'
    3. 'rgeos'
    4. 'velox'
    5. 'devtools'
    6. 'usethis'
    7. 'e1071'
    8. 'randomForest'
    9. 'spatialEco'
    10. 'maptools'
    11. 'raster'
    12. 'rgdal'
    13. 'sp'
    14. 'stats'
    15. 'graphics'
    16. 'grDevices'
    17. 'utils'
    18. 'datasets'
    19. 'methods'
    20. 'base'
    \n", + "
    1. 'IRdisplay'
    2. 'htmlwidgets'
    3. 'leaflet'
    4. 'rgeos'
    5. 'velox'
    6. 'devtools'
    7. 'usethis'
    8. 'e1071'
    9. 'randomForest'
    10. 'spatialEco'
    11. 'maptools'
    12. 'raster'
    13. 'rgdal'
    14. 'sf'
    15. 'sp'
    16. 'stats'
    17. 'graphics'
    18. 'grDevices'
    19. 'utils'
    20. 'datasets'
    21. 'methods'
    22. 'base'
    \n", "
  • \n", "\t
  • \n", - "
    1. 'HaSa'
    2. 'htmlwidgets'
    3. 'leaflet'
    4. 'rgeos'
    5. 'velox'
    6. 'devtools'
    7. 'usethis'
    8. 'e1071'
    9. 'randomForest'
    10. 'spatialEco'
    11. 'maptools'
    12. 'raster'
    13. 'rgdal'
    14. 'sp'
    15. 'stats'
    16. 'graphics'
    17. 'grDevices'
    18. 'utils'
    19. 'datasets'
    20. 'methods'
    21. 'base'
    \n", + "
    1. 'HaSa'
    2. 'IRdisplay'
    3. 'htmlwidgets'
    4. 'leaflet'
    5. 'rgeos'
    6. 'velox'
    7. 'devtools'
    8. 'usethis'
    9. 'e1071'
    10. 'randomForest'
    11. 'spatialEco'
    12. 'maptools'
    13. 'raster'
    14. 'rgdal'
    15. 'sf'
    16. 'sp'
    17. 'stats'
    18. 'graphics'
    19. 'grDevices'
    20. 'utils'
    21. 'datasets'
    22. 'methods'
    23. 'base'
    \n", "
  • \n", "\n" ], "text/latex": [ "\\begin{enumerate}\n", "\\item \\begin{enumerate*}\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'sf'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'rgdal'\n", + "\\item 'sf'\n", + "\\item 'sp'\n", + "\\item 'stats'\n", + "\\item 'graphics'\n", + "\\item 'grDevices'\n", + "\\item 'utils'\n", + "\\item 'datasets'\n", + "\\item 'methods'\n", + "\\item 'base'\n", + "\\end{enumerate*}\n", + "\n", + "\\item \\begin{enumerate*}\n", + "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -193,8 +263,10 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", + "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -206,9 +278,11 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", + "\\item 'spatialEco'\n", "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -220,10 +294,12 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", + "\\item 'randomForest'\n", "\\item 'spatialEco'\n", "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -235,11 +311,13 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", + "\\item 'e1071'\n", "\\item 'randomForest'\n", "\\item 'spatialEco'\n", "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -251,12 +329,15 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", + "\\item 'devtools'\n", + "\\item 'usethis'\n", "\\item 'e1071'\n", "\\item 'randomForest'\n", "\\item 'spatialEco'\n", "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -268,6 +349,7 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", + "\\item 'velox'\n", "\\item 'devtools'\n", "\\item 'usethis'\n", "\\item 'e1071'\n", @@ -276,6 +358,7 @@ "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -287,6 +370,7 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", + "\\item 'rgeos'\n", "\\item 'velox'\n", "\\item 'devtools'\n", "\\item 'usethis'\n", @@ -296,6 +380,7 @@ "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -307,6 +392,7 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", + "\\item 'leaflet'\n", "\\item 'rgeos'\n", "\\item 'velox'\n", "\\item 'devtools'\n", @@ -317,6 +403,7 @@ "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -328,6 +415,7 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", + "\\item 'htmlwidgets'\n", "\\item 'leaflet'\n", "\\item 'rgeos'\n", "\\item 'velox'\n", @@ -339,6 +427,7 @@ "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -350,6 +439,7 @@ "\\end{enumerate*}\n", "\n", "\\item \\begin{enumerate*}\n", + "\\item 'IRdisplay'\n", "\\item 'htmlwidgets'\n", "\\item 'leaflet'\n", "\\item 'rgeos'\n", @@ -362,6 +452,7 @@ "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -374,6 +465,7 @@ "\n", "\\item \\begin{enumerate*}\n", "\\item 'HaSa'\n", + "\\item 'IRdisplay'\n", "\\item 'htmlwidgets'\n", "\\item 'leaflet'\n", "\\item 'rgeos'\n", @@ -386,6 +478,7 @@ "\\item 'maptools'\n", "\\item 'raster'\n", "\\item 'rgdal'\n", + "\\item 'sf'\n", "\\item 'sp'\n", "\\item 'stats'\n", "\\item 'graphics'\n", @@ -399,7 +492,18 @@ "\\end{enumerate}\n" ], "text/markdown": [ - "1. 1. 'rgdal'\n", + "1. 1. 'sp'\n", + "2. 'stats'\n", + "3. 'graphics'\n", + "4. 'grDevices'\n", + "5. 'utils'\n", + "6. 'datasets'\n", + "7. 'methods'\n", + "8. 'base'\n", + "\n", + "\n", + "\n", + "2. 1. 'sf'\n", "2. 'sp'\n", "3. 'stats'\n", "4. 'graphics'\n", @@ -411,8 +515,8 @@ "\n", "\n", "\n", - "2. 1. 'raster'\n", - "2. 'rgdal'\n", + "3. 1. 'rgdal'\n", + "2. 'sf'\n", "3. 'sp'\n", "4. 'stats'\n", "5. 'graphics'\n", @@ -424,9 +528,9 @@ "\n", "\n", "\n", - "3. 1. 'maptools'\n", - "2. 'raster'\n", - "3. 'rgdal'\n", + "4. 1. 'raster'\n", + "2. 'rgdal'\n", + "3. 'sf'\n", "4. 'sp'\n", "5. 'stats'\n", "6. 'graphics'\n", @@ -438,10 +542,10 @@ "\n", "\n", "\n", - "4. 1. 'spatialEco'\n", - "2. 'maptools'\n", - "3. 'raster'\n", - "4. 'rgdal'\n", + "5. 1. 'maptools'\n", + "2. 'raster'\n", + "3. 'rgdal'\n", + "4. 'sf'\n", "5. 'sp'\n", "6. 'stats'\n", "7. 'graphics'\n", @@ -453,11 +557,11 @@ "\n", "\n", "\n", - "5. 1. 'randomForest'\n", - "2. 'spatialEco'\n", - "3. 'maptools'\n", - "4. 'raster'\n", - "5. 'rgdal'\n", + "6. 1. 'spatialEco'\n", + "2. 'maptools'\n", + "3. 'raster'\n", + "4. 'rgdal'\n", + "5. 'sf'\n", "6. 'sp'\n", "7. 'stats'\n", "8. 'graphics'\n", @@ -469,12 +573,12 @@ "\n", "\n", "\n", - "6. 1. 'e1071'\n", - "2. 'randomForest'\n", - "3. 'spatialEco'\n", - "4. 'maptools'\n", - "5. 'raster'\n", - "6. 'rgdal'\n", + "7. 1. 'randomForest'\n", + "2. 'spatialEco'\n", + "3. 'maptools'\n", + "4. 'raster'\n", + "5. 'rgdal'\n", + "6. 'sf'\n", "7. 'sp'\n", "8. 'stats'\n", "9. 'graphics'\n", @@ -486,7 +590,25 @@ "\n", "\n", "\n", - "7. 1. 'devtools'\n", + "8. 1. 'e1071'\n", + "2. 'randomForest'\n", + "3. 'spatialEco'\n", + "4. 'maptools'\n", + "5. 'raster'\n", + "6. 'rgdal'\n", + "7. 'sf'\n", + "8. 'sp'\n", + "9. 'stats'\n", + "10. 'graphics'\n", + "11. 'grDevices'\n", + "12. 'utils'\n", + "13. 'datasets'\n", + "14. 'methods'\n", + "15. 'base'\n", + "\n", + "\n", + "\n", + "9. 1. 'devtools'\n", "2. 'usethis'\n", "3. 'e1071'\n", "4. 'randomForest'\n", @@ -494,18 +616,19 @@ "6. 'maptools'\n", "7. 'raster'\n", "8. 'rgdal'\n", - "9. 'sp'\n", - "10. 'stats'\n", - "11. 'graphics'\n", - "12. 'grDevices'\n", - "13. 'utils'\n", - "14. 'datasets'\n", - "15. 'methods'\n", - "16. 'base'\n", + "9. 'sf'\n", + "10. 'sp'\n", + "11. 'stats'\n", + "12. 'graphics'\n", + "13. 'grDevices'\n", + "14. 'utils'\n", + "15. 'datasets'\n", + "16. 'methods'\n", + "17. 'base'\n", "\n", "\n", "\n", - "8. 1. 'velox'\n", + "10. 1. 'velox'\n", "2. 'devtools'\n", "3. 'usethis'\n", "4. 'e1071'\n", @@ -514,18 +637,19 @@ "7. 'maptools'\n", "8. 'raster'\n", "9. 'rgdal'\n", - "10. 'sp'\n", - "11. 'stats'\n", - "12. 'graphics'\n", - "13. 'grDevices'\n", - "14. 'utils'\n", - "15. 'datasets'\n", - "16. 'methods'\n", - "17. 'base'\n", + "10. 'sf'\n", + "11. 'sp'\n", + "12. 'stats'\n", + "13. 'graphics'\n", + "14. 'grDevices'\n", + "15. 'utils'\n", + "16. 'datasets'\n", + "17. 'methods'\n", + "18. 'base'\n", "\n", "\n", "\n", - "9. 1. 'rgeos'\n", + "11. 1. 'rgeos'\n", "2. 'velox'\n", "3. 'devtools'\n", "4. 'usethis'\n", @@ -535,18 +659,19 @@ "8. 'maptools'\n", "9. 'raster'\n", "10. 'rgdal'\n", - "11. 'sp'\n", - "12. 'stats'\n", - "13. 'graphics'\n", - "14. 'grDevices'\n", - "15. 'utils'\n", - "16. 'datasets'\n", - "17. 'methods'\n", - "18. 'base'\n", + "11. 'sf'\n", + "12. 'sp'\n", + "13. 'stats'\n", + "14. 'graphics'\n", + "15. 'grDevices'\n", + "16. 'utils'\n", + "17. 'datasets'\n", + "18. 'methods'\n", + "19. 'base'\n", "\n", "\n", "\n", - "10. 1. 'leaflet'\n", + "12. 1. 'leaflet'\n", "2. 'rgeos'\n", "3. 'velox'\n", "4. 'devtools'\n", @@ -557,18 +682,19 @@ "9. 'maptools'\n", "10. 'raster'\n", "11. 'rgdal'\n", - "12. 'sp'\n", - "13. 'stats'\n", - "14. 'graphics'\n", - "15. 'grDevices'\n", - "16. 'utils'\n", - "17. 'datasets'\n", - "18. 'methods'\n", - "19. 'base'\n", + "12. 'sf'\n", + "13. 'sp'\n", + "14. 'stats'\n", + "15. 'graphics'\n", + "16. 'grDevices'\n", + "17. 'utils'\n", + "18. 'datasets'\n", + "19. 'methods'\n", + "20. 'base'\n", "\n", "\n", "\n", - "11. 1. 'htmlwidgets'\n", + "13. 1. 'htmlwidgets'\n", "2. 'leaflet'\n", "3. 'rgeos'\n", "4. 'velox'\n", @@ -580,18 +706,19 @@ "10. 'maptools'\n", "11. 'raster'\n", "12. 'rgdal'\n", - "13. 'sp'\n", - "14. 'stats'\n", - "15. 'graphics'\n", - "16. 'grDevices'\n", - "17. 'utils'\n", - "18. 'datasets'\n", - "19. 'methods'\n", - "20. 'base'\n", + "13. 'sf'\n", + "14. 'sp'\n", + "15. 'stats'\n", + "16. 'graphics'\n", + "17. 'grDevices'\n", + "18. 'utils'\n", + "19. 'datasets'\n", + "20. 'methods'\n", + "21. 'base'\n", "\n", "\n", "\n", - "12. 1. 'HaSa'\n", + "14. 1. 'IRdisplay'\n", "2. 'htmlwidgets'\n", "3. 'leaflet'\n", "4. 'rgeos'\n", @@ -604,14 +731,41 @@ "11. 'maptools'\n", "12. 'raster'\n", "13. 'rgdal'\n", - "14. 'sp'\n", - "15. 'stats'\n", - "16. 'graphics'\n", - "17. 'grDevices'\n", - "18. 'utils'\n", - "19. 'datasets'\n", - "20. 'methods'\n", - "21. 'base'\n", + "14. 'sf'\n", + "15. 'sp'\n", + "16. 'stats'\n", + "17. 'graphics'\n", + "18. 'grDevices'\n", + "19. 'utils'\n", + "20. 'datasets'\n", + "21. 'methods'\n", + "22. 'base'\n", + "\n", + "\n", + "\n", + "15. 1. 'HaSa'\n", + "2. 'IRdisplay'\n", + "3. 'htmlwidgets'\n", + "4. 'leaflet'\n", + "5. 'rgeos'\n", + "6. 'velox'\n", + "7. 'devtools'\n", + "8. 'usethis'\n", + "9. 'e1071'\n", + "10. 'randomForest'\n", + "11. 'spatialEco'\n", + "12. 'maptools'\n", + "13. 'raster'\n", + "14. 'rgdal'\n", + "15. 'sf'\n", + "16. 'sp'\n", + "17. 'stats'\n", + "18. 'graphics'\n", + "19. 'grDevices'\n", + "20. 'utils'\n", + "21. 'datasets'\n", + "22. 'methods'\n", + "23. 'base'\n", "\n", "\n", "\n", @@ -620,68 +774,84 @@ ], "text/plain": [ "[[1]]\n", - "[1] \"rgdal\" \"sp\" \"stats\" \"graphics\" \"grDevices\" \"utils\" \n", - "[7] \"datasets\" \"methods\" \"base\" \n", + "[1] \"sp\" \"stats\" \"graphics\" \"grDevices\" \"utils\" \"datasets\" \n", + "[7] \"methods\" \"base\" \n", "\n", "[[2]]\n", - " [1] \"raster\" \"rgdal\" \"sp\" \"stats\" \"graphics\" \"grDevices\"\n", - " [7] \"utils\" \"datasets\" \"methods\" \"base\" \n", + "[1] \"sf\" \"sp\" \"stats\" \"graphics\" \"grDevices\" \"utils\" \n", + "[7] \"datasets\" \"methods\" \"base\" \n", "\n", "[[3]]\n", - " [1] \"maptools\" \"raster\" \"rgdal\" \"sp\" \"stats\" \"graphics\" \n", - " [7] \"grDevices\" \"utils\" \"datasets\" \"methods\" \"base\" \n", + " [1] \"rgdal\" \"sf\" \"sp\" \"stats\" \"graphics\" \"grDevices\"\n", + " [7] \"utils\" \"datasets\" \"methods\" \"base\" \n", "\n", "[[4]]\n", - " [1] \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \"sp\" \n", - " [6] \"stats\" \"graphics\" \"grDevices\" \"utils\" \"datasets\" \n", - "[11] \"methods\" \"base\" \n", + " [1] \"raster\" \"rgdal\" \"sf\" \"sp\" \"stats\" \"graphics\" \n", + " [7] \"grDevices\" \"utils\" \"datasets\" \"methods\" \"base\" \n", "\n", "[[5]]\n", - " [1] \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \n", - " [6] \"sp\" \"stats\" \"graphics\" \"grDevices\" \"utils\" \n", - "[11] \"datasets\" \"methods\" \"base\" \n", + " [1] \"maptools\" \"raster\" \"rgdal\" \"sf\" \"sp\" \"stats\" \n", + " [7] \"graphics\" \"grDevices\" \"utils\" \"datasets\" \"methods\" \"base\" \n", "\n", "[[6]]\n", - " [1] \"e1071\" \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \n", - " [6] \"rgdal\" \"sp\" \"stats\" \"graphics\" \"grDevices\" \n", - "[11] \"utils\" \"datasets\" \"methods\" \"base\" \n", + " [1] \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \"sf\" \n", + " [6] \"sp\" \"stats\" \"graphics\" \"grDevices\" \"utils\" \n", + "[11] \"datasets\" \"methods\" \"base\" \n", "\n", "[[7]]\n", - " [1] \"devtools\" \"usethis\" \"e1071\" \"randomForest\" \"spatialEco\" \n", - " [6] \"maptools\" \"raster\" \"rgdal\" \"sp\" \"stats\" \n", - "[11] \"graphics\" \"grDevices\" \"utils\" \"datasets\" \"methods\" \n", - "[16] \"base\" \n", + " [1] \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \n", + " [6] \"sf\" \"sp\" \"stats\" \"graphics\" \"grDevices\" \n", + "[11] \"utils\" \"datasets\" \"methods\" \"base\" \n", "\n", "[[8]]\n", - " [1] \"velox\" \"devtools\" \"usethis\" \"e1071\" \"randomForest\"\n", - " [6] \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \"sp\" \n", + " [1] \"e1071\" \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \n", + " [6] \"rgdal\" \"sf\" \"sp\" \"stats\" \"graphics\" \n", + "[11] \"grDevices\" \"utils\" \"datasets\" \"methods\" \"base\" \n", + "\n", + "[[9]]\n", + " [1] \"devtools\" \"usethis\" \"e1071\" \"randomForest\" \"spatialEco\" \n", + " [6] \"maptools\" \"raster\" \"rgdal\" \"sf\" \"sp\" \n", "[11] \"stats\" \"graphics\" \"grDevices\" \"utils\" \"datasets\" \n", "[16] \"methods\" \"base\" \n", "\n", - "[[9]]\n", - " [1] \"rgeos\" \"velox\" \"devtools\" \"usethis\" \"e1071\" \n", - " [6] \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \n", + "[[10]]\n", + " [1] \"velox\" \"devtools\" \"usethis\" \"e1071\" \"randomForest\"\n", + " [6] \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \"sf\" \n", "[11] \"sp\" \"stats\" \"graphics\" \"grDevices\" \"utils\" \n", "[16] \"datasets\" \"methods\" \"base\" \n", "\n", - "[[10]]\n", + "[[11]]\n", + " [1] \"rgeos\" \"velox\" \"devtools\" \"usethis\" \"e1071\" \n", + " [6] \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \n", + "[11] \"sf\" \"sp\" \"stats\" \"graphics\" \"grDevices\" \n", + "[16] \"utils\" \"datasets\" \"methods\" \"base\" \n", + "\n", + "[[12]]\n", " [1] \"leaflet\" \"rgeos\" \"velox\" \"devtools\" \"usethis\" \n", " [6] \"e1071\" \"randomForest\" \"spatialEco\" \"maptools\" \"raster\" \n", - "[11] \"rgdal\" \"sp\" \"stats\" \"graphics\" \"grDevices\" \n", - "[16] \"utils\" \"datasets\" \"methods\" \"base\" \n", + "[11] \"rgdal\" \"sf\" \"sp\" \"stats\" \"graphics\" \n", + "[16] \"grDevices\" \"utils\" \"datasets\" \"methods\" \"base\" \n", "\n", - "[[11]]\n", + "[[13]]\n", " [1] \"htmlwidgets\" \"leaflet\" \"rgeos\" \"velox\" \"devtools\" \n", " [6] \"usethis\" \"e1071\" \"randomForest\" \"spatialEco\" \"maptools\" \n", - "[11] \"raster\" \"rgdal\" \"sp\" \"stats\" \"graphics\" \n", - "[16] \"grDevices\" \"utils\" \"datasets\" \"methods\" \"base\" \n", + "[11] \"raster\" \"rgdal\" \"sf\" \"sp\" \"stats\" \n", + "[16] \"graphics\" \"grDevices\" \"utils\" \"datasets\" \"methods\" \n", + "[21] \"base\" \n", "\n", - "[[12]]\n", - " [1] \"HaSa\" \"htmlwidgets\" \"leaflet\" \"rgeos\" \"velox\" \n", + "[[14]]\n", + " [1] \"IRdisplay\" \"htmlwidgets\" \"leaflet\" \"rgeos\" \"velox\" \n", " [6] \"devtools\" \"usethis\" \"e1071\" \"randomForest\" \"spatialEco\" \n", - "[11] \"maptools\" \"raster\" \"rgdal\" \"sp\" \"stats\" \n", - "[16] \"graphics\" \"grDevices\" \"utils\" \"datasets\" \"methods\" \n", - "[21] \"base\" \n" + "[11] \"maptools\" \"raster\" \"rgdal\" \"sf\" \"sp\" \n", + "[16] \"stats\" \"graphics\" \"grDevices\" \"utils\" \"datasets\" \n", + "[21] \"methods\" \"base\" \n", + "\n", + "[[15]]\n", + " [1] \"HaSa\" \"IRdisplay\" \"htmlwidgets\" \"leaflet\" \"rgeos\" \n", + " [6] \"velox\" \"devtools\" \"usethis\" \"e1071\" \"randomForest\"\n", + "[11] \"spatialEco\" \"maptools\" \"raster\" \"rgdal\" \"sf\" \n", + "[16] \"sp\" \"stats\" \"graphics\" \"grDevices\" \"utils\" \n", + "[21] \"datasets\" \"methods\" \"base\" \n" ] }, "metadata": {}, @@ -689,7 +859,8 @@ } ], "source": [ - "libraries <- c(\"rgdal\",\"raster\",\"maptools\",\"spatialEco\",\"randomForest\",\"e1071\",\"devtools\",\"velox\",\"rgeos\",\"leaflet\",\"htmlwidgets\", \"HaSa\")\n", + "options(\"rgdal_show_exportToProj4_warnings\"=\"none\")\n", + "libraries <- c(\"sp\", \"sf\", \"rgdal\",\"raster\",\"maptools\",\"spatialEco\",\"randomForest\",\"e1071\",\"devtools\",\"velox\",\"rgeos\",\"leaflet\",\"htmlwidgets\", \"IRdisplay\", \"HaSa\")\n", "lapply(libraries, library, character.only = TRUE)" ] }, @@ -709,7 +880,7 @@ "wd<-\"./\"\n", "dataPath<-\"./Data/\"\n", "outPath<-paste(wd,\"Data/Results/\",sep=\"\")\n", - "rasterOptions(tmpdir=\"./RasterTmp/\")" + "raster::rasterOptions(tmpdir=\"./RasterTmp/\")" ] }, { @@ -739,7 +910,7 @@ "metadata": {}, "outputs": [], "source": [ - "a1<-brick(paste(dataPath,\"SentinelStack_2018.tif\",sep=\"\"))" + "a1<-raster::brick(paste(dataPath,\"SentinelStack_2018.tif\",sep=\"\"))" ] }, { @@ -795,10 +966,10 @@ } ], "source": [ - "shp<-readOGR(paste(dataPath,\"Example_Reference_Points.shp\", sep=\"\"))\n", - "proj4string(shp)<- \"+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0\"\n", - "shp<-spTransform(shp,CRS( \"+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0\"))\n", - "ref<-as.data.frame(extract(a1,shp))" + "shp <- readOGR(paste(dataPath,\"Example_Reference_Points.shp\", sep=\"\"))\n", + "proj4string(shp) <- \"+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0\"\n", + "shp <- spTransform(shp,CRS( \"+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0\"))\n", + "ref <- as.data.frame(extract(a1,shp))" ] }, { @@ -822,9 +993,9 @@ "metadata": {}, "outputs": [], "source": [ - "p <- as(extent(a1), 'SpatialPolygons') \n", - "p <- SpatialPolygonsDataFrame(p, data.frame( ID=1:length(p)))\n", - "proj4string(p)<-proj4string(a1)" + "p <- as(raster::extent(a1), 'SpatialPolygons') \n", + "p <- sp::SpatialPolygonsDataFrame(p, data.frame( ID=1:length(p)))\n", + "sp::proj4string(p)<-sp::proj4string(a1)" ] }, { @@ -858,8 +1029,8 @@ ], "source": [ "r=19; g=20; b=21;\n", - "plotRGB(a1,r=r,g=g,b=b,stretch=\"lin\", axes=T)\n", - "plot(shp,pch=21,bg=\"red\",col=\"yellow\",cex=1.9,lwd=2.5,add=T)" + "raster::plotRGB(a1,r=r,g=g,b=b,stretch=\"lin\", axes=T)\n", + "raster::plot(shp,pch=21,bg=\"red\",col=\"yellow\",cex=1.9,lwd=2.5,add=T)" ] }, { @@ -905,32 +1076,16 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[1] \"init.samples = 50 models = 200\"\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning message in parallel::mclapply(1:nb_mean, model_opt_r, raster = raster, sample_type = sample_type, :\n", - "“all scheduled cores encountered errors in user code”\n" - ] - }, - { - "ename": "ERROR", - "evalue": "Error in res[[k = k]][[\"points\"]]: subscript out of bounds\n", - "output_type": "error", - "traceback": [ - "Error in res[[k = k]][[\"points\"]]: subscript out of bounds\nTraceback:\n", - "1. HaSa::multi_Class_Sampling(in.raster = a1, init.samples = 50, \n . sample_type = \"regular\", nb_models = 200, nb_it = 10, buffer = 15, \n . reference = ref, model = \"rf\", mtry = 10, last = F, seed = 3, \n . init.seed = \"sample\", outPath = outPath, step = 1, classNames = classNames, \n . n_classes = 7, multiTest = 1, RGB = c(19, 20, 21), overwrite = TRUE, \n . parallel_mode = TRUE)", - "2. sample_nb(raster = in.raster, nb_samples = seq(init.samples, \n . init.samples, init.samples), sample_type = sample_type, nb_mean = nb_models, \n . nb_it = nb_it, buffer = buffer, reference = reference, model = model, \n . area = area, mtry = mtry, last = last, seed = seed, init.seed = init.seed, \n . parallel_mode = parallel_mode)" + "[1] \"init.samples = 50 models = 200\"\n", + "[1] \"class=2 difference=0.64\"\n", + "\n" ] } ], @@ -955,7 +1110,8 @@ " multiTest = 1,\n", " RGB = c(19,20,21),\n", " overwrite=TRUE,\n", - " parallel_mode=TRUE)" + " parallel_mode=TRUE,\n", + " plot_on_browser = FALSE)" ] }, { @@ -973,13 +1129,6 @@ "source": [ "plot_results(inPath=outPath)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -994,7 +1143,7 @@ "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", - "version": "4.0.3" + "version": "3.6.3" } }, "nbformat": 4, -- GitLab From c43247ec362eb2d760da5ae5fc95c6cc4415e278 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Fri, 29 Jan 2021 14:41:21 +0100 Subject: [PATCH 23/58] Define the default values for the input, tmp and output directories. Define the memory size. --- docker/start_docker.sh | 46 ++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/docker/start_docker.sh b/docker/start_docker.sh index c271910..db1bcc9 100755 --- a/docker/start_docker.sh +++ b/docker/start_docker.sh @@ -1,9 +1,9 @@ #!/bin/bash # variables to bet set by the user -input_dir="" -tmp_dir="" -output_dir="" +input_dir="../demo/Data" +tmp_dir="../demo/Data" +output_dir="../demo/Data" jupyter_notebook="TrUE" @@ -11,23 +11,6 @@ jupyter_notebook="TrUE" # DO NOT CHANGE ANYTHING FROM HERE ON!!! # ########################################## -# HaSa configuration -demo_dir="$(realpath ../demo/)" - -# Docker container related -container_name="hasa" -runner_os="ubuntu" -runner_iname="hasa_runner" -runner_version="latest" -runner_tag="${runner_os}_${runner_iname}:${runner_version}" -out_data_folder="/home/hasa/output" -in_data_folder="/home/hasa/input" -tmp_data_folder="/home/hasa/tmp" -demo_data_folder="/home/hasa/demo" -demo_data_foler="$(realpath ../demo/)" -jupyter_lab_port=8888 -docker_jupyterlab_port=8888 - if [ "$input_dir" == "" ] then echo "Please define the input_dir" @@ -46,6 +29,27 @@ then exit fi +input_dir_=MY_PATH=$(readlink -f $input_dir) +output_dir_=MY_PATH=$(readlink -f $output_dir) +tmp_dir_=MY_PATH=$(readlink -f $tmp_dir) + +# HaSa configuration +demo_dir="$(realpath ../demo/)" + +# Docker container related +container_name="hasa" +runner_os="ubuntu" +runner_iname="hasa_runner" +runner_version="latest" +runner_tag="${runner_os}_${runner_iname}:${runner_version}" +out_data_folder="/home/hasa/output" +in_data_folder="/home/hasa/input" +tmp_data_folder="/home/hasa/tmp" +demo_data_folder="/home/hasa/demo" +demo_data_foler="$(realpath ../demo/)" +jupyter_lab_port=8888 +docker_jupyterlab_port=8888 + sudo docker rm -f ${container_name} @@ -53,6 +57,7 @@ echo "Starting HaSa container, please add the input files to ${input_dir} and re if [ "${jupyter_notebook,,}" = "true" ] then sudo docker run -it --name ${container_name} \ + --memory="20g" --memory-swap="20g" --memory-swappiness=0 \ -p $jupyter_lab_port:$docker_jupyterlab_port \ -v ${input_dir}:${in_data_folder} \ -v ${tmp_dir}:${tmp_data_folder} \ @@ -61,6 +66,7 @@ then bash -i -c "cd /home/hasa; jupyter-lab --ip 0.0.0.0 --no-browser --allow-root demo/" else sudo docker run -it --name ${container_name} -u 1000:1000 \ + --memory="20g" --memory-swap="20g" --memory-swappiness=0 \ -v ${input_dir}:${in_data_folder} \ -v ${tmp_dir}:${tmp_data_folder} \ -v ${output_dir}:${out_data_folder} \ -- GitLab From 01517cd3c4d29ca1eecf2a029fca4de629b7ed6e Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Fri, 29 Jan 2021 14:55:17 +0100 Subject: [PATCH 24/58] Let's just use the host values. --- docker/start_docker.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/docker/start_docker.sh b/docker/start_docker.sh index db1bcc9..95579a6 100755 --- a/docker/start_docker.sh +++ b/docker/start_docker.sh @@ -50,14 +50,12 @@ demo_data_foler="$(realpath ../demo/)" jupyter_lab_port=8888 docker_jupyterlab_port=8888 - sudo docker rm -f ${container_name} echo "Starting HaSa container, please add the input files to ${input_dir} and read the results from the ${output_dir}" if [ "${jupyter_notebook,,}" = "true" ] then sudo docker run -it --name ${container_name} \ - --memory="20g" --memory-swap="20g" --memory-swappiness=0 \ -p $jupyter_lab_port:$docker_jupyterlab_port \ -v ${input_dir}:${in_data_folder} \ -v ${tmp_dir}:${tmp_data_folder} \ @@ -66,7 +64,6 @@ then bash -i -c "cd /home/hasa; jupyter-lab --ip 0.0.0.0 --no-browser --allow-root demo/" else sudo docker run -it --name ${container_name} -u 1000:1000 \ - --memory="20g" --memory-swap="20g" --memory-swappiness=0 \ -v ${input_dir}:${in_data_folder} \ -v ${tmp_dir}:${tmp_data_folder} \ -v ${output_dir}:${out_data_folder} \ -- GitLab From cf2c0bbbc0f4d79f02d42fb76a99d5f6f0f8e69b Mon Sep 17 00:00:00 2001 From: Romulo Pereira Goncalves Date: Fri, 29 Jan 2021 15:04:48 +0100 Subject: [PATCH 25/58] Improve documentation --- docker/README.md | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/docker/README.md b/docker/README.md index 9f249a2..c9c683f 100644 --- a/docker/README.md +++ b/docker/README.md @@ -82,6 +82,33 @@ The message `The following object is masked from 'package:graphics':` means that ### Jupyter-lab -To start a `jupyter-lab` the user needs to set the variable `jupyter_lab` to `TRUE` in the `start_container.sh` script. Once set the user only needs to re-run the script and open in a web-browser the link `localhost:8080`. For more information on how to use jupyter_lab, please refer to its [manual](https://jupyterlab.readthedocs.io/en/stable/). +To start a `jupyter-lab` the user needs to set the variable `jupyter_lab` to `TRUE` in the `start_container.sh` script. Once set, the user only needs to re-run the script. The user will see the following output: +```bash +docker$ ./start_docker.sh +Error: No such container: hasa +Starting HaSa container, please add the input files to /home/romulo/gitlab/HabitatSampler/demo/Data and read the results from the /home/romulo/gitlab/HabitatSampler/demo/Data +[I 2021-01-29 13:58:46.420 ServerApp] jupyterlab | extension was successfully linked. +[I 2021-01-29 13:58:46.428 ServerApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/jupyter_cookie_secret +[I 2021-01-29 13:58:46.621 ServerApp] nbclassic | extension was successfully linked. +[I 2021-01-29 13:58:46.651 LabApp] JupyterLab extension loaded from /usr/local/lib/python3.8/dist-packages/jupyterlab +[I 2021-01-29 13:58:46.651 LabApp] JupyterLab application directory is /usr/local/share/jupyter/lab +[I 2021-01-29 13:58:46.654 ServerApp] jupyterlab | extension was successfully loaded. +[I 2021-01-29 13:58:46.658 ServerApp] nbclassic | extension was successfully loaded. +[I 2021-01-29 13:58:46.659 ServerApp] Serving notebooks from local directory: /home/hasa/demo +[I 2021-01-29 13:58:46.659 ServerApp] Jupyter Server 1.2.2 is running at: +[I 2021-01-29 13:58:46.659 ServerApp] http://a6d306398719:8888/lab?token=b883010687291bca935a65f39f40b66fc8a5a7646e866c1e +[I 2021-01-29 13:58:46.659 ServerApp] or http://127.0.0.1:8888/lab?token=b883010687291bca935a65f39f40b66fc8a5a7646e866c1e +[I 2021-01-29 13:58:46.659 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). +[C 2021-01-29 13:58:46.661 ServerApp] + + To access the server, open this file in a browser: + file:///root/.local/share/jupyter/runtime/jpserver-12-open.html + Or copy and paste one of these URLs: + http://a6d306398719:8888/lab?token=b883010687291bca935a65f39f40b66fc8a5a7646e866c1e + or http://127.0.0.1:8888/lab?token=b883010687291bca935a65f39f40b66fc8a5a7646e866c1e + +``` + +The user should then open one of the provided URLs in a web-browser. For more information on how to use jupyter_lab, please refer to its [manual](https://jupyterlab.readthedocs.io/en/stable/). -The `jupyter-lab` will open directly into the `demo/` directory of HaSa repository. The use should load the notebook `HabitatSamplerDocker.ipynb` to run the demo. +The `jupyter-lab` will open directly into the `demo/` directory of HaSa repository. The user should load the notebook `HabitatSamplerDocker.ipynb` to run the demo. -- GitLab From bae0582ecc282a73d0f76df08bb16a267f4307bc Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Fri, 29 Jan 2021 15:06:04 +0100 Subject: [PATCH 26/58] Fix the relative paths. --- docker/start_docker.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docker/start_docker.sh b/docker/start_docker.sh index 95579a6..f38444f 100755 --- a/docker/start_docker.sh +++ b/docker/start_docker.sh @@ -29,9 +29,9 @@ then exit fi -input_dir_=MY_PATH=$(readlink -f $input_dir) -output_dir_=MY_PATH=$(readlink -f $output_dir) -tmp_dir_=MY_PATH=$(readlink -f $tmp_dir) +input_dir_=$(readlink -f $input_dir) +output_dir_=$(readlink -f $output_dir) +tmp_dir_=$(readlink -f $tmp_dir) # HaSa configuration demo_dir="$(realpath ../demo/)" @@ -52,21 +52,21 @@ docker_jupyterlab_port=8888 sudo docker rm -f ${container_name} -echo "Starting HaSa container, please add the input files to ${input_dir} and read the results from the ${output_dir}" +echo "Starting HaSa container, please add the input files to ${input_dir_} and read the results from the ${output_dir_}" if [ "${jupyter_notebook,,}" = "true" ] then sudo docker run -it --name ${container_name} \ -p $jupyter_lab_port:$docker_jupyterlab_port \ - -v ${input_dir}:${in_data_folder} \ - -v ${tmp_dir}:${tmp_data_folder} \ - -v ${output_dir}:${out_data_folder} \ + -v ${input_dir_}:${in_data_folder} \ + -v ${tmp_dir_}:${tmp_data_folder} \ + -v ${output_dir_}:${out_data_folder} \ -v ${demo_dir}:${demo_data_folder} ${runner_tag} \ bash -i -c "cd /home/hasa; jupyter-lab --ip 0.0.0.0 --no-browser --allow-root demo/" else sudo docker run -it --name ${container_name} -u 1000:1000 \ - -v ${input_dir}:${in_data_folder} \ - -v ${tmp_dir}:${tmp_data_folder} \ - -v ${output_dir}:${out_data_folder} \ + -v ${input_dir_}:${in_data_folder} \ + -v ${tmp_dir_}:${tmp_data_folder} \ + -v ${output_dir_}:${out_data_folder} \ -v ${demo_dir}:${demo_data_folder} ${runner_tag} \ bash -i -c "cd /home/hasa; echo "";echo "";echo '#######';echo 'This is a shell were you can use HaSa.'; echo 'To start the R shell run the command: R';echo '#######'; bash" fi -- GitLab From 9f239c786fa7eb2cc331ccf8dba4753d2ae66061 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Fri, 29 Jan 2021 15:08:13 +0100 Subject: [PATCH 27/58] Increase version --- R-package/DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R-package/DESCRIPTION b/R-package/DESCRIPTION index 63e4751..805ff3c 100644 --- a/R-package/DESCRIPTION +++ b/R-package/DESCRIPTION @@ -1,6 +1,6 @@ Package: HaSa Title: Autonomous Image Sampling and Probability Mapping -Version: 1.2.0 +Version: 1.3.0 Authors@R: person(given = "Carsten", family = "Neumann", -- GitLab From 7a30ebf91accbe82f214844c27470d66ae83066e Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Fri, 29 Jan 2021 15:47:09 +0100 Subject: [PATCH 28/58] Run privileged mode --- docker/context/install.R | 2 +- docker/start_docker.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/context/install.R b/docker/context/install.R index 39c7cf1..7bf32f4 100644 --- a/docker/context/install.R +++ b/docker/context/install.R @@ -15,7 +15,7 @@ install.packages("https://cran.r-project.org/src/contrib/Archive/rgdal/rgdal_1.5 library(remotes) remotes::install_git( "https://git.gfz-potsdam.de/habitat-sampler/HabitatSampler.git", - ref = "master", + ref = "docker", subdir = "R-package", dependencies = NA, upgrade=FALSE, diff --git a/docker/start_docker.sh b/docker/start_docker.sh index f38444f..4c5448c 100755 --- a/docker/start_docker.sh +++ b/docker/start_docker.sh @@ -55,7 +55,7 @@ sudo docker rm -f ${container_name} echo "Starting HaSa container, please add the input files to ${input_dir_} and read the results from the ${output_dir_}" if [ "${jupyter_notebook,,}" = "true" ] then - sudo docker run -it --name ${container_name} \ + sudo docker run -it --name ${container_name} --privileged \ -p $jupyter_lab_port:$docker_jupyterlab_port \ -v ${input_dir_}:${in_data_folder} \ -v ${tmp_dir_}:${tmp_data_folder} \ @@ -63,7 +63,7 @@ then -v ${demo_dir}:${demo_data_folder} ${runner_tag} \ bash -i -c "cd /home/hasa; jupyter-lab --ip 0.0.0.0 --no-browser --allow-root demo/" else - sudo docker run -it --name ${container_name} -u 1000:1000 \ + sudo docker run -it --name ${container_name} -u 1000:1000 --privileged \ -v ${input_dir_}:${in_data_folder} \ -v ${tmp_dir_}:${tmp_data_folder} \ -v ${output_dir_}:${out_data_folder} \ -- GitLab From 58de1fee38c7cae7c82cd6e74669099467fb1344 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Mon, 1 Feb 2021 16:52:54 +0100 Subject: [PATCH 29/58] Remove variable which we do not need anymore so the garbage collector releases memory. --- R-package/R/outer_procedure.r | 5 +++++ R-package/R/plot_interactive.r | 2 ++ 2 files changed, 7 insertions(+) diff --git a/R-package/R/outer_procedure.r b/R-package/R/outer_procedure.r index 2626273..ec42516 100644 --- a/R-package/R/outer_procedure.r +++ b/R-package/R/outer_procedure.r @@ -185,6 +185,9 @@ multi_Class_Sampling <- function(in.raster, maFo_rf <- maFo[[as.numeric(decision)]] index <- new.names[[as.numeric(decision)]] acc <- new.acc[[as.numeric(decision)]] + remove(maFo) + remove(new.names) + remove(new.acc) ########################################################################## } else{ ######################## @@ -230,6 +233,7 @@ multi_Class_Sampling <- function(in.raster, sample2 <- init.samples models2 <- nb_models while (decision == "0") { + remove(maFo_rf) decision2 <- readline("Adjust init.samples/nb.models or auto [../.. or 0]: ") if (decision2 != "0") { @@ -289,6 +293,7 @@ multi_Class_Sampling <- function(in.raster, ni <- i } save(run1, file = paste(outPath, paste("Run", ni, sep = ""), sep = "")) + remove(run1) ###rgdal version issue not_good_workaround <- comment(dummy@crs) comment(dummy@crs) <- "" diff --git a/R-package/R/plot_interactive.r b/R-package/R/plot_interactive.r index 20c566f..7edb988 100644 --- a/R-package/R/plot_interactive.r +++ b/R-package/R/plot_interactive.r @@ -166,6 +166,7 @@ iplot <- function(x, y, HaTy, r, g, b, acc, outPath, plot_on_browser = TRUE) { file = paste(outPath, 'leaflet.html', sep = ""), append = TRUE ) + rm(mv) if (plot_on_browser == TRUE) { utils::browseURL(paste(outPath, 'leaflet.html', sep = ""), browser = "firefox") @@ -180,6 +181,7 @@ iplot <- function(x, y, HaTy, r, g, b, acc, outPath, plot_on_browser = TRUE) { htmlwidgets::saveWidget(mv, selfcontained = FALSE, paste(outPath, 'leaflet.html', sep = "")) + rm(mv) cat( "", file = paste(outPath, 'leaflet.html', sep = ""), -- GitLab From 87d944d2e5d530a374ee8a0fcf021119ab671f3c Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Mon, 1 Feb 2021 19:13:00 +0100 Subject: [PATCH 30/58] New output --- demo/HabitatSampler.ipynb | 704 +++++++++++++++++++++++++++++++++++++- 1 file changed, 700 insertions(+), 4 deletions(-) diff --git a/demo/HabitatSampler.ipynb b/demo/HabitatSampler.ipynb index b86c722..30ec057 100644 --- a/demo/HabitatSampler.ipynb +++ b/demo/HabitatSampler.ipynb @@ -780,6 +780,7 @@ } ], "source": [ + "options(\"rgdal_show_exportToProj4_warnings\"=\"none\")\n", "if (from_sources == TRUE) {\n", " libraries <- c(\"rgdal\",\"raster\",\"maptools\",\"spatialEco\",\"randomForest\",\"e1071\",\"devtools\",\"velox\",\"rgeos\",\"leaflet\",\"htmlwidgets\", \"IRdisplay\")\n", "} else {\n", @@ -1000,7 +1001,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -1008,7 +1009,401 @@ "output_type": "stream", "text": [ "[1] \"init.samples = 50 models = 200\"\n", - "[1] \"class=2 difference=0.76\"\n", + "[1] \"class=4 difference=0.76\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 24\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 13\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 1 Done\"\n", + "[1] \"Classification took 11.735330\"\n", + "[1] \"init.samples = 100 models = 215\"\n", + "[1] \"class=4 difference=0.84\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 40\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 23\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 2 Done\"\n", + "[1] \"Classification took 73.487621\"\n", + "[1] \"init.samples = 150 models = 230\"\n", + "[1] \"class=4 difference=0.92\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 42\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 24\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n", + "[1] 24\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 3 Done\"\n", + "[1] \"Classification took 74.542457\"\n", + "[1] \"init.samples = 200 models = 245\"\n", + "[1] \"class=3 difference=0.96\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 85\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 46\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n", + "[1] 24\n", + "[1] 25\n", + "[1] 26\n", + "[1] 27\n", + "[1] 28\n", + "[1] 29\n", + "[1] 30\n", + "[1] 31\n", + "[1] 32\n", + "[1] 33\n", + "[1] 34\n", + "[1] 35\n", + "[1] 36\n", + "[1] 37\n", + "[1] 38\n", + "[1] 39\n", + "[1] 40\n", + "[1] 41\n", + "[1] 42\n", + "[1] 43\n", + "[1] 44\n", + "[1] 45\n", + "[1] 46\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 4 Done\"\n", + "[1] \"Classification took 65.365530\"\n", + "[1] \"init.samples = 250 models = 260\"\n", + "[1] \"class=3 difference=0.96\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 155\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 83\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n", + "[1] 24\n", + "[1] 25\n", + "[1] 26\n", + "[1] 27\n", + "[1] 28\n", + "[1] 29\n", + "[1] 30\n", + "[1] 31\n", + "[1] 32\n", + "[1] 33\n", + "[1] 34\n", + "[1] 35\n", + "[1] 36\n", + "[1] 37\n", + "[1] 38\n", + "[1] 39\n", + "[1] 40\n", + "[1] 41\n", + "[1] 42\n", + "[1] 43\n", + "[1] 44\n", + "[1] 45\n", + "[1] 46\n", + "[1] 47\n", + "[1] 48\n", + "[1] 49\n", + "[1] 50\n", + "[1] 51\n", + "[1] 52\n", + "[1] 53\n", + "[1] 54\n", + "[1] 55\n", + "[1] 56\n", + "[1] 57\n", + "[1] 58\n", + "[1] 59\n", + "[1] 60\n", + "[1] 61\n", + "[1] 62\n", + "[1] 63\n", + "[1] 64\n", + "[1] 65\n", + "[1] 66\n", + "[1] 67\n", + "[1] 68\n", + "[1] 69\n", + "[1] 70\n", + "[1] 71\n", + "[1] 72\n", + "[1] 73\n", + "[1] 74\n", + "[1] 75\n", + "[1] 76\n", + "[1] 77\n", + "[1] 78\n", + "[1] 79\n", + "[1] 80\n", + "[1] 81\n", + "[1] 82\n", + "[1] 83\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 5 Done\"\n", + "[1] \"Classification took 62.097358\"\n", + "[1] \"init.samples = 300 models = 275\"\n", + "[1] \"class=1 difference=1\"\n", "\n" ] }, @@ -1025,9 +1420,310 @@ "name": "stdin", "output_type": "stream", "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 0\n", + "Threshold for Habitat Extraction or Sample Again [../0]: 190\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 103\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n", + "[1] 24\n", + "[1] 25\n", + "[1] 26\n", + "[1] 27\n", + "[1] 28\n", + "[1] 29\n", + "[1] 30\n", + "[1] 31\n", + "[1] 32\n", + "[1] 33\n", + "[1] 34\n", + "[1] 35\n", + "[1] 36\n", + "[1] 37\n", + "[1] 38\n", + "[1] 39\n", + "[1] 40\n", + "[1] 41\n", + "[1] 42\n", + "[1] 43\n", + "[1] 44\n", + "[1] 45\n", + "[1] 46\n", + "[1] 47\n", + "[1] 48\n", + "[1] 49\n", + "[1] 50\n", + "[1] 51\n", + "[1] 52\n", + "[1] 53\n", + "[1] 54\n", + "[1] 55\n", + "[1] 56\n", + "[1] 57\n", + "[1] 58\n", + "[1] 59\n", + "[1] 60\n", + "[1] 61\n", + "[1] 62\n", + "[1] 63\n", + "[1] 64\n", + "[1] 65\n", + "[1] 66\n", + "[1] 67\n", + "[1] 68\n", + "[1] 69\n", + "[1] 70\n", + "[1] 71\n", + "[1] 72\n", + "[1] 73\n", + "[1] 74\n", + "[1] 75\n", + "[1] 76\n", + "[1] 77\n", + "[1] 78\n", + "[1] 79\n", + "[1] 80\n", + "[1] 81\n", + "[1] 82\n", + "[1] 83\n", + "[1] 84\n", + "[1] 85\n", + "[1] 86\n", + "[1] 87\n", + "[1] 88\n", + "[1] 89\n", + "[1] 90\n", + "[1] 91\n", + "[1] 92\n", + "[1] 93\n", + "[1] 94\n", + "[1] 95\n", + "[1] 96\n", + "[1] 97\n", + "[1] 98\n", + "[1] 99\n", + "[1] 100\n", + "[1] 101\n", + "[1] 102\n", + "[1] 103\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 6 Done\"\n", + "[1] \"Classification took 61.119719\"\n", + "[1] \"init.samples = 350 models = 290\"\n", + "[1] \"class=1 difference=0.96\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 280\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 149\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n", + "[1] 24\n", + "[1] 25\n", + "[1] 26\n", + "[1] 27\n", + "[1] 28\n", + "[1] 29\n", + "[1] 30\n", + "[1] 31\n", + "[1] 32\n", + "[1] 33\n", + "[1] 34\n", + "[1] 35\n", + "[1] 36\n", + "[1] 37\n", + "[1] 38\n", + "[1] 39\n", + "[1] 40\n", + "[1] 41\n", + "[1] 42\n", + "[1] 43\n", + "[1] 44\n", + "[1] 45\n", + "[1] 46\n", + "[1] 47\n", + "[1] 48\n", + "[1] 49\n", + "[1] 50\n", + "[1] 51\n", + "[1] 52\n", + "[1] 53\n", + "[1] 54\n", + "[1] 55\n", + "[1] 56\n", + "[1] 57\n", + "[1] 58\n", + "[1] 59\n", + "[1] 60\n", + "[1] 61\n", + "[1] 62\n", + "[1] 63\n", + "[1] 64\n", + "[1] 65\n", + "[1] 66\n", + "[1] 67\n", + "[1] 68\n", + "[1] 69\n", + "[1] 70\n", + "[1] 71\n", + "[1] 72\n", + "[1] 73\n", + "[1] 74\n", + "[1] 75\n", + "[1] 76\n", + "[1] 77\n", + "[1] 78\n", + "[1] 79\n", + "[1] 80\n", + "[1] 81\n", + "[1] 82\n", + "[1] 83\n", + "[1] 84\n", + "[1] 85\n", + "[1] 86\n", + "[1] 87\n", + "[1] 88\n", + "[1] 89\n", + "[1] 90\n", + "[1] 91\n", + "[1] 92\n", + "[1] 93\n", + "[1] 94\n", + "[1] 95\n", + "[1] 96\n", + "[1] 97\n", + "[1] 98\n", + "[1] 99\n", + "[1] 100\n", + "[1] 101\n", + "[1] 102\n", + "[1] 103\n", + "[1] 104\n", + "[1] 105\n", + "[1] 106\n", + "[1] 107\n", + "[1] 108\n", + "[1] 109\n", + "[1] 110\n", + "[1] 111\n", + "[1] 112\n", + "[1] 113\n", + "[1] 114\n", + "[1] 115\n", + "[1] 116\n", + "[1] 117\n", + "[1] 118\n", + "[1] 119\n", + "[1] 120\n", + "[1] 121\n", + "[1] 122\n", + "[1] 123\n", + "[1] 124\n", + "[1] 125\n", + "[1] 126\n", + "[1] 127\n", + "[1] 128\n", + "[1] 129\n", + "[1] 130\n", + "[1] 131\n", + "[1] 132\n", + "[1] 133\n", + "[1] 134\n", + "[1] 135\n", + "[1] 136\n", + "[1] 137\n", + "[1] 138\n", + "[1] 139\n", + "[1] 140\n", + "[1] 141\n", + "[1] 142\n", + "[1] 143\n", + "[1] 144\n", + "[1] 145\n", + "[1] 146\n", + "[1] 147\n", + "[1] 148\n", + "[1] 149\n", + "[1] \"Habitat 7 Done\"\n", + "[1] \"Congratulation - you finally made it towards the last habitat\"\n" + ] } ], "source": [ @@ -1052,7 +1748,7 @@ " RGB = c(19,20,21),\n", " overwrite=TRUE,\n", " parallel_mode=TRUE,\n", - " plot_on_browser = TRUE)" + " plot_on_browser = FALSE)" ] }, { -- GitLab From 6aa47b26bc790108cb9ed352308456352ec0bc11 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Tue, 2 Feb 2021 11:31:48 +0100 Subject: [PATCH 31/58] Define memory and swap constraints. The R kernel should not be killed by the OS. --- docker/start_docker.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/start_docker.sh b/docker/start_docker.sh index 4c5448c..e6a8c9d 100755 --- a/docker/start_docker.sh +++ b/docker/start_docker.sh @@ -56,6 +56,7 @@ echo "Starting HaSa container, please add the input files to ${input_dir_} and r if [ "${jupyter_notebook,,}" = "true" ] then sudo docker run -it --name ${container_name} --privileged \ + --oom-kill-disable --memory=30g --memory-swap=14g \ -p $jupyter_lab_port:$docker_jupyterlab_port \ -v ${input_dir_}:${in_data_folder} \ -v ${tmp_dir_}:${tmp_data_folder} \ @@ -64,6 +65,7 @@ then bash -i -c "cd /home/hasa; jupyter-lab --ip 0.0.0.0 --no-browser --allow-root demo/" else sudo docker run -it --name ${container_name} -u 1000:1000 --privileged \ + --oom-kill-disable --memory=30g --memory-swap=14g \ -v ${input_dir_}:${in_data_folder} \ -v ${tmp_dir_}:${tmp_data_folder} \ -v ${output_dir_}:${out_data_folder} \ -- GitLab From ac68e813c0a293790fe068199a5d4f04c627573f Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Tue, 2 Feb 2021 12:33:08 +0100 Subject: [PATCH 32/58] User can now decided if the runs are saved or not. --- R-package/R/outer_procedure.r | 13 +++++++++---- R-package/man/multi_Class_Sampling.Rd | 5 ++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/R-package/R/outer_procedure.r b/R-package/R/outer_procedure.r index ec42516..9e29ce1 100644 --- a/R-package/R/outer_procedure.r +++ b/R-package/R/outer_procedure.r @@ -21,13 +21,14 @@ #' @param multiTest number of test runs to compare different probability outputs #' @param RGB rgb channel numbers for image plot #' @param overwrite overwrite the results file +#' @param save_runs if it saves the Habitat object or not (default TRUE) #' @param parallel_mode run loops using all available cores #' @param plot_on_browser plot on the browser or inline in a notebook (default TRUE) #' #' @return 4 files per step: #' 1) Habitat type probability map as geocoded *.kml layer and *.tif raster files and *.png image output -#' 2) A Habitat object consisting of 7 slots: \cr +#' 2) A Habitat object (only if save_runs is set to TRUE) consisting of 7 slots: \cr #' run1@models - list of selcted classifiers \cr #' run1@ref_samples - list of SpatialPointsDataFrames with same length as run1@models holding reference labels [1,2] for each selected model \cr #' run1@switch - vector of lenght run1@models indicating if target class equals 2, if not NA the labels need to be switched \cr @@ -84,6 +85,7 @@ multi_Class_Sampling <- function(in.raster, multiTest = 1, RGB = c(19, 20, 21), overwrite = TRUE, + save_runs = TRUE, parallel_mode = FALSE, plot_on_browser = TRUE) { ###first steps: data preparation @@ -286,14 +288,17 @@ multi_Class_Sampling <- function(in.raster, readline("Threshold for Habitat Extraction or Sample Again [../0]: ") } - run1 <- maFo_rf if (i < 10) { ni <- paste("0", i, sep = "") } else{ ni <- i } - save(run1, file = paste(outPath, paste("Run", ni, sep = ""), sep = "")) - remove(run1) + + if ( save_runs == TRUE) { + run1 <- maFo_rf + save(run1, file = paste(outPath, paste("Run", ni, sep = ""), sep = "")) + remove(run1) + } ###rgdal version issue not_good_workaround <- comment(dummy@crs) comment(dummy@crs) <- "" diff --git a/R-package/man/multi_Class_Sampling.Rd b/R-package/man/multi_Class_Sampling.Rd index 6104675..a8473ad 100644 --- a/R-package/man/multi_Class_Sampling.Rd +++ b/R-package/man/multi_Class_Sampling.Rd @@ -24,6 +24,7 @@ multi_Class_Sampling( multiTest = 1, RGB = c(19, 20, 21), overwrite = TRUE, + save_runs = TRUE, parallel_mode = FALSE, plot_on_browser = TRUE ) @@ -67,6 +68,8 @@ multi_Class_Sampling( \item{overwrite}{overwrite the results file} +\item{save_runs}{if it saves the Habitat object or not (default TRUE)} + \item{parallel_mode}{run loops using all available cores} \item{plot_on_browser}{plot on the browser or inline in a notebook (default TRUE)} @@ -75,7 +78,7 @@ multi_Class_Sampling( 4 files per step: \enumerate{ \item Habitat type probability map as geocoded *.kml layer and *.tif raster files and *.png image output -\item A Habitat object consisting of 7 slots: \cr +\item A Habitat object (only if save_runs is set to TRUE) consisting of 7 slots: \cr run1@models - list of selcted classifiers \cr run1@ref_samples - list of SpatialPointsDataFrames with same length as run1@models holding reference labels \link{1,2} for each selected model \cr run1@switch - vector of lenght run1@models indicating if target class equals 2, if not NA the labels need to be switched \cr -- GitLab From 2546336bf11395542eeaa9488cadce79057baf33 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Tue, 2 Feb 2021 12:36:37 +0100 Subject: [PATCH 33/58] More cleanning. --- R-package/R/outer_procedure.r | 1 + 1 file changed, 1 insertion(+) diff --git a/R-package/R/outer_procedure.r b/R-package/R/outer_procedure.r index 9e29ce1..278b7bf 100644 --- a/R-package/R/outer_procedure.r +++ b/R-package/R/outer_procedure.r @@ -333,6 +333,7 @@ multi_Class_Sampling <- function(in.raster, out.names <<- classNames in.raster <- in.raster * dummy out.raster <<- in.raster + remove(maFo_rf) print(paste(paste("Habitat", i), "Done")) -- GitLab From b2231316c49a13f6a62b886edfbadda8b00f7f80 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Tue, 2 Feb 2021 19:39:50 +0100 Subject: [PATCH 34/58] The user can now specify the max number of cores. This helps us to control the ratio of available cores and main memory. --- R-package/R/inner_procedure.r | 12 ++++++++++-- R-package/R/outer_procedure.r | 11 ++++++++--- R-package/man/multi_Class_Sampling.Rd | 3 +++ R-package/man/sample_nb.Rd | 7 +++++-- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/R-package/R/inner_procedure.r b/R-package/R/inner_procedure.r index c0e1616..5121faa 100644 --- a/R-package/R/inner_procedure.r +++ b/R-package/R/inner_procedure.r @@ -15,7 +15,8 @@ #' @param last only true for one class classifier c("FALSE", TRUE") #' @param seed set seed for reproducable results #' @param init.seed "sample" for new or use run1@seeds to reproduce previous steps -#' @param parallel_mode run loops using all available cores +#' @param parallel_mode run loops in parallel +#' @param max_num_cores maximum number of cores for parallelism #' #' @return a list with 3 elements: #' 1) An index @@ -46,7 +47,8 @@ sample_nb <- function(raster, last, seed, init.seed, - parallel_mode) { + parallel_mode, + max_num_cores) { ### n_channel <- length(names(raster)) ###velox @@ -85,6 +87,12 @@ sample_nb <- function(raster, if (parallel_mode == TRUE) { cores = parallel::detectCores( logical = TRUE) + if (cores > max_num_cores) { + cores <- max_num_cores + } else { + cores <- cores - 1 + } + res <- parallel::mclapply( 1:nb_mean, model_opt_r, diff --git a/R-package/R/outer_procedure.r b/R-package/R/outer_procedure.r index 278b7bf..fdba6a2 100644 --- a/R-package/R/outer_procedure.r +++ b/R-package/R/outer_procedure.r @@ -23,6 +23,7 @@ #' @param overwrite overwrite the results file #' @param save_runs if it saves the Habitat object or not (default TRUE) #' @param parallel_mode run loops using all available cores +#' @param max_num_cores maximum number of cores for parallelism #' @param plot_on_browser plot on the browser or inline in a notebook (default TRUE) #' @@ -87,6 +88,7 @@ multi_Class_Sampling <- function(in.raster, overwrite = TRUE, save_runs = TRUE, parallel_mode = FALSE, + max_num_cores = 5, plot_on_browser = TRUE) { ###first steps: data preparation if (class(reference) == "SpatialPointsDataFrame") { @@ -156,7 +158,8 @@ multi_Class_Sampling <- function(in.raster, last = last, seed = seed, init.seed = init.seed, - parallel_mode = parallel_mode + parallel_mode = parallel_mode, + max_num_cores = max_num_cores ) index <- maFo_rf$index @@ -207,7 +210,8 @@ multi_Class_Sampling <- function(in.raster, last = last, seed = seed, init.seed = init.seed, - parallel_mode = parallel_mode + parallel_mode = parallel_mode, + max_num_cores = max_num_cores ) index <- maFo_rf$index @@ -263,7 +267,8 @@ multi_Class_Sampling <- function(in.raster, last = last, seed = seed, init.seed = init.seed, - parallel_mode = parallel_mode + parallel_mode = parallel_mode, + max_num_cores = max_num_cores ) index <- maFo_rf$index diff --git a/R-package/man/multi_Class_Sampling.Rd b/R-package/man/multi_Class_Sampling.Rd index a8473ad..01078e5 100644 --- a/R-package/man/multi_Class_Sampling.Rd +++ b/R-package/man/multi_Class_Sampling.Rd @@ -26,6 +26,7 @@ multi_Class_Sampling( overwrite = TRUE, save_runs = TRUE, parallel_mode = FALSE, + max_num_cores = 5, plot_on_browser = TRUE ) } @@ -72,6 +73,8 @@ multi_Class_Sampling( \item{parallel_mode}{run loops using all available cores} +\item{max_num_cores}{maximum number of cores for parallelism} + \item{plot_on_browser}{plot on the browser or inline in a notebook (default TRUE)} } \value{ diff --git a/R-package/man/sample_nb.Rd b/R-package/man/sample_nb.Rd index da32d5d..86f3ce2 100644 --- a/R-package/man/sample_nb.Rd +++ b/R-package/man/sample_nb.Rd @@ -18,7 +18,8 @@ sample_nb( last, seed, init.seed, - parallel_mode + parallel_mode, + max_num_cores ) } \arguments{ @@ -46,7 +47,9 @@ sample_nb( \item{init.seed}{"sample" for new or use run1@seeds to reproduce previous steps} -\item{parallel_mode}{run loops using all available cores} +\item{parallel_mode}{run loops in parallel} + +\item{max_num_cores}{maximum number of cores for parallelism} \item{nb_models}{number of models (independent classifiers) to collect} } -- GitLab From b653d2692575b019498ff52bbf537a7c4b665b32 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Tue, 2 Feb 2021 19:58:10 +0100 Subject: [PATCH 35/58] Remove assignment which do not make sense. Drop some more structures before returning to release memory. --- R-package/R/model_opt.r | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/R-package/R/model_opt.r b/R-package/R/model_opt.r index 9439896..ee3e867 100644 --- a/R-package/R/model_opt.r +++ b/R-package/R/model_opt.r @@ -120,10 +120,7 @@ model_opt_r <- function(k, break } } - model_pre <- model1 - pbtn1_pre <- pbtn1 - pbtn2_pre <- pbtn2 - oobe <- oobe + ######################################################################## if (model == "rf") { correct <- @@ -138,8 +135,6 @@ model_opt_r <- function(k, if (length(which_classes_correct) == 0) { if (j == 1) { break - } else{ - pbtn1 <- pbtn1 } } else { d1 <- correct[which_classes_correct] @@ -202,8 +197,6 @@ model_opt_r <- function(k, if (length(which_classes_correct_2) == 0) { if (j == 1) { break - } else{ - pbtn2 <- pbtn2 } } else { d2 <- correct[which_classes_correct_2] @@ -300,6 +293,10 @@ model_opt_r <- function(k, classes <- data$classes pbt <- rbind(pbtn1, pbtn2) } + remove(pbt) + remove(pbt1) + remove(pbt2) + return(list( "k" = k, "models" = models, -- GitLab From e1d9e630695607900a8a14ce56158b078a2f72ed Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 10:15:51 +0100 Subject: [PATCH 36/58] When the user does not need to save the runs, then we should not build a complete Habitat Class object which takes a lot of space in memory. --- R-package/R/inner_procedure.r | 48 +++++++++++++++++++++++------------ R-package/R/outer_procedure.r | 3 +++ R-package/man/sample_nb.Rd | 15 ++++++----- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/R-package/R/inner_procedure.r b/R-package/R/inner_procedure.r index 5121faa..1b2a805 100644 --- a/R-package/R/inner_procedure.r +++ b/R-package/R/inner_procedure.r @@ -15,6 +15,7 @@ #' @param last only true for one class classifier c("FALSE", TRUE") #' @param seed set seed for reproducable results #' @param init.seed "sample" for new or use run1@seeds to reproduce previous steps +#' @param save_runs if the user wants to save the runs, if TRUE the complete Habitat Class object is returned #' @param parallel_mode run loops in parallel #' @param max_num_cores maximum number of cores for parallelism #' @@ -22,13 +23,13 @@ #' 1) An index #' 2) Accuracy vector #' 3) A vector with a Habitat objects, each consisting of 7 slots: \cr -#' run1@models - list of selected classifiers \cr -#' run1@ref_samples - list of SpatialPointsDataFrames with same length as run1@models holding reference labels [1,2] for each selected model \cr -#' run1@switch - vector of length run1@models indicating if target class equals 2, if not NA the labels need to be switched \cr +#' run1@models - list of selected classifiers (only if save_runs is TRUE) \cr +#' run1@ref_samples - list of SpatialPointsDataFrames with same length as run1@models holding reference labels [1,2] for each selected model (only if save_runs is TRUE) \cr +#' run1@switch - vector of length run1@models indicating if target class equals 2, if not NA the labels need to be switched (only if save_runs is TRUE) \cr #' run1@layer - raster map of habitat type probability \cr -#' run1@mod_all - list of all classifiers (equals nb_models) \cr -#' run1@class_ind - vector of predictive distance measure for all habitats \cr -#' run1@seeds - vector of seeds for random sampling \cr +#' run1@mod_all - list of all classifiers (equals nb_models) (only if save_runs is TRUE) \cr +#' run1@class_ind - vector of predictive distance measure for all habitats (only if save_runs is TRUE) \cr +#' run1@seeds - vector of seeds for random sampling (only if save_runs is TRUE) \cr #' all files are saved with step number, the *.tif file is additionally saved with class names #' @keywords internal @@ -47,6 +48,7 @@ sample_nb <- function(raster, last, seed, init.seed, + save_runs, parallel_mode, max_num_cores) { ### @@ -154,6 +156,7 @@ sample_nb <- function(raster, if (length(which_models_null[which_models_null == FALSE]) > 0) { models <- models[which_models_null] } + for (jj in 1:nrow(reference)) { ref <- jj rr = 3 @@ -249,16 +252,29 @@ sample_nb <- function(raster, dummy <- raster::calc(dummy, fun = sum) layer[[1]] <- dummy - obj <- new( - "Habitat", - models = models, - ref_samples = points, - switch = switch, - layer = layer, - mod_all = mod_all, - class_ind = dif, - seeds = seed2 - ) + if (save_runs == TRUE) { + obj <- new( + "Habitat", + models = models, + ref_samples = points, + switch = switch, + layer = layer, + mod_all = mod_all, + class_ind = dif, + seeds = seed2 + ) + } else { + obj <- new( + "Habitat", + models = NULL, + ref_samples = NULL, + switch = NULL, + layer = layer, + mod_all = NULL, + class_ind = NULL, + seeds = NULL + ) + } out <- list(index = index, acc = acc, obj = obj) return(out) } diff --git a/R-package/R/outer_procedure.r b/R-package/R/outer_procedure.r index fdba6a2..22cab20 100644 --- a/R-package/R/outer_procedure.r +++ b/R-package/R/outer_procedure.r @@ -158,6 +158,7 @@ multi_Class_Sampling <- function(in.raster, last = last, seed = seed, init.seed = init.seed, + save_runs = save_runs, parallel_mode = parallel_mode, max_num_cores = max_num_cores ) @@ -210,6 +211,7 @@ multi_Class_Sampling <- function(in.raster, last = last, seed = seed, init.seed = init.seed, + save_runs = save_runs, parallel_mode = parallel_mode, max_num_cores = max_num_cores ) @@ -267,6 +269,7 @@ multi_Class_Sampling <- function(in.raster, last = last, seed = seed, init.seed = init.seed, + save_runs = save_runs, parallel_mode = parallel_mode, max_num_cores = max_num_cores ) diff --git a/R-package/man/sample_nb.Rd b/R-package/man/sample_nb.Rd index 86f3ce2..43c7a80 100644 --- a/R-package/man/sample_nb.Rd +++ b/R-package/man/sample_nb.Rd @@ -18,6 +18,7 @@ sample_nb( last, seed, init.seed, + save_runs, parallel_mode, max_num_cores ) @@ -47,6 +48,8 @@ sample_nb( \item{init.seed}{"sample" for new or use run1@seeds to reproduce previous steps} +\item{save_runs}{if the user wants to save the runs, if TRUE the complete Habitat Class object is returned} + \item{parallel_mode}{run loops in parallel} \item{max_num_cores}{maximum number of cores for parallelism} @@ -59,13 +62,13 @@ a list with 3 elements: \item An index \item Accuracy vector \item A vector with a Habitat objects, each consisting of 7 slots: \cr -run1@models - list of selected classifiers \cr -run1@ref_samples - list of SpatialPointsDataFrames with same length as run1@models holding reference labels \link{1,2} for each selected model \cr -run1@switch - vector of length run1@models indicating if target class equals 2, if not NA the labels need to be switched \cr +run1@models - list of selected classifiers (only if save_runs is TRUE) \cr +run1@ref_samples - list of SpatialPointsDataFrames with same length as run1@models holding reference labels \link{1,2} for each selected model (only if save_runs is TRUE) \cr +run1@switch - vector of length run1@models indicating if target class equals 2, if not NA the labels need to be switched (only if save_runs is TRUE) \cr run1@layer - raster map of habitat type probability \cr -run1@mod_all - list of all classifiers (equals nb_models) \cr -run1@class_ind - vector of predictive distance measure for all habitats \cr -run1@seeds - vector of seeds for random sampling \cr +run1@mod_all - list of all classifiers (equals nb_models) (only if save_runs is TRUE) \cr +run1@class_ind - vector of predictive distance measure for all habitats (only if save_runs is TRUE) \cr +run1@seeds - vector of seeds for random sampling (only if save_runs is TRUE) \cr all files are saved with step number, the *.tif file is additionally saved with class names } } -- GitLab From b85fec99fe9d2fb848abdef74dd1339599eb2cfb Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 10:37:48 +0100 Subject: [PATCH 37/58] Different initialization --- R-package/R/inner_procedure.r | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/R-package/R/inner_procedure.r b/R-package/R/inner_procedure.r index 1b2a805..bbf442f 100644 --- a/R-package/R/inner_procedure.r +++ b/R-package/R/inner_procedure.r @@ -266,13 +266,13 @@ sample_nb <- function(raster, } else { obj <- new( "Habitat", - models = NULL, - ref_samples = NULL, - switch = NULL, + models = list(), + ref_samples = list(), + switch = vector(), layer = layer, - mod_all = NULL, - class_ind = NULL, - seeds = NULL + mod_all = list(), + class_ind = 0, + seeds = 0 ) } out <- list(index = index, acc = acc, obj = obj) -- GitLab From 61bb25b668874d7668e9c817f224d767fa97185f Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 11:05:47 +0100 Subject: [PATCH 38/58] Avoid re-assignments to the same variable name so we can delete the content and help the garbage collector to clean memory. --- R-package/R/inner_procedure.r | 36 +++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/R-package/R/inner_procedure.r b/R-package/R/inner_procedure.r index bbf442f..04a0e68 100644 --- a/R-package/R/inner_procedure.r +++ b/R-package/R/inner_procedure.r @@ -78,8 +78,8 @@ sample_nb <- function(raster, seed2 <- init.seed } oobe <- matrix(NA, nrow = n, ncol = nb_mean) - models <- list() - points <- list() + models_list <- list() + points_list <- list() dif <- matrix(NA, nrow = nb_mean, ncol = nrow(reference)) channel <- matrix(NA, nrow = nb_mean, ncol = nrow(reference)) switch <- matrix(NA, nrow = nb_mean, ncol = nrow(reference)) @@ -116,8 +116,8 @@ sample_nb <- function(raster, mc.cores = cores ) for (k in 1:nb_mean) { - points[[k]] <- res[["k" = k]][["points"]] - models[[k]] <- res[["k" = k]][["models"]] + points_list[[k]] <- res[["k" = k]][["points"]] + models_list[[k]] <- res[["k" = k]][["models"]] oobe[, k] <- res[["k" = k]][["oobe"]][, 1] } } else { @@ -140,21 +140,22 @@ sample_nb <- function(raster, ras_vx = ras.vx, max_samples_per_class = max_samples_per_class ) - points[[k]] <- res$points - models[[k]] <- res$models + points_list[[k]] <- res$points + models_list[[k]] <- res$models oobe[, k] <- res$oobe[, 1] setTxtProgressBar(pb, k) } } #which_models_null <- which(models == "NULL") - which_models_null <- vapply(models, is.not.null <- function(x){!is.null(x)}, FALSE) - if (length(models) == 0 | - length(which_models_null[which_models_null == FALSE]) == length(models)) { + which_models_null <- vapply(models_list, is.not.null <- function(x){!is.null(x)}, FALSE) + if (length(models_list) == 0 | + length(which_models_null[which_models_null == FALSE]) == length(models_list)) { stop("No Models - would you be so kind to increase init.samples, please") } if (length(which_models_null[which_models_null == FALSE]) > 0) { - models <- models[which_models_null] + models <- models_list[which_models_null] + remove(models_list) } for (jj in 1:nrow(reference)) { @@ -215,11 +216,14 @@ sample_nb <- function(raster, } close(pb) - mod_all <- models + if (save_runs == TRUE) { + mod_all <- models + } models <- models[ch] print(paste("n_models =", length(models))) switch <- switch[ch, index] - points <- points[ch] + points <- points_list[ch] + remove(points_list) dif <- dif[2,] ############################################################################## ###Vohersage @@ -275,6 +279,14 @@ sample_nb <- function(raster, seeds = 0 ) } + remove(models) + remove(points) + remove(switch) + remove(layer) + remove(mod_all) + remove(diff) + remove(seed2) + out <- list(index = index, acc = acc, obj = obj) return(out) } -- GitLab From 6cd306ade79908e7a4c7df7e41b1fee180d37401 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 13:50:01 +0100 Subject: [PATCH 39/58] Order the variables, only save into memory current status if the user wants to save the runs. Call garbage collector after each run. --- R-package/R/outer_procedure.r | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/R-package/R/outer_procedure.r b/R-package/R/outer_procedure.r index 22cab20..6c6f585 100644 --- a/R-package/R/outer_procedure.r +++ b/R-package/R/outer_procedure.r @@ -335,12 +335,15 @@ multi_Class_Sampling <- function(in.raster, dummy <- maFo_rf@layer[[1]] dummy[dummy < thres] <- 1 dummy[dummy >= thres] <- NA + in.raster <- in.raster * dummy reference <- reference[-index,] - out.reference <<- reference classNames <- classNames[-index] - out.names <<- classNames - in.raster <- in.raster * dummy - out.raster <<- in.raster + if (save_runs) { + out.reference <<- reference + out.names <<- classNames + out.raster <<- in.raster + } + remove(dummy) remove(maFo_rf) print(paste(paste("Habitat", i), "Done")) @@ -359,6 +362,8 @@ multi_Class_Sampling <- function(in.raster, paste("threshold_step_", ni, sep = ""), sep = "")) } + # Release memory + gc() if (i == r) { print("Congratulation - you finally made it towards the last habitat") -- GitLab From ec1e8e932fba1222c367770b6fa02b08fe162e18 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 13:51:05 +0100 Subject: [PATCH 40/58] No need to remove them, in most of the cases they are not initialized. --- R-package/R/model_opt.r | 2 -- 1 file changed, 2 deletions(-) diff --git a/R-package/R/model_opt.r b/R-package/R/model_opt.r index ee3e867..c9c674d 100644 --- a/R-package/R/model_opt.r +++ b/R-package/R/model_opt.r @@ -294,8 +294,6 @@ model_opt_r <- function(k, pbt <- rbind(pbtn1, pbtn2) } remove(pbt) - remove(pbt1) - remove(pbt2) return(list( "k" = k, -- GitLab From 827798ea9423c85eae9b85dd00fe2fb508412aa2 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 13:52:45 +0100 Subject: [PATCH 41/58] Models needs to be initialized since now we use models_list. Remove more variables and call garbage collector. --- R-package/R/inner_procedure.r | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/R-package/R/inner_procedure.r b/R-package/R/inner_procedure.r index 04a0e68..649ce2c 100644 --- a/R-package/R/inner_procedure.r +++ b/R-package/R/inner_procedure.r @@ -119,6 +119,7 @@ sample_nb <- function(raster, points_list[[k]] <- res[["k" = k]][["points"]] models_list[[k]] <- res[["k" = k]][["models"]] oobe[, k] <- res[["k" = k]][["oobe"]][, 1] + remove(res) } } else { for (k in 1:nb_mean) { @@ -143,6 +144,7 @@ sample_nb <- function(raster, points_list[[k]] <- res$points models_list[[k]] <- res$models oobe[, k] <- res$oobe[, 1] + remove(res) setTxtProgressBar(pb, k) } } @@ -151,12 +153,17 @@ sample_nb <- function(raster, which_models_null <- vapply(models_list, is.not.null <- function(x){!is.null(x)}, FALSE) if (length(models_list) == 0 | length(which_models_null[which_models_null == FALSE]) == length(models_list)) { + remove(points_list) + remove(models_list) + remove(ooe) stop("No Models - would you be so kind to increase init.samples, please") } if (length(which_models_null[which_models_null == FALSE]) > 0) { models <- models_list[which_models_null] - remove(models_list) + } else { + models <- models_list } + remove(models_list) for (jj in 1:nrow(reference)) { ref <- jj @@ -218,6 +225,8 @@ sample_nb <- function(raster, if (save_runs == TRUE) { mod_all <- models + } else { + mod_all = list() } models <- models[ch] print(paste("n_models =", length(models))) @@ -284,8 +293,9 @@ sample_nb <- function(raster, remove(switch) remove(layer) remove(mod_all) - remove(diff) + remove(dif) remove(seed2) + gc() out <- list(index = index, acc = acc, obj = obj) return(out) -- GitLab From bb5b7d9e11d21bef789032ae81a503e1eb2389a1 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 14:16:10 +0100 Subject: [PATCH 42/58] We can't remove it otherwise we have object of type closure is not subsettable when running in parallel. --- R-package/R/inner_procedure.r | 2 -- 1 file changed, 2 deletions(-) diff --git a/R-package/R/inner_procedure.r b/R-package/R/inner_procedure.r index 649ce2c..3b226fa 100644 --- a/R-package/R/inner_procedure.r +++ b/R-package/R/inner_procedure.r @@ -119,7 +119,6 @@ sample_nb <- function(raster, points_list[[k]] <- res[["k" = k]][["points"]] models_list[[k]] <- res[["k" = k]][["models"]] oobe[, k] <- res[["k" = k]][["oobe"]][, 1] - remove(res) } } else { for (k in 1:nb_mean) { @@ -144,7 +143,6 @@ sample_nb <- function(raster, points_list[[k]] <- res$points models_list[[k]] <- res$models oobe[, k] <- res$oobe[, 1] - remove(res) setTxtProgressBar(pb, k) } } -- GitLab From c8464386de57a5447b904b238ae006ab0e6e1dce Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 15:14:13 +0100 Subject: [PATCH 43/58] Garbage collector when finishing a job. Clean on the way out. --- R-package/R/inner_procedure.r | 4 +++- R-package/R/model_opt.r | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/R-package/R/inner_procedure.r b/R-package/R/inner_procedure.r index 3b226fa..bfc9238 100644 --- a/R-package/R/inner_procedure.r +++ b/R-package/R/inner_procedure.r @@ -113,7 +113,9 @@ sample_nb <- function(raster, pbtn2 = pbtn2, ras_vx = ras.vx, max_samples_per_class = max_samples_per_class, - mc.cores = cores + mc.cores = cores, + mc.preschedule = TRUE, + mc.cleanup = TRUE ) for (k in 1:nb_mean) { points_list[[k]] <- res[["k" = k]][["points"]] diff --git a/R-package/R/model_opt.r b/R-package/R/model_opt.r index c9c674d..a10c38d 100644 --- a/R-package/R/model_opt.r +++ b/R-package/R/model_opt.r @@ -294,6 +294,7 @@ model_opt_r <- function(k, pbt <- rbind(pbtn1, pbtn2) } remove(pbt) + gc() return(list( "k" = k, -- GitLab From 8ce8abea0b8a56283ff96bc5842b355d2047a48e Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 18:16:26 +0100 Subject: [PATCH 44/58] Do not do garbage collection here. --- R-package/R/model_opt.r | 1 - 1 file changed, 1 deletion(-) diff --git a/R-package/R/model_opt.r b/R-package/R/model_opt.r index a10c38d..c9c674d 100644 --- a/R-package/R/model_opt.r +++ b/R-package/R/model_opt.r @@ -294,7 +294,6 @@ model_opt_r <- function(k, pbt <- rbind(pbtn1, pbtn2) } remove(pbt) - gc() return(list( "k" = k, -- GitLab From 7b7702a7cb2f409518ac8a960288696a81d169d3 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 18:17:15 +0100 Subject: [PATCH 45/58] Full collection --- R-package/R/inner_procedure.r | 2 +- R-package/R/outer_procedure.r | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R-package/R/inner_procedure.r b/R-package/R/inner_procedure.r index bfc9238..8baadfc 100644 --- a/R-package/R/inner_procedure.r +++ b/R-package/R/inner_procedure.r @@ -295,7 +295,7 @@ sample_nb <- function(raster, remove(mod_all) remove(dif) remove(seed2) - gc() + gc(full = TRUE) out <- list(index = index, acc = acc, obj = obj) return(out) diff --git a/R-package/R/outer_procedure.r b/R-package/R/outer_procedure.r index 6c6f585..d9fc7c9 100644 --- a/R-package/R/outer_procedure.r +++ b/R-package/R/outer_procedure.r @@ -363,7 +363,7 @@ multi_Class_Sampling <- function(in.raster, sep = "")) } # Release memory - gc() + gc(full = TRUE) if (i == r) { print("Congratulation - you finally made it towards the last habitat") -- GitLab From bc05dd466391e43b22a52d8c3cca786577b256b1 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 21:40:29 +0100 Subject: [PATCH 46/58] Latest version --- demo/HabitatSamplerDocker.ipynb | 647 ++++++++++++++++++++++++++++++-- 1 file changed, 621 insertions(+), 26 deletions(-) diff --git a/demo/HabitatSamplerDocker.ipynb b/demo/HabitatSamplerDocker.ipynb index cbb7ee3..0feb6b1 100644 --- a/demo/HabitatSamplerDocker.ipynb +++ b/demo/HabitatSamplerDocker.ipynb @@ -25,25 +25,19 @@ "name": "stderr", "output_type": "stream", "text": [ - "Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 7.0.0\n", + "Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1\n", "\n", - "WARNING: different compile-time and runtime versions for GEOS found:\n", + "rgdal: version: 1.5-12, (SVN revision 1018)\n", + "Geospatial Data Abstraction Library extensions to R successfully loaded\n", + "Loaded GDAL runtime: GDAL 3.0.4, released 2020/01/28\n", + "Path to GDAL shared files: /usr/share/gdal\n", + "GDAL binary built with GEOS: TRUE \n", + "Loaded PROJ runtime: Rel. 6.3.1, February 10th, 2020, [PJ_VERSION: 631]\n", + "Path to PROJ shared files: /usr/share/proj\n", + "Linking to sp version:1.4-4\n", + "To mute warnings of possible GDAL/OSR exportToProj4() degradation,\n", + "use options(\"rgdal_show_exportToProj4_warnings\"=\"none\") before loading rgdal.\n", "\n", - "Linked against: 3.8.0-CAPI-1.13.1 compiled against: 3.7.0-CAPI-1.11.0\n", - "\n", - "It is probably a good idea to reinstall sf, and maybe rgeos and rgdal too\n", - "\n", - "rgdal: version: 1.4-8, (SVN revision 845)\n", - " Geospatial Data Abstraction Library extensions to R successfully loaded\n", - " Loaded GDAL runtime: GDAL 3.0.4, released 2020/01/28\n", - " Path to GDAL shared files: \n", - " GDAL binary built with GEOS: FALSE \n", - " Loaded PROJ.4 runtime: Rel. 7.0.0, March 1st, 2020, [PJ_VERSION: 700]\n", - " Path to PROJ.4 shared files: /home/romulo/gitlab/python-setup-ubuntu/python/opt/share/proj\n", - " Linking to sp version: 1.4-1 \n", - "\n", - "Warning message:\n", - "“no function found corresponding to methods exports from ‘raster’ for: ‘wkt’”\n", "Checking rgeos availability: TRUE\n", "\n", "\n", @@ -79,12 +73,9 @@ "\n", "Loading required package: usethis\n", "\n", - "Warning message in fun(libname, pkgname):\n", - "“rgeos: versions of GEOS runtime 3.8.0-CAPI-1.13.1\n", - "and GEOS at installation 3.7.0-CAPI-1.11.0differ”\n", "rgeos version: 0.5-5, (SVN revision 640)\n", " GEOS runtime version: 3.8.0-CAPI-1.13.1 \n", - " Linking to sp version: 1.4-5 \n", + " Linking to sp version: 1.4-4 \n", " Polygon checking: TRUE \n", "\n", "\n", @@ -1076,7 +1067,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -1084,9 +1075,604 @@ "output_type": "stream", "text": [ "[1] \"init.samples = 50 models = 200\"\n", - "[1] \"class=2 difference=0.64\"\n", + " |======================================================================| 100%[1] \"class=2 difference=0.68\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 18\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 10\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 1 Done\"\n", + "[1] \"init.samples = 100 models = 215\"\n", + " |======================================================================| 100%[1] \"class=3 difference=0.88\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 24\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 13\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 2 Done\"\n", + "[1] \"init.samples = 150 models = 230\"\n", + " |======================================================================| 100%[1] \"class=2 difference=0.92\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 42\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 23\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 3 Done\"\n", + "[1] \"init.samples = 200 models = 245\"\n", + " |======================================================================| 100%[1] \"class=2 difference=0.96\"\n", "\n" ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 85\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 45\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n", + "[1] 24\n", + "[1] 25\n", + "[1] 26\n", + "[1] 27\n", + "[1] 28\n", + "[1] 29\n", + "[1] 30\n", + "[1] 31\n", + "[1] 32\n", + "[1] 33\n", + "[1] 34\n", + "[1] 35\n", + "[1] 36\n", + "[1] 37\n", + "[1] 38\n", + "[1] 39\n", + "[1] 40\n", + "[1] 41\n", + "[1] 42\n", + "[1] 43\n", + "[1] 44\n", + "[1] 45\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 4 Done\"\n", + "[1] \"init.samples = 250 models = 260\"\n", + " |======================================================================| 100%[1] \"class=1 difference=0.96\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 160\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 89\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n", + "[1] 24\n", + "[1] 25\n", + "[1] 26\n", + "[1] 27\n", + "[1] 28\n", + "[1] 29\n", + "[1] 30\n", + "[1] 31\n", + "[1] 32\n", + "[1] 33\n", + "[1] 34\n", + "[1] 35\n", + "[1] 36\n", + "[1] 37\n", + "[1] 38\n", + "[1] 39\n", + "[1] 40\n", + "[1] 41\n", + "[1] 42\n", + "[1] 43\n", + "[1] 44\n", + "[1] 45\n", + "[1] 46\n", + "[1] 47\n", + "[1] 48\n", + "[1] 49\n", + "[1] 50\n", + "[1] 51\n", + "[1] 52\n", + "[1] 53\n", + "[1] 54\n", + "[1] 55\n", + "[1] 56\n", + "[1] 57\n", + "[1] 58\n", + "[1] 59\n", + "[1] 60\n", + "[1] 61\n", + "[1] 62\n", + "[1] 63\n", + "[1] 64\n", + "[1] 65\n", + "[1] 66\n", + "[1] 67\n", + "[1] 68\n", + "[1] 69\n", + "[1] 70\n", + "[1] 71\n", + "[1] 72\n", + "[1] 73\n", + "[1] 74\n", + "[1] 75\n", + "[1] 76\n", + "[1] 77\n", + "[1] 78\n", + "[1] 79\n", + "[1] 80\n", + "[1] 81\n", + "[1] 82\n", + "[1] 83\n", + "[1] 84\n", + "[1] 85\n", + "[1] 86\n", + "[1] 87\n", + "[1] 88\n", + "[1] 89\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 5 Done\"\n", + "[1] \"init.samples = 300 models = 275\"\n", + " |======================================================================| 100%[1] \"class=1 difference=1\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 170\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 99\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n", + "[1] 24\n", + "[1] 25\n", + "[1] 26\n", + "[1] 27\n", + "[1] 28\n", + "[1] 29\n", + "[1] 30\n", + "[1] 31\n", + "[1] 32\n", + "[1] 33\n", + "[1] 34\n", + "[1] 35\n", + "[1] 36\n", + "[1] 37\n", + "[1] 38\n", + "[1] 39\n", + "[1] 40\n", + "[1] 41\n", + "[1] 42\n", + "[1] 43\n", + "[1] 44\n", + "[1] 45\n", + "[1] 46\n", + "[1] 47\n", + "[1] 48\n", + "[1] 49\n", + "[1] 50\n", + "[1] 51\n", + "[1] 52\n", + "[1] 53\n", + "[1] 54\n", + "[1] 55\n", + "[1] 56\n", + "[1] 57\n", + "[1] 58\n", + "[1] 59\n", + "[1] 60\n", + "[1] 61\n", + "[1] 62\n", + "[1] 63\n", + "[1] 64\n", + "[1] 65\n", + "[1] 66\n", + "[1] 67\n", + "[1] 68\n", + "[1] 69\n", + "[1] 70\n", + "[1] 71\n", + "[1] 72\n", + "[1] 73\n", + "[1] 74\n", + "[1] 75\n", + "[1] 76\n", + "[1] 77\n", + "[1] 78\n", + "[1] 79\n", + "[1] 80\n", + "[1] 81\n", + "[1] 82\n", + "[1] 83\n", + "[1] 84\n", + "[1] 85\n", + "[1] 86\n", + "[1] 87\n", + "[1] 88\n", + "[1] 89\n", + "[1] 90\n", + "[1] 91\n", + "[1] 92\n", + "[1] 93\n", + "[1] 94\n", + "[1] 95\n", + "[1] 96\n", + "[1] 97\n", + "[1] 98\n", + "[1] 99\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Adjust init.samples/nb.models or auto [../.. or 0]: 0\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"Habitat 6 Done\"\n", + "[1] \"init.samples = 350 models = 290\"\n", + " |======================================================================| 100%[1] \"class=1 difference=0.92\"\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Threshold for Habitat Extraction or Sample Again [../0]: 95\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1] \"n_models = 51\"\n", + "[1] 1\n", + "[1] 2\n", + "[1] 3\n", + "[1] 4\n", + "[1] 5\n", + "[1] 6\n", + "[1] 7\n", + "[1] 8\n", + "[1] 9\n", + "[1] 10\n", + "[1] 11\n", + "[1] 12\n", + "[1] 13\n", + "[1] 14\n", + "[1] 15\n", + "[1] 16\n", + "[1] 17\n", + "[1] 18\n", + "[1] 19\n", + "[1] 20\n", + "[1] 21\n", + "[1] 22\n", + "[1] 23\n", + "[1] 24\n", + "[1] 25\n", + "[1] 26\n", + "[1] 27\n", + "[1] 28\n", + "[1] 29\n", + "[1] 30\n", + "[1] 31\n", + "[1] 32\n", + "[1] 33\n", + "[1] 34\n", + "[1] 35\n", + "[1] 36\n", + "[1] 37\n", + "[1] 38\n", + "[1] 39\n", + "[1] 40\n", + "[1] 41\n", + "[1] 42\n", + "[1] 43\n", + "[1] 44\n", + "[1] 45\n", + "[1] 46\n", + "[1] 47\n", + "[1] 48\n", + "[1] 49\n", + "[1] 50\n", + "[1] 51\n", + "[1] \"Habitat 7 Done\"\n", + "[1] \"Congratulation - you finally made it towards the last habitat\"\n" + ] } ], "source": [ @@ -1109,8 +1695,10 @@ " n_classes = 7,\n", " multiTest = 1,\n", " RGB = c(19,20,21),\n", - " overwrite=TRUE,\n", - " parallel_mode=TRUE,\n", + " overwrite = TRUE,\n", + " parallel_mode = FALSE,\n", + " max_num_cores = 4,\n", + " save_runs = FALSE,\n", " plot_on_browser = FALSE)" ] }, @@ -1129,6 +1717,13 @@ "source": [ "plot_results(inPath=outPath)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -1143,7 +1738,7 @@ "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", - "version": "3.6.3" + "version": "4.0.3" } }, "nbformat": 4, -- GitLab From 7fc143da3771bdc9eb5bb128298d8cebb91167e3 Mon Sep 17 00:00:00 2001 From: Romulo Goncalves Date: Wed, 3 Feb 2021 21:42:33 +0100 Subject: [PATCH 47/58] Use the master branch. --- demo/HabitatSampler.ipynb | 480 +++++++++++++++++--------------------- 1 file changed, 218 insertions(+), 262 deletions(-) diff --git a/demo/HabitatSampler.ipynb b/demo/HabitatSampler.ipynb index 30ec057..df023cf 100644 --- a/demo/HabitatSampler.ipynb +++ b/demo/HabitatSampler.ipynb @@ -27,31 +27,23 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Installing package into ‘/home/romulo/R/x86_64-pc-linux-gnu-library/3.6’\n", - "(as ‘lib’ is unspecified)\n", - "\n", - "Installing package into ‘/home/romulo/R/x86_64-pc-linux-gnu-library/3.6’\n", - "(as ‘lib’ is unspecified)\n", - "\n", - "Installing package into ‘/home/romulo/R/x86_64-pc-linux-gnu-library/3.6’\n", - "(as ‘lib’ is unspecified)\n", - "\n", - "Installing package into ‘/home/romulo/R/x86_64-pc-linux-gnu-library/3.6’\n", - "(as ‘lib’ is unspecified)\n", - "\n" - ] - } - ], + "outputs": [], "source": [ - "install.packages(\"https://cran.r-project.org/src/contrib/Archive/BH/BH_1.69.0-1.tar.gz\", repos=NULL, type=\"source\")\n", - "install.packages(\"https://cran.r-project.org/src/contrib/Archive/sf/sf_0.8-1.tar.gz\", repos=NULL, type=\"source\")\n", - "install.packages(\"https://cran.r-project.org/src/contrib/Archive/sp/sp_1.4-1.tar.gz\", repos=NULL, type=\"source\")\n", - "install.packages(\"https://cran.r-project.org/src/contrib/Archive/rgdal/rgdal_1.4-8.tar.gz\", repos=NULL, type=\"source\") " + "install_dependencies <- FALSE" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "if (install_dependencies == TRUE) {\n", + " install.packages(\"https://cran.r-project.org/src/contrib/Archive/BH/BH_1.69.0-1.tar.gz\", repos=NULL, type=\"source\")\n", + " install.packages(\"https://cran.r-project.org/src/contrib/Archive/sf/sf_0.8-1.tar.gz\", repos=NULL, type=\"source\")\n", + " install.packages(\"https://cran.r-project.org/src/contrib/Archive/sp/sp_1.4-1.tar.gz\", repos=NULL, type=\"source\")\n", + " install.packages(\"https://cran.r-project.org/src/contrib/Archive/rgdal/rgdal_1.4-8.tar.gz\", repos=NULL, type=\"source\") \n", + "}" ] }, { @@ -65,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -74,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -91,7 +83,7 @@ "} else { \n", " remotes::install_git(\n", " \"https://git.gfz-potsdam.de/habitat-sampler/HabitatSampler.git\",\n", - " ref = \"performance\",\n", + " ref = \"master\",\n", " subdir = \"R-package\",\n", " dependencies = NA,\n", " upgrade=FALSE,\n", @@ -113,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -798,7 +790,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -831,7 +823,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -858,7 +850,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -876,7 +868,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -914,7 +906,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -933,7 +925,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -968,7 +960,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -985,13 +977,22 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "classNames<-c(\"deciduous\",\"coniferous\",\"heather_young\",\"heather_old\",\"heather_shrub\",\"bare_ground\",\"xeric_grass\")" ] }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "library(profvis)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1001,15 +1002,15 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[1] \"init.samples = 50 models = 200\"\n", - "[1] \"class=4 difference=0.76\"\n", + "[1] \"init.samples = 75 models = 220\"\n", + "[1] \"class=5 difference=0.8\"\n", "\n" ] }, @@ -1026,14 +1027,14 @@ "name": "stdin", "output_type": "stream", "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 24\n" + "Threshold for Habitat Extraction or Sample Again [../0]: 15\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "[1] \"n_models = 13\"\n", + "[1] \"n_models = 8\"\n", "[1] 1\n", "[1] 2\n", "[1] 3\n", @@ -1041,12 +1042,7 @@ "[1] 5\n", "[1] 6\n", "[1] 7\n", - "[1] 8\n", - "[1] 9\n", - "[1] 10\n", - "[1] 11\n", - "[1] 12\n", - "[1] 13\n" + "[1] 8\n" ] }, { @@ -1061,9 +1057,8 @@ "output_type": "stream", "text": [ "[1] \"Habitat 1 Done\"\n", - "[1] \"Classification took 11.735330\"\n", - "[1] \"init.samples = 100 models = 215\"\n", - "[1] \"class=4 difference=0.84\"\n", + "[1] \"init.samples = 125 models = 235\"\n", + "[1] \"class=4 difference=0.88\"\n", "\n" ] }, @@ -1080,14 +1075,14 @@ "name": "stdin", "output_type": "stream", "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 40\n" + "Threshold for Habitat Extraction or Sample Again [../0]: 24\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "[1] \"n_models = 23\"\n", + "[1] \"n_models = 13\"\n", "[1] 1\n", "[1] 2\n", "[1] 3\n", @@ -1100,17 +1095,7 @@ "[1] 10\n", "[1] 11\n", "[1] 12\n", - "[1] 13\n", - "[1] 14\n", - "[1] 15\n", - "[1] 16\n", - "[1] 17\n", - "[1] 18\n", - "[1] 19\n", - "[1] 20\n", - "[1] 21\n", - "[1] 22\n", - "[1] 23\n" + "[1] 13\n" ] }, { @@ -1125,9 +1110,8 @@ "output_type": "stream", "text": [ "[1] \"Habitat 2 Done\"\n", - "[1] \"Classification took 73.487621\"\n", - "[1] \"init.samples = 150 models = 230\"\n", - "[1] \"class=4 difference=0.92\"\n", + "[1] \"init.samples = 175 models = 250\"\n", + "[1] \"class=3 difference=0.84\"\n", "\n" ] }, @@ -1144,14 +1128,14 @@ "name": "stdin", "output_type": "stream", "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 42\n" + "Threshold for Habitat Extraction or Sample Again [../0]: 40\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "[1] \"n_models = 24\"\n", + "[1] \"n_models = 22\"\n", "[1] 1\n", "[1] 2\n", "[1] 3\n", @@ -1173,9 +1157,7 @@ "[1] 19\n", "[1] 20\n", "[1] 21\n", - "[1] 22\n", - "[1] 23\n", - "[1] 24\n" + "[1] 22\n" ] }, { @@ -1190,9 +1172,8 @@ "output_type": "stream", "text": [ "[1] \"Habitat 3 Done\"\n", - "[1] \"Classification took 74.542457\"\n", - "[1] \"init.samples = 200 models = 245\"\n", - "[1] \"class=3 difference=0.96\"\n", + "[1] \"init.samples = 225 models = 265\"\n", + "[1] \"class=3 difference=0.92\"\n", "\n" ] }, @@ -1209,14 +1190,14 @@ "name": "stdin", "output_type": "stream", "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 85\n" + "Threshold for Habitat Extraction or Sample Again [../0]: 55\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "[1] \"n_models = 46\"\n", + "[1] \"n_models = 30\"\n", "[1] 1\n", "[1] 2\n", "[1] 3\n", @@ -1246,23 +1227,7 @@ "[1] 27\n", "[1] 28\n", "[1] 29\n", - "[1] 30\n", - "[1] 31\n", - "[1] 32\n", - "[1] 33\n", - "[1] 34\n", - "[1] 35\n", - "[1] 36\n", - "[1] 37\n", - "[1] 38\n", - "[1] 39\n", - "[1] 40\n", - "[1] 41\n", - "[1] 42\n", - "[1] 43\n", - "[1] 44\n", - "[1] 45\n", - "[1] 46\n" + "[1] 30\n" ] }, { @@ -1277,9 +1242,8 @@ "output_type": "stream", "text": [ "[1] \"Habitat 4 Done\"\n", - "[1] \"Classification took 65.365530\"\n", - "[1] \"init.samples = 250 models = 260\"\n", - "[1] \"class=3 difference=0.96\"\n", + "[1] \"init.samples = 275 models = 280\"\n", + "[1] \"class=2 difference=0.96\"\n", "\n" ] }, @@ -1296,14 +1260,14 @@ "name": "stdin", "output_type": "stream", "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 155\n" + "Threshold for Habitat Extraction or Sample Again [../0]: 85\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "[1] \"n_models = 83\"\n", + "[1] \"n_models = 47\"\n", "[1] 1\n", "[1] 2\n", "[1] 3\n", @@ -1350,43 +1314,7 @@ "[1] 44\n", "[1] 45\n", "[1] 46\n", - "[1] 47\n", - "[1] 48\n", - "[1] 49\n", - "[1] 50\n", - "[1] 51\n", - "[1] 52\n", - "[1] 53\n", - "[1] 54\n", - "[1] 55\n", - "[1] 56\n", - "[1] 57\n", - "[1] 58\n", - "[1] 59\n", - "[1] 60\n", - "[1] 61\n", - "[1] 62\n", - "[1] 63\n", - "[1] 64\n", - "[1] 65\n", - "[1] 66\n", - "[1] 67\n", - "[1] 68\n", - "[1] 69\n", - "[1] 70\n", - "[1] 71\n", - "[1] 72\n", - "[1] 73\n", - "[1] 74\n", - "[1] 75\n", - "[1] 76\n", - "[1] 77\n", - "[1] 78\n", - "[1] 79\n", - "[1] 80\n", - "[1] 81\n", - "[1] 82\n", - "[1] 83\n" + "[1] 47\n" ] }, { @@ -1401,8 +1329,7 @@ "output_type": "stream", "text": [ "[1] \"Habitat 5 Done\"\n", - "[1] \"Classification took 62.097358\"\n", - "[1] \"init.samples = 300 models = 275\"\n", + "[1] \"init.samples = 325 models = 295\"\n", "[1] \"class=1 difference=1\"\n", "\n" ] @@ -1420,14 +1347,14 @@ "name": "stdin", "output_type": "stream", "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 190\n" + "Threshold for Habitat Extraction or Sample Again [../0]: 270\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "[1] \"n_models = 103\"\n", + "[1] \"n_models = 144\"\n", "[1] 1\n", "[1] 2\n", "[1] 3\n", @@ -1530,7 +1457,48 @@ "[1] 100\n", "[1] 101\n", "[1] 102\n", - "[1] 103\n" + "[1] 103\n", + "[1] 104\n", + "[1] 105\n", + "[1] 106\n", + "[1] 107\n", + "[1] 108\n", + "[1] 109\n", + "[1] 110\n", + "[1] 111\n", + "[1] 112\n", + "[1] 113\n", + "[1] 114\n", + "[1] 115\n", + "[1] 116\n", + "[1] 117\n", + "[1] 118\n", + "[1] 119\n", + "[1] 120\n", + "[1] 121\n", + "[1] 122\n", + "[1] 123\n", + "[1] 124\n", + "[1] 125\n", + "[1] 126\n", + "[1] 127\n", + "[1] 128\n", + "[1] 129\n", + "[1] 130\n", + "[1] 131\n", + "[1] 132\n", + "[1] 133\n", + "[1] 134\n", + "[1] 135\n", + "[1] 136\n", + "[1] 137\n", + "[1] 138\n", + "[1] 139\n", + "[1] 140\n", + "[1] 141\n", + "[1] 142\n", + "[1] 143\n", + "[1] 144\n" ] }, { @@ -1545,9 +1513,8 @@ "output_type": "stream", "text": [ "[1] \"Habitat 6 Done\"\n", - "[1] \"Classification took 61.119719\"\n", - "[1] \"init.samples = 350 models = 290\"\n", - "[1] \"class=1 difference=0.96\"\n", + "[1] \"init.samples = 375 models = 310\"\n", + "[1] \"class=1 difference=0.92\"\n", "\n" ] }, @@ -1564,14 +1531,14 @@ "name": "stdin", "output_type": "stream", "text": [ - "Threshold for Habitat Extraction or Sample Again [../0]: 280\n" + "Threshold for Habitat Extraction or Sample Again [../0]: 72\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "[1] \"n_models = 149\"\n", + "[1] \"n_models = 39\"\n", "[1] 1\n", "[1] 2\n", "[1] 3\n", @@ -1611,127 +1578,17 @@ "[1] 37\n", "[1] 38\n", "[1] 39\n", - "[1] 40\n", - "[1] 41\n", - "[1] 42\n", - "[1] 43\n", - "[1] 44\n", - "[1] 45\n", - "[1] 46\n", - "[1] 47\n", - "[1] 48\n", - "[1] 49\n", - "[1] 50\n", - "[1] 51\n", - "[1] 52\n", - "[1] 53\n", - "[1] 54\n", - "[1] 55\n", - "[1] 56\n", - "[1] 57\n", - "[1] 58\n", - "[1] 59\n", - "[1] 60\n", - "[1] 61\n", - "[1] 62\n", - "[1] 63\n", - "[1] 64\n", - "[1] 65\n", - "[1] 66\n", - "[1] 67\n", - "[1] 68\n", - "[1] 69\n", - "[1] 70\n", - "[1] 71\n", - "[1] 72\n", - "[1] 73\n", - "[1] 74\n", - "[1] 75\n", - "[1] 76\n", - "[1] 77\n", - "[1] 78\n", - "[1] 79\n", - "[1] 80\n", - "[1] 81\n", - "[1] 82\n", - "[1] 83\n", - "[1] 84\n", - "[1] 85\n", - "[1] 86\n", - "[1] 87\n", - "[1] 88\n", - "[1] 89\n", - "[1] 90\n", - "[1] 91\n", - "[1] 92\n", - "[1] 93\n", - "[1] 94\n", - "[1] 95\n", - "[1] 96\n", - "[1] 97\n", - "[1] 98\n", - "[1] 99\n", - "[1] 100\n", - "[1] 101\n", - "[1] 102\n", - "[1] 103\n", - "[1] 104\n", - "[1] 105\n", - "[1] 106\n", - "[1] 107\n", - "[1] 108\n", - "[1] 109\n", - "[1] 110\n", - "[1] 111\n", - "[1] 112\n", - "[1] 113\n", - "[1] 114\n", - "[1] 115\n", - "[1] 116\n", - "[1] 117\n", - "[1] 118\n", - "[1] 119\n", - "[1] 120\n", - "[1] 121\n", - "[1] 122\n", - "[1] 123\n", - "[1] 124\n", - "[1] 125\n", - "[1] 126\n", - "[1] 127\n", - "[1] 128\n", - "[1] 129\n", - "[1] 130\n", - "[1] 131\n", - "[1] 132\n", - "[1] 133\n", - "[1] 134\n", - "[1] 135\n", - "[1] 136\n", - "[1] 137\n", - "[1] 138\n", - "[1] 139\n", - "[1] 140\n", - "[1] 141\n", - "[1] 142\n", - "[1] 143\n", - "[1] 144\n", - "[1] 145\n", - "[1] 146\n", - "[1] 147\n", - "[1] 148\n", - "[1] 149\n", "[1] \"Habitat 7 Done\"\n", "[1] \"Congratulation - you finally made it towards the last habitat\"\n" ] } ], "source": [ - "multi_Class_Sampling(\n", + "pros <- profvis(multi_Class_Sampling(\n", " in.raster = a1,\n", - " init.samples = 50,\n", + " init.samples = 75,\n", " sample_type = \"regular\",\n", - " nb_models = 200,\n", + " nb_models = 220,\n", " nb_it = 10,\n", " buffer = 15,\n", " reference = ref,\n", @@ -1746,9 +1603,108 @@ " n_classes = 7,\n", " multiTest = 1,\n", " RGB = c(19,20,21),\n", - " overwrite=TRUE,\n", - " parallel_mode=TRUE,\n", - " plot_on_browser = FALSE)" + " overwrite = TRUE,\n", + " save_runs = FALSE,\n", + " parallel_mode = TRUE,\n", + " max_num_cores = 7,\n", + " plot_on_browser = FALSE))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\t\n", + "\t\t\n", + "\t\t\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\t\n", + "\t\n", + "\t\t
    \n", + "