depot/third_party/nixpkgs/pkgs/applications/science/machine-learning/shogun/default.nix

245 lines
6.4 KiB
Nix

{
lib,
stdenv,
fetchFromGitHub,
fetchpatch,
fetchurl,
# build
cmake,
ctags,
python3Packages,
swig,
# math
eigen,
blas,
lapack,
glpk,
# data
protobuf,
json_c,
libxml2,
hdf5,
curl,
# compression
libarchive,
bzip2,
xz,
snappy,
lzo,
# more math
nlopt,
lp_solve,
colpack,
# extra support
pythonSupport ? false,
opencvSupport ? false,
opencv ? null,
withSvmLight ? false,
}:
assert pythonSupport -> python3Packages != null;
assert opencvSupport -> opencv != null;
assert (!blas.isILP64) && (!lapack.isILP64);
let
pname = "shogun";
version = "6.1.4";
rxcppVersion = "4.0.0";
gtestVersion = "1.8.0";
srcs = {
toolbox = fetchFromGitHub {
owner = "shogun-toolbox";
repo = "shogun";
rev = "shogun_${version}";
hash = "sha256-38aULxK50wQ2+/ERosSpRyBmssmYSGv5aaWfWSlrSRc=";
fetchSubmodules = true;
};
# The CMake external projects expect the packed archives
rxcpp = fetchurl {
url = "https://github.com/Reactive-Extensions/RxCpp/archive/v${rxcppVersion}.tar.gz";
sha256 = "sha256-UOc5WrG8KgAA3xJsaSCjbdPE7gSnFJay9MEK31DWUXg=";
};
gtest = fetchurl {
url = "https://github.com/google/googletest/archive/release-${gtestVersion}.tar.gz";
sha256 = "sha256-WKb0J3yivIVlIis7vVihd2CenEiOinJkk1m6UUUNt9g=";
};
};
in
stdenv.mkDerivation (finalAttrs: {
inherit pname version;
outputs = [
"out"
"dev"
"doc"
];
src = srcs.toolbox;
patches = [
# Fix compile errors with GCC 9+
# https://github.com/shogun-toolbox/shogun/pull/4811
(fetchpatch {
url = "https://github.com/shogun-toolbox/shogun/commit/c8b670be4790e0f06804b048a6f3d77c17c3ee95.patch";
sha256 = "sha256-MxsR3Y2noFQevfqWK3nmX5iK4OVWeKBl5tfeDNgjcXk=";
})
(fetchpatch {
url = "https://github.com/shogun-toolbox/shogun/commit/5aceefd9fb0e2132c354b9a0c0ceb9160cc9b2f7.patch";
sha256 = "sha256-AgJJKQA8vc5oKaTQDqMdwBR4hT4sn9+uW0jLe7GteJw=";
})
# Fix virtual destruction
(fetchpatch {
url = "https://github.com/shogun-toolbox/shogun/commit/ef0e4dc1cc4a33c9e6b17a108fa38a436de2d7ee.patch";
sha256 = "sha256-a9Rm0ytqkSAgC3dguv8m3SwOSipb+VByBHHdmV0d63w=";
})
./fix-virtual-destruction.patch
# Fix compile errors with json-c
# https://github.com/shogun-toolbox/shogun/pull/4104
(fetchpatch {
url = "https://github.com/shogun-toolbox/shogun/commit/365ce4c4c700736d2eec8ba6c975327a5ac2cd9b.patch";
sha256 = "sha256-OhEWwrHtD/sOcjHmPY/C9zJ8ruww8yXrRcTw38nGEJU=";
})
# Fix compile errors with Eigen 3.4
./eigen-3.4.patch
] ++ lib.optional (!withSvmLight) ./svmlight-scrubber.patch;
nativeBuildInputs =
[
cmake
swig
ctags
]
++ (with python3Packages; [
python
jinja2
ply
]);
buildInputs =
[
eigen
blas
lapack
glpk
protobuf
json_c
libxml2
hdf5
curl
libarchive
bzip2
xz
snappy
lzo
nlopt
lp_solve
colpack
]
++ lib.optionals pythonSupport (
with python3Packages;
[
python
numpy
]
)
++ lib.optional opencvSupport opencv;
cmakeFlags =
let
excludeTestsRegex = lib.concatStringsSep "|" [
# segfault
"SerializationXML"
"TrainedModelSerialization"
# broken by openblas 0.3.21
"mathematics_lapack"
# fails on aarch64
"LinearTimeMMD"
"QuadraticTimeMMD"
"SGVectorTest"
"Statistics"
# hangs on aarch64
"PRange"
# these take too long on CI
"evaluation_cross_validation"
"modelselection_combined_kernel"
"modelselection_grid_search"
];
in
[
(lib.cmakeBool "BUILD_META_EXAMPLES" true)
(lib.cmakeBool "CMAKE_DISABLE_FIND_PACKAGE_ARPACK" true)
(lib.cmakeBool "CMAKE_DISABLE_FIND_PACKAGE_ARPREC" true)
(lib.cmakeBool "CMAKE_DISABLE_FIND_PACKAGE_CPLEX" true)
(lib.cmakeBool "CMAKE_DISABLE_FIND_PACKAGE_Mosek" true)
(lib.cmakeBool "CMAKE_DISABLE_FIND_PACKAGE_TFLogger" true)
(lib.cmakeBool "CMAKE_DISABLE_FIND_PACKAGE_ViennaCL" true)
(lib.cmakeFeature "CMAKE_CTEST_ARGUMENTS" "--exclude-regex;'${excludeTestsRegex}'")
(lib.cmakeBool "ENABLE_TESTING" finalAttrs.doCheck)
(lib.cmakeBool "DISABLE_META_INTEGRATION_TESTS" true)
(lib.cmakeBool "TRAVIS_DISABLE_META_CPP" true)
(lib.cmakeBool "INTERFACE_PYTHON" pythonSupport)
(lib.cmakeBool "OpenCV" opencvSupport)
(lib.cmakeBool "USE_SVMLIGHT" withSvmLight)
];
CXXFLAGS = "-faligned-new";
doCheck = true;
postUnpack = ''
mkdir -p $sourceRoot/third_party/{rxcpp,GoogleMock}
ln -s ${srcs.rxcpp} $sourceRoot/third_party/rxcpp/v${rxcppVersion}.tar.gz
ln -s ${srcs.gtest} $sourceRoot/third_party/GoogleMock/release-${gtestVersion}.tar.gz
'';
postPatch =
''
# Fix preprocessing SVMlight code
sed -i \
-e 's@#ifdef SVMLIGHT@#ifdef USE_SVMLIGHT@' \
-e '/^#ifdef USE_SVMLIGHT/,/^#endif/ s@#endif@#endif //USE_SVMLIGHT@' \
src/shogun/kernel/string/CommUlongStringKernel.cpp
sed -i -e 's/#if USE_SVMLIGHT/#ifdef USE_SVMLIGHT/' src/interfaces/swig/Machine.i
sed -i -e 's@// USE_SVMLIGHT@//USE_SVMLIGHT@' src/interfaces/swig/Transfer.i
sed -i -e 's@/\* USE_SVMLIGHT \*/@//USE_SVMLIGHT@' src/interfaces/swig/Transfer_includes.i
''
+ lib.optionalString (!withSvmLight) ''
# Run SVMlight scrubber
patchShebangs scripts/light-scrubber.sh
echo "removing SVMlight code"
./scripts/light-scrubber.sh
'';
postInstall = ''
mkdir -p $doc/share/doc/shogun/examples
mv $out/share/shogun/examples/cpp $doc/share/doc/shogun/examples
cp ../examples/undocumented/libshogun/*.cpp $doc/share/doc/shogun/examples/cpp
rm -r $out/share
'';
postFixup = ''
# CMake incorrectly calculates library path from dev prefix
substituteInPlace $dev/lib/cmake/shogun/ShogunTargets-release.cmake \
--replace-fail "\''${_IMPORT_PREFIX}/lib/" "$out/lib/"
'';
meta = with lib; {
description = "Toolbox which offers a wide range of efficient and unified machine learning methods";
homepage = "http://shogun-toolbox.org/";
license = if withSvmLight then licenses.unfree else licenses.gpl3Plus;
maintainers = with maintainers; [
edwtjo
smancill
];
};
})