{"action":"created","comment":{"url":"https://api.github.com/repos/intel-analytics/BigDL/pulls/comments/138084529","pull_request_review_id":61834684,"id":138084529,"diff_hunk":"@@ -0,0 +1,369 @@\n+/*\n+ * Copyright 2016 The BigDL Authors.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *     http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+package com.intel.analytics.bigdl.tensor\n+\n+import breeze.linalg.{DenseMatrix, DenseVector}\n+import com.intel.analytics.bigdl.bigquant.BigQuant\n+import com.intel.analytics.bigdl.nn.quantized._\n+import com.intel.analytics.bigdl.tensor.TensorNumericMath.TensorNumeric\n+import com.intel.analytics.bigdl.utils.Table\n+import java.nio.ByteBuffer\n+import org.apache.spark.mllib.linalg\n+import org.apache.spark.mllib.linalg.Matrix\n+import scala.reflect.ClassTag\n+\n+@SerialVersionUID(- 1766499387282335147L)\n+private[bigdl] class QuantizedTensor[@specialized(Float) T: ClassTag](\n+  private var _size: Array[Int],\n+  private var _stride: Array[Int],\n+  var nDimension: Int)(implicit ev: TensorNumeric[T]) extends QuantTensorUnsupported[T] {\n+  @transient private var desc = 0L\n+  private var value: Array[Byte] = null\n+\n+  var maxOfRow: Array[T] = null\n+  var minOfRow: Array[T] = null\n+  var sumOfRow: Array[T] = null\n+\n+  var params: DescParams = _\n+  var descType: DescType = _\n+\n+  def getStorage: Array[Byte] = {\n+    value\n+  }\n+\n+  def getNativeStorage: Long = {\n+    desc\n+  }\n+\n+  def release(): this.type = {\n+    if (desc != 0) {\n+      BigQuant.FreeMemory(desc)\n+    }\n+    desc = 0L\n+    this\n+  }\n+\n+  override def equals(obj: Any): Boolean = {\n+    if (obj == null) {\n+      return false\n+    }\n+\n+    if (!obj.isInstanceOf[QuantizedTensor[T]]) {\n+      return false\n+    }\n+\n+    val other = obj.asInstanceOf[QuantizedTensor[T]]\n+    if (this.eq(other)) {\n+      return true\n+    }\n+\n+    if (this.nDimension != other.nDimension) {\n+      return false\n+    }\n+\n+    var d = 1\n+    while (d <= this.nDimension) {\n+      if (this.size(d) != other.size(d)) {\n+        return false\n+      }\n+      d += 1\n+    }\n+\n+    var result = true\n+    for (i <- value.indices) {\n+      result = value(i) == other.getStorage(i)\n+    }\n+\n+    result\n+  }\n+\n+  override def hashCode(): Int = {\n+    val seed = 37\n+    var hash = 1\n+\n+    hash = hash * seed + this.nDimension\n+    var d = 1\n+    while (d <= this.nDimension) {\n+      hash = hash * seed + this.size(d)\n+      d += 1\n+    }\n+\n+    if (value != null) {\n+      var i = 0\n+      while (i < value.length) {\n+        hash = hash * seed + value(i).toFloat.hashCode()\n+        i += 1\n+      }\n+    }\n+\n+    hash\n+  }\n+\n+  def this()(implicit ev: TensorNumeric[T]) = this(null, null, 0)\n+\n+  def this(d1: Int)(implicit ev: TensorNumeric[T]) = this(Array(d1), Array(1), 1)\n+\n+  def this(d1: Int, d2: Int)(implicit ev: TensorNumeric[T]) = this(Array(d1, d2), Array(d2, 1), 2)\n+\n+  def this(d1: Int, d2: Int, d3: Int)(implicit ev: TensorNumeric[T]) =\n+    this(Array(d1, d2, d3), Array(d3 * d2, d3, 1), 3)\n+\n+  def this(d1: Int, d2: Int, d3: Int, d4: Int)(implicit ev: TensorNumeric[T]) =\n+    this(Array(d1, d2, d3, d4), Array(d4 * d3 * d2, d4 * d3, d4, 1), 4)\n+\n+  def this(d1: Int, d2: Int, d3: Int, d4: Int, d5: Int)(implicit ev: TensorNumeric[T]) =\n+    this(Array(d1, d2, d3, d4, d5), Array(d5 * d4 * d3 * d2, d5 * d4 * d3, d5 * d4, d5, 1), 5)\n+\n+  def this(size: Array[Int])(implicit ev: TensorNumeric[T]) =\n+    this(size, DenseTensor.size2Stride(size), size.length)\n+\n+  private def createInternalStorage(tensor: Tensor[T]): Array[Byte] = {\n+    val size = tensor.size(1)\n+    maxOfRow = new Array[T](size)\n+    minOfRow = new Array[T](size)\n+    sumOfRow = new Array[T](size)\n+\n+    for (i <- 1 to size) {\n+      val tmp = tensor.select(1, i)\n+      minOfRow(i - 1) = tmp.min()\n+      maxOfRow(i - 1) = tmp.max()\n+      sumOfRow(i - 1) = tmp.sum()\n+    }\n+\n+    val bytes = new Array[Byte](this.nElement())\n+    val bytesOffset = 0\n+    ev.getType() match {\n+      case FloatType =>\n+        Quantization.quantize(tensor.asInstanceOf[Tensor[Float]], bytes, bytesOffset)\n+      case _ =>\n+        throw new UnsupportedOperationException(s\"Only support Float for quantized model\")\n+    }\n+\n+    bytes\n+  }\n+\n+  // TODO rename init\n+  def init(params: DescParams, descType: DescType): Unit = {\n+    // two cases:\n+    // weight init\n+    // the input attributes have been changed\n+    if (this.desc == 0L || this.params != params) {\n+      release()\n+      this.desc = Desc.get(params, descType, this)\n+    }\n+  }\n+\n+  override def getTensorType: TensorType = QuantizedType\n+\n+  override def dim(): Int = nDimension\n+\n+  override def size(): Array[Int] = _size\n+\n+  override def size(dim: Int): Int = {\n+    require(dim > 0 && dim <= this.nDimension,\n+      s\"dimension ${dim} out of range of ${this.nDimension}D tensor\")\n+    _size(dim - 1)\n+  }\n+\n+  override def stride(): Array[Int] = _stride.slice(0, this.nDimension)\n+\n+  override def stride(dim: Int): Int = {\n+    require(dim > 0 && dim <= this.nDimension,\n+      s\"dimension ${dim} out of range of ${this.nDimension}D tensor\")\n+    _stride(dim - 1)\n+  }\n+\n+  override def resize(sizes: Array[Int], strides: Array[Int]): Tensor[T] = {\n+    _size = sizes\n+    _stride = strides\n+    this\n+  }\n+\n+  override def resize(size1: Int): Tensor[T] = {\n+    if (this.nDimension != 1 || this.size(1) != size1) {\n+      resize(Array(size1))\n+    } else {\n+      this\n+    }\n+  }\n+\n+  override def resize(size1: Int, size2: Int): Tensor[T] = {\n+    if (this.nDimension != 2 || this.size(1) != size1 || this.size(2) != size2) {\n+      resize(Array(size1, size2))\n+    } else {\n+      this\n+    }\n+  }\n+\n+  override def resize(size1: Int, size2: Int, size3: Int): Tensor[T] = {\n+    if (this.nDimension != 3 || this.size(1) != size1 || this.size(2) != size2 ||\n+      this.size(3) != size3) {\n+      resize(Array(size1, size2, size3))\n+    } else {\n+      this\n+    }\n+  }\n+\n+  override def resize(size1: Int, size2: Int, size3: Int, size4: Int): Tensor[T] = {\n+    if (this.nDimension != 4 || this.size(1) != size1 || this.size(2) != size2 ||\n+      this.size(3) != size3 ||\n+      this.size(4) != size4) {\n+      resize(Array(size1, size2, size3, size4))\n+    } else {\n+      this\n+    }\n+  }\n+\n+  override def resize(size1: Int, size2: Int, size3: Int, size4: Int, size5: Int): Tensor[T] = {\n+    if (this.nDimension != 5 || this.size(1) != size1 || this.size(2) != size2 ||\n+      this.size(3) != size3 || this.size(4) != size4 || this.size(5) != size5) {\n+      resize(Array(size1, size2, size3, size4, size5))\n+    } else {\n+      this\n+    }\n+  }\n+\n+  override def nElement(): Int = {\n+    if (this.nDimension == 0) {\n+      0\n+    } else {\n+      var n = 1\n+      var d = 0\n+      while (d < this.nDimension) {\n+        n = n * this._size(d)\n+        d += 1\n+      }\n+      n\n+    }\n+  }\n+\n+  override def set(): Tensor[T] = {\n+    value = null\n+    maxOfRow = null\n+    minOfRow = null\n+    sumOfRow = null\n+    desc = 0L\n+    this\n+  }\n+\n+  /**\n+   * set from other tensor, it will share the storage and desc with other\n+   *\n+   * @param other the given tensor\n+   * @return current tensor\n+   */\n+  override def set(other: Tensor[T]): Tensor[T] = {\n+    if (other.isInstanceOf[QuantizedTensor[T]]) {\n+      val o = other.asInstanceOf[QuantizedTensor[T]]\n+\n+      this.value = o.getStorage\n+      this.params = o.params\n+      this.descType = o.descType\n+      this.desc = o.getNativeStorage\n+\n+      this.maxOfRow = o.maxOfRow\n+      this.minOfRow = o.minOfRow\n+      this.sumOfRow = o.sumOfRow\n+\n+    } else {\n+      throw new UnsupportedOperationException(s\"can't set from other type of tensor.\")\n+    }\n+    this\n+  }\n+\n+  /**\n+   * copy from another QuantizedTensor, it will a new storage and new desc\n+   *\n+   * @param other source tensor\n+   * @return current tensor\n+   */\n+  override def copy(other: Tensor[T]): Tensor[T] = {\n+    if (other.isInstanceOf[QuantizedTensor[T]] && other.size().deep == this.size().deep) {\n+      val quantizedTensor = other.asInstanceOf[QuantizedTensor[T]]\n+\n+      if (value != null) {\n+        value = new Array[Byte](other.nElement())\n+      }\n+\n+      System.arraycopy(quantizedTensor.getStorage, 0, value, 0, this.nElement())\n+\n+      params = quantizedTensor.params.copy()\n+      descType = quantizedTensor.descType\n+\n+      val length = quantizedTensor.maxOfRow.length\n+      maxOfRow = new Array[T](length)\n+      System.arraycopy(quantizedTensor.maxOfRow, 0, maxOfRow, 0, length)\n+\n+      minOfRow = new Array[T](length)\n+      System.arraycopy(quantizedTensor.minOfRow, 0, minOfRow, 0, length)\n+\n+      sumOfRow = new Array[T](length)\n+      System.arraycopy(quantizedTensor.sumOfRow, 0, sumOfRow, 0, length)\n+\n+      init(params, descType)\n+    } else {\n+      throw new UnsupportedOperationException(s\"can't set from other type of tensor.\")\n+    }\n+\n+    this\n+  }\n+}\n+\n+object QuantizedTensor {\n+  def apply[@specialized(Float, Double) T: ClassTag]()(\n+    implicit ev: TensorNumeric[T]): QuantizedTensor[T] = new QuantizedTensor[T]()\n+\n+  def apply[@specialized(Float, Double) T: ClassTag](d1: Int)(\n+    implicit ev: TensorNumeric[T]): QuantizedTensor[T] = new QuantizedTensor[T](d1)\n+\n+  def apply[@specialized(Float, Double) T: ClassTag](d1: Int, d2: Int)(\n+    implicit ev: TensorNumeric[T]): QuantizedTensor[T] = new QuantizedTensor[T](d1, d2)\n+\n+  def apply[@specialized(Float, Double) T: ClassTag](d1: Int, d2: Int, d3: Int)(\n+    implicit ev: TensorNumeric[T]): QuantizedTensor[T] = new QuantizedTensor[T](d1, d2, d3)\n+\n+  def apply[@specialized(Float, Double) T: ClassTag](d1: Int, d2: Int, d3: Int, d4: Int)(\n+    implicit ev: TensorNumeric[T]): QuantizedTensor[T] = new QuantizedTensor[T](d1, d2, d3, d4)\n+\n+  def apply[@specialized(Float, Double) T: ClassTag](d1: Int, d2: Int, d3: Int, d4: Int, d5: Int)(\n+    implicit ev: TensorNumeric[T]): QuantizedTensor[T] = new QuantizedTensor[T](d1, d2, d3, d4, d5)\n+\n+  def apply[@specialized(Float, Double) T: ClassTag](size: Array[Int])(\n+    implicit ev: TensorNumeric[T]): QuantizedTensor[T] = new QuantizedTensor[T](size)\n+\n+  def apply[@specialized(Float, Double) T: ClassTag](src: Tensor[T], descParams: DescParams,\n+    descType: DescType)(implicit ev: TensorNumeric[T]): QuantizedTensor[T] = {\n+    val tensor = new QuantizedTensor[T](src.size(), src.stride(), src.nDimension())","path":"spark/dl/src/main/scala/com/intel/analytics/bigdl/tensor/QuantizedTensor.scala","position":350,"original_position":350,"commit_id":"138840af042654eba4bd7933d0b6579902d7ced9","original_commit_id":"138840af042654eba4bd7933d0b6579902d7ced9","user":{"login":"jason-dai","id":1931082,"avatar_url":"https://avatars3.githubusercontent.com/u/1931082?v=4","gravatar_id":"","url":"https://api.github.com/users/jason-dai","html_url":"https://github.com/jason-dai","followers_url":"https://api.github.com/users/jason-dai/followers","following_url":"https://api.github.com/users/jason-dai/following{/other_user}","gists_url":"https://api.github.com/users/jason-dai/gists{/gist_id}","starred_url":"https://api.github.com/users/jason-dai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jason-dai/subscriptions","organizations_url":"https://api.github.com/users/jason-dai/orgs","repos_url":"https://api.github.com/users/jason-dai/repos","events_url":"https://api.github.com/users/jason-dai/events{/privacy}","received_events_url":"https://api.github.com/users/jason-dai/received_events","type":"User","site_admin":false},"body":"Make these part of the constructor","created_at":"2017-09-11T14:19:20Z","updated_at":"2017-09-11T14:19:20Z","html_url":"https://github.com/intel-analytics/BigDL/pull/1475#discussion_r138084529","pull_request_url":"https://api.github.com/repos/intel-analytics/BigDL/pulls/1475","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/intel-analytics/BigDL/pulls/comments/138084529"},"html":{"href":"https://github.com/intel-analytics/BigDL/pull/1475#discussion_r138084529"},"pull_request":{"href":"https://api.github.com/repos/intel-analytics/BigDL/pulls/1475"}}},"pull_request":{"url":"https://api.github.com/repos/intel-analytics/BigDL/pulls/1475","id":135999723,"html_url":"https://github.com/intel-analytics/BigDL/pull/1475","diff_url":"https://github.com/intel-analytics/BigDL/pull/1475.diff","patch_url":"https://github.com/intel-analytics/BigDL/pull/1475.patch","issue_url":"https://api.github.com/repos/intel-analytics/BigDL/issues/1475","number":1475,"state":"open","locked":false,"title":"[WIP] Quantization supports","user":{"login":"i8run","id":2551195,"avatar_url":"https://avatars3.githubusercontent.com/u/2551195?v=4","gravatar_id":"","url":"https://api.github.com/users/i8run","html_url":"https://github.com/i8run","followers_url":"https://api.github.com/users/i8run/followers","following_url":"https://api.github.com/users/i8run/following{/other_user}","gists_url":"https://api.github.com/users/i8run/gists{/gist_id}","starred_url":"https://api.github.com/users/i8run/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/i8run/subscriptions","organizations_url":"https://api.github.com/users/i8run/orgs","repos_url":"https://api.github.com/users/i8run/repos","events_url":"https://api.github.com/users/i8run/events{/privacy}","received_events_url":"https://api.github.com/users/i8run/received_events","type":"User","site_admin":false},"body":"## What changes were proposed in this pull request?\r\n\r\nThis pull request supports quantization for BigDL.\r\n\r\n---\r\n\r\nSummary,\r\n\r\nCurrently, it supports quantizing a BigDL model. It contains functions below,\r\n\r\n1. Quantize model described by BigDL.\r\n    \r\n    You can use `Module.load` to load BigDL model and use `Module.quantize` to quantize the model. It will deep copy from the origin model\r\n    and return a new quantized model. so you can reuse the origin model.\r\n\r\n2. Load and save quantized model.\r\n\r\n    Currently, you can use `Module.save(model)` to save the quantized model and `Module.load(model)` to load quantized model,\r\n    which will call java serialization method. Proto style save and load will come soon.\r\n\r\n3. Do forward (updateOutput) as normal way.\r\n\r\n4. Convert different types of models (caffe, torch) and quantize the model converted.\r\n\r\n---\r\n\r\nExperiment,\r\n\r\nThese models below have been tested for correctness both local mode and cluster mode.\r\n\r\nAlexNet\r\nInception_V1\r\nInception_V2\r\nResNet-18\r\nResNet-34\r\nResNet-50\r\nResNet-101\r\nResNet-152\r\nResNet-on-Cifar10\r\nVGG-on-Cifar10\r\nLeNet5\r\nSSD\r\nRNN\r\n\r\n----\r\n\r\nCode details,\r\n\r\n1. Add a new `QuantizeTensor` which extends `Tensor[T]`. Currently, it only supports `Float` because of the backend library.\r\n2. Add a new object `Quantize` in `nn/quantization/Quantize.scala` which support quantize an array, matrix or Tensor.\r\n3. Add three layers which has same API with the MKL backend layers, besides doesn't support backword. They are Linear, SpatialConvolution and SpatialDilatedConvolution.\r\n4. Add a converter which supports converting different types of model and whether quantizing it or not.\r\n5. In BigDL, there're two types of models, sequential style and graph style. In `Module.quantize` method, it will quantize depends on the type.\r\n   For convenience, it will return a new graph which use the layers from old model for graph style and replace relative layers for sequential style model.\r\n\r\n\r\n---\r\n\r\nComing soon,\r\n\r\n1. Mac and Windows support\r\n2. Protobuf supports\r\n\r\n## How was this patch tested?\r\n\r\nUnit tests and manual tests for normal models.","created_at":"2017-08-16T11:21:17Z","updated_at":"2017-09-11T14:19:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"30a1605f41f5075e26d615ca4f0850cff54124ca","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/intel-analytics/BigDL/pulls/1475/commits","review_comments_url":"https://api.github.com/repos/intel-analytics/BigDL/pulls/1475/comments","review_comment_url":"https://api.github.com/repos/intel-analytics/BigDL/pulls/comments{/number}","comments_url":"https://api.github.com/repos/intel-analytics/BigDL/issues/1475/comments","statuses_url":"https://api.github.com/repos/intel-analytics/BigDL/statuses/138840af042654eba4bd7933d0b6579902d7ced9","head":{"label":"i8run:fixpoint","ref":"fixpoint","sha":"138840af042654eba4bd7933d0b6579902d7ced9","user":{"login":"i8run","id":2551195,"avatar_url":"https://avatars3.githubusercontent.com/u/2551195?v=4","gravatar_id":"","url":"https://api.github.com/users/i8run","html_url":"https://github.com/i8run","followers_url":"https://api.github.com/users/i8run/followers","following_url":"https://api.github.com/users/i8run/following{/other_user}","gists_url":"https://api.github.com/users/i8run/gists{/gist_id}","starred_url":"https://api.github.com/users/i8run/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/i8run/subscriptions","organizations_url":"https://api.github.com/users/i8run/orgs","repos_url":"https://api.github.com/users/i8run/repos","events_url":"https://api.github.com/users/i8run/events{/privacy}","received_events_url":"https://api.github.com/users/i8run/received_events","type":"User","site_admin":false},"repo":{"id":78086686,"name":"BigDL-1","full_name":"i8run/BigDL-1","owner":{"login":"i8run","id":2551195,"avatar_url":"https://avatars3.githubusercontent.com/u/2551195?v=4","gravatar_id":"","url":"https://api.github.com/users/i8run","html_url":"https://github.com/i8run","followers_url":"https://api.github.com/users/i8run/followers","following_url":"https://api.github.com/users/i8run/following{/other_user}","gists_url":"https://api.github.com/users/i8run/gists{/gist_id}","starred_url":"https://api.github.com/users/i8run/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/i8run/subscriptions","organizations_url":"https://api.github.com/users/i8run/orgs","repos_url":"https://api.github.com/users/i8run/repos","events_url":"https://api.github.com/users/i8run/events{/privacy}","received_events_url":"https://api.github.com/users/i8run/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/i8run/BigDL-1","description":"BigDL: Distributed Deep learning Library for Apache Spark","fork":true,"url":"https://api.github.com/repos/i8run/BigDL-1","forks_url":"https://api.github.com/repos/i8run/BigDL-1/forks","keys_url":"https://api.github.com/repos/i8run/BigDL-1/keys{/key_id}","collaborators_url":"https://api.github.com/repos/i8run/BigDL-1/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/i8run/BigDL-1/teams","hooks_url":"https://api.github.com/repos/i8run/BigDL-1/hooks","issue_events_url":"https://api.github.com/repos/i8run/BigDL-1/issues/events{/number}","events_url":"https://api.github.com/repos/i8run/BigDL-1/events","assignees_url":"https://api.github.com/repos/i8run/BigDL-1/assignees{/user}","branches_url":"https://api.github.com/repos/i8run/BigDL-1/branches{/branch}","tags_url":"https://api.github.com/repos/i8run/BigDL-1/tags","blobs_url":"https://api.github.com/repos/i8run/BigDL-1/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/i8run/BigDL-1/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/i8run/BigDL-1/git/refs{/sha}","trees_url":"https://api.github.com/repos/i8run/BigDL-1/git/trees{/sha}","statuses_url":"https://api.github.com/repos/i8run/BigDL-1/statuses/{sha}","languages_url":"https://api.github.com/repos/i8run/BigDL-1/languages","stargazers_url":"https://api.github.com/repos/i8run/BigDL-1/stargazers","contributors_url":"https://api.github.com/repos/i8run/BigDL-1/contributors","subscribers_url":"https://api.github.com/repos/i8run/BigDL-1/subscribers","subscription_url":"https://api.github.com/repos/i8run/BigDL-1/subscription","commits_url":"https://api.github.com/repos/i8run/BigDL-1/commits{/sha}","git_commits_url":"https://api.github.com/repos/i8run/BigDL-1/git/commits{/sha}","comments_url":"https://api.github.com/repos/i8run/BigDL-1/comments{/number}","issue_comment_url":"https://api.github.com/repos/i8run/BigDL-1/issues/comments{/number}","contents_url":"https://api.github.com/repos/i8run/BigDL-1/contents/{+path}","compare_url":"https://api.github.com/repos/i8run/BigDL-1/compare/{base}...{head}","merges_url":"https://api.github.com/repos/i8run/BigDL-1/merges","archive_url":"https://api.github.com/repos/i8run/BigDL-1/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/i8run/BigDL-1/downloads","issues_url":"https://api.github.com/repos/i8run/BigDL-1/issues{/number}","pulls_url":"https://api.github.com/repos/i8run/BigDL-1/pulls{/number}","milestones_url":"https://api.github.com/repos/i8run/BigDL-1/milestones{/number}","notifications_url":"https://api.github.com/repos/i8run/BigDL-1/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/i8run/BigDL-1/labels{/name}","releases_url":"https://api.github.com/repos/i8run/BigDL-1/releases{/id}","deployments_url":"https://api.github.com/repos/i8run/BigDL-1/deployments","created_at":"2017-01-05T06:36:06Z","updated_at":"2017-05-10T08:50:43Z","pushed_at":"2017-09-11T11:11:04Z","git_url":"git://github.com/i8run/BigDL-1.git","ssh_url":"git@github.com:i8run/BigDL-1.git","clone_url":"https://github.com/i8run/BigDL-1.git","svn_url":"https://github.com/i8run/BigDL-1","homepage":"","size":14980,"stargazers_count":1,"watchers_count":1,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"intel-analytics:master","ref":"master","sha":"5362f55856a9eccb59311d58311f44e000432bf8","user":{"login":"intel-analytics","id":10941215,"avatar_url":"https://avatars3.githubusercontent.com/u/10941215?v=4","gravatar_id":"","url":"https://api.github.com/users/intel-analytics","html_url":"https://github.com/intel-analytics","followers_url":"https://api.github.com/users/intel-analytics/followers","following_url":"https://api.github.com/users/intel-analytics/following{/other_user}","gists_url":"https://api.github.com/users/intel-analytics/gists{/gist_id}","starred_url":"https://api.github.com/users/intel-analytics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intel-analytics/subscriptions","organizations_url":"https://api.github.com/users/intel-analytics/orgs","repos_url":"https://api.github.com/users/intel-analytics/repos","events_url":"https://api.github.com/users/intel-analytics/events{/privacy}","received_events_url":"https://api.github.com/users/intel-analytics/received_events","type":"Organization","site_admin":false},"repo":{"id":66823715,"name":"BigDL","full_name":"intel-analytics/BigDL","owner":{"login":"intel-analytics","id":10941215,"avatar_url":"https://avatars3.githubusercontent.com/u/10941215?v=4","gravatar_id":"","url":"https://api.github.com/users/intel-analytics","html_url":"https://github.com/intel-analytics","followers_url":"https://api.github.com/users/intel-analytics/followers","following_url":"https://api.github.com/users/intel-analytics/following{/other_user}","gists_url":"https://api.github.com/users/intel-analytics/gists{/gist_id}","starred_url":"https://api.github.com/users/intel-analytics/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intel-analytics/subscriptions","organizations_url":"https://api.github.com/users/intel-analytics/orgs","repos_url":"https://api.github.com/users/intel-analytics/repos","events_url":"https://api.github.com/users/intel-analytics/events{/privacy}","received_events_url":"https://api.github.com/users/intel-analytics/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/intel-analytics/BigDL","description":"BigDL: Distributed Deep Learning Library for Apache Spark","fork":false,"url":"https://api.github.com/repos/intel-analytics/BigDL","forks_url":"https://api.github.com/repos/intel-analytics/BigDL/forks","keys_url":"https://api.github.com/repos/intel-analytics/BigDL/keys{/key_id}","collaborators_url":"https://api.github.com/repos/intel-analytics/BigDL/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/intel-analytics/BigDL/teams","hooks_url":"https://api.github.com/repos/intel-analytics/BigDL/hooks","issue_events_url":"https://api.github.com/repos/intel-analytics/BigDL/issues/events{/number}","events_url":"https://api.github.com/repos/intel-analytics/BigDL/events","assignees_url":"https://api.github.com/repos/intel-analytics/BigDL/assignees{/user}","branches_url":"https://api.github.com/repos/intel-analytics/BigDL/branches{/branch}","tags_url":"https://api.github.com/repos/intel-analytics/BigDL/tags","blobs_url":"https://api.github.com/repos/intel-analytics/BigDL/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/intel-analytics/BigDL/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/intel-analytics/BigDL/git/refs{/sha}","trees_url":"https://api.github.com/repos/intel-analytics/BigDL/git/trees{/sha}","statuses_url":"https://api.github.com/repos/intel-analytics/BigDL/statuses/{sha}","languages_url":"https://api.github.com/repos/intel-analytics/BigDL/languages","stargazers_url":"https://api.github.com/repos/intel-analytics/BigDL/stargazers","contributors_url":"https://api.github.com/repos/intel-analytics/BigDL/contributors","subscribers_url":"https://api.github.com/repos/intel-analytics/BigDL/subscribers","subscription_url":"https://api.github.com/repos/intel-analytics/BigDL/subscription","commits_url":"https://api.github.com/repos/intel-analytics/BigDL/commits{/sha}","git_commits_url":"https://api.github.com/repos/intel-analytics/BigDL/git/commits{/sha}","comments_url":"https://api.github.com/repos/intel-analytics/BigDL/comments{/number}","issue_comment_url":"https://api.github.com/repos/intel-analytics/BigDL/issues/comments{/number}","contents_url":"https://api.github.com/repos/intel-analytics/BigDL/contents/{+path}","compare_url":"https://api.github.com/repos/intel-analytics/BigDL/compare/{base}...{head}","merges_url":"https://api.github.com/repos/intel-analytics/BigDL/merges","archive_url":"https://api.github.com/repos/intel-analytics/BigDL/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/intel-analytics/BigDL/downloads","issues_url":"https://api.github.com/repos/intel-analytics/BigDL/issues{/number}","pulls_url":"https://api.github.com/repos/intel-analytics/BigDL/pulls{/number}","milestones_url":"https://api.github.com/repos/intel-analytics/BigDL/milestones{/number}","notifications_url":"https://api.github.com/repos/intel-analytics/BigDL/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/intel-analytics/BigDL/labels{/name}","releases_url":"https://api.github.com/repos/intel-analytics/BigDL/releases{/id}","deployments_url":"https://api.github.com/repos/intel-analytics/BigDL/deployments","created_at":"2016-08-29T07:59:50Z","updated_at":"2017-09-11T10:08:30Z","pushed_at":"2017-09-11T11:11:07Z","git_url":"git://github.com/intel-analytics/BigDL.git","ssh_url":"git@github.com:intel-analytics/BigDL.git","clone_url":"https://github.com/intel-analytics/BigDL.git","svn_url":"https://github.com/intel-analytics/BigDL","homepage":"https://bigdl-project.github.io/","size":14792,"stargazers_count":1981,"watchers_count":1981,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":399,"mirror_url":null,"open_issues_count":116,"forks":399,"open_issues":116,"watchers":1981,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/intel-analytics/BigDL/pulls/1475"},"html":{"href":"https://github.com/intel-analytics/BigDL/pull/1475"},"issue":{"href":"https://api.github.com/repos/intel-analytics/BigDL/issues/1475"},"comments":{"href":"https://api.github.com/repos/intel-analytics/BigDL/issues/1475/comments"},"review_comments":{"href":"https://api.github.com/repos/intel-analytics/BigDL/pulls/1475/comments"},"review_comment":{"href":"https://api.github.com/repos/intel-analytics/BigDL/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/intel-analytics/BigDL/pulls/1475/commits"},"statuses":{"href":"https://api.github.com/repos/intel-analytics/BigDL/statuses/138840af042654eba4bd7933d0b6579902d7ced9"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jason-dai"}}