From 61147e2cdc12929ebd9e5a768b7004d8edc3b194 Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 21:34:21 +0100 Subject: [PATCH 01/11] Working basic R Predictors --- README.md | 17 +++++ src/lib-base/src/ConfigDirs.cpp | 1 + src/lib-base/src/ConfigDirs.h | 1 + src/lib-base/src/PredictorRBaseline.cpp | 16 ++--- src/lib-base/src/PredictorRBaseline.h | 3 + src/lib-base/src/PredictorRCustom.cpp | 14 +++-- src/lib-base/src/PredictorRCustom.h | 2 + src/lib-base/src/RInitDeinit.cpp | 22 +++++++ src/lib-base/src/RInitDeinit.h | 16 +++++ src/lib-base/src/RWrapper.cpp | 83 +++++++++++++++++++++++++ src/lib-base/src/RWrapper.h | 21 +++++++ src/tsqsim-qt/src/main.cpp | 2 + src/tsqsim/src/main.cpp | 2 + 13 files changed, 188 insertions(+), 12 deletions(-) create mode 100644 src/lib-base/src/RInitDeinit.cpp create mode 100644 src/lib-base/src/RInitDeinit.h create mode 100644 src/lib-base/src/RWrapper.cpp create mode 100644 src/lib-base/src/RWrapper.h diff --git a/README.md b/README.md index a18e000..f25b111 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,23 @@ Beside the usual application usage, please note, that it's very beneficial to us ## Modifying the transformation script The TS transformation script's path can be obtained via `./tsqsim --help`, as well as it's currently available transformations. The script can modify the chain of transformations used by the executable, without the need for its recompilation. +## Running R scripts +The tool delivers binding to the R's C interface, currently via `PredictorRBaseline` and `PredictorRCustom`. Their corresponding R scripts can be found in the directory `static/scripts` +Before running the wrapped R scripts, two variables need to be exported from the shell, that is supposed to run the predictors. Under Linux: +``` +export R_HOME=/usr/lib/R +export LD_LIBRARY_PATH=$R_HOME/lib +./tsqsim +``` + +and under OSX: + +``` +export R_HOME=/Library/Frameworks/R.framework/Resources +export LD_LIBRARY_PATH=$R_HOME/lib +./tsqsim +``` + # Development For the development use case, it's recommended to turn on certain optimizations, that reduce the recompilation and linking time while changing the source code often. The optimizations are: dynamic linking (*shared*), precompiled headers (*pch*) and (optionally) a networked parallel compiler's wrapper, [icecc](https://github.com/icecc/icecream). diff --git a/src/lib-base/src/ConfigDirs.cpp b/src/lib-base/src/ConfigDirs.cpp index 75cef85..b9ef831 100644 --- a/src/lib-base/src/ConfigDirs.cpp +++ b/src/lib-base/src/ConfigDirs.cpp @@ -17,6 +17,7 @@ ConfigDirs::ConfigDirs() , DIR_OUT_LABELS(DIR_DATA + "/labels") , DIR_LABELS_RANGE("static/labels-range/") , DIR_LABELS_SIGNAL("static/labels-strat/") + , DIR_SCRIPTS2("static/scripts/") , DIR_CRYPTO("static/crypto/") , FILE_LABELS("/labels-strat.txt") , FILE_CORREL_LIST(DIR_DATA + "/list_correl.txt") diff --git a/src/lib-base/src/ConfigDirs.h b/src/lib-base/src/ConfigDirs.h index a52c2bd..15c878d 100644 --- a/src/lib-base/src/ConfigDirs.h +++ b/src/lib-base/src/ConfigDirs.h @@ -16,6 +16,7 @@ class ConfigDirs const EnjoLib::Str DIR_CACHE; const EnjoLib::Str DIR_CFG; const EnjoLib::Str DIR_SCRIPTS; + const EnjoLib::Str DIR_SCRIPTS2; const EnjoLib::Str DIR_OUT; const EnjoLib::Str DIR_OUT_LABELS; const EnjoLib::Str DIR_LABELS_RANGE; diff --git a/src/lib-base/src/PredictorRBaseline.cpp b/src/lib-base/src/PredictorRBaseline.cpp index f283e7d..0098ff6 100644 --- a/src/lib-base/src/PredictorRBaseline.cpp +++ b/src/lib-base/src/PredictorRBaseline.cpp @@ -1,24 +1,26 @@ #include "PredictorRBaseline.h" -#ifdef USE_R -#include -#include -#endif //USE_R +#include "ConfigDirs.h" +#include "RWrapper.h" + +const char * PredictorRBaseline::SCRIPT_NAME = "r-baseline.R"; PredictorRBaseline::PredictorRBaseline(const IDataProvider & dat) : PredictorBase(dat, "RBaseline") { - //ctor } PredictorRBaseline::~PredictorRBaseline() { - //dtor } EnjoLib::VecD PredictorRBaseline::Predict(const EnjoLib::VecD & data) const { - return data; + // Invoke a function in R + RWrapper::source(ConfigDirs().DIR_SCRIPTS2 + SCRIPT_NAME); + const EnjoLib::VecD & ret = RWrapper::R_predictVec(data); + + return ret; } unsigned PredictorRBaseline::GetLags() const diff --git a/src/lib-base/src/PredictorRBaseline.h b/src/lib-base/src/PredictorRBaseline.h index f4ac2d8..24937c6 100644 --- a/src/lib-base/src/PredictorRBaseline.h +++ b/src/lib-base/src/PredictorRBaseline.h @@ -12,6 +12,9 @@ class PredictorRBaseline : public PredictorBase EnjoLib::VecD Predict(const EnjoLib::VecD & data) const override; unsigned GetLags() const override; + + static const char * SCRIPT_NAME; + //static const char * FUNCTION_NAME; protected: diff --git a/src/lib-base/src/PredictorRCustom.cpp b/src/lib-base/src/PredictorRCustom.cpp index 3122699..1778b87 100644 --- a/src/lib-base/src/PredictorRCustom.cpp +++ b/src/lib-base/src/PredictorRCustom.cpp @@ -1,9 +1,9 @@ #include "PredictorRCustom.h" -#ifdef USE_R -#include -#include -#endif //USE_R +#include "ConfigDirs.h" +#include "RWrapper.h" + +const char * PredictorRCustom::SCRIPT_NAME = "r-custom.R"; PredictorRCustom::PredictorRCustom(const IDataProvider & dat) : PredictorBase(dat, "RCustom") @@ -18,7 +18,11 @@ PredictorRCustom::~PredictorRCustom() EnjoLib::VecD PredictorRCustom::Predict(const EnjoLib::VecD & data) const { - return data; + // Invoke a function in R + RWrapper::source(ConfigDirs().DIR_SCRIPTS2 + SCRIPT_NAME); + const EnjoLib::VecD & ret = RWrapper::R_predictVec(data); + + return ret; } unsigned PredictorRCustom::GetLags() const diff --git a/src/lib-base/src/PredictorRCustom.h b/src/lib-base/src/PredictorRCustom.h index 97a1cc8..5bfdb61 100644 --- a/src/lib-base/src/PredictorRCustom.h +++ b/src/lib-base/src/PredictorRCustom.h @@ -12,6 +12,8 @@ class PredictorRCustom : public PredictorBase EnjoLib::VecD Predict(const EnjoLib::VecD & data) const override; unsigned GetLags() const override; + + static const char * SCRIPT_NAME; protected: diff --git a/src/lib-base/src/RInitDeinit.cpp b/src/lib-base/src/RInitDeinit.cpp new file mode 100644 index 0000000..1c9d349 --- /dev/null +++ b/src/lib-base/src/RInitDeinit.cpp @@ -0,0 +1,22 @@ +#include "RInitDeinit.h" + +#ifdef USE_R +#include +#include +#endif //USE_R + +RInitDeinit::RInitDeinit() +{ +#ifdef USE_R + int r_argc = 2; + char *r_argv[] = { "R", "--silent" }; + Rf_initEmbeddedR(r_argc, r_argv); +#endif //USE_R +} + +RInitDeinit::~RInitDeinit() +{ +#ifdef USE_R + Rf_endEmbeddedR(0); +#endif //USE_R +} diff --git a/src/lib-base/src/RInitDeinit.h b/src/lib-base/src/RInitDeinit.h new file mode 100644 index 0000000..f4a06b6 --- /dev/null +++ b/src/lib-base/src/RInitDeinit.h @@ -0,0 +1,16 @@ +#ifndef RINITDEINIT_HPP +#define RINITDEINIT_HPP + + +class RInitDeinit +{ + public: + RInitDeinit(); + virtual ~RInitDeinit(); + + protected: + + private: +}; + +#endif // RINITDEINIT_HPP diff --git a/src/lib-base/src/RWrapper.cpp b/src/lib-base/src/RWrapper.cpp new file mode 100644 index 0000000..7701a76 --- /dev/null +++ b/src/lib-base/src/RWrapper.cpp @@ -0,0 +1,83 @@ +#include "RWrapper.h" + +#include +#include + +#ifdef USE_R +#include +#include +#endif //USE_R + +#include + +RWrapper::RWrapper() +{ +} + +RWrapper::~RWrapper() +{ +} + +/** + * Wrapper for R function predict, defined in func.R. + */ +EnjoLib::VecD RWrapper::R_predictVec(const EnjoLib::VecD & vec) +{ + EnjoLib::VecD retVec; +#ifdef USE_R + const double * a = vec.data(); + const int alen = vec.size(); + const char * functionName = "predict"; + + // Allocate an R vector and copy the C array into it. + SEXP arg; + PROTECT(arg = allocVector(REALSXP, alen)); + std::memcpy(REAL(arg), a, alen * sizeof(double)); + + // Setup a call to the R function + SEXP add1_call; + PROTECT(add1_call = lang2(install(functionName), arg)); + + // Execute the function + int errorOccurred; + SEXP ret = R_tryEval(add1_call, R_GlobalEnv, &errorOccurred); + + if (!errorOccurred) + { + printf("R returned: "); + double *val = REAL(ret); + for (int i = 0; i < LENGTH(ret); i++) + { + printf("%0.1f, ", val[i]); + retVec.Add(val[i]); + } + + printf("\n"); + } + else + { + printf("Error occurred calling R\n"); + } + + UNPROTECT(2); +#endif //USE_R + return retVec; +} + +/** + * Invokes the command source(scriptPath). + */ +void RWrapper::source(const EnjoLib::Str & scriptPath) +{ + if (not EnjoLib::FileUtils().FileExists(scriptPath)) + { + throw EnjoLib::ExceptInvalidArg("RWrapper::source(): File doesn't exist: " + scriptPath); + } +#ifdef USE_R + SEXP e; + + PROTECT(e = lang2(install("source"), mkString(scriptPath.c_str()))); + R_tryEval(e, R_GlobalEnv, NULL); + UNPROTECT(1); +#endif //USE_R +} diff --git a/src/lib-base/src/RWrapper.h b/src/lib-base/src/RWrapper.h new file mode 100644 index 0000000..804a768 --- /dev/null +++ b/src/lib-base/src/RWrapper.h @@ -0,0 +1,21 @@ +#ifndef RWRAPPER_H +#define RWRAPPER_H + +#include +#include + +class RWrapper +{ + public: + RWrapper(); + virtual ~RWrapper(); + + static EnjoLib::VecD R_predictVec(const EnjoLib::VecD & vec); + static void source(const EnjoLib::Str & scriptPath); + + protected: + + private: +}; + +#endif // RWRAPPER_H diff --git a/src/tsqsim-qt/src/main.cpp b/src/tsqsim-qt/src/main.cpp index 7ae1813..5be5c57 100644 --- a/src/tsqsim-qt/src/main.cpp +++ b/src/tsqsim-qt/src/main.cpp @@ -35,6 +35,7 @@ #include #include "StrategyType.h" #include "StrategyTypeEnum.h" +#include "RInitDeinit.h" //#include #include @@ -49,6 +50,7 @@ using namespace EnjoLib; int main(int argc, char *argv[]) { + RInitDeinit rinit; int mode = 0; if (argc > 1) { diff --git a/src/tsqsim/src/main.cpp b/src/tsqsim/src/main.cpp index a0973bf..0a9ea48 100644 --- a/src/tsqsim/src/main.cpp +++ b/src/tsqsim/src/main.cpp @@ -2,6 +2,7 @@ #include "CLITsq.h" #include "CLIResult.h" +#include "RInitDeinit.h" #include #include @@ -15,6 +16,7 @@ int main(int argc, char ** argv) { try { + RInitDeinit rinit; const CLITsq cli; const EnjoLib::Result & result = cli.GetConfigs(argc, argv); From e005134a1cc912dc10bc85f3a1ce4e8316017da7 Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 21:49:11 +0100 Subject: [PATCH 02/11] Added R exports --- util/build.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/util/build.py b/util/build.py index 119a7de..b580c70 100755 --- a/util/build.py +++ b/util/build.py @@ -130,8 +130,15 @@ def build(args): #print(cmd) def run_demo(args): os.chdir(DIR_BIN) + exports_r = "" + if platform.system() == 'Linux': + exports_r = "&& export R_HOME=/usr/lib/R && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$R_HOME/lib" + elif platform.system() == 'Darwin': + exports_r = "&& export R_HOME=/Library/Frameworks/R.framework/Resources && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$R_HOME/lib" + cmd = "" cmd += ' export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:lib' # TODO: Solve in CMake? + cmd += exports_r cmd += '&& ./tsqsim --help' cmd += '&& ./tsqsim' From b465970e52200bcd0ee438dc72d65c8b529bd9aa Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 22:04:04 +0100 Subject: [PATCH 03/11] Added R exports --- src/lib-base/src/RInitDeinit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib-base/src/RInitDeinit.cpp b/src/lib-base/src/RInitDeinit.cpp index 1c9d349..f138a8e 100644 --- a/src/lib-base/src/RInitDeinit.cpp +++ b/src/lib-base/src/RInitDeinit.cpp @@ -8,8 +8,8 @@ RInitDeinit::RInitDeinit() { #ifdef USE_R - int r_argc = 2; - char *r_argv[] = { "R", "--silent" }; + const int r_argc = 3; + char *r_argv[] = { "R", "--silent", "--vanilla" }; Rf_initEmbeddedR(r_argc, r_argv); #endif //USE_R } From 62282c6116471884243d38710b25297790539f3c Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 22:23:02 +0100 Subject: [PATCH 04/11] Trying to install rstudio --- util/deps-pull.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/deps-pull.sh b/util/deps-pull.sh index f474c54..5bff068 100755 --- a/util/deps-pull.sh +++ b/util/deps-pull.sh @@ -8,7 +8,7 @@ if [ "$(uname)" == "Darwin" ]; then fi #HOMEBREW_NO_AUTO_UPDATE=1 brew install qt5 #brew link -v qt5 --force - HOMEBREW_NO_AUTO_UPDATE=1 brew install boost ccache gnuplot eigen gsl unittest-cpp wxwidgets r # openssl zmq + HOMEBREW_NO_AUTO_UPDATE=1 brew install boost ccache gnuplot eigen gsl unittest-cpp wxwidgets r rstudio # openssl zmq # TODO: install qt instead of qt5, after moving to latest QCustomPlot. Then the "--prefix" and "link" aren't needed. elif [ "$(uname)" == "Linux" ]; then sudo apt update; sudo apt -y install build-essential cmake ccache gnuplot libeigen3-dev libunittest++-dev libgsl-dev libboost-system-dev libboost-filesystem-dev libboost-iostreams-dev libboost-serialization-dev libboost-program-options-dev libboost-date-time-dev libboost-atomic-dev libwxgtk3.0-gtk3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools r-base-dev # libssl-dev From fe0916908f843af1663a0584574942b7bc2d8812 Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 22:32:50 +0100 Subject: [PATCH 05/11] Revert "Trying to install rstudio" This reverts commit 62282c6116471884243d38710b25297790539f3c. --- util/deps-pull.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/deps-pull.sh b/util/deps-pull.sh index 5bff068..f474c54 100755 --- a/util/deps-pull.sh +++ b/util/deps-pull.sh @@ -8,7 +8,7 @@ if [ "$(uname)" == "Darwin" ]; then fi #HOMEBREW_NO_AUTO_UPDATE=1 brew install qt5 #brew link -v qt5 --force - HOMEBREW_NO_AUTO_UPDATE=1 brew install boost ccache gnuplot eigen gsl unittest-cpp wxwidgets r rstudio # openssl zmq + HOMEBREW_NO_AUTO_UPDATE=1 brew install boost ccache gnuplot eigen gsl unittest-cpp wxwidgets r # openssl zmq # TODO: install qt instead of qt5, after moving to latest QCustomPlot. Then the "--prefix" and "link" aren't needed. elif [ "$(uname)" == "Linux" ]; then sudo apt update; sudo apt -y install build-essential cmake ccache gnuplot libeigen3-dev libunittest++-dev libgsl-dev libboost-system-dev libboost-filesystem-dev libboost-iostreams-dev libboost-serialization-dev libboost-program-options-dev libboost-date-time-dev libboost-atomic-dev libwxgtk3.0-gtk3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools r-base-dev # libssl-dev From 849e24b43b1be1e9784dba266d599af996202aca Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 22:34:37 +0100 Subject: [PATCH 06/11] Verbose Brew --- util/deps-pull.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/deps-pull.sh b/util/deps-pull.sh index f474c54..7e6c5cb 100755 --- a/util/deps-pull.sh +++ b/util/deps-pull.sh @@ -8,7 +8,7 @@ if [ "$(uname)" == "Darwin" ]; then fi #HOMEBREW_NO_AUTO_UPDATE=1 brew install qt5 #brew link -v qt5 --force - HOMEBREW_NO_AUTO_UPDATE=1 brew install boost ccache gnuplot eigen gsl unittest-cpp wxwidgets r # openssl zmq + HOMEBREW_NO_AUTO_UPDATE=1 brew -vd install r # openssl zmq # TODO: install qt instead of qt5, after moving to latest QCustomPlot. Then the "--prefix" and "link" aren't needed. elif [ "$(uname)" == "Linux" ]; then sudo apt update; sudo apt -y install build-essential cmake ccache gnuplot libeigen3-dev libunittest++-dev libgsl-dev libboost-system-dev libboost-filesystem-dev libboost-iostreams-dev libboost-serialization-dev libboost-program-options-dev libboost-date-time-dev libboost-atomic-dev libwxgtk3.0-gtk3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools r-base-dev # libssl-dev From c9b50953e5b687f061827482a2b4d85a87e24cf3 Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 22:38:52 +0100 Subject: [PATCH 07/11] Verbose Brew --- util/deps-pull.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/deps-pull.sh b/util/deps-pull.sh index 7e6c5cb..94cb049 100755 --- a/util/deps-pull.sh +++ b/util/deps-pull.sh @@ -8,7 +8,7 @@ if [ "$(uname)" == "Darwin" ]; then fi #HOMEBREW_NO_AUTO_UPDATE=1 brew install qt5 #brew link -v qt5 --force - HOMEBREW_NO_AUTO_UPDATE=1 brew -vd install r # openssl zmq + HOMEBREW_NO_AUTO_UPDATE=1 brew install -vd r # openssl zmq # TODO: install qt instead of qt5, after moving to latest QCustomPlot. Then the "--prefix" and "link" aren't needed. elif [ "$(uname)" == "Linux" ]; then sudo apt update; sudo apt -y install build-essential cmake ccache gnuplot libeigen3-dev libunittest++-dev libgsl-dev libboost-system-dev libboost-filesystem-dev libboost-iostreams-dev libboost-serialization-dev libboost-program-options-dev libboost-date-time-dev libboost-atomic-dev libwxgtk3.0-gtk3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools r-base-dev # libssl-dev From 4eda80ea76c35011f981a250dddf2198f700795f Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 22:47:27 +0100 Subject: [PATCH 08/11] Added R scripts --- src/tsqsim-lib/static/scripts/r-baseline.R | 8 ++++++++ src/tsqsim-lib/static/scripts/r-custom.R | 8 ++++++++ src/tsqsim-lib/static/scripts/r-path.R | 1 + 3 files changed, 17 insertions(+) create mode 100644 src/tsqsim-lib/static/scripts/r-baseline.R create mode 100644 src/tsqsim-lib/static/scripts/r-custom.R create mode 100644 src/tsqsim-lib/static/scripts/r-path.R diff --git a/src/tsqsim-lib/static/scripts/r-baseline.R b/src/tsqsim-lib/static/scripts/r-baseline.R new file mode 100644 index 0000000..951dc52 --- /dev/null +++ b/src/tsqsim-lib/static/scripts/r-baseline.R @@ -0,0 +1,8 @@ +# This function is invoked by the PredictorRBaseline class + +predict <- function(a) { + cat("R received: ", a, "\n"); + b <- c(0, a) # Add 0 at front + return(head(b, -1)) # Remove last element + #return(a + 1) +} diff --git a/src/tsqsim-lib/static/scripts/r-custom.R b/src/tsqsim-lib/static/scripts/r-custom.R new file mode 100644 index 0000000..951dc52 --- /dev/null +++ b/src/tsqsim-lib/static/scripts/r-custom.R @@ -0,0 +1,8 @@ +# This function is invoked by the PredictorRBaseline class + +predict <- function(a) { + cat("R received: ", a, "\n"); + b <- c(0, a) # Add 0 at front + return(head(b, -1)) # Remove last element + #return(a + 1) +} diff --git a/src/tsqsim-lib/static/scripts/r-path.R b/src/tsqsim-lib/static/scripts/r-path.R new file mode 100644 index 0000000..b1cf4ca --- /dev/null +++ b/src/tsqsim-lib/static/scripts/r-path.R @@ -0,0 +1 @@ +Sys.getenv("R_HOME") From 35c190c472dc02071fcc3e18f07531cd48075521 Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 22:48:59 +0100 Subject: [PATCH 09/11] Rscript call --- util/deps-pull.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/util/deps-pull.sh b/util/deps-pull.sh index 94cb049..364d2bc 100755 --- a/util/deps-pull.sh +++ b/util/deps-pull.sh @@ -10,6 +10,8 @@ if [ "$(uname)" == "Darwin" ]; then #brew link -v qt5 --force HOMEBREW_NO_AUTO_UPDATE=1 brew install -vd r # openssl zmq # TODO: install qt instead of qt5, after moving to latest QCustomPlot. Then the "--prefix" and "link" aren't needed. + Rscript src/tsqsim-lib/static/scripts/r-path.R + elif [ "$(uname)" == "Linux" ]; then sudo apt update; sudo apt -y install build-essential cmake ccache gnuplot libeigen3-dev libunittest++-dev libgsl-dev libboost-system-dev libboost-filesystem-dev libboost-iostreams-dev libboost-serialization-dev libboost-program-options-dev libboost-date-time-dev libboost-atomic-dev libwxgtk3.0-gtk3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools r-base-dev # libssl-dev else From 36b2dca29dacaadfaf4739ce004f27a4c7c3207c Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 22:56:59 +0100 Subject: [PATCH 10/11] Rscript call --- util/deps-pull.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/deps-pull.sh b/util/deps-pull.sh index 364d2bc..ca6fe3f 100755 --- a/util/deps-pull.sh +++ b/util/deps-pull.sh @@ -8,7 +8,7 @@ if [ "$(uname)" == "Darwin" ]; then fi #HOMEBREW_NO_AUTO_UPDATE=1 brew install qt5 #brew link -v qt5 --force - HOMEBREW_NO_AUTO_UPDATE=1 brew install -vd r # openssl zmq + HOMEBREW_NO_AUTO_UPDATE=1 brew install r # openssl zmq # TODO: install qt instead of qt5, after moving to latest QCustomPlot. Then the "--prefix" and "link" aren't needed. Rscript src/tsqsim-lib/static/scripts/r-path.R From 474852d5e3b2d03294efaa31d6aa2240515bf169 Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sat, 15 Jan 2022 23:05:19 +0100 Subject: [PATCH 11/11] Trying the right R path for osx 11 --- util/build.py | 6 +++++- util/deps-pull.sh | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/util/build.py b/util/build.py index b580c70..59a5b86 100755 --- a/util/build.py +++ b/util/build.py @@ -134,7 +134,11 @@ def run_demo(args): if platform.system() == 'Linux': exports_r = "&& export R_HOME=/usr/lib/R && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$R_HOME/lib" elif platform.system() == 'Darwin': - exports_r = "&& export R_HOME=/Library/Frameworks/R.framework/Resources && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$R_HOME/lib" + dir_framework = '/Library/Frameworks/R.framework/Resources' + dir_osx11 = '/usr/local/Cellar/r/4.1.2/lib/R' + if os.path.isdir(dir_osx11): + dir_framework = dir_osx11 + exports_r = "&& export R_HOME={} && export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$R_HOME/lib".format(dir_framework) cmd = "" cmd += ' export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:lib' # TODO: Solve in CMake? diff --git a/util/deps-pull.sh b/util/deps-pull.sh index ca6fe3f..2fbbe1d 100755 --- a/util/deps-pull.sh +++ b/util/deps-pull.sh @@ -8,10 +8,10 @@ if [ "$(uname)" == "Darwin" ]; then fi #HOMEBREW_NO_AUTO_UPDATE=1 brew install qt5 #brew link -v qt5 --force - HOMEBREW_NO_AUTO_UPDATE=1 brew install r # openssl zmq + HOMEBREW_NO_AUTO_UPDATE=1 brew install boost ccache gnuplot eigen gsl unittest-cpp wxwidgets r # openssl zmq # TODO: install qt instead of qt5, after moving to latest QCustomPlot. Then the "--prefix" and "link" aren't needed. + # Expose R_HOME path: Rscript src/tsqsim-lib/static/scripts/r-path.R - elif [ "$(uname)" == "Linux" ]; then sudo apt update; sudo apt -y install build-essential cmake ccache gnuplot libeigen3-dev libunittest++-dev libgsl-dev libboost-system-dev libboost-filesystem-dev libboost-iostreams-dev libboost-serialization-dev libboost-program-options-dev libboost-date-time-dev libboost-atomic-dev libwxgtk3.0-gtk3-dev qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools r-base-dev # libssl-dev else