{"action":"created","comment":{"url":"https://api.github.com/repos/gonum/graph/pulls/comments/34866150","id":34866150,"diff_hunk":"@@ -0,0 +1,462 @@\n+// Copyright ©2014 The gonum Authors. All rights reserved.\n+// Use of this source code is governed by a BSD-style\n+// license that can be found in the LICENSE file.\n+\n+package dynamic\n+\n+import (\n+\t\"container/heap\"\n+\t\"fmt\"\n+\t\"math\"\n+\n+\t\"github.com/gonum/graph\"\n+\t\"github.com/gonum/graph/concrete\"\n+\t\"github.com/gonum/graph/path\"\n+)\n+\n+// DStarLite implements the D* Lite dynamic re-planning path search algorithm.\n+//\n+//  doi:10.1109/tro.2004.838026 and ISBN:0-262-51129-0 pp476-483\n+//\n+type DStarLite struct {\n+\ts, t *dStarLiteNode\n+\tlast *dStarLiteNode\n+\n+\tworld       MutableDirected\n+\tqueue       dStarLiteQueue\n+\tkeyModifier float64\n+\n+\tweight    graph.WeightFunc\n+\theuristic path.Heuristic\n+}\n+\n+// MutableDirected is a mutable directed graph that can return nodes identified\n+// by id number.\n+type MutableDirected interface {\n+\tgraph.MutableDirected\n+\tNode(id int) graph.Node\n+}\n+\n+// NewDStarLite returns a new DStarLite planner for the path from s to t in g using the\n+// heuristic h. The mutable directed graph world is used to store shortest path information\n+// during path planning.\n+//\n+// If h is nil, the DStarLite will use the g.HeuristicCost method if g implements\n+// path.HeuristicCoster, falling back to path.NullHeuristic otherwise. If the graph does not\n+// implement graph.Weighter, graph.UniformCost is used. NewDStarLite will panic if g has\n+// a negative edge weight.\n+func NewDStarLite(s, t graph.Node, g graph.Graph, h path.Heuristic, world MutableDirected) *DStarLite {\n+\t/*\n+\t   procedure Initialize()\n+\t   {02”} U = ∅;\n+\t   {03”} k_m = 0;\n+\t   {04”} for all s ∈ S rhs(s) = g(s) = ∞;\n+\t   {05”} rhs(s_goal) = 0;\n+\t   {06”} U.Insert(s_goal, [h(s_start, s_goal); 0]);\n+\t*/\n+\n+\td := &DStarLite{\n+\t\ts: &dStarLiteNode{Node: s, rhs: math.Inf(1), g: math.Inf(1)},\n+\t\tt: &dStarLiteNode{Node: t, g: math.Inf(1)},\n+\n+\t\tworld: world,\n+\n+\t\theuristic: h,\n+\t}\n+\n+\t/*\n+\t\tprocedure Main()\n+\t\t{29”} s_last = s_start;\n+\t\t{30”} Initialize();\n+\t*/\n+\td.last = d.s\n+\n+\tif g, ok := g.(graph.Weighter); ok {\n+\t\td.weight = g.Weight\n+\t} else {\n+\t\td.weight = graph.UniformCost\n+\t}\n+\tif d.heuristic == nil {\n+\t\tif g, ok := g.(path.HeuristicCoster); ok {\n+\t\t\td.heuristic = g.HeuristicCost\n+\t\t} else {\n+\t\t\td.heuristic = path.NullHeuristic\n+\t\t}\n+\t}\n+\n+\td.queue.indexOf = make(map[int]int)\n+\td.queue.insert(d.t, key{d.heuristic(s, t), 0})\n+\n+\tfor _, n := range g.Nodes() {\n+\t\tswitch n.ID() {\n+\t\tcase d.s.ID():\n+\t\t\tworld.AddNode(d.s)\n+\t\tcase d.t.ID():\n+\t\t\tworld.AddNode(d.t)\n+\t\tdefault:\n+\t\t\tworld.AddNode(&dStarLiteNode{Node: n, rhs: math.Inf(1), g: math.Inf(1)})\n+\t\t}\n+\t}\n+\tfor _, u := range world.Nodes() {\n+\t\tfor _, v := range g.From(u) {\n+\t\t\tw := d.weight(g.Edge(u, v))\n+\t\t\tif w < 0 {\n+\t\t\t\tpanic(\"D* Lite: negative edge weight\")\n+\t\t\t}\n+\t\t\tworld.SetEdge(concrete.Edge{F: u, T: world.Node(v.ID())}, w)\n+\t\t}\n+\t}\n+\n+\t/*\n+\t\tprocedure Main()\n+\t\t{31”} ComputeShortestPath();\n+\t*/\n+\td.findShortestPath()\n+\n+\treturn d\n+}\n+\n+// keyFor is the CalculateKey procedure in the D* Lite papers.\n+func (d *DStarLite) keyFor(s *dStarLiteNode) key {\n+\t/*\n+\t   procedure CalculateKey(s)\n+\t   {01”} return [min(g(s), rhs(s)) + h(s_start, s) + k_m; min(g(s), rhs(s))];\n+\t*/\n+\tk := key{1: math.Min(s.g, s.rhs)}\n+\tk[0] = k[1] + d.heuristic(d.s.Node, s.Node) + d.keyModifier\n+\treturn k\n+}\n+\n+// update is the UpdateVertex procedure in the D* Lite papers.\n+func (d *DStarLite) update(u *dStarLiteNode) {\n+\t/*\n+\t   procedure UpdateVertex(u)\n+\t   {07”} if (g(u) != rhs(u) AND u ∈ U) U.Update(u,CalculateKey(u));\n+\t   {08”} else if (g(u) != rhs(u) AND u /∈ U) U.Insert(u,CalculateKey(u));\n+\t   {09”} else if (g(u) = rhs(u) AND u ∈ U) U.Remove(u);\n+\t*/\n+\tuid := u.ID()\n+\tinQueue := d.queue.has(uid)\n+\tswitch {\n+\tcase inQueue && u.g != u.rhs:\n+\t\td.queue.update(uid, d.keyFor(u))\n+\tcase !inQueue && u.g != u.rhs:\n+\t\td.queue.insert(u, d.keyFor(u))\n+\tcase inQueue && u.g == u.rhs:\n+\t\td.queue.remove(uid)\n+\t}\n+}\n+\n+// findShortestPath is the ComputeShortestPath procedure in the D* Lite papers.\n+func (d *DStarLite) findShortestPath() {\n+\t/*\n+\t   procedure ComputeShortestPath()\n+\t   {10”} while (U.TopKey() < CalculateKey(s_start) OR rhs(s_start) > g(s_start))\n+\t   {11”} u = U.Top();\n+\t   {12”} k_old = U.TopKey();\n+\t   {13”} k_new = CalculateKey(u);\n+\t   {14”} if(k_old < k_new)\n+\t   {15”}   U.Update(u, k_new);\n+\t   {16”} else if (g(u) > rhs(u))\n+\t   {17”}   g(u) = rhs(u);\n+\t   {18”}   U.Remove(u);\n+\t   {19”}   for all s ∈ Pred(u)\n+\t   {20”}     if (s != s_goal) rhs(s) = min(rhs(s), c(s, u) + g(u));\n+\t   {21”}     UpdateVertex(s);\n+\t   {22”} else\n+\t   {23”}   g_old = g(u);\n+\t   {24”}   g(u) = ∞;\n+\t   {25”}   for all s ∈ Pred(u) ∪ {u}\n+\t   {26”}     if (rhs(s) = c(s, u) + g_old)\n+\t   {27”}       if (s != s_goal) rhs(s) = min s'∈Succ(s)(c(s, s') + g(s'));\n+\t   {28”}     UpdateVertex(s);\n+\t*/\n+\tfor d.queue.Len() != 0 { // We use d.queue.Len since d.queue does not return an infinite key when empty.\n+\t\tu := d.queue.top()\n+\t\tif !u.key.less(d.keyFor(d.s)) && d.s.rhs <= d.s.g {\n+\t\t\tbreak\n+\t\t}\n+\t\tswitch kNew := d.keyFor(u); {\n+\t\tcase u.key.less(kNew):\n+\t\t\td.queue.update(u.ID(), kNew)\n+\t\tcase u.g > u.rhs:\n+\t\t\tu.g = u.rhs\n+\t\t\td.queue.remove(u.ID())\n+\t\t\tfor _, _s := range d.world.To(u) {\n+\t\t\t\ts := _s.(*dStarLiteNode)\n+\t\t\t\tif s.ID() != d.t.ID() {\n+\t\t\t\t\ts.rhs = math.Min(s.rhs, d.weight(d.world.Edge(s, u))+u.g)\n+\t\t\t\t}\n+\t\t\t\td.update(s)\n+\t\t\t}\n+\t\tdefault:\n+\t\t\tgOld := u.g\n+\t\t\tu.g = math.Inf(1)\n+\t\t\tfor _, _s := range append(d.world.To(u), u) {\n+\t\t\t\ts := _s.(*dStarLiteNode)\n+\t\t\t\t// This is necessary since we are potentially\n+\t\t\t\t// asking for the weight of u to u, but we\n+\t\t\t\t// never return a self-edge.\n+\t\t\t\tvar w float64\n+\t\t\t\tif s.ID() != u.ID() {\n+\t\t\t\t\tw = d.weight(d.world.Edge(s, u))\n+\t\t\t\t}\n+\t\t\t\tif s.rhs == w+gOld {\n+\t\t\t\t\tif s.ID() != d.t.ID() {\n+\t\t\t\t\t\ts.rhs = math.Inf(1)\n+\t\t\t\t\t\tfor _, t := range d.world.From(s) {\n+\t\t\t\t\t\t\ts.rhs = math.Min(s.rhs, d.weight(d.world.Edge(s, t))+t.(dStarLiteNode).g)\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t\td.update(s)\n+\t\t\t}\n+\t\t}\n+\t}\n+}\n+\n+// Step performs one movement step along the best path towards the goal.\n+// It returns false if no further progression toward the goal can be\n+// achieved, either because the goal has been reached or because there\n+// is no path.\n+func (d *DStarLite) Step() bool {\n+\t/*\n+\t   procedure Main()\n+\t   {32”} while (s_start != s_goal)\n+\t   {33”} // if (g(rhs_start) = ∞) then there is no known path\n+\t   {34”}   s_start = argmin s'∈Succ(s_start)(c(s_start, s') + g(s'));\n+\t*/\n+\tif d.s.ID() == d.t.ID() {\n+\t\treturn false\n+\t}\n+\tif math.IsInf(d.s.rhs, 1) {\n+\t\treturn false\n+\t}\n+\tmin := math.Inf(1)","path":"path/dynamic/dstarlite.go","position":235,"original_position":235,"commit_id":"bfda297d6d025205fc2f915966bd0fc76f36dd78","original_commit_id":"33eb3999f8b8b845a88794f281cd0006700e6863","user":{"login":"kortschak","id":275221,"avatar_url":"https://avatars.githubusercontent.com/u/275221?v=3","gravatar_id":"","url":"https://api.github.com/users/kortschak","html_url":"https://github.com/kortschak","followers_url":"https://api.github.com/users/kortschak/followers","following_url":"https://api.github.com/users/kortschak/following{/other_user}","gists_url":"https://api.github.com/users/kortschak/gists{/gist_id}","starred_url":"https://api.github.com/users/kortschak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kortschak/subscriptions","organizations_url":"https://api.github.com/users/kortschak/orgs","repos_url":"https://api.github.com/users/kortschak/repos","events_url":"https://api.github.com/users/kortschak/events{/privacy}","received_events_url":"https://api.github.com/users/kortschak/received_events","type":"User","site_admin":false},"body":"I wanted to make the distinction that the move is not being done by the algorithm - this was the source of confusion before. AFAICS the English comment indicates that it is the movement of the robot, not the change of the algorithm's representation of location; so the action described by `{35”}` takes place after the return true with (in the tests) `l.MoveTo(d.Here())`.","created_at":"2015-07-17T07:00:28Z","updated_at":"2015-07-17T07:00:28Z","html_url":"https://github.com/gonum/graph/pull/92#discussion_r34866150","pull_request_url":"https://api.github.com/repos/gonum/graph/pulls/92","_links":{"self":{"href":"https://api.github.com/repos/gonum/graph/pulls/comments/34866150"},"html":{"href":"https://github.com/gonum/graph/pull/92#discussion_r34866150"},"pull_request":{"href":"https://api.github.com/repos/gonum/graph/pulls/92"}}},"pull_request":{"url":"https://api.github.com/repos/gonum/graph/pulls/92","id":38839651,"html_url":"https://github.com/gonum/graph/pull/92","diff_url":"https://github.com/gonum/graph/pull/92.diff","patch_url":"https://github.com/gonum/graph/pull/92.patch","issue_url":"https://api.github.com/repos/gonum/graph/issues/92","number":92,"state":"open","locked":false,"title":"dynamic: new package dynamic path finding","user":{"login":"kortschak","id":275221,"avatar_url":"https://avatars.githubusercontent.com/u/275221?v=3","gravatar_id":"","url":"https://api.github.com/users/kortschak","html_url":"https://github.com/kortschak","followers_url":"https://api.github.com/users/kortschak/followers","following_url":"https://api.github.com/users/kortschak/following{/other_user}","gists_url":"https://api.github.com/users/kortschak/gists{/gist_id}","starred_url":"https://api.github.com/users/kortschak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kortschak/subscriptions","organizations_url":"https://api.github.com/users/kortschak/orgs","repos_url":"https://api.github.com/users/kortschak/repos","events_url":"https://api.github.com/users/kortschak/events{/privacy}","received_events_url":"https://api.github.com/users/kortschak/received_events","type":"User","site_admin":false},"body":"Start by adding D* Lite dynamic re-planning path finder.\r\n\r\n~~NOT FOR SUBMISSION~~\r\n\r\nThis needs further tests which I don't have time to write right now. Currently it passes the A* tests with the exception of zero-weight cycles (which I think we can legitimately ignore since this is a real-world planner), but we need tests for a dynamically defined world. This will probably involve writing an 8grid with limited vision.\r\n\r\nAdditionally, the A* tests are copied from path because they are defined in path_test. Probably we need to make a path/internal package for these so they can be shared, though other suggestions are welcomed.\r\n\r\n@gonum/developers @vladimir-ch PTAL\r\n\r\nTODO(kortschak): Mark as \"Fixes # 15.\" in commit prior to submission.","created_at":"2015-06-30T03:34:33Z","updated_at":"2015-07-17T07:00:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"85f62f9e347227548a98c1d76f5e2101c9cdf9ca","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/gonum/graph/pulls/92/commits","review_comments_url":"https://api.github.com/repos/gonum/graph/pulls/92/comments","review_comment_url":"https://api.github.com/repos/gonum/graph/pulls/comments{/number}","comments_url":"https://api.github.com/repos/gonum/graph/issues/92/comments","statuses_url":"https://api.github.com/repos/gonum/graph/statuses/bfda297d6d025205fc2f915966bd0fc76f36dd78","head":{"label":"gonum:d_star_lite","ref":"d_star_lite","sha":"bfda297d6d025205fc2f915966bd0fc76f36dd78","user":{"login":"gonum","id":3771091,"avatar_url":"https://avatars.githubusercontent.com/u/3771091?v=3","gravatar_id":"","url":"https://api.github.com/users/gonum","html_url":"https://github.com/gonum","followers_url":"https://api.github.com/users/gonum/followers","following_url":"https://api.github.com/users/gonum/following{/other_user}","gists_url":"https://api.github.com/users/gonum/gists{/gist_id}","starred_url":"https://api.github.com/users/gonum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gonum/subscriptions","organizations_url":"https://api.github.com/users/gonum/orgs","repos_url":"https://api.github.com/users/gonum/repos","events_url":"https://api.github.com/users/gonum/events{/privacy}","received_events_url":"https://api.github.com/users/gonum/received_events","type":"Organization","site_admin":false},"repo":{"id":8589420,"name":"graph","full_name":"gonum/graph","owner":{"login":"gonum","id":3771091,"avatar_url":"https://avatars.githubusercontent.com/u/3771091?v=3","gravatar_id":"","url":"https://api.github.com/users/gonum","html_url":"https://github.com/gonum","followers_url":"https://api.github.com/users/gonum/followers","following_url":"https://api.github.com/users/gonum/following{/other_user}","gists_url":"https://api.github.com/users/gonum/gists{/gist_id}","starred_url":"https://api.github.com/users/gonum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gonum/subscriptions","organizations_url":"https://api.github.com/users/gonum/orgs","repos_url":"https://api.github.com/users/gonum/repos","events_url":"https://api.github.com/users/gonum/events{/privacy}","received_events_url":"https://api.github.com/users/gonum/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/gonum/graph","description":"Graph packages for the Go language","fork":false,"url":"https://api.github.com/repos/gonum/graph","forks_url":"https://api.github.com/repos/gonum/graph/forks","keys_url":"https://api.github.com/repos/gonum/graph/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gonum/graph/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gonum/graph/teams","hooks_url":"https://api.github.com/repos/gonum/graph/hooks","issue_events_url":"https://api.github.com/repos/gonum/graph/issues/events{/number}","events_url":"https://api.github.com/repos/gonum/graph/events","assignees_url":"https://api.github.com/repos/gonum/graph/assignees{/user}","branches_url":"https://api.github.com/repos/gonum/graph/branches{/branch}","tags_url":"https://api.github.com/repos/gonum/graph/tags","blobs_url":"https://api.github.com/repos/gonum/graph/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gonum/graph/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gonum/graph/git/refs{/sha}","trees_url":"https://api.github.com/repos/gonum/graph/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gonum/graph/statuses/{sha}","languages_url":"https://api.github.com/repos/gonum/graph/languages","stargazers_url":"https://api.github.com/repos/gonum/graph/stargazers","contributors_url":"https://api.github.com/repos/gonum/graph/contributors","subscribers_url":"https://api.github.com/repos/gonum/graph/subscribers","subscription_url":"https://api.github.com/repos/gonum/graph/subscription","commits_url":"https://api.github.com/repos/gonum/graph/commits{/sha}","git_commits_url":"https://api.github.com/repos/gonum/graph/git/commits{/sha}","comments_url":"https://api.github.com/repos/gonum/graph/comments{/number}","issue_comment_url":"https://api.github.com/repos/gonum/graph/issues/comments{/number}","contents_url":"https://api.github.com/repos/gonum/graph/contents/{+path}","compare_url":"https://api.github.com/repos/gonum/graph/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gonum/graph/merges","archive_url":"https://api.github.com/repos/gonum/graph/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gonum/graph/downloads","issues_url":"https://api.github.com/repos/gonum/graph/issues{/number}","pulls_url":"https://api.github.com/repos/gonum/graph/pulls{/number}","milestones_url":"https://api.github.com/repos/gonum/graph/milestones{/number}","notifications_url":"https://api.github.com/repos/gonum/graph/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gonum/graph/labels{/name}","releases_url":"https://api.github.com/repos/gonum/graph/releases{/id}","created_at":"2013-03-05T21:22:45Z","updated_at":"2015-07-13T00:09:36Z","pushed_at":"2015-07-17T06:49:37Z","git_url":"git://github.com/gonum/graph.git","ssh_url":"git@github.com:gonum/graph.git","clone_url":"https://github.com/gonum/graph.git","svn_url":"https://github.com/gonum/graph","homepage":"","size":3213,"stargazers_count":71,"watchers_count":71,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":10,"mirror_url":null,"open_issues_count":20,"forks":10,"open_issues":20,"watchers":71,"default_branch":"master"}},"base":{"label":"gonum:master","ref":"master","sha":"bde6d0fbd9dec5a997e906611fe0364001364c41","user":{"login":"gonum","id":3771091,"avatar_url":"https://avatars.githubusercontent.com/u/3771091?v=3","gravatar_id":"","url":"https://api.github.com/users/gonum","html_url":"https://github.com/gonum","followers_url":"https://api.github.com/users/gonum/followers","following_url":"https://api.github.com/users/gonum/following{/other_user}","gists_url":"https://api.github.com/users/gonum/gists{/gist_id}","starred_url":"https://api.github.com/users/gonum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gonum/subscriptions","organizations_url":"https://api.github.com/users/gonum/orgs","repos_url":"https://api.github.com/users/gonum/repos","events_url":"https://api.github.com/users/gonum/events{/privacy}","received_events_url":"https://api.github.com/users/gonum/received_events","type":"Organization","site_admin":false},"repo":{"id":8589420,"name":"graph","full_name":"gonum/graph","owner":{"login":"gonum","id":3771091,"avatar_url":"https://avatars.githubusercontent.com/u/3771091?v=3","gravatar_id":"","url":"https://api.github.com/users/gonum","html_url":"https://github.com/gonum","followers_url":"https://api.github.com/users/gonum/followers","following_url":"https://api.github.com/users/gonum/following{/other_user}","gists_url":"https://api.github.com/users/gonum/gists{/gist_id}","starred_url":"https://api.github.com/users/gonum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gonum/subscriptions","organizations_url":"https://api.github.com/users/gonum/orgs","repos_url":"https://api.github.com/users/gonum/repos","events_url":"https://api.github.com/users/gonum/events{/privacy}","received_events_url":"https://api.github.com/users/gonum/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/gonum/graph","description":"Graph packages for the Go language","fork":false,"url":"https://api.github.com/repos/gonum/graph","forks_url":"https://api.github.com/repos/gonum/graph/forks","keys_url":"https://api.github.com/repos/gonum/graph/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gonum/graph/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gonum/graph/teams","hooks_url":"https://api.github.com/repos/gonum/graph/hooks","issue_events_url":"https://api.github.com/repos/gonum/graph/issues/events{/number}","events_url":"https://api.github.com/repos/gonum/graph/events","assignees_url":"https://api.github.com/repos/gonum/graph/assignees{/user}","branches_url":"https://api.github.com/repos/gonum/graph/branches{/branch}","tags_url":"https://api.github.com/repos/gonum/graph/tags","blobs_url":"https://api.github.com/repos/gonum/graph/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gonum/graph/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gonum/graph/git/refs{/sha}","trees_url":"https://api.github.com/repos/gonum/graph/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gonum/graph/statuses/{sha}","languages_url":"https://api.github.com/repos/gonum/graph/languages","stargazers_url":"https://api.github.com/repos/gonum/graph/stargazers","contributors_url":"https://api.github.com/repos/gonum/graph/contributors","subscribers_url":"https://api.github.com/repos/gonum/graph/subscribers","subscription_url":"https://api.github.com/repos/gonum/graph/subscription","commits_url":"https://api.github.com/repos/gonum/graph/commits{/sha}","git_commits_url":"https://api.github.com/repos/gonum/graph/git/commits{/sha}","comments_url":"https://api.github.com/repos/gonum/graph/comments{/number}","issue_comment_url":"https://api.github.com/repos/gonum/graph/issues/comments{/number}","contents_url":"https://api.github.com/repos/gonum/graph/contents/{+path}","compare_url":"https://api.github.com/repos/gonum/graph/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gonum/graph/merges","archive_url":"https://api.github.com/repos/gonum/graph/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gonum/graph/downloads","issues_url":"https://api.github.com/repos/gonum/graph/issues{/number}","pulls_url":"https://api.github.com/repos/gonum/graph/pulls{/number}","milestones_url":"https://api.github.com/repos/gonum/graph/milestones{/number}","notifications_url":"https://api.github.com/repos/gonum/graph/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gonum/graph/labels{/name}","releases_url":"https://api.github.com/repos/gonum/graph/releases{/id}","created_at":"2013-03-05T21:22:45Z","updated_at":"2015-07-13T00:09:36Z","pushed_at":"2015-07-17T06:49:37Z","git_url":"git://github.com/gonum/graph.git","ssh_url":"git@github.com:gonum/graph.git","clone_url":"https://github.com/gonum/graph.git","svn_url":"https://github.com/gonum/graph","homepage":"","size":3213,"stargazers_count":71,"watchers_count":71,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":10,"mirror_url":null,"open_issues_count":20,"forks":10,"open_issues":20,"watchers":71,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/gonum/graph/pulls/92"},"html":{"href":"https://github.com/gonum/graph/pull/92"},"issue":{"href":"https://api.github.com/repos/gonum/graph/issues/92"},"comments":{"href":"https://api.github.com/repos/gonum/graph/issues/92/comments"},"review_comments":{"href":"https://api.github.com/repos/gonum/graph/pulls/92/comments"},"review_comment":{"href":"https://api.github.com/repos/gonum/graph/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/gonum/graph/pulls/92/commits"},"statuses":{"href":"https://api.github.com/repos/gonum/graph/statuses/bfda297d6d025205fc2f915966bd0fc76f36dd78"}}}}