{"action":"created","comment":{"url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments/33543683","id":33543683,"diff_hunk":"@@ -0,0 +1,1022 @@\n+:author: Mike Pacer\n+:email: mpacer@berkeley.edu\n+:institution: University of California at Berkeley\n+:bibliography: myBibliography\n+\n+:video: youtube_link_to_come\n+\n+..  latex::\n+    :usepackage: booktabs\n+\n+..  latex::\n+\n+    %:usepackage: mathpalette, graphicx\n+    \\newcommand{\\bigCI}{\\mathrel{\\text{\\scalebox{1.07}{$\\perp\\mkern-10mu\\perp$}}}}\n+    \\newcommand\\independent{\\protect\\mathpalette{\\protect\\independenT}{\\perp}}\n+    \\def\\independenT#1#2{\\mathrel{\\rlap{$#1#2$}\\mkern2mu{#1#2}}}\n+\n+\n+.. raw::latex\n+\n+    \\newcommand{\\DUrolesc}{\\textsc}\n+    \\newcommand{\\DUroleindep}{\\mathrel{\\text{\\scalebox{1}{$\\perp\\mkern-9mu\\perp$}}}}\n+\n+\n+.. role:: indep\n+\n+.. role:: sc\n+\n+\n+\n+------------------------\n+Causal Bayesian NetworkX\n+------------------------\n+\n+..  class:: abstract\n+\n+    Humans are existence proofs for the solubility of computational causal inference.\n+\n+    Computational problems are sometimes thought to be the exclusive domain of computer science, though the solutions found prove vital for many other sciences. But computational cognitive science can also contribute to the solution of computational problems, particularly inductive problems. Causal inference (and inductive problems more generally) have proven resilient to traditional analysis, and the recent progress on these problems observed in machine learning (e.g., neural networks and their extensions) originate in models formulated by cognitive scientists.\n+\n+    As a computational cognitive scientist, I use a technique called rational analysis, which roughly consists of developing formal models of how *any* cognitive agent might optimally solve a computational problem and comparing that to how people actually solve analogous problems. In the course of doing so we find that people turn out to make much more sense than popular psychology might lead you to believe. At the same time, we create formal frameworks that represent entities and relations in the world as well as reasoning processes over those representations. \n+\n+    One of the frameworks successfully used in this way are causal Bayesian networks. Bayesian networks fall within the more general class of probabilistic graphical models, specifically, directed acyclic graphs with associated conditional probability distributions. Directed arrows encode direct dependency relationships going from parents to their children, whose conditional probability distribution is defined in terms of the parents' values. *Causal* Bayesian networks are endowed with an intervention operation that allows \"graph surgery\" in which one cuts variables off from their parents (usually setting it to a particular value). \n+\n+    I have developed tools on top of the :code:`NetworkX` package that allow me to implement some aspects of these models. By treating graph definition as one of enumeration and filtering rather than investigating invidual graphs, we are able to more conveniently state constraints on the graph structures under question. Indeed this gives an alternative view of intervention not as the modification of an single graph, but as a constraint on the total set of graphs. This allows us to treat the graphical aspects of the problem separately from the probabilistic semantics that define particular models on those graphs. I call this set of tools `Causal Bayesian NetworkX`.\n+\n+\n+..  class:: keywords\n+\n+    probabilistic graphical models, causality, intervention\n+\n+Introduction and Aims\n+---------------------\n+\n+My first goal in this paper is to provide enough of an introduction to some formal/mathematical tools such that those familiar with :code:`python` and programming more generally will be able to appreciate both why and how one might implement causal Bayesian networks. Especially to exhibit *how*, I have developed parts of a toolkit that allows the creation of these models on top of the :code:`NetworkX` python package. Given the coincidence of the names, it seemed most apt to refer to this toolkit as :code:`Causal Bayesian NetworkX` (the current implementation of which can be found at `Causal Bayesian NetworkX`_).\n+\n+In order to understand the toolset requires the basics of probabilsitic graphical models, which requires understanding some graph theory and some probability theory. The first few pages are devoted to providing necessary background and illustrative cases for conveying that understanding. \n+\n+Notably, contrary to how Bayesian networks are commonly introduced, I say relatively little about inference from observed data. This is intentional, as is this discussion of it. Many of the most trenchant problems with Bayesian networks are found in critiques of their use to infer these networks from observed data. But, many of the aspects of Bayesian networks (especially causal Bayesian networks) that are most useful for thinking about problems of structure and probabilistic relations do not rely on inference from observed data. In fact, I think the immediate focus on inference has greatly hampered widespread understanding of the power and representative capacity of this class of models. Equally – if not more – importantly, I aim to discuss generalizations of Bayesian networks such as those that appear in :cite:`griffithst09`, and inference in these cases requires a much longer treatement (if a comprehensive treatment can be provided at all). If you are dissatisfied with this approach and wish to read a more conventional introduction to (causal) Bayesian networks I suggest consulting :cite:`pearl2000`.\n+\n+The Causal Bayesian NetworkX toolkit can be seen as consisting of two main parts: graph enumeration/filtering and the storage and use of probabilistic graphical models in a NetworkX compatible format. Because this topic will more be the focus of my talk which can be viewed at the youtube link above and the source code of the most basic implementation is available at `Causal Bayesian NetworkX`_, in this paper I focus more on the other aspects of the problem. Nonetheless, appreciating these other aspects is made easier by also appreciating the problems of implementation/representation and the early solutions that I propose.\n+\n+I focus first on establishing a means of building iterators over sets of directed graphs. I then apply operations to those sets. Beginning with the complete directed graph, we enumerate over the subgraphs of that complete graph and enforce graph theoretic conditions such as acyclicity over the entire graph, guarantees on paths between nodes that are known to be able to communicate with one another, or orphan-hood for individual nodes known to have no parents. We accomplish this by using closures that take graphs as their input along with any explicitly defined arguments needed to define the exact desired conditions. \n+\n+I then shift focus to a case where there is a specific known directed acyclic graph that is imbued with a simple probabilistic semantics over its nodes and edges, also known as a Bayesian network. I demonstrate how to sample independent trials from these variables in a way consistent with these semantics. I discuss briefly some of the challenges of encoding these semantics in dictionaries as afforded by NetworkX without resorting to :code:`eval` statements and discuss compatibility issues I have found with JSON storage formats. \n+\n+I conclude with a discussion of some of the problems that have been addressed in Cognitive Science through the use of graphical models like those described. In particular, I will discuss a framework called **theory based causal induction** :cite:`griffithst09`, or my preferred term: **causal theories**, which allows for defining problems of causal induction. It is out of this framework the perspective expressed in this paper, the associated talk, and the Causal Bayesian NetworkX toolkit developed. \n+\n+.. _Causal Bayesian NetworkX: https://github.com/michaelpacer/Causal-Bayesian-NetworkX\n+\n+Graphical Models\n+----------------\n+\n+Graphs are formal models defined by a set of nodes (:math:`X, |X| = N`) and edges between those nodes (:math:`e \\in E \\equiv e \\in (X \\times X)`, where *E* is the set of edges). \n+\n+Notes on notation\n+=================\n+\n+Nodes\n+^^^^^\n+\n+In the examples in `Causal Bayesian NetworkX`_, nodes are given explicit labels individuating them such as :math:`\\{A,B,C,\\ldots\\}` or {'rain','sprinkler','grass_wet'}. Oftentimes, for the purposes of mathematical notation, it will be helpful to index nodes by the integers over a common variable label, e.g., using  :math:`\\{X_1,X_2,X_3,\\ldots\\}`. [#]_ \n+\n+.. [#] Despite pythonic counting beginning with 0, I chose not to begin this series with 0 because when dealing with variables that might be used in statistical regressions, the 0 subscript will have a specific meaning that separates it from the rest of the notation. For example when expressing multivariate regession as :math:`Y = \\beta X + \\epsilon, \\epsilon \\sim \\mathcal{N}(0,\\Sigma)`, :math:`\\beta_0` refers to the parameter associated with a constant variable :math:`x_0 = 1` and :math:`X` is normally defined as :math:`x_1, x_2, x_3, \\ldots`. This allows a simple additive constant to be estimated, which usually(but not always) is not of interest to statistical tests, acting as a scaling constant more than anything else. This also makes for simpler notation than saying :math:`Y = \\beta_0 + \\beta X + \\epsilon`, since that is equivalent to the previous notation (:math:`Y = \\beta X + \\epsilon`) if :math:`x_0 = 1`. In other cases :cite:`griffithst05,pacerg12`, the 0 index will be used to indicate background sources for events in a system.\n+\n+Edges\n+^^^^^\n+\n+Defined in this way, edges are all *directed* in the sense that an edge from :math:`X_1 \\textrm{ to } X_2` is not the same as the edge from :math:`X_2 \\textrm{ to } X_1`, or :math:`(X_1,X_2) \\neq (X_2,X_1)`. An edge :math:`(X_1,X_2)` will sometimes be written as :math:`X_1 \\rightarrow X_2`, and the relation may be described using language like \":math:`X_1` is the parent of :math:`X_2`\" or \":math:`X_2` is the child of :math:`X_1`\".\n+\n+Directed paths\n+^^^^^^^^^^^^^^\n+\n+Paths are a useful way to understand sequences of edges and the structure of a graph. Informally, to say there is a path between :math:`X_i` and :math:`X_j` is to say that one can start at :math:`X_i` and by traveling from parent to child along the edges leading out from the node that you are currently at, you can eventually reach :math:`X_j`.\n+\n+To define it recursively and more precisely, if the edge :math:`(X_i,X_j)` is in the edge set or if the edges :math:`(X_i,X_k)` and :math:`(X_k,X_j)` are in the edge set there is a path from :math:`X_i` to :math:`X_j`. Otherwise, a graph has a path from node :math:`X_i` to :math:`X_j` if there is a subset of its set of edges such that the set contains edges :math:`(X_i,X_k)` and :math:`(X_l,X_j)` and there is a path from :math:`X_k` to :math:`X_l`. \n+\n+\n+Adjacency Matrix Perspective\n+============================\n+\n+For a fixed set of nodes :math:`X` of size :math:`N`, each graph is uniquely defined by its edge set, which can be seen as a binary :math:`N \\times N` matrix, where each index :math:`(i,j)` in the matrix is :math:`1` if the graph contains an edge from :math:`X_i \\rightarrow X_j`, and :math:`0` if it does not contain such an edge. We will refer to this matrix as :math:`A(G)`.\n+\n+This means that any values of :math:`1` found on the diagonal of the adjacency matrix (i.e., where :math:`X_i \\rightarrow X_j, i=j`) indicate a self-loop on the respective node.\n+\n+.. Finding paths using adjacency matrices\n+.. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n+\n+.. It is straightforward to interpret questions of the existence of paths between :math:`X_i` and :math:`X_j` using the adjacency matrix perspective and matrix multiplication. The key step is to recognize that you can think of multiplying the adjacency matrix from the right by a binary vector as taking a step in the graph from the nodes whose values in the vector were 1 to the set of children of those nodes. To continue to have a binary vector then requires resetting values in the vector 0 and 1 by taking (for every element of the resulting vector) the minimum of the value of the vector and 1 (which addresses the case where more than one edge leads into the same node). \n+\n+.. To use this technique to test whether a matrix has an edge between, if you have a value of 1 at index *i*, and 0's elsewhere, if you multiply this vector from the left by the adjacency matrix, then if there is a path between \n+\n+Undirected Graphs\n+=================\n+\n+We can still have a coherent view of *undirected* graphs, despite the fact that our primitive notion of an edge is that of a *directed* edge. If a graph is undirected, then if it has an edge from :math:`X_i \\rightarrow X_j` then it has an edge from :math:`X_j \\rightarrow X_i`. Equivalently, this means that the adjacency matrix of the graph is symmetric, or :math:`A(G)=A(G)^\\top`.\n+\n+\n+Directed Graphs\n+===============\n+\n+From the adjacency matrix perspective we've been considering, all graphs are technically directed, and undirected graphs are a special case where both edges are symmetric.\n+\n+The number of directed graphs that can be obtained from a set of nodes of size :math:`n` can be defined explicitly using the fact that they can be encoded as a unique :math:`n \\times n` matrix:","path":"papers/mike_pacer/scipy_first_draft.rst","position":124,"original_position":124,"commit_id":"ffb7f35705522a628fb0b02fea785ebf6c2dbb83","original_commit_id":"ffb7f35705522a628fb0b02fea785ebf6c2dbb83","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":"Not true in the case of Multigraphs. Please do mention it some where that you are not considering Multigraphs.","created_at":"2015-06-30T06:31:48Z","updated_at":"2015-06-30T06:31:48Z","html_url":"https://github.com/scipy-conference/scipy_proceedings/pull/147#discussion_r33543683","pull_request_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/147","_links":{"self":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments/33543683"},"html":{"href":"https://github.com/scipy-conference/scipy_proceedings/pull/147#discussion_r33543683"},"pull_request":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/147"}}},"pull_request":{"url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/147","id":37754091,"html_url":"https://github.com/scipy-conference/scipy_proceedings/pull/147","diff_url":"https://github.com/scipy-conference/scipy_proceedings/pull/147.diff","patch_url":"https://github.com/scipy-conference/scipy_proceedings/pull/147.patch","issue_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/147","number":147,"state":"open","locked":false,"title":"Paper: Causal Bayesian NetworkX (Pacer)","user":{"login":"michaelpacer","id":2482408,"avatar_url":"https://avatars.githubusercontent.com/u/2482408?v=3","gravatar_id":"","url":"https://api.github.com/users/michaelpacer","html_url":"https://github.com/michaelpacer","followers_url":"https://api.github.com/users/michaelpacer/followers","following_url":"https://api.github.com/users/michaelpacer/following{/other_user}","gists_url":"https://api.github.com/users/michaelpacer/gists{/gist_id}","starred_url":"https://api.github.com/users/michaelpacer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaelpacer/subscriptions","organizations_url":"https://api.github.com/users/michaelpacer/orgs","repos_url":"https://api.github.com/users/michaelpacer/repos","events_url":"https://api.github.com/users/michaelpacer/events{/privacy}","received_events_url":"https://api.github.com/users/michaelpacer/received_events","type":"User","site_admin":false},"body":"Note: The paper as it stands is incomplete. Apologies —  I will be continuing to work on it in the coming days. \r\n\r\nNote2: Part of the time was spent trying to alter `paper_build` and and `writer.__init__` to be able to allow a local bibtex file to be used with a simple declaration at the head of the file after the `:name:` `:email:` and `:institution:` class declarations. I worked on this in conversation with @stefanv's, so apologies if my file doesn't build quite right as is (since the changes I've made are not likely to have been ported over to the master branch until others can look through them more closely).\r\n\r\nFor others who want to use an external bib file, just include `:bibliography: fileName` for a `fileName.bib` and it should work. If you don't have any declaration then none of the bibtex specific code should run. The file name cannot contain spaces or any special characters that need to be escaped. \r\n\r\nCitations can be called then using :cite:`citekey`. \r\n\r\nCheers,\r\nMike\r\n\r\n[Edit by jaberg] http://nipy.bic.berkeley.edu:5000/download/12","created_at":"2015-06-16T02:23:27Z","updated_at":"2015-06-30T06:31:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"95a4ac046fab53c61045e8eb7ca4bb2485e8ebc5","assignee":{"login":"jaberg","id":171276,"avatar_url":"https://avatars.githubusercontent.com/u/171276?v=3","gravatar_id":"","url":"https://api.github.com/users/jaberg","html_url":"https://github.com/jaberg","followers_url":"https://api.github.com/users/jaberg/followers","following_url":"https://api.github.com/users/jaberg/following{/other_user}","gists_url":"https://api.github.com/users/jaberg/gists{/gist_id}","starred_url":"https://api.github.com/users/jaberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jaberg/subscriptions","organizations_url":"https://api.github.com/users/jaberg/orgs","repos_url":"https://api.github.com/users/jaberg/repos","events_url":"https://api.github.com/users/jaberg/events{/privacy}","received_events_url":"https://api.github.com/users/jaberg/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/147/commits","review_comments_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/147/comments","review_comment_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments{/number}","comments_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/147/comments","statuses_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/statuses/ffb7f35705522a628fb0b02fea785ebf6c2dbb83","head":{"label":"michaelpacer:2015","ref":"2015","sha":"ffb7f35705522a628fb0b02fea785ebf6c2dbb83","user":{"login":"michaelpacer","id":2482408,"avatar_url":"https://avatars.githubusercontent.com/u/2482408?v=3","gravatar_id":"","url":"https://api.github.com/users/michaelpacer","html_url":"https://github.com/michaelpacer","followers_url":"https://api.github.com/users/michaelpacer/followers","following_url":"https://api.github.com/users/michaelpacer/following{/other_user}","gists_url":"https://api.github.com/users/michaelpacer/gists{/gist_id}","starred_url":"https://api.github.com/users/michaelpacer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaelpacer/subscriptions","organizations_url":"https://api.github.com/users/michaelpacer/orgs","repos_url":"https://api.github.com/users/michaelpacer/repos","events_url":"https://api.github.com/users/michaelpacer/events{/privacy}","received_events_url":"https://api.github.com/users/michaelpacer/received_events","type":"User","site_admin":false},"repo":{"id":37351679,"name":"scipy_proceedings","full_name":"michaelpacer/scipy_proceedings","owner":{"login":"michaelpacer","id":2482408,"avatar_url":"https://avatars.githubusercontent.com/u/2482408?v=3","gravatar_id":"","url":"https://api.github.com/users/michaelpacer","html_url":"https://github.com/michaelpacer","followers_url":"https://api.github.com/users/michaelpacer/followers","following_url":"https://api.github.com/users/michaelpacer/following{/other_user}","gists_url":"https://api.github.com/users/michaelpacer/gists{/gist_id}","starred_url":"https://api.github.com/users/michaelpacer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaelpacer/subscriptions","organizations_url":"https://api.github.com/users/michaelpacer/orgs","repos_url":"https://api.github.com/users/michaelpacer/repos","events_url":"https://api.github.com/users/michaelpacer/events{/privacy}","received_events_url":"https://api.github.com/users/michaelpacer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/michaelpacer/scipy_proceedings","description":"Tools used to generate the SciPy conference proceedings","fork":true,"url":"https://api.github.com/repos/michaelpacer/scipy_proceedings","forks_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/forks","keys_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/keys{/key_id}","collaborators_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/teams","hooks_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/hooks","issue_events_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/issues/events{/number}","events_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/events","assignees_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/assignees{/user}","branches_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/branches{/branch}","tags_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/tags","blobs_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/git/refs{/sha}","trees_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/git/trees{/sha}","statuses_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/statuses/{sha}","languages_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/languages","stargazers_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/stargazers","contributors_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/contributors","subscribers_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/subscribers","subscription_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/subscription","commits_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/commits{/sha}","git_commits_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/git/commits{/sha}","comments_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/comments{/number}","issue_comment_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/issues/comments{/number}","contents_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/contents/{+path}","compare_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/compare/{base}...{head}","merges_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/merges","archive_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/downloads","issues_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/issues{/number}","pulls_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/pulls{/number}","milestones_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/milestones{/number}","notifications_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/labels{/name}","releases_url":"https://api.github.com/repos/michaelpacer/scipy_proceedings/releases{/id}","created_at":"2015-06-13T00:49:36Z","updated_at":"2015-06-16T04:12:13Z","pushed_at":"2015-06-30T02:49:54Z","git_url":"git://github.com/michaelpacer/scipy_proceedings.git","ssh_url":"git@github.com:michaelpacer/scipy_proceedings.git","clone_url":"https://github.com/michaelpacer/scipy_proceedings.git","svn_url":"https://github.com/michaelpacer/scipy_proceedings","homepage":"","size":1346,"stargazers_count":0,"watchers_count":0,"language":"TeX","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":"master"}},"base":{"label":"scipy-conference:2015","ref":"2015","sha":"4e7f0ee5967290cb3ad92468133949c518186a11","user":{"login":"scipy-conference","id":4884274,"avatar_url":"https://avatars.githubusercontent.com/u/4884274?v=3","gravatar_id":"","url":"https://api.github.com/users/scipy-conference","html_url":"https://github.com/scipy-conference","followers_url":"https://api.github.com/users/scipy-conference/followers","following_url":"https://api.github.com/users/scipy-conference/following{/other_user}","gists_url":"https://api.github.com/users/scipy-conference/gists{/gist_id}","starred_url":"https://api.github.com/users/scipy-conference/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scipy-conference/subscriptions","organizations_url":"https://api.github.com/users/scipy-conference/orgs","repos_url":"https://api.github.com/users/scipy-conference/repos","events_url":"https://api.github.com/users/scipy-conference/events{/privacy}","received_events_url":"https://api.github.com/users/scipy-conference/received_events","type":"Organization","site_admin":false},"repo":{"id":1825629,"name":"scipy_proceedings","full_name":"scipy-conference/scipy_proceedings","owner":{"login":"scipy-conference","id":4884274,"avatar_url":"https://avatars.githubusercontent.com/u/4884274?v=3","gravatar_id":"","url":"https://api.github.com/users/scipy-conference","html_url":"https://github.com/scipy-conference","followers_url":"https://api.github.com/users/scipy-conference/followers","following_url":"https://api.github.com/users/scipy-conference/following{/other_user}","gists_url":"https://api.github.com/users/scipy-conference/gists{/gist_id}","starred_url":"https://api.github.com/users/scipy-conference/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scipy-conference/subscriptions","organizations_url":"https://api.github.com/users/scipy-conference/orgs","repos_url":"https://api.github.com/users/scipy-conference/repos","events_url":"https://api.github.com/users/scipy-conference/events{/privacy}","received_events_url":"https://api.github.com/users/scipy-conference/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/scipy-conference/scipy_proceedings","description":"Tools used to generate the SciPy conference proceedings","fork":false,"url":"https://api.github.com/repos/scipy-conference/scipy_proceedings","forks_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/forks","keys_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/teams","hooks_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/hooks","issue_events_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/events{/number}","events_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/events","assignees_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/assignees{/user}","branches_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/branches{/branch}","tags_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/tags","blobs_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/refs{/sha}","trees_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/statuses/{sha}","languages_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/languages","stargazers_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/stargazers","contributors_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/contributors","subscribers_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/subscribers","subscription_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/subscription","commits_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/commits{/sha}","git_commits_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/commits{/sha}","comments_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/comments{/number}","issue_comment_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/comments{/number}","contents_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/contents/{+path}","compare_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/merges","archive_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/downloads","issues_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues{/number}","pulls_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls{/number}","milestones_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/milestones{/number}","notifications_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/labels{/name}","releases_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/releases{/id}","created_at":"2011-05-31T10:26:48Z","updated_at":"2015-06-22T07:22:47Z","pushed_at":"2015-06-30T05:55:54Z","git_url":"git://github.com/scipy-conference/scipy_proceedings.git","ssh_url":"git@github.com:scipy-conference/scipy_proceedings.git","clone_url":"https://github.com/scipy-conference/scipy_proceedings.git","svn_url":"https://github.com/scipy-conference/scipy_proceedings","homepage":"","size":155374,"stargazers_count":76,"watchers_count":76,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":142,"mirror_url":null,"open_issues_count":38,"forks":142,"open_issues":38,"watchers":76,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/147"},"html":{"href":"https://github.com/scipy-conference/scipy_proceedings/pull/147"},"issue":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/147"},"comments":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/147/comments"},"review_comments":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/147/comments"},"review_comment":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/147/commits"},"statuses":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/statuses/ffb7f35705522a628fb0b02fea785ebf6c2dbb83"}}}}