Merge pull request #145161 from smancill/shogun-fix-build

shogun: refactor derivation and fix build

authored by

Jörg Thalheim and committed by
GitHub
584c5fc2 e71c1b94

+192 -56
+117 -46
pkgs/applications/science/machine-learning/shogun/default.nix
··· 1 - { stdenv, lib, fetchFromGitHub, fetchpatch, fetchurl, cmake, ctags, swig 2 - # data, compression 3 - , bzip2, curl, hdf5, json_c, xz, lzo, protobuf, snappy 4 - # maths 5 - , blas, lapack, eigen, nlopt, lp_solve, colpack, glpk 6 - # libraries 7 - , libarchive, libxml2 8 - # extra support 9 - , pythonSupport ? true, pythonPackages ? null 10 - , opencvSupport ? false, opencv ? null 1 + { lib 2 + , stdenv 3 + , fetchFromGitHub 4 + , fetchpatch 5 + , fetchurl 6 + # build 7 + , cmake 8 + , ctags 9 + , pythonPackages 10 + , swig 11 + # math 12 + , eigen 13 + , blas 14 + , lapack 15 + , glpk 16 + # data 17 + , protobuf 18 + , json_c 19 + , libxml2 20 + , hdf5 21 + , curl 22 + # compression 23 + , libarchive 24 + , bzip2 25 + , xz 26 + , snappy 27 + , lzo 28 + # more math 29 + , nlopt 30 + , lp_solve 31 + , colpack 32 + # extra support 33 + , pythonSupport ? true 34 + , opencvSupport ? false 35 + , opencv ? null 11 36 , withSvmLight ? false 12 37 }: 13 38 ··· 19 44 let 20 45 pname = "shogun"; 21 46 version = "6.1.4"; 47 + 22 48 rxcppVersion = "4.0.0"; 23 49 gtestVersion = "1.8.0"; 50 + 24 51 srcs = { 25 52 toolbox = fetchFromGitHub { 26 53 owner = pname + "-toolbox"; ··· 29 56 sha256 = "05s9dclmk7x5d7wnnj4qr6r6c827m72a44gizcv09lxr28pr9inz"; 30 57 fetchSubmodules = true; 31 58 }; 32 - # we need the packed archive 59 + 60 + # The CMake external projects expect the packed archives 33 61 rxcpp = fetchurl { 34 62 url = "https://github.com/Reactive-Extensions/RxCpp/archive/v${rxcppVersion}.tar.gz"; 35 63 sha256 = "0y2isr8dy2n1yjr9c5570kpc9lvdlch6jv0jvw000amwn5d3krsh"; ··· 42 70 in 43 71 44 72 stdenv.mkDerivation rec { 73 + inherit pname version; 45 74 46 - inherit pname version; 75 + outputs = [ "out" "dev" "doc" ]; 47 76 48 77 src = srcs.toolbox; 49 - 50 - postUnpack = '' 51 - mkdir -p $sourceRoot/third_party/{rxcpp,gtest} 52 - ln -s ${srcs.rxcpp} $sourceRoot/third_party/rxcpp/v${rxcppVersion}.tar.gz 53 - ln -s ${srcs.gtest} $sourceRoot/third_party/gtest/release-${gtestVersion}.tar.gz 54 - ''; 55 - 56 - # broken 57 - doCheck = false; 58 78 59 79 patches = [ 80 + # Fix compile errors with json-c 81 + # https://github.com/shogun-toolbox/shogun/pull/4104 60 82 (fetchpatch { 61 - url = "https://github.com/awild82/shogun/commit/365ce4c4c700736d2eec8ba6c975327a5ac2cd9b.patch"; 83 + url = "https://github.com/shogun-toolbox/shogun/commit/365ce4c4c700736d2eec8ba6c975327a5ac2cd9b.patch"; 62 84 sha256 = "158hqv4xzw648pmjbwrhxjp7qcppqa7kvriif87gn3zdn711c49s"; 63 85 }) 86 + 87 + # Fix compile errors with GCC 9+ 88 + # https://github.com/shogun-toolbox/shogun/pull/4811 89 + (fetchpatch { 90 + url = "https://github.com/shogun-toolbox/shogun/commit/c8b670be4790e0f06804b048a6f3d77c17c3ee95.patch"; 91 + sha256 = "sha256-MxsR3Y2noFQevfqWK3nmX5iK4OVWeKBl5tfeDNgjcXk="; 92 + }) 93 + (fetchpatch { 94 + url = "https://github.com/shogun-toolbox/shogun/commit/5aceefd9fb0e2132c354b9a0c0ceb9160cc9b2f7.patch"; 95 + sha256 = "sha256-AgJJKQA8vc5oKaTQDqMdwBR4hT4sn9+uW0jLe7GteJw="; 96 + }) 97 + 98 + # Fix compile errors with Eigen 3.4 99 + ./eigen-3.4.patch 100 + 64 101 ] ++ lib.optional (!withSvmLight) ./svmlight-scrubber.patch; 65 102 66 - CCACHE_DISABLE="1"; 67 - CCACHE_DIR=".ccache"; 103 + nativeBuildInputs = [ cmake swig ctags ] 104 + ++ (with pythonPackages; [ python jinja2 ply ]); 105 + 106 + buildInputs = [ 107 + eigen 108 + blas 109 + lapack 110 + glpk 111 + protobuf 112 + json_c 113 + libxml2 114 + hdf5 115 + curl 116 + libarchive 117 + bzip2 118 + xz 119 + snappy 120 + lzo 121 + nlopt 122 + lp_solve 123 + colpack 124 + ] ++ lib.optionals pythonSupport (with pythonPackages; [ python numpy ]) 125 + ++ lib.optional opencvSupport opencv; 126 + 127 + cmakeFlags = let 128 + enableIf = cond: if cond then "ON" else "OFF"; 129 + in [ 130 + "-DBUILD_META_EXAMPLES=ON" 131 + "-DCMAKE_DISABLE_FIND_PACKAGE_ARPACK=ON" 132 + "-DCMAKE_DISABLE_FIND_PACKAGE_ARPREC=ON" 133 + "-DCMAKE_DISABLE_FIND_PACKAGE_CPLEX=ON" 134 + "-DCMAKE_DISABLE_FIND_PACKAGE_Mosek=ON" 135 + "-DCMAKE_DISABLE_FIND_PACKAGE_TFLogger=ON" 136 + "-DCMAKE_DISABLE_FIND_PACKAGE_ViennaCL=ON" 137 + "-DCMAKE_SKIP_BUILD_RPATH=OFF" 138 + "-DCMAKE_CTEST_ARGUMENTS='--exclude-regex;TrainedModelSerialization'" # Sporadic segfault 139 + "-DENABLE_TESTING=${enableIf doCheck}" 140 + "-DDISABLE_META_INTEGRATION_TESTS=ON" 141 + "-DTRAVIS_DISABLE_META_CPP=ON" 142 + "-DPythonModular=${enableIf pythonSupport}" 143 + "-DOpenCV=${enableIf opencvSupport}" 144 + "-DUSE_SVMLIGHT=${enableIf withSvmLight}" 145 + ]; 68 146 69 - nativeBuildInputs = [ cmake ]; 70 - buildInputs = with lib; [ 71 - blas lapack bzip2 colpack curl ctags eigen hdf5 json_c lp_solve xz lzo 72 - protobuf nlopt snappy swig (libarchive.dev) libxml2 lapack glpk 73 - ] 74 - ++ optionals (pythonSupport) (with pythonPackages; [ python ply numpy ]) 75 - ++ optional (opencvSupport) opencv; 147 + CXXFLAGS = "-faligned-new"; 76 148 77 - NIX_CFLAGS_COMPILE="-faligned-new"; 149 + doCheck = true; 78 150 79 - cmakeFlags = 80 - let 81 - onOff = b: if b then "ON" else "OFF"; 82 - flag = n: b: "-D"+n+"="+onOff b; 83 - in 84 - with lib; [ 85 - (flag "ENABLE_TESTING" doCheck) 86 - (flag "BUILD_META_EXAMPLES" doCheck) 87 - (flag "CMAKE_VERBOSE_MAKEFILE:BOOL" doCheck) 88 - (flag "PythonModular" pythonSupport) 89 - (flag "OpenCV" opencvSupport) 90 - (flag "USE_SVMLIGHT" withSvmLight) 91 - ]; 151 + postUnpack = '' 152 + mkdir -p $sourceRoot/third_party/{rxcpp,GoogleMock} 153 + ln -s ${srcs.rxcpp} $sourceRoot/third_party/rxcpp/v${rxcppVersion}.tar.gz 154 + ln -s ${srcs.gtest} $sourceRoot/third_party/GoogleMock/release-${gtestVersion}.tar.gz 155 + ''; 92 156 93 157 postPatch = '' 94 158 # Fix preprocessing SVMlight code ··· 106 170 ./scripts/light-scrubber.sh 107 171 ''; 108 172 173 + postInstall = '' 174 + mkdir -p $doc/share/doc/shogun/examples 175 + mv $out/share/shogun/examples/cpp $doc/share/doc/shogun/examples 176 + cp ../examples/undocumented/libshogun/*.cpp $doc/share/doc/shogun/examples/cpp 177 + rm -r $out/share 178 + ''; 179 + 109 180 meta = with lib; { 110 181 description = "A toolbox which offers a wide range of efficient and unified machine learning methods"; 111 182 homepage = "http://shogun-toolbox.org/"; 112 183 license = if withSvmLight then licenses.unfree else licenses.gpl3Plus; 113 - maintainers = with maintainers; [ edwtjo ]; 184 + maintainers = with maintainers; [ edwtjo smancill ]; 114 185 }; 115 186 }
+74
pkgs/applications/science/machine-learning/shogun/eigen-3.4.patch
··· 1 + From: Sebastián Mancilla <smancill@smancill.dev> 2 + Subject: [PATCH] Fix compile errors when using Eigen 3.4 3 + 4 + --- 5 + .../machine/gp/MultiLaplaceInferenceMethod.cpp | 18 +++++++++--------- 6 + 1 file changed, 9 insertions(+), 9 deletions(-) 7 + 8 + diff --git a/src/shogun/machine/gp/MultiLaplaceInferenceMethod.cpp b/src/shogun/machine/gp/MultiLaplaceInferenceMethod.cpp 9 + index 2e27678d2..60050afea 100644 10 + --- a/src/shogun/machine/gp/MultiLaplaceInferenceMethod.cpp 11 + +++ b/src/shogun/machine/gp/MultiLaplaceInferenceMethod.cpp 12 + @@ -84,9 +84,9 @@ class CMultiPsiLine : public func_base 13 + float64_t result=0; 14 + for(index_t bl=0; bl<C; bl++) 15 + { 16 + - eigen_f.block(bl*n,0,n,1)=K*alpha->block(bl*n,0,n,1)*CMath::exp(log_scale*2.0); 17 + - result+=alpha->block(bl*n,0,n,1).dot(eigen_f.block(bl*n,0,n,1))/2.0; 18 + - eigen_f.block(bl*n,0,n,1)+=eigen_m; 19 + + eigen_f.segment(bl*n,n)=K*alpha->segment(bl*n,n)*CMath::exp(log_scale*2.0); 20 + + result+=alpha->segment(bl*n,n).dot(eigen_f.segment(bl*n,n))/2.0; 21 + + eigen_f.segment(bl*n,n)+=eigen_m; 22 + } 23 + 24 + // get first and second derivatives of log likelihood 25 + @@ -272,7 +272,7 @@ void CMultiLaplaceInferenceMethod::update_alpha() 26 + { 27 + Map<VectorXd> alpha(m_alpha.vector, m_alpha.vlen); 28 + for(index_t bl=0; bl<C; bl++) 29 + - eigen_mu.block(bl*n,0,n,1)=eigen_ktrtr*CMath::exp(m_log_scale*2.0)*alpha.block(bl*n,0,n,1); 30 + + eigen_mu.segment(bl*n,n)=eigen_ktrtr*CMath::exp(m_log_scale*2.0)*alpha.segment(bl*n,n); 31 + 32 + //alpha'*(f-m)/2.0 33 + Psi_New=alpha.dot(eigen_mu)/2.0; 34 + @@ -316,7 +316,7 @@ void CMultiLaplaceInferenceMethod::update_alpha() 35 + 36 + for(index_t bl=0; bl<C; bl++) 37 + { 38 + - VectorXd eigen_sD=eigen_dpi.block(bl*n,0,n,1).cwiseSqrt(); 39 + + VectorXd eigen_sD=eigen_dpi.segment(bl*n,n).cwiseSqrt(); 40 + LLT<MatrixXd> chol_tmp((eigen_sD*eigen_sD.transpose()).cwiseProduct(eigen_ktrtr*CMath::exp(m_log_scale*2.0))+ 41 + MatrixXd::Identity(m_ktrtr.num_rows, m_ktrtr.num_cols)); 42 + MatrixXd eigen_L_tmp=chol_tmp.matrixU(); 43 + @@ -341,11 +341,11 @@ void CMultiLaplaceInferenceMethod::update_alpha() 44 + VectorXd tmp2=m_tmp.array().rowwise().sum(); 45 + 46 + for(index_t bl=0; bl<C; bl++) 47 + - eigen_b.block(bl*n,0,n,1)+=eigen_dpi.block(bl*n,0,n,1).cwiseProduct(eigen_mu.block(bl*n,0,n,1)-eigen_mean_bl-tmp2); 48 + + eigen_b.segment(bl*n,n)+=eigen_dpi.segment(bl*n,n).cwiseProduct(eigen_mu.segment(bl*n,n)-eigen_mean_bl-tmp2); 49 + 50 + Map<VectorXd> &eigen_c=eigen_W; 51 + for(index_t bl=0; bl<C; bl++) 52 + - eigen_c.block(bl*n,0,n,1)=eigen_E.block(0,bl*n,n,n)*(eigen_ktrtr*CMath::exp(m_log_scale*2.0)*eigen_b.block(bl*n,0,n,1)); 53 + + eigen_c.segment(bl*n,n)=eigen_E.block(0,bl*n,n,n)*(eigen_ktrtr*CMath::exp(m_log_scale*2.0)*eigen_b.segment(bl*n,n)); 54 + 55 + Map<MatrixXd> c_tmp(eigen_c.data(),n,C); 56 + 57 + @@ -409,7 +409,7 @@ float64_t CMultiLaplaceInferenceMethod::get_derivative_helper(SGMatrix<float64_t 58 + { 59 + result+=((eigen_E.block(0,bl*n,n,n)-eigen_U.block(0,bl*n,n,n).transpose()*eigen_U.block(0,bl*n,n,n)).array() 60 + *eigen_dK.array()).sum(); 61 + - result-=(eigen_dK*eigen_alpha.block(bl*n,0,n,1)).dot(eigen_alpha.block(bl*n,0,n,1)); 62 + + result-=(eigen_dK*eigen_alpha.segment(bl*n,n)).dot(eigen_alpha.segment(bl*n,n)); 63 + } 64 + 65 + return result/2.0; 66 + @@ -489,7 +489,7 @@ SGVector<float64_t> CMultiLaplaceInferenceMethod::get_derivative_wrt_mean( 67 + result[i]=0; 68 + //currently only compute the explicit term 69 + for(index_t bl=0; bl<C; bl++) 70 + - result[i]-=eigen_alpha.block(bl*n,0,n,1).dot(eigen_dmu); 71 + + result[i]-=eigen_alpha.segment(bl*n,n).dot(eigen_dmu); 72 + } 73 + 74 + return result;
+1 -10
pkgs/top-level/all-packages.nix
··· 26935 26935 shotcut = libsForQt5.callPackage ../applications/video/shotcut { }; 26936 26936 26937 26937 shogun = callPackage ../applications/science/machine-learning/shogun { 26938 - stdenv = gcc8Stdenv; 26939 - 26940 - # Workaround for the glibc abi version mismatch. 26941 - # Please note that opencv builds are by default disabled. 26942 - opencv = opencv3.override { 26943 - stdenv = gcc8Stdenv; 26944 - openexr = openexr.override { 26945 - stdenv = gcc8Stdenv; 26946 - }; 26947 - }; 26938 + opencv = opencv3; 26948 26939 }; 26949 26940 26950 26941 smplayer = libsForQt5.callPackage ../applications/video/smplayer { };