about summary refs log tree commit diff
path: root/pkgs/development/haskell-modules/configuration-tensorflow.nix
blob: aab416b9a87b66a9eee77cd3930cf1777bddbe75 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
{ pkgs, haskellLib }:

with haskellLib;

self: super:
let
  # This contains updates to the dependencies, without which it would
  # be even more work to get it to build.
  # As of 2020-04, there's no new release in sight, which is why we're
  # pulling from Github.
  tensorflow-haskell = pkgs.fetchFromGitHub {
    owner = "tensorflow";
    repo = "haskell";
    rev = "0f322b2e0611cbe7011c84ba8b6cb822e4725ebc";
    sha256 = "15gn66i547q20sd50ixwm6yk1g00syfgxp8xa6xjd0i3kcsl3gs1";
    fetchSubmodules = true;
  };

  setTensorflowSourceRoot = dir: drv:
    (overrideCabal drv (drv: { src = tensorflow-haskell; }))
      .overrideAttrs (_oldAttrs: {sourceRoot = "source/${dir}";});

  proto-lens = self.proto-lens_0_5_1_0;
  proto-lens-protoc = self.proto-lens-protoc_0_5_0_0;
  proto-lens-runtime = self.proto-lens-runtime_0_5_0_0;
  proto-lens-protobuf-types = self.proto-lens-protobuf-types_0_5_0_0;
  proto-lens-setup = self.proto-lens-setup_0_4_0_2;
  lens-family = self.lens-family_1_2_3;
in
{
  lens-family_1_2_3 = super.lens-family_1_2_3.override {
    lens-family-core = self.lens-family-core_1_2_3;
  };
  
  proto-lens_0_5_1_0 = (appendPatch (doJailbreak super.proto-lens_0_5_1_0) ./patches/proto-lens-0.5.1.0.patch).override {
    inherit lens-family;
  };

  proto-lens-runtime_0_5_0_0 = doJailbreak (super.proto-lens-runtime_0_5_0_0.override {
    inherit lens-family proto-lens;
  });

  proto-lens-protoc_0_5_0_0 = doJailbreak (super.proto-lens-protoc_0_5_0_0.override {
    inherit lens-family proto-lens;
    haskell-src-exts = self.haskell-src-exts_1_19_1;
  });
  proto-lens-setup_0_4_0_2 = appendPatch (doJailbreak (super.proto-lens-setup_0_4_0_2.override {
    inherit proto-lens-protoc;
  })) ./patches/proto-lens-setup-0.4.0.2.patch;

  proto-lens-protobuf-types_0_5_0_0 = doJailbreak (super.proto-lens-protobuf-types_0_5_0_0.override {
    inherit lens-family proto-lens proto-lens-runtime proto-lens-setup;
  });

  haskell-src-exts_1_19_1 = appendPatches (doJailbreak super.haskell-src-exts_1_19_1) [
    # Adapt to the Semigroup–Monoid Proposal (enables building on GHC >= 8.4)
    (pkgs.fetchpatch {
        url = "https://github.com/haskell-suite/haskell-src-exts/commit/258e072fe9e37f94360b7488b58ea2832843bbb8.patch";
        sha256 = "0ja6ai41v9plinlhjwja282m6ahn6mw4xi79np0jxqk83cg0z1ff";
    })
    # Adapt to MonadFail proposal (enables building on GHC >= 8.8)
    (pkgs.fetchpatch {
        url = "https://gist.githubusercontent.com/mikesperber/0f2addaf3fbe97ffb4a5234d8711ba41/raw/e09e20998283c7195e82d546ba9266d290eb000d/gistfile1.txt";
        sha256 = "18clvli7vpqsqlf2f3qidn71738j9zdlpana6wha3x0dxwan5ly0";
    }) ];

  tensorflow-proto = (setTensorflowSourceRoot "tensorflow-proto" super.tensorflow-proto).override {
    inherit proto-lens proto-lens-runtime proto-lens-setup proto-lens-protobuf-types;
  };

  tensorflow = (setTensorflowSourceRoot "tensorflow" super.tensorflow).override {
    inherit lens-family proto-lens;
    # the "regular" Python package does not seem to include the binary library
    libtensorflow = pkgs.libtensorflow-bin;
  };

  tensorflow-core-ops = (setTensorflowSourceRoot "tensorflow-core-ops" super.tensorflow-core-ops).override {
    inherit lens-family proto-lens;
  };

  tensorflow-logging = (setTensorflowSourceRoot "tensorflow-logging" super.tensorflow-logging).override {
    inherit lens-family proto-lens;
  };

  tensorflow-mnist = (setTensorflowSourceRoot "tensorflow-mnist" super.tensorflow-mnist).override {
    inherit lens-family proto-lens;
    # https://github.com/tensorflow/haskell/issues/215
    tensorflow-mnist-input-data = self.tensorflow-mnist-input-data;
  };

  tensorflow-mnist-input-data = setTensorflowSourceRoot "tensorflow-mnist-input-data" (super.callPackage (
    { mkDerivation, base, bytestring, Cabal, cryptonite, directory
    , filepath, HTTP, network-uri, stdenv
    }:

    let
      fileInfos = {
        "train-images-idx3-ubyte.gz" = "440fcabf73cc546fa21475e81ea370265605f56be210a4024d2ca8f203523609";
        "train-labels-idx1-ubyte.gz" = "3552534a0a558bbed6aed32b30c495cca23d567ec52cac8be1a0730e8010255c";
        "t10k-images-idx3-ubyte.gz"  = "8d422c7b0a1c1c79245a5bcf07fe86e33eeafee792b84584aec276f5a2dbc4e6";
        "t10k-labels-idx1-ubyte.gz"  = "f7ae60f92e00ec6debd23a6088c31dbd2371eca3ffa0defaefb259924204aec6";
      };
      downloads = with pkgs.lib; flip mapAttrsToList fileInfos (name: sha256:
                    pkgs.fetchurl {
                      url = "http://yann.lecun.com/exdb/mnist/${name}";
                      inherit sha256;
                    });
    in
    mkDerivation {
      pname = "tensorflow-mnist-input-data";
      version = "0.1.0.0";
      enableSeparateDataOutput = true;
      setupHaskellDepends = [
        base bytestring Cabal cryptonite directory filepath HTTP
        network-uri
      ];
      preConfigure = pkgs.lib.strings.concatStringsSep "\n" (
          map (x: "ln -s ${x} data/$(stripHash ${x})") downloads
        );
      libraryHaskellDepends = [ base ];
      homepage = "https://github.com/tensorflow/haskell#readme";
      description = "Downloader of input data for training MNIST";
      license = stdenv.lib.licenses.asl20;
    }
  ) {});

  tensorflow-opgen = (setTensorflowSourceRoot "tensorflow-opgen" super.tensorflow-opgen).override {
    inherit lens-family proto-lens;
  };

  tensorflow-ops = (setTensorflowSourceRoot "tensorflow-ops" super.tensorflow-ops).override {
    inherit lens-family proto-lens;
  };
}