{"action":"created","comment":{"url":"https://api.github.com/repos/pgmpy/pgmpy/pulls/comments/67618995","id":67618995,"diff_hunk":"@@ -0,0 +1,396 @@\n+import numpy as np\n+\n+from pgmpy.utils import _check_1d_array_object, _check_length_equal\n+\n+\n+class BaseGradLogPDF(object):\n+    \"\"\"\n+    Base class for evaluating gradient log of probability density function/ distribution\n+\n+    Classes inheriting this base class can be passed as an argument for\n+    finding gradient log of probability distribution in inference algorithms\n+\n+    The class should initialize  self.grad_log and self.log_pdf\n+\n+    Parameters\n+    ----------\n+    distribution_param : A 1d array like object (numpy.ndarray or list)\n+        Vector representing values of distribution parameter at which we want to find gradient and log\n+\n+    model : An instance of pgmpy.models\n+\n+    Examples\n+    --------\n+    >>> from pgmpy.models import JointGaussianDistribution\n+    >>> from pgmpy.inference.continuous import BaseGradLogPDF\n+    >>> import numpy as np\n+    >>> class GradLogGaussian(BaseGradLogPDF):\n+    ...     def __init__(self, position, model):\n+    ...         BaseGradLogPDF.__init__(self, position, model)\n+    ...         self.grad_log, self.log_pdf = self._get_gradient_log_pdf()\n+    ...     def _get_gradient_log_pdf(self):\n+    ...         sub_vec = self.position - self.model.mean\n+    ...         grad = - np.dot(self.model.precision_matrix, sub_vec)\n+    ...         log_pdf = 0.5 * np.float(np.dot(sub_vec.T, grad))\n+    ...         return grad, log_pdf\n+    >>> mean = np.array([1, 1])\n+    >>> covariance = np.array([[1, 0.2], [0.2, 7]])\n+    >>> model = JointGaussianDistribution(['x', 'y'], mean, covariance)\n+    >>> dist_param = np.array([0.1, 0.9])\n+    >>> grad_logp, logp = GradLogGaussian(dist_param, model).get_gradient_log_pdf()\n+    >>> logp\n+    -0.4054597701149426\n+    >>> grad_logp\n+    array([ 0.90229885, -0.01149425])\n+    \"\"\"\n+\n+    def __init__(self, distribution_param, model):\n+\n+        self.distribution_param = _check_1d_array_object(distribution_param, 'distribution_param')\n+        _check_length_equal(distribution_param, model.variables, 'distribution_param', 'model.variables')\n+        self.model = model\n+\n+        # The gradient log of probability distribution at position\n+        self.grad_log = None\n+\n+        # The gradient log of probability distribution at position\n+        self.log_pdf = None\n+\n+    def get_gradient_log_pdf(self):\n+        \"\"\"\n+        Returns the gradient log and log of model at given position\n+\n+        Returns\n+        -------\n+        Returns a tuple of following types\n+\n+        numpy.array: Representing gradient log of model at given position\n+\n+        float: Representing log of model at given position\n+\n+        Example\n+        --------\n+        >>> # Using implementation of GradLogPDFGaussian\n+        >>> from pgmpy.inference.continuous import GradLogPDFGaussian\n+        >>> from pgmpy.models import JointGaussianDistribution\n+        >>> import numpy as np\n+        >>> mean = np.array([1, 1])\n+        >>> covariance = np.array([[1, -5], [-5, 2]])\n+        >>> model = JointGaussianDistribution(['x', 'y'], mean, covariance)\n+        >>> dist_param = np.array([0.6, 0.8])\n+        >>> grad_logp, logp = GradLogPDFGaussian(dist_param, model).get_gradient_log_pdf()\n+        >>> logp\n+        0.025217391304347823\n+        >>> grad_logp\n+        array([-0.07826087, -0.09565217])\n+        \"\"\"\n+        return self.grad_log, self.log_pdf\n+\n+\n+class GradLogPDFGaussian(BaseGradLogPDF):\n+    \"\"\"\n+    Class for finding gradient and gradient log of Joint Gaussian Distribution\n+    Inherits pgmpy.inference.base_continuous.BaseGradLogPDF\n+    Here model must be an instance of JointGaussianDistribution\n+\n+    Parameters\n+    ----------\n+    distribution_param : A 1d array like object (numpy.ndarray or list)\n+        Vector representing values of distribution parameter at which we want to find gradient and log\n+\n+    model : An instance of pgmpy.models.JointGaussianDistribution\n+\n+    Example\n+    -------\n+    >>> from pgmpy.inference.continuous import GradLogPDFGaussian\n+    >>> from pgmpy.models import JointGaussianDistribution\n+    >>> import numpy as np\n+    >>> mean = np.array([3, 4])\n+    >>> covariance = np.array([[5, 4], [4, 5]])\n+    >>> model = JointGaussianDistribution(['x', 'y'], mean, covariance)\n+    >>> dist_param = np.array([12, 21])\n+    >>> grad_logp, logp = GradLogPDFGaussian(dist_param, model).get_gradient_log_pdf()\n+    >>> logp\n+    -34.777777777777771\n+    >>> grad_logp\n+    array([ 2.55555556, -5.44444444])\n+    \"\"\"\n+\n+    def __init__(self, distribution_param, model):\n+        BaseGradLogPDF.__init__(self, distribution_param, model)\n+        self.grad_log, self.log_pdf = self._get_gradient_log_pdf()\n+\n+    def _get_gradient_log_pdf(self):\n+        \"\"\"\n+        Method that finds gradient and its log at position\n+        \"\"\"\n+        sub_vec = self.distribution_param - self.model.mean\n+        grad = - np.dot(self.model.precision_matrix, sub_vec)\n+        log_pdf = 0.5 * np.dot(sub_vec, grad)\n+\n+        return grad, log_pdf\n+\n+\n+class BaseSimulateHamiltonianDynamics(object):\n+    \"\"\"\n+    Base class for proposing new values of position and momentum by simulating Hamiltonian Dynamics.\n+\n+    Classes inheriting this base class can be passed as an argument for\n+    simulate_dynamics in inference algorithms.\n+\n+    Parameters\n+    ----------\n+    model : An instance of pgmpy.models\n+        Model for which DiscretizeTime object is initialized\n+\n+    position : A 1d array like object (numpy.ndarray or list)\n+        Vector representing values of parameter position( or X)\n+\n+    momentum: A 1d array like object (numpy.ndarray or list)\n+        Vector representing the proposed value for momentum (velocity)\n+\n+    stepsize: Float\n+        stepsize for the simulating dynamics\n+\n+    grad_log_pdf : A subclass of pgmpy.inference.continuous.BaseGradLogPDF, defaults to None\n+        A class for finding gradient log and log of distribution\n+        If none, then model.get_gradient_log_pdf will be used\n+\n+    grad_log_position: A 1d array like object, defaults to None\n+        Vector representing gradient log at given position\n+        If None, then will be calculated\n+\n+    Examples\n+    --------\n+    >>> from pgmpy.inference.continuous import BaseSimulateHamiltonianDynamics\n+    >>> from pgmpy.models import JointGaussianDistribution\n+    >>> from pgmpy.inference.continuous import GradLogPDFGaussian\n+    >>> # Class should initalize self.new_position, self.new_momentum and self.new_grad_logp\n+    >>> # self.new_grad_logp represents gradient log at new proposed value of position\n+    >>> class ModifiedEuler(BaseSimulateHamiltonianDynamics):\n+    ...     def __init__(self, model, position, momentum, stepsize, grad_log_pdf, grad_log_position=None):\n+    ...         BaseSimulateHamiltonianDynamics.__init__(self, model, position, momentum,\n+    ...                                                  stepsize, grad_log_pdf, grad_log_position)\n+    ...         self.new_position, self.new_momentum, self.new_grad_logp = self._get_proposed_values()\n+    ...     def _get_proposed_values(self):\n+    ...         momentum_bar = self.momentum + self.stepsize * self.grad_log_position\n+    ...         position_bar = self.position + self.stepsize * momentum_bar\n+    ...         grad_log_position, _ = self.model.get_gradient_log_pdf(position_bar, self.grad_log_pdf)\n+    ...         return position_bar, momentum_bar, grad_log_position\n+    >>> import numpy as np","path":"pgmpy/inference/continuous/base.py","position":180,"original_position":180,"commit_id":"196c017c533de8a10fd03bfa6db879a23d895cb6","original_commit_id":"196c017c533de8a10fd03bfa6db879a23d895cb6","user":{"login":"ankurankan","id":1461453,"avatar_url":"https://avatars.githubusercontent.com/u/1461453?v=3","gravatar_id":"","url":"https://api.github.com/users/ankurankan","html_url":"https://github.com/ankurankan","followers_url":"https://api.github.com/users/ankurankan/followers","following_url":"https://api.github.com/users/ankurankan/following{/other_user}","gists_url":"https://api.github.com/users/ankurankan/gists{/gist_id}","starred_url":"https://api.github.com/users/ankurankan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ankurankan/subscriptions","organizations_url":"https://api.github.com/users/ankurankan/orgs","repos_url":"https://api.github.com/users/ankurankan/repos","events_url":"https://api.github.com/users/ankurankan/events{/privacy}","received_events_url":"https://api.github.com/users/ankurankan/received_events","type":"User","site_admin":false},"body":"@khalibartan Put all the imports at the top.","created_at":"2016-06-19T15:41:05Z","updated_at":"2016-06-19T15:41:05Z","html_url":"https://github.com/pgmpy/pgmpy/pull/702#discussion_r67618995","pull_request_url":"https://api.github.com/repos/pgmpy/pgmpy/pulls/702","_links":{"self":{"href":"https://api.github.com/repos/pgmpy/pgmpy/pulls/comments/67618995"},"html":{"href":"https://github.com/pgmpy/pgmpy/pull/702#discussion_r67618995"},"pull_request":{"href":"https://api.github.com/repos/pgmpy/pgmpy/pulls/702"}}},"pull_request":{"url":"https://api.github.com/repos/pgmpy/pgmpy/pulls/702","id":74285115,"html_url":"https://github.com/pgmpy/pgmpy/pull/702","diff_url":"https://github.com/pgmpy/pgmpy/pull/702.diff","patch_url":"https://github.com/pgmpy/pgmpy/pull/702.patch","issue_url":"https://api.github.com/repos/pgmpy/pgmpy/issues/702","number":702,"state":"open","locked":false,"title":"[Duplicate!] [For discussion] HMC (changes in handling gradients)","user":{"login":"khalibartan","id":8940456,"avatar_url":"https://avatars.githubusercontent.com/u/8940456?v=3","gravatar_id":"","url":"https://api.github.com/users/khalibartan","html_url":"https://github.com/khalibartan","followers_url":"https://api.github.com/users/khalibartan/followers","following_url":"https://api.github.com/users/khalibartan/following{/other_user}","gists_url":"https://api.github.com/users/khalibartan/gists{/gist_id}","starred_url":"https://api.github.com/users/khalibartan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/khalibartan/subscriptions","organizations_url":"https://api.github.com/users/khalibartan/orgs","repos_url":"https://api.github.com/users/khalibartan/repos","events_url":"https://api.github.com/users/khalibartan/events{/privacy}","received_events_url":"https://api.github.com/users/khalibartan/received_events","type":"User","site_admin":false},"body":"@ankurankan I have send this PR to aid us in discussion.\r\n I was experimenting things with how to handle gradients (removing the gradient argument). I tested with two ways:\r\n- First I tried handled `grad_log_pdf` argument on places itself depending upon how user passed the argument, if None was passed then I created a lambda function to call `model.get_gradient_log_pdf` otherwise I created a lambda function to use the custom class. But with this things were messy as I have to handle this parameter at two places, one in `sampling class` and other in `BaseSimulateHamiltonianDynamics` class.\r\n\r\n- Second ( this PR implements it). Handle everything in `model.get_gradient_log_pdf`. This code is less messy, because every call is made to model.get_gradient_log_pdf and the method internally handles the rest so need of making suitable changes at different places.\r\n\r\nHow do you suggest I should handle the gradients ? You can look at the last commit to specifically see the changes I made https://github.com/pgmpy/pgmpy/pull/702/commits/748eb1fe13488bb8f0cf27a7064a67384ec3315e\r\n\r\nAfter the discussion I'll close one of the PR. \r\n","created_at":"2016-06-17T18:25:09Z","updated_at":"2016-06-19T15:41:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"eed8243cd1004a49bbf74d5b47dd9d152b188b67","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/pgmpy/pgmpy/pulls/702/commits","review_comments_url":"https://api.github.com/repos/pgmpy/pgmpy/pulls/702/comments","review_comment_url":"https://api.github.com/repos/pgmpy/pgmpy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pgmpy/pgmpy/issues/702/comments","statuses_url":"https://api.github.com/repos/pgmpy/pgmpy/statuses/196c017c533de8a10fd03bfa6db879a23d895cb6","head":{"label":"khalibartan:testing_hmc","ref":"testing_hmc","sha":"196c017c533de8a10fd03bfa6db879a23d895cb6","user":{"login":"khalibartan","id":8940456,"avatar_url":"https://avatars.githubusercontent.com/u/8940456?v=3","gravatar_id":"","url":"https://api.github.com/users/khalibartan","html_url":"https://github.com/khalibartan","followers_url":"https://api.github.com/users/khalibartan/followers","following_url":"https://api.github.com/users/khalibartan/following{/other_user}","gists_url":"https://api.github.com/users/khalibartan/gists{/gist_id}","starred_url":"https://api.github.com/users/khalibartan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/khalibartan/subscriptions","organizations_url":"https://api.github.com/users/khalibartan/orgs","repos_url":"https://api.github.com/users/khalibartan/repos","events_url":"https://api.github.com/users/khalibartan/events{/privacy}","received_events_url":"https://api.github.com/users/khalibartan/received_events","type":"User","site_admin":false},"repo":{"id":45398389,"name":"pgmpy","full_name":"khalibartan/pgmpy","owner":{"login":"khalibartan","id":8940456,"avatar_url":"https://avatars.githubusercontent.com/u/8940456?v=3","gravatar_id":"","url":"https://api.github.com/users/khalibartan","html_url":"https://github.com/khalibartan","followers_url":"https://api.github.com/users/khalibartan/followers","following_url":"https://api.github.com/users/khalibartan/following{/other_user}","gists_url":"https://api.github.com/users/khalibartan/gists{/gist_id}","starred_url":"https://api.github.com/users/khalibartan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/khalibartan/subscriptions","organizations_url":"https://api.github.com/users/khalibartan/orgs","repos_url":"https://api.github.com/users/khalibartan/repos","events_url":"https://api.github.com/users/khalibartan/events{/privacy}","received_events_url":"https://api.github.com/users/khalibartan/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/khalibartan/pgmpy","description":"Python Library for Probabilistic Graphical Models","fork":true,"url":"https://api.github.com/repos/khalibartan/pgmpy","forks_url":"https://api.github.com/repos/khalibartan/pgmpy/forks","keys_url":"https://api.github.com/repos/khalibartan/pgmpy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/khalibartan/pgmpy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/khalibartan/pgmpy/teams","hooks_url":"https://api.github.com/repos/khalibartan/pgmpy/hooks","issue_events_url":"https://api.github.com/repos/khalibartan/pgmpy/issues/events{/number}","events_url":"https://api.github.com/repos/khalibartan/pgmpy/events","assignees_url":"https://api.github.com/repos/khalibartan/pgmpy/assignees{/user}","branches_url":"https://api.github.com/repos/khalibartan/pgmpy/branches{/branch}","tags_url":"https://api.github.com/repos/khalibartan/pgmpy/tags","blobs_url":"https://api.github.com/repos/khalibartan/pgmpy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/khalibartan/pgmpy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/khalibartan/pgmpy/git/refs{/sha}","trees_url":"https://api.github.com/repos/khalibartan/pgmpy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/khalibartan/pgmpy/statuses/{sha}","languages_url":"https://api.github.com/repos/khalibartan/pgmpy/languages","stargazers_url":"https://api.github.com/repos/khalibartan/pgmpy/stargazers","contributors_url":"https://api.github.com/repos/khalibartan/pgmpy/contributors","subscribers_url":"https://api.github.com/repos/khalibartan/pgmpy/subscribers","subscription_url":"https://api.github.com/repos/khalibartan/pgmpy/subscription","commits_url":"https://api.github.com/repos/khalibartan/pgmpy/commits{/sha}","git_commits_url":"https://api.github.com/repos/khalibartan/pgmpy/git/commits{/sha}","comments_url":"https://api.github.com/repos/khalibartan/pgmpy/comments{/number}","issue_comment_url":"https://api.github.com/repos/khalibartan/pgmpy/issues/comments{/number}","contents_url":"https://api.github.com/repos/khalibartan/pgmpy/contents/{+path}","compare_url":"https://api.github.com/repos/khalibartan/pgmpy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/khalibartan/pgmpy/merges","archive_url":"https://api.github.com/repos/khalibartan/pgmpy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/khalibartan/pgmpy/downloads","issues_url":"https://api.github.com/repos/khalibartan/pgmpy/issues{/number}","pulls_url":"https://api.github.com/repos/khalibartan/pgmpy/pulls{/number}","milestones_url":"https://api.github.com/repos/khalibartan/pgmpy/milestones{/number}","notifications_url":"https://api.github.com/repos/khalibartan/pgmpy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/khalibartan/pgmpy/labels{/name}","releases_url":"https://api.github.com/repos/khalibartan/pgmpy/releases{/id}","deployments_url":"https://api.github.com/repos/khalibartan/pgmpy/deployments","created_at":"2015-11-02T14:09:37Z","updated_at":"2016-01-13T08:36:49Z","pushed_at":"2016-06-18T09:19:58Z","git_url":"git://github.com/khalibartan/pgmpy.git","ssh_url":"git@github.com:khalibartan/pgmpy.git","clone_url":"https://github.com/khalibartan/pgmpy.git","svn_url":"https://github.com/khalibartan/pgmpy","homepage":null,"size":5105,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"dev"}},"base":{"label":"pgmpy:dev","ref":"dev","sha":"c6ec2b58794840d030877cb6fb7e2a6fc3c375e6","user":{"login":"pgmpy","id":5500131,"avatar_url":"https://avatars.githubusercontent.com/u/5500131?v=3","gravatar_id":"","url":"https://api.github.com/users/pgmpy","html_url":"https://github.com/pgmpy","followers_url":"https://api.github.com/users/pgmpy/followers","following_url":"https://api.github.com/users/pgmpy/following{/other_user}","gists_url":"https://api.github.com/users/pgmpy/gists{/gist_id}","starred_url":"https://api.github.com/users/pgmpy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pgmpy/subscriptions","organizations_url":"https://api.github.com/users/pgmpy/orgs","repos_url":"https://api.github.com/users/pgmpy/repos","events_url":"https://api.github.com/users/pgmpy/events{/privacy}","received_events_url":"https://api.github.com/users/pgmpy/received_events","type":"Organization","site_admin":false},"repo":{"id":12968651,"name":"pgmpy","full_name":"pgmpy/pgmpy","owner":{"login":"pgmpy","id":5500131,"avatar_url":"https://avatars.githubusercontent.com/u/5500131?v=3","gravatar_id":"","url":"https://api.github.com/users/pgmpy","html_url":"https://github.com/pgmpy","followers_url":"https://api.github.com/users/pgmpy/followers","following_url":"https://api.github.com/users/pgmpy/following{/other_user}","gists_url":"https://api.github.com/users/pgmpy/gists{/gist_id}","starred_url":"https://api.github.com/users/pgmpy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pgmpy/subscriptions","organizations_url":"https://api.github.com/users/pgmpy/orgs","repos_url":"https://api.github.com/users/pgmpy/repos","events_url":"https://api.github.com/users/pgmpy/events{/privacy}","received_events_url":"https://api.github.com/users/pgmpy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pgmpy/pgmpy","description":"Python Library for Probabilistic Graphical Models","fork":false,"url":"https://api.github.com/repos/pgmpy/pgmpy","forks_url":"https://api.github.com/repos/pgmpy/pgmpy/forks","keys_url":"https://api.github.com/repos/pgmpy/pgmpy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pgmpy/pgmpy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pgmpy/pgmpy/teams","hooks_url":"https://api.github.com/repos/pgmpy/pgmpy/hooks","issue_events_url":"https://api.github.com/repos/pgmpy/pgmpy/issues/events{/number}","events_url":"https://api.github.com/repos/pgmpy/pgmpy/events","assignees_url":"https://api.github.com/repos/pgmpy/pgmpy/assignees{/user}","branches_url":"https://api.github.com/repos/pgmpy/pgmpy/branches{/branch}","tags_url":"https://api.github.com/repos/pgmpy/pgmpy/tags","blobs_url":"https://api.github.com/repos/pgmpy/pgmpy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pgmpy/pgmpy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pgmpy/pgmpy/git/refs{/sha}","trees_url":"https://api.github.com/repos/pgmpy/pgmpy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pgmpy/pgmpy/statuses/{sha}","languages_url":"https://api.github.com/repos/pgmpy/pgmpy/languages","stargazers_url":"https://api.github.com/repos/pgmpy/pgmpy/stargazers","contributors_url":"https://api.github.com/repos/pgmpy/pgmpy/contributors","subscribers_url":"https://api.github.com/repos/pgmpy/pgmpy/subscribers","subscription_url":"https://api.github.com/repos/pgmpy/pgmpy/subscription","commits_url":"https://api.github.com/repos/pgmpy/pgmpy/commits{/sha}","git_commits_url":"https://api.github.com/repos/pgmpy/pgmpy/git/commits{/sha}","comments_url":"https://api.github.com/repos/pgmpy/pgmpy/comments{/number}","issue_comment_url":"https://api.github.com/repos/pgmpy/pgmpy/issues/comments{/number}","contents_url":"https://api.github.com/repos/pgmpy/pgmpy/contents/{+path}","compare_url":"https://api.github.com/repos/pgmpy/pgmpy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pgmpy/pgmpy/merges","archive_url":"https://api.github.com/repos/pgmpy/pgmpy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pgmpy/pgmpy/downloads","issues_url":"https://api.github.com/repos/pgmpy/pgmpy/issues{/number}","pulls_url":"https://api.github.com/repos/pgmpy/pgmpy/pulls{/number}","milestones_url":"https://api.github.com/repos/pgmpy/pgmpy/milestones{/number}","notifications_url":"https://api.github.com/repos/pgmpy/pgmpy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pgmpy/pgmpy/labels{/name}","releases_url":"https://api.github.com/repos/pgmpy/pgmpy/releases{/id}","deployments_url":"https://api.github.com/repos/pgmpy/pgmpy/deployments","created_at":"2013-09-20T08:18:58Z","updated_at":"2016-06-12T22:38:24Z","pushed_at":"2016-06-18T20:32:26Z","git_url":"git://github.com/pgmpy/pgmpy.git","ssh_url":"git@github.com:pgmpy/pgmpy.git","clone_url":"https://github.com/pgmpy/pgmpy.git","svn_url":"https://github.com/pgmpy/pgmpy","homepage":null,"size":6247,"stargazers_count":244,"watchers_count":244,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":115,"mirror_url":null,"open_issues_count":89,"forks":115,"open_issues":89,"watchers":244,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/pgmpy/pgmpy/pulls/702"},"html":{"href":"https://github.com/pgmpy/pgmpy/pull/702"},"issue":{"href":"https://api.github.com/repos/pgmpy/pgmpy/issues/702"},"comments":{"href":"https://api.github.com/repos/pgmpy/pgmpy/issues/702/comments"},"review_comments":{"href":"https://api.github.com/repos/pgmpy/pgmpy/pulls/702/comments"},"review_comment":{"href":"https://api.github.com/repos/pgmpy/pgmpy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pgmpy/pgmpy/pulls/702/commits"},"statuses":{"href":"https://api.github.com/repos/pgmpy/pgmpy/statuses/196c017c533de8a10fd03bfa6db879a23d895cb6"}}}}
{"actor":{"display_login":"ankurankan"}}