{"action":"created","comment":{"url":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/comments/181265605","pull_request_review_id":111652735,"id":181265605,"diff_hunk":"@@ -0,0 +1,372 @@\n+# ELEKTRONN3 - Neural Network Toolkit\n+#\n+# Copyright (c) 2017 - now\n+# Max Planck Institute of Neurobiology, Munich, Germany\n+# Authors: Martin Drawitsch, Philipp Schubert, Marius Killinger\n+\n+import numpy as np\n+import time\n+import h5py as h5\n+from scipy import ndimage\n+import os\n+from elektronn3.data.blob_generator import BlobGenerator\n+\n+\n+class IncorrectLimits(Exception):\n+    pass\n+\n+\n+class IncorrectThreshold(Exception):\n+    pass\n+\n+\n+class IncorrectType(Exception):\n+    pass\n+\n+\n+class FunctionCallsCounter():\n+    counter = 0\n+\n+\n+class ScheduledVariable(object):\n+    \"\"\" The class is responsible for variable scheduling along an iteration\n+    process according to the exponential law. The user specifies\n+    the initial value, the target one and the number of steps\n+    along which the variable will be gradually scaled.\n+\n+    At each iteration the user has explicitly call update_variable to\n+    update and modify the variable\n+\n+    The class overrides all comparison operators which make it easier\n+    to compare the current scheduled variable value with a float\n+    number\n+\n+    If the user doesn't specify the target value or the interval the variable\n+    works as a constant\n+\n+    \"\"\"\n+    def __init__(self, value, max_value=None, interval=None, steps_per_report=None):\n+        \"\"\"\n+        The constructor initializes all necessary variables and checks that\n+        the initial value is less than the target one\n+        Parameters\n+        ----------\n+        value - float\n+        max_value - float\n+        interval - int\n+        steps_per_report - int\n+        \"\"\"\n+        if max_value and (value > max_value):\n+            raise IncorrectLimits(\"ERROR: threshold limits are wrong: \"\n+                                  \"initial_threshold_value = %f, \"\n+                                  \"max_threshold_value = %f\" %\n+                                  (value, max_value))\n+\n+        self.value = value\n+        self.max_value = max_value\n+        self.interval = interval\n+\n+        if max_value and interval:\n+            self.base = np.power((self.max_value / self.value), 1.0 / self.interval)\n+\n+        self.steps_per_report = steps_per_report\n+        self.counter = 0\n+\n+    def update_value(self):\n+        \"\"\"\n+        The function preforms update of the scheduled variable\n+        according to the exponential law\n+        Returns\n+        -------\n+        self.value - float\n+        \"\"\"\n+\n+        if not self.max_value or not self.interval:\n+            return self.value\n+\n+        self.value *= self.base\n+\n+        if self.value > self.max_value:\n+            self.value = self.max_value\n+\n+        if self.steps_per_report:\n+            if (self.counter % self.steps_per_report) == 0:\n+                print(\"ScheduledVariable: value: %f; counter: %d\"\n+                      % (self.value, self.counter))\n+            self.counter += 1\n+\n+        return self.value\n+\n+    def get_value(self):\n+        \"\"\"\n+        The function returns the current value of the scheduled\n+        variable\n+        Returns\n+        -------\n+        self.value - float\n+        \"\"\"\n+        return self.value\n+\n+    def __lt__(self, other):\n+        return self.value < other\n+\n+    def __le__(self, other):\n+        return self.value <= other\n+\n+    def __eq__(self, other):\n+        return self.value == other\n+\n+    def __ne__(self, other):\n+        return self.value != other\n+\n+    def __gt__(self, other):\n+        return self.value > other\n+\n+    def __ge__(self, other):\n+        return self.value >= other\n+\n+\n+def check_data_erasing_config(batch,\n+                              probability,\n+                              threshold,\n+                              lim_blob_depth,\n+                              lim_blob_width,\n+                              lim_blob_height,\n+                              lim_gauss_diffusion,\n+                              verbose=False,\n+                              save_path=None,\n+                              num_steps_save=None):\n+    \"\"\" The function checks data erasing parameters and ensures the user\n+    that all parameters won't cause problem during apply_data_erasing\n+    function calls. The function throws exceptions if a conflict is\n+    detected. Use this function before training procedure to be sure the config\n+    fulfills the requirements posed by the apply_data_erasing function\n+\n+    batch - 4d float numpy array\n+        raw data batch with the format: [num_channels, depth, width, height]\n+    probability - float\n+        probability of applying the data erasing algorithm\n+    threshold - ScheduledVariable\n+        The variable controls the level of data erasing with respect to\n+        raw data batch volume\n+    lim_blob_depth - 2d int numpy array\n+        min and max values of the blob depth\n+    lim_blob_width - 2d int numpy array\n+        min and max values of the blob width\n+    lim_blob_height - 2d int numpy array\n+        min and max values of the blob height\n+    lim_gauss_diffusion - 2d int numpy array\n+        min and max values of gaussian blurring level\n+    verbose - boolean\n+        mode that controls text information on the screen\n+    save_path - str\n+        path to the files that will contain modified\n+        raw data batch in the \"h5\" format\n+    num_steps_save - int\n+        number of steps between writing modified\n+        raw data batch in the \"h5\" format\n+\n+    Returns\n+    -------\n+    None\n+    \"\"\"\n+\n+    channels, batch_depth, batch_width, batch_height = batch.shape\n+\n+    # Check the user's specified blob size.\n+    # First entry of each list must be less than the second one\n+    if lim_blob_depth[0] >= lim_blob_depth[1]:\n+        raise IncorrectLimits(\"ERROR: blob depth limits are inconsistent: \"\n+                              \"min depth = %i, max depth = %i\" %\n+                              (lim_blob_depth[0],\n+                               lim_blob_depth[1]))\n+\n+    if lim_blob_width[0] >= lim_blob_width[1]:\n+        raise IncorrectLimits(\"ERROR: blob width limits are inconsistent: \"\n+                              \"min width = %i, max width = %i\" %\n+                              (lim_blob_width[0],\n+                               lim_blob_width[1]))\n+\n+    if lim_blob_height[0] >= lim_blob_height[1]:\n+        raise IncorrectLimits(\"ERROR: blob height limits are inconsistent: \"\n+                              \"min height = %i, max height = %i\" %\n+                              (lim_blob_height[0],\n+                               lim_blob_height[1]))\n+\n+    # Сheck whether the blob size exceeds the domain (batch) size\n+    # If so, raise the corresponfing exception\n+    if lim_blob_depth[1] >= batch_depth:\n+        raise IncorrectLimits(\"ERROR: blob depth exceeds domain depth: \"\n+                              \"blob depth = %i, domain depth = %i\" %\n+                              (lim_blob_depth[1],\n+                               batch_depth))\n+\n+    elif lim_blob_height[1] >= batch_width:\n+        raise IncorrectLimits(\"ERROR: blob width exceeds domain width: \"\n+                              \"blob width = %i, domain width = %i\" %\n+                              (lim_blob_width[1],\n+                               batch_width))\n+\n+    elif lim_blob_height[1] >= batch_height:\n+        raise IncorrectLimits(\"ERROR: blob height exceeds domain height: \"\n+                              \"blob height = %i, domain height = %i\" %\n+                              (lim_blob_height[1],\n+                               batch_height))\n+\n+    # Check the data type of  the threshold variable\n+    # The threshold must have its type of ScheduledVariable\n+    if not isinstance(threshold, ScheduledVariable):\n+        raise IncorrectType(\"ERROR: threshold variable is not type of ScheduledVariable\")\n+\n+    # Check whether the theshold value specified by the user\n+    # is within the range (0.0, 1.0). If it's not, raise the\n+    # corresponding exception\n+    if threshold < 0.0 or threshold > 1.0:\n+        raise IncorrectLimits(\"ERROR: threshold of data erasing is out \"\n+                              \"of the limits [0.0,1.0]: threshold = %f\" %\n+                              (threshold))\n+\n+    # Check the user's specified level of Gaussing blurring.\n+    # First entry of the list must be less than the second one\n+    if lim_gauss_diffusion[0] >= lim_gauss_diffusion[1]:\n+        raise IncorrectLimits(\"ERROR: blob diffusion limits are inconsistent: \"\n+                              \"min diff = %i, max diff = %i\" %\n+                              (lim_gauss_diffusion[0],\n+                               lim_gauss_diffusion[1]))\n+\n+    # Check whether the probability value specified by the user\n+    # is within the range (0.0, 1.0). If it's not, raise the\n+    # corresponding exception\n+    if probability < 0.0 or probability > 1.0:\n+        raise IncorrectLimits(\"ERROR: probability of data erasing is out \"\n+                              \"of the limits [0.0,1.0]: probability = %f\" %\n+                              (probability))\n+\n+    # Check whether the directory specified by the user exists.\n+    # If no, try to create the dirrectory using the path\n+    # passed by the user to the function\n+    if save_path is not None:\n+        if not os.path.isdir(save_path):\n+            os.makedirs(save_path)\n+\n+\n+def apply_data_erasing(batch,\n+                       probability,\n+                       threshold,\n+                       lim_blob_depth,\n+                       lim_blob_width,\n+                       lim_blob_height,\n+                       lim_gauss_diffusion,\n+                       verbose=False,\n+                       save_path=None,\n+                       num_steps_save=None):\n+    \"\"\" The function takes a batch and applies data erasing.\n+    At the beginning the function generates a random number within\n+    the range [0,1) and compares it with the probability value passed\n+    by the user. If the random number exceeds the probability value\n+    the function terminates and returns the controls to the caller.\n+    Otherwise, the function generates random blobs within a raw data batch\n+    volume until the total accumulated blob volume exceeds that value\n+    specified by means of the threshold variable. The threshold denotes\n+    the percentage of raw data batch volume that has to be filled in\n+    by blobs. Blobs have different spatial size which is randomly\n+    generated within the ranges specified by the user.\n+    Moreover, the volume within a blob is blurred by the Gaussian filter.\n+    The user is responsible to pass range of the Gaussian\n+    blurring filter levels\n+\n+    Parameters\n+    ----------\n+    batch - 4d float numpy array\n+        raw data batch with the format: [num_channels, depth, width, height]\n+    probability - float\n+        probability of applying the data erasing algorithm\n+    threshold - ScheduledVariable\n+        The variable controls the level of data erasing with respect to\n+        raw data batch volume\n+    lim_blob_depth - 2d int numpy array\n+        min and max values of the blob depth\n+    lim_blob_width - 2d int numpy array\n+        min and max values of the blob width\n+    lim_blob_height - 2d int numpy array\n+        min and max values of the blob height\n+    lim_gauss_diffusion - 2d int numpy array\n+        min and max values of gaussian blurring level\n+    verbose - boolean\n+        mode that controls text information on the screen\n+    save_path - str\n+        path to the files that will contain modified\n+        raw data batch in the \"h5\" format\n+    num_steps_save - int\n+        number of steps between writing modified\n+        raw data batch in the \"h5\" format\n+\n+    Returns\n+    -------\n+    None\n+    \"\"\"\n+\n+    if np.random.rand() > probability:\n+        return\n+\n+    channels, batch_depth, batch_width, batch_height = batch.shape\n+    batch_volume = batch_depth * batch_width * batch_height","path":"elektronn3/data/data_erasing.py","position":313,"original_position":313,"commit_id":"6db57962b5f351b6360f49741604e7400393914e","original_commit_id":"6db57962b5f351b6360f49741604e7400393914e","user":{"login":"mdraw","id":6719909,"avatar_url":"https://avatars3.githubusercontent.com/u/6719909?v=4","gravatar_id":"","url":"https://api.github.com/users/mdraw","html_url":"https://github.com/mdraw","followers_url":"https://api.github.com/users/mdraw/followers","following_url":"https://api.github.com/users/mdraw/following{/other_user}","gists_url":"https://api.github.com/users/mdraw/gists{/gist_id}","starred_url":"https://api.github.com/users/mdraw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mdraw/subscriptions","organizations_url":"https://api.github.com/users/mdraw/orgs","repos_url":"https://api.github.com/users/mdraw/repos","events_url":"https://api.github.com/users/mdraw/events{/privacy}","received_events_url":"https://api.github.com/users/mdraw/received_events","type":"User","site_admin":false},"body":"(Low priority:) `volume = np.prod(inp.shape[1:])` (given that `batch` is renamed to `inp`.","created_at":"2018-04-13T01:30:34Z","updated_at":"2018-04-13T01:53:42Z","html_url":"https://github.com/ELEKTRONN/elektronn3/pull/18#discussion_r181265605","pull_request_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/18","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/comments/181265605"},"html":{"href":"https://github.com/ELEKTRONN/elektronn3/pull/18#discussion_r181265605"},"pull_request":{"href":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/18"}}},"pull_request":{"url":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/18","id":181219542,"html_url":"https://github.com/ELEKTRONN/elektronn3/pull/18","diff_url":"https://github.com/ELEKTRONN/elektronn3/pull/18.diff","patch_url":"https://github.com/ELEKTRONN/elektronn3/pull/18.patch","issue_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/issues/18","number":18,"state":"open","locked":false,"title":"[WIP] Add local blur (\"blob\") augmentations","user":{"login":"mdraw","id":6719909,"avatar_url":"https://avatars3.githubusercontent.com/u/6719909?v=4","gravatar_id":"","url":"https://api.github.com/users/mdraw","html_url":"https://github.com/mdraw","followers_url":"https://api.github.com/users/mdraw/followers","following_url":"https://api.github.com/users/mdraw/following{/other_user}","gists_url":"https://api.github.com/users/mdraw/gists{/gist_id}","starred_url":"https://api.github.com/users/mdraw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mdraw/subscriptions","organizations_url":"https://api.github.com/users/mdraw/orgs","repos_url":"https://api.github.com/users/mdraw/repos","events_url":"https://api.github.com/users/mdraw/events{/privacy}","received_events_url":"https://api.github.com/users/mdraw/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-04-12T14:21:03Z","updated_at":"2018-04-13T01:53:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e3059eeb2bfaee5933bcd914be96ef1873e796d1","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/18/commits","review_comments_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/18/comments","review_comment_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/issues/18/comments","statuses_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/statuses/6db57962b5f351b6360f49741604e7400393914e","head":{"label":"ELEKTRONN:ravil","ref":"ravil","sha":"6db57962b5f351b6360f49741604e7400393914e","user":{"login":"ELEKTRONN","id":14909447,"avatar_url":"https://avatars1.githubusercontent.com/u/14909447?v=4","gravatar_id":"","url":"https://api.github.com/users/ELEKTRONN","html_url":"https://github.com/ELEKTRONN","followers_url":"https://api.github.com/users/ELEKTRONN/followers","following_url":"https://api.github.com/users/ELEKTRONN/following{/other_user}","gists_url":"https://api.github.com/users/ELEKTRONN/gists{/gist_id}","starred_url":"https://api.github.com/users/ELEKTRONN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ELEKTRONN/subscriptions","organizations_url":"https://api.github.com/users/ELEKTRONN/orgs","repos_url":"https://api.github.com/users/ELEKTRONN/repos","events_url":"https://api.github.com/users/ELEKTRONN/events{/privacy}","received_events_url":"https://api.github.com/users/ELEKTRONN/received_events","type":"Organization","site_admin":false},"repo":{"id":113795977,"name":"elektronn3","full_name":"ELEKTRONN/elektronn3","owner":{"login":"ELEKTRONN","id":14909447,"avatar_url":"https://avatars1.githubusercontent.com/u/14909447?v=4","gravatar_id":"","url":"https://api.github.com/users/ELEKTRONN","html_url":"https://github.com/ELEKTRONN","followers_url":"https://api.github.com/users/ELEKTRONN/followers","following_url":"https://api.github.com/users/ELEKTRONN/following{/other_user}","gists_url":"https://api.github.com/users/ELEKTRONN/gists{/gist_id}","starred_url":"https://api.github.com/users/ELEKTRONN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ELEKTRONN/subscriptions","organizations_url":"https://api.github.com/users/ELEKTRONN/orgs","repos_url":"https://api.github.com/users/ELEKTRONN/repos","events_url":"https://api.github.com/users/ELEKTRONN/events{/privacy}","received_events_url":"https://api.github.com/users/ELEKTRONN/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ELEKTRONN/elektronn3","description":"Utilities for 3D CNNs in PyTorch","fork":false,"url":"https://api.github.com/repos/ELEKTRONN/elektronn3","forks_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/forks","keys_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/teams","hooks_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/hooks","issue_events_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/issues/events{/number}","events_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/events","assignees_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/assignees{/user}","branches_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/branches{/branch}","tags_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/tags","blobs_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/git/refs{/sha}","trees_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/statuses/{sha}","languages_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/languages","stargazers_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/stargazers","contributors_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/contributors","subscribers_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/subscribers","subscription_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/subscription","commits_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/commits{/sha}","git_commits_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/git/commits{/sha}","comments_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/comments{/number}","issue_comment_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/issues/comments{/number}","contents_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/contents/{+path}","compare_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/merges","archive_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/downloads","issues_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/issues{/number}","pulls_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls{/number}","milestones_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/milestones{/number}","notifications_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/labels{/name}","releases_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/releases{/id}","deployments_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/deployments","created_at":"2017-12-11T00:53:48Z","updated_at":"2018-04-06T20:47:39Z","pushed_at":"2018-04-12T14:21:03Z","git_url":"git://github.com/ELEKTRONN/elektronn3.git","ssh_url":"git@github.com:ELEKTRONN/elektronn3.git","clone_url":"https://github.com/ELEKTRONN/elektronn3.git","svn_url":"https://github.com/ELEKTRONN/elektronn3","homepage":null,"size":376,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":15,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":0,"open_issues":15,"watchers":1,"default_branch":"master"}},"base":{"label":"ELEKTRONN:master","ref":"master","sha":"cacafe99f70d4e452f658b370c2ed6f7f845810c","user":{"login":"ELEKTRONN","id":14909447,"avatar_url":"https://avatars1.githubusercontent.com/u/14909447?v=4","gravatar_id":"","url":"https://api.github.com/users/ELEKTRONN","html_url":"https://github.com/ELEKTRONN","followers_url":"https://api.github.com/users/ELEKTRONN/followers","following_url":"https://api.github.com/users/ELEKTRONN/following{/other_user}","gists_url":"https://api.github.com/users/ELEKTRONN/gists{/gist_id}","starred_url":"https://api.github.com/users/ELEKTRONN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ELEKTRONN/subscriptions","organizations_url":"https://api.github.com/users/ELEKTRONN/orgs","repos_url":"https://api.github.com/users/ELEKTRONN/repos","events_url":"https://api.github.com/users/ELEKTRONN/events{/privacy}","received_events_url":"https://api.github.com/users/ELEKTRONN/received_events","type":"Organization","site_admin":false},"repo":{"id":113795977,"name":"elektronn3","full_name":"ELEKTRONN/elektronn3","owner":{"login":"ELEKTRONN","id":14909447,"avatar_url":"https://avatars1.githubusercontent.com/u/14909447?v=4","gravatar_id":"","url":"https://api.github.com/users/ELEKTRONN","html_url":"https://github.com/ELEKTRONN","followers_url":"https://api.github.com/users/ELEKTRONN/followers","following_url":"https://api.github.com/users/ELEKTRONN/following{/other_user}","gists_url":"https://api.github.com/users/ELEKTRONN/gists{/gist_id}","starred_url":"https://api.github.com/users/ELEKTRONN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ELEKTRONN/subscriptions","organizations_url":"https://api.github.com/users/ELEKTRONN/orgs","repos_url":"https://api.github.com/users/ELEKTRONN/repos","events_url":"https://api.github.com/users/ELEKTRONN/events{/privacy}","received_events_url":"https://api.github.com/users/ELEKTRONN/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ELEKTRONN/elektronn3","description":"Utilities for 3D CNNs in PyTorch","fork":false,"url":"https://api.github.com/repos/ELEKTRONN/elektronn3","forks_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/forks","keys_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/teams","hooks_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/hooks","issue_events_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/issues/events{/number}","events_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/events","assignees_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/assignees{/user}","branches_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/branches{/branch}","tags_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/tags","blobs_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/git/refs{/sha}","trees_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/statuses/{sha}","languages_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/languages","stargazers_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/stargazers","contributors_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/contributors","subscribers_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/subscribers","subscription_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/subscription","commits_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/commits{/sha}","git_commits_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/git/commits{/sha}","comments_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/comments{/number}","issue_comment_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/issues/comments{/number}","contents_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/contents/{+path}","compare_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/merges","archive_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/downloads","issues_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/issues{/number}","pulls_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls{/number}","milestones_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/milestones{/number}","notifications_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/labels{/name}","releases_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/releases{/id}","deployments_url":"https://api.github.com/repos/ELEKTRONN/elektronn3/deployments","created_at":"2017-12-11T00:53:48Z","updated_at":"2018-04-06T20:47:39Z","pushed_at":"2018-04-12T14:21:03Z","git_url":"git://github.com/ELEKTRONN/elektronn3.git","ssh_url":"git@github.com:ELEKTRONN/elektronn3.git","clone_url":"https://github.com/ELEKTRONN/elektronn3.git","svn_url":"https://github.com/ELEKTRONN/elektronn3","homepage":null,"size":376,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":15,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":0,"open_issues":15,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/18"},"html":{"href":"https://github.com/ELEKTRONN/elektronn3/pull/18"},"issue":{"href":"https://api.github.com/repos/ELEKTRONN/elektronn3/issues/18"},"comments":{"href":"https://api.github.com/repos/ELEKTRONN/elektronn3/issues/18/comments"},"review_comments":{"href":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/18/comments"},"review_comment":{"href":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ELEKTRONN/elektronn3/pulls/18/commits"},"statuses":{"href":"https://api.github.com/repos/ELEKTRONN/elektronn3/statuses/6db57962b5f351b6360f49741604e7400393914e"}},"author_association":"OWNER"}}
{"actor":{"display_login":"mdraw"}}