diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a9640fb..99814ce 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,7 @@ jobs: matrix: os: [ubuntu-latest] #, ubuntu-18.04] # TODO: Consider(!) supporting the previous version. compiler: [gcc, clang] + options: ["", "--ffp"] linkage: ["", "--shared", "--lto"] steps: - uses: actions/checkout@v1 @@ -38,8 +39,8 @@ jobs: uses: actions/cache@v2 with: path: ~/.ccache - key: ccache03-${{ runner.os }}-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.linkage }}-build-${{ github.sha }} - restore-keys: ccache03-${{ runner.os }}-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.linkage }}-build- + key: ccache03-${{ runner.os }}-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.linkage }}-${{ matrix.options }}-build-${{ github.sha }} + restore-keys: ccache03-${{ runner.os }}-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.linkage }}-${{ matrix.options }}-build- # Less volatile cache - name: data cache uses: actions/cache@v2 @@ -62,9 +63,9 @@ jobs: - name: build & install the unmanaged dependencies run: util/deps-build.sh - name: build - run: ./ci-default --compiler ${{ matrix.compiler }} ${{ matrix.linkage }} --unity --build-qt --build-r + run: ./ci-default --compiler ${{ matrix.compiler }} ${{ matrix.linkage }} ${{ matrix.options }} --unity --build-qt --build-r - name: run demo - run: ./ci-default --compiler ${{ matrix.compiler }} ${{ matrix.linkage }} --unity --build-qt --build-r --run-demo + run: ./ci-default --compiler ${{ matrix.compiler }} ${{ matrix.linkage }} ${{ matrix.options }} --unity --build-qt --build-r --run-demo # It doesn't make sense for now, since we're not linking Boost statically yet. # - uses: actions/upload-artifact@v2 # if: ${{ matrix.compiler == 'gcc' && matrix.linkage == '--lto' }} @@ -75,6 +76,42 @@ jobs: # TODO: All the unmaintained denendencies should have their own CMakeLists.txt file (URT. Others?) and the util/deps-build.sh should not be used, if possible. # TODO: All the testing should be done in a separate job, AFTER building and downloading resources, in order to use caches better (short and easy. Needs to have the build scripts restructured - separate building and testing) +# Performance tests: + perf-ubuntu: + runs-on: ${{ matrix.os }} + env: + CCACHE_TEMPDIR: /tmp/.ccache-temp + strategy: + fail-fast: false +# max-parallel: 1 # Single threaded for now, because the jobs overwrite each other's data/bin/* files? + matrix: + os: [ubuntu-latest] #, ubuntu-18.04] # TODO: Consider(!) supporting the previous version. + compiler: [gcc, clang] + options: ["", "--ffp"] + steps: + - uses: actions/checkout@v1 + with: + submodules: recursive + # Less volatile cache + - name: data cache + uses: actions/cache@v2 + with: + path: build/data/data/txt + key: data-${{ hashFiles('build/data/data/txt/**/*') }} + restore-keys: data-${{ hashFiles('build/data/data/txt/**/*') }} + - name: prepare environment + run: util/prep-env.sh + - name: set apt conf + run: ${{env.APT_SET_CONF}} + - name: install dependencies + run: util/deps-pull.sh + - name: build & install the unmanaged dependencies + run: util/deps-build.sh + - name: build + run: ./ci-default --compiler ${{ matrix.compiler }} --lto -j 1 ${{ matrix.options }} --native --unity --build-qt --build-r + - name: run demo + run: ./ci-default --compiler ${{ matrix.compiler }} --lto -j 1 ${{ matrix.options }} --native --unity --build-qt --build-r --run-demo + build-macos: runs-on: ${{ matrix.os }} env: diff --git a/.gitignore b/.gitignore index 1668b1e..94f2d3a 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,4 @@ *.app # Own -./build* +build/* diff --git a/externals/EnjoLib b/externals/EnjoLib index 00e4bda..dcdd951 160000 --- a/externals/EnjoLib +++ b/externals/EnjoLib @@ -1 +1 @@ -Subproject commit 00e4bda251b87f1f6bbb7fd23845813667d47e0b +Subproject commit dcdd9510dc35542af554b5a780b7d35623b38c6a diff --git a/src/lib-base/src/BufferDouble.cpp b/src/lib-base/src/BufferDouble.cpp index 7b908f0..cf9a97d 100644 --- a/src/lib-base/src/BufferDouble.cpp +++ b/src/lib-base/src/BufferDouble.cpp @@ -13,31 +13,31 @@ BufferDouble::~BufferDouble() //dtor } -double BufferDouble::operator[](unsigned i) const +EnjoLib::FP BufferDouble::operator[](unsigned i) const { //return (*m_buf)[i]; - return BufferTpl(m_data.Data(), m_name.c_str())[i]; + return BufferTpl(m_data.Data(), m_name.c_str())[i]; } unsigned BufferDouble::ConvertIndex(unsigned i) const { //return (*m_buf).ConvertIndex(i); - return BufferTpl(m_data.Data(), m_name.c_str()).ConvertIndex(i); + return BufferTpl(m_data.Data(), m_name.c_str()).ConvertIndex(i); } -double BufferDouble::operator[](const State & st) const +EnjoLib::FP BufferDouble::operator[](const State & st) const { - return BufferTpl(m_data.Data(), m_name.c_str())[st]; + return BufferTpl(m_data.Data(), m_name.c_str())[st]; } EnjoLib::VecD BufferDouble::GetAfter(unsigned iFrom, unsigned num) const { - return BufferTpl(m_data.Data(), m_name.c_str()).GetAfter(iFrom, num); + return BufferTpl(m_data.Data(), m_name.c_str()).GetAfter(iFrom, num); } EnjoLib::VecD BufferDouble::GetBefore(unsigned iUntil, unsigned num) const { - return BufferTpl(m_data.Data(), m_name.c_str()).GetBefore(iUntil, num); + return BufferTpl(m_data.Data(), m_name.c_str()).GetBefore(iUntil, num); } const EnjoLib::VecD & BufferDouble::GetData() const @@ -47,5 +47,5 @@ const EnjoLib::VecD & BufferDouble::GetData() const int BufferDouble::Len() const { - return BufferTpl(m_data.Data(), m_name.c_str()).Len(); + return BufferTpl(m_data.Data(), m_name.c_str()).Len(); } diff --git a/src/lib-base/src/BufferDouble.h b/src/lib-base/src/BufferDouble.h index 22ccd06..8ca6ae4 100644 --- a/src/lib-base/src/BufferDouble.h +++ b/src/lib-base/src/BufferDouble.h @@ -12,8 +12,8 @@ class BufferDouble virtual ~BufferDouble(); // From BufferTpl - double operator[](unsigned i) const; - double operator[](const State & st) const; + EnjoLib::FP operator[](unsigned i) const; + EnjoLib::FP operator[](const State & st) const; EnjoLib::VecD GetBefore(unsigned iUntil, unsigned num) const; EnjoLib::VecD GetAfter(unsigned iFrom, unsigned num) const; //STDFWD::vector GetMiddle(unsigned i, unsigned num) const; diff --git a/src/lib-base/src/DTWDistCompDTW.cpp b/src/lib-base/src/DTWDistCompDTW.cpp index 257c661..416f490 100644 --- a/src/lib-base/src/DTWDistCompDTW.cpp +++ b/src/lib-base/src/DTWDistCompDTW.cpp @@ -8,7 +8,7 @@ using namespace EnjoLib; DTWDistCompDTW::DTWDistCompDTW(const EnjoLib::VecD & obsNew) //const int size = obsNew.size(); //const int tol = size / 10; // we use the DTW with a tolerance of 10% (size/10) - : m_filter(obsNew.Data(), obsNew.size()/10) + : m_filter(obsNew.ToVecDouble(), obsNew.size()/10) { } @@ -16,7 +16,7 @@ DTWDistCompDTW::~DTWDistCompDTW(){} double DTWDistCompDTW::Compare(const EnjoLib::VecD & obsVec) const { - double newbest = m_filter.test(obsVec.Data()); + double newbest = m_filter.test(obsVec.ToVecDouble()); return newbest; } @@ -25,4 +25,4 @@ double DTWDistCompKNN::Compare(const EnjoLib::VecD & obsVec) const { double newbest = Statistical().RMSTwo(obsNew, obsVec); return newbest; -} \ No newline at end of file +} diff --git a/src/lib-base/src/GnuplotIOSWrap.cpp b/src/lib-base/src/GnuplotIOSWrap.cpp index 080af28..8cc86f2 100644 --- a/src/lib-base/src/GnuplotIOSWrap.cpp +++ b/src/lib-base/src/GnuplotIOSWrap.cpp @@ -30,7 +30,7 @@ void GnuplotIOSWrap::Add1d(const EnjoLib::VecD & data) } ///SetupXY() -void GnuplotIOSWrap::Add2d(const EnjoLib::Array> & data) +void GnuplotIOSWrap::Add2d(const EnjoLib::Array> & data) { std::vector> dataTuple; for (const auto & par : data) @@ -98,7 +98,7 @@ void GnuplotPlotTerminal1d(const EnjoLib::VecD & data, const EnjoLib::Str & desc plot.Add1d(data); } -void GnuplotPlotTerminal2d(const EnjoLib::Array> & data, const EnjoLib::Str & descr, float scaleX, float scaleY) +void GnuplotPlotTerminal2d(const EnjoLib::Array> & data, const EnjoLib::Str & descr, float scaleX, float scaleY) { if (not descr.empty()) { diff --git a/src/lib-base/src/GnuplotIOSWrap.h b/src/lib-base/src/GnuplotIOSWrap.h index ec3d7f0..540ddf5 100644 --- a/src/lib-base/src/GnuplotIOSWrap.h +++ b/src/lib-base/src/GnuplotIOSWrap.h @@ -26,7 +26,7 @@ class GnuplotIOSWrap void SetZeroMin(double valMax); void SetZeroMin(); void Add1d(const EnjoLib::VecD & data); - void Add2d(const EnjoLib::Array> & data); + void Add2d(const EnjoLib::Array> & data); const static int TERMINAL_W; const static int TERMINAL_H; @@ -39,7 +39,7 @@ class GnuplotIOSWrap }; void GnuplotPlotTerminal1d(const EnjoLib::VecD & data, const EnjoLib::Str & descr = "", float scaleX = 1, float scaleY = 1); -void GnuplotPlotTerminal2d(const EnjoLib::Array> & data, const EnjoLib::Str & descr = "", float scaleX = 1, float scaleY = 1); +void GnuplotPlotTerminal2d(const EnjoLib::Array> & data, const EnjoLib::Str & descr = "", float scaleX = 1, float scaleY = 1); void GnuplotPlotTerminal1dSubplots(const EnjoLib::Array & data, const EnjoLib::Str & descr = "", float scaleX = 1, float scaleY = 1); #endif // GNUPLOTIOSWRAP_H diff --git a/src/lib-base/src/MatplotACF.cpp b/src/lib-base/src/MatplotACF.cpp index add1e6c..6e7358b 100644 --- a/src/lib-base/src/MatplotACF.cpp +++ b/src/lib-base/src/MatplotACF.cpp @@ -43,7 +43,7 @@ void MatplotACF::Plot(const EnjoLib::VecD & dat, int lags, int periodSeasonal, c ofs << line << Nl; } VecD reversed = dat; - AlgoSTDIVec().Reverse(&reversed); + AlgoSTDIVec().Reverse(&reversed); //ofs << dat.PrintPython("dat") << Nl; ofs << reversed.PrintPython("dat") << Nl; ofs << "plotACF(dat, " << lags << ", '" << title << "')" << Nl; diff --git a/src/lib-base/src/OptiSubjectTSUtil.cpp b/src/lib-base/src/OptiSubjectTSUtil.cpp index f8fe799..b1de141 100644 --- a/src/lib-base/src/OptiSubjectTSUtil.cpp +++ b/src/lib-base/src/OptiSubjectTSUtil.cpp @@ -20,7 +20,7 @@ OptiSubjectTSUtil::~OptiSubjectTSUtil() { } -double OptiSubjectTSUtil::UpdateOptiGetPenality(const double * inp, int n, const EnjoLib::VecD & iterData, IOptimizable * opti) const +double OptiSubjectTSUtil::UpdateOptiGetPenality(const EnjoLib::FP * inp, int n, const EnjoLib::VecD & iterData, IOptimizable * opti) const { EnjoLib::Array vopti = opti->GetOptiFloat().Vec(); //OptiVarF * varReal = FindVarCurrent(strat, iVar); diff --git a/src/lib-base/src/OptiSubjectTSUtil.h b/src/lib-base/src/OptiSubjectTSUtil.h index ac17a73..3bc00f1 100644 --- a/src/lib-base/src/OptiSubjectTSUtil.h +++ b/src/lib-base/src/OptiSubjectTSUtil.h @@ -12,7 +12,7 @@ class OptiSubjectTSUtil OptiSubjectTSUtil(); virtual ~OptiSubjectTSUtil(); - double UpdateOptiGetPenality(const double * in, int n, const EnjoLib::VecD & iterData, IOptimizable * opti) const; + double UpdateOptiGetPenality(const EnjoLib::FP * in, int n, const EnjoLib::VecD & iterData, IOptimizable * opti) const; EnjoLib::VecD GetStartProt(const STDFWD::vector & optiVec) const; EnjoLib::VecD GetStepProt(const STDFWD::vector & optiVec) const; diff --git a/src/lib-base/src/RWrapper.cpp b/src/lib-base/src/RWrapper.cpp index 7701a76..41ba8e6 100644 --- a/src/lib-base/src/RWrapper.cpp +++ b/src/lib-base/src/RWrapper.cpp @@ -9,6 +9,7 @@ #endif //USE_R #include +#include RWrapper::RWrapper() { @@ -21,8 +22,9 @@ RWrapper::~RWrapper() /** * Wrapper for R function predict, defined in func.R. */ -EnjoLib::VecD RWrapper::R_predictVec(const EnjoLib::VecD & vec) +EnjoLib::VecD RWrapper::R_predictVec(const EnjoLib::VecD & vecd) { + const std::vector vec = vecd.ToVecDouble(); EnjoLib::VecD retVec; #ifdef USE_R const double * a = vec.data(); diff --git a/src/lib-base/src/RegressionPoints.cpp b/src/lib-base/src/RegressionPoints.cpp index e5fdc3b..7df7301 100644 --- a/src/lib-base/src/RegressionPoints.cpp +++ b/src/lib-base/src/RegressionPoints.cpp @@ -25,7 +25,7 @@ RegressionPoints::~RegressionPoints(){} float RegressionPoints::GetPoints() const { float error = 0; - const Array> & data = GetDistrib(); + const Array> & data = GetDistrib(); for (unsigned i = 0; i < data.size(); ++i) { const double x = data.at(i).first; @@ -130,14 +130,14 @@ void RegressionPoints::Finish() m_distributionOut.atw(i) = m_distributionIn.at(i) * mul; } -EnjoLib::Array> RegressionPoints::GetDistrib() const +EnjoLib::Array> RegressionPoints::GetDistrib() const { - std::vector> data; + std::vector> data; for (unsigned i = 0; i < m_distributionOut.size(); ++i) { double moved = i - (m_numBins / 2.0 - 1); double scaleFactor = 2.5 / m_numBins; - double scaledX = moved * scaleFactor; + EnjoLib::FP scaledX = moved * scaleFactor; data.push_back(EnjoLib::MakePair(scaledX, m_distributionOut.at(i))); } return data; @@ -146,7 +146,7 @@ EnjoLib::Array> RegressionPoints::GetDistrib() con // Wykrywac wszystkie mody powyzej 0.35 float RegressionPoints::GetMedian() const { - const EnjoLib::Array> & distrib = GetDistrib(); + const EnjoLib::Array> & distrib = GetDistrib(); double maxArg = -1; double maxVal = -1; for (int i = 0; i < int(distrib.size()); ++i) @@ -166,8 +166,8 @@ float RegressionPoints::GetMedian() const /// TODO: Upstream ? float RegressionPoints::GetDistribDiff(const RegressionPoints & other) const { - const EnjoLib::Array> & distrib1 = GetDistrib(); - const EnjoLib::Array> & distrib2 = other.GetDistrib(); + const EnjoLib::Array> & distrib1 = GetDistrib(); + const EnjoLib::Array> & distrib2 = other.GetDistrib(); double sum = 0; diff --git a/src/lib-base/src/RegressionPoints.h b/src/lib-base/src/RegressionPoints.h index 7889c61..a0010e3 100644 --- a/src/lib-base/src/RegressionPoints.h +++ b/src/lib-base/src/RegressionPoints.h @@ -28,7 +28,7 @@ class RegressionPoints private: double GetNormalDistrib(double x) const; - EnjoLib::Array> GetDistrib() const; + EnjoLib::Array> GetDistrib() const; static const int m_numBins; diff --git a/src/lib-base/src/StatsMedianSplit.cpp b/src/lib-base/src/StatsMedianSplit.cpp index 30b2c35..50b9c1e 100644 --- a/src/lib-base/src/StatsMedianSplit.cpp +++ b/src/lib-base/src/StatsMedianSplit.cpp @@ -77,7 +77,7 @@ StatsMedianSplit::Results StatsMedianSplit::CalcResults(const EnjoLib::VecD & ve const Statistical stat; const VecD & vecNoZeros = stat.RemoveLeadingZeroes(vecWZeros); - const vector> & dataSplit = VecOp().Split(vecNoZeros.Data(), numRanges); + const vector> & dataSplit = VecOp().Split(vecNoZeros.Data(), numRanges); std::future fut; if (m_multiThreaded) diff --git a/src/tsqsim-lib/src/OptiSubjectPred.cpp b/src/tsqsim-lib/src/OptiSubjectPred.cpp index 32b92db..105afd8 100644 --- a/src/tsqsim-lib/src/OptiSubjectPred.cpp +++ b/src/tsqsim-lib/src/OptiSubjectPred.cpp @@ -39,7 +39,7 @@ OptiSubjectPred::~OptiSubjectPred() //dtor } -double OptiSubjectPred::Get(const double * inp, int n) +EnjoLib::FP OptiSubjectPred::Get(const EnjoLib::FP * inp, int n) { CorPtr fun = m_fact.Create(m_period, m_type); IPredictor & strat = *(fun.get()); diff --git a/src/tsqsim-lib/src/OptiSubjectPred.h b/src/tsqsim-lib/src/OptiSubjectPred.h index 2f81d50..97b4a43 100644 --- a/src/tsqsim-lib/src/OptiSubjectPred.h +++ b/src/tsqsim-lib/src/OptiSubjectPred.h @@ -22,7 +22,7 @@ class OptiSubjectPred : public IOptiSubject double GetGoal() const; - double Get(const double * in, int n) override; + EnjoLib::FP Get(const EnjoLib::FP * in, int n) override; EnjoLib::VecD GetStart() const override; EnjoLib::VecD GetStep() const override; EnjoLib::Array GetBounds() const override; diff --git a/util/build.py b/util/build.py index 5514659..53d6c6f 100755 --- a/util/build.py +++ b/util/build.py @@ -32,6 +32,8 @@ def get_parser(): parser = argparse.ArgumentParser() parser.add_argument('-s', '--shared', default=False, action='store_true', help="build shared libraries (default: OFF)") parser.add_argument('-l', '--lto', default=False, action='store_true', help="link time optimization (Release case; default: OFF)") + parser.add_argument('-f', '--ffp', default=False, action='store_true', help="faster, but less precise floating point (default: OFF)") + parser.add_argument('-n', '--native', default=False, action='store_true', help="native build (default: OFF)") parser.add_argument('-d', '--debug', default=False, action='store_true', help="build debug (default: OFF)") parser.add_argument('-p', '--pch', default=False, action='store_true', help="build pch (Dev case; default: OFF)") parser.add_argument('-u', '--unity', default=False, action='store_true', help="build unity (CI case; default: OFF)") @@ -126,6 +128,9 @@ def build(args): cmd += NL + '-DUSE_DEBUG={}' .format(ON if args.debug else OFF) cmd += NL + '-DUSE_UNITY={}' .format(ON if args.unity else OFF) cmd += NL + '-DUSE_PCH={}' .format(ON if args.pch else OFF) + cmd += NL + '-DUSE_FLOATING_POINT_LOW_PRECISION={}'.format(ON if args.ffp else OFF) + cmd += NL + '-DUSE_OPTI_NATIVE={}' .format(ON if args.native else OFF) + cmd += NL + '-DUSE_OPTI_GENERIC={}'.format(OFF if args.native else ON) cmd += NL + '-DBUILD_QT={}' .format(ON if args.build_qt else OFF) # Optional cmd += NL + '-DBUILD_WX={}' .format(OFF if args.no_wx else ON ) # Optional cmd += NL + '-DBUILD_TESTS={}'.format(OFF if args.no_tests else ON ) # Optional