{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments/117580827","pull_request_review_id":39262467,"id":117580827,"diff_hunk":"@@ -0,0 +1,224 @@\n+package org.broadinstitute.hellbender.tools.spark.utils;\n+\n+import com.esotericsoftware.kryo.DefaultSerializer;\n+import com.esotericsoftware.kryo.Kryo;\n+import com.esotericsoftware.kryo.io.Input;\n+import com.esotericsoftware.kryo.io.Output;\n+import org.broadinstitute.hellbender.tools.spark.sv.SVUtils;\n+import org.broadinstitute.hellbender.utils.Utils;\n+\n+import java.io.Serializable;\n+import java.util.ArrayList;\n+import java.util.Collection;\n+import java.util.List;\n+import java.util.NoSuchElementException;\n+\n+/**\n+ * Set of longs that is larger than the max Java array size ( ~ 2^31 ~ 2 billion) and therefore cannot fit into a\n+ * single LongHopscotchSet. Maintains partitions of LongHopscotchSets given a maximum partition size and the number\n+ * of elements to be added. Bins each entry into a corresponding LongHopscotchSet using the entry hash value. Does\n+ * not support dynamic resizing.\n+ */\n+@DefaultSerializer(LargeLongHopscotchSet.Serializer.class)\n+public class LargeLongHopscotchSet implements Serializable, QueryableLongSet {\n+\n+    private static final long serialVersionUID = 1L;\n+    private final List<LongHopscotchSet> sets;\n+    private int numSets;\n+\n+    public LargeLongHopscotchSet(final long maxPartitionBytes, final long numElements) {\n+        sets = new ArrayList<>();\n+        initialize(maxPartitionBytes, numElements);\n+    }\n+\n+    @SuppressWarnings(\"unchecked\")\n+    protected LargeLongHopscotchSet(final Kryo kryo, final Input stream) {\n+        final boolean oldReferences = kryo.getReferences();\n+        kryo.setReferences(false);\n+\n+        numSets = stream.readInt();\n+        sets = new ArrayList<>(numSets);\n+        for (int i = 0; i < numSets; i++) {\n+            sets.add(kryo.readObject(stream, LongHopscotchSet.class));\n+        }\n+\n+        kryo.setReferences(oldReferences);\n+    }\n+\n+    private static int longHash(final long entryVal) {\n+        return (int) SVUtils.fnvLong64(0x4c79ac6a, entryVal);\n+    }\n+\n+    private void initialize(final long maxPartitionBytes, final long numElements) {\n+        Utils.validateArg(maxPartitionBytes > 0, \"Max partition size must be greater than 0\");\n+        Utils.validateArg(numElements > 0, \"Number of elements must be greater than 0\");\n+\n+        //Largest partition according to the max bytes per partition constraint\n+        final int maxPartitionSize = LongHopscotchSet.getLegalSizeBelow(maxPartitionBytes / LongHopscotchSet.bytesPerBucket);\n+        //Truncate numElements to largest int possible\n+        final int idealPartitionSize = LongHopscotchSet.getPartitionSize(numElements);\n+        //Number of elements per partition\n+        final int elementsPerPartitionGuess = Math.min(idealPartitionSize, maxPartitionSize);\n+        final int partitions = (int) Math.ceil(((double) numElements) / elementsPerPartitionGuess);\n+        final int elementsPerPartition = (int)Math.ceil(numElements / (double)partitions);\n+\n+        for (int i = 0; i < partitions; i++) {\n+            sets.add(new LongHopscotchSet(elementsPerPartition));\n+        }\n+        numSets = sets.size();\n+    }\n+\n+    protected void serialize(final Kryo kryo, final Output stream) {\n+        final boolean oldReferences = kryo.getReferences();\n+        kryo.setReferences(false);\n+\n+        stream.writeInt(sets.size());\n+        for (final LongHopscotchSet set : sets) {\n+            kryo.writeObject(stream, set);\n+        }\n+\n+        kryo.setReferences(oldReferences);\n+    }\n+\n+    public boolean add(final long entryValue) {\n+        final int setIndex = setIndexOf(entryValue);\n+        final LongHopscotchSet setRef = sets.get(setIndex);\n+        return setRef.add(entryValue);\n+    }\n+\n+    public void addAll(final long[] entryValues) {\n+        for (final long val : entryValues) {\n+            add(val);\n+        }\n+    }\n+\n+    public long size() {\n+        long sum = 0;\n+        for (final LongHopscotchSet s : sets) {\n+            sum += s.size();\n+        }\n+        return sum;\n+    }\n+\n+    public Collection<LongHopscotchSet> getSets() {\n+        return sets;\n+    }\n+\n+    public long capacity() {\n+        long sum = 0;\n+        for (final LongHopscotchSet s : sets) {\n+            sum += s.capacity();\n+        }\n+        return sum;\n+    }\n+\n+    public boolean contains(final long key) {\n+        return sets.get(setIndexOf(key)).contains(key);\n+    }\n+\n+    public boolean containsAll(final long[] vals) {\n+        for (final long val : vals) {\n+            if (!contains(val))\n+                return false;\n+        }\n+        return true;\n+    }\n+\n+    public LongIterator iterator() {\n+        return new LargeLongHopscotchSetIterator();\n+\n+    }\n+\n+    public boolean remove(final long key) {\n+        return sets.get(setIndexOf(key)).remove(key);\n+    }\n+\n+    public boolean removeAll(final long[] set) {\n+        boolean result = false;\n+        for (final long val : set) {\n+            if (remove(val)) result = true;\n+        }\n+        return result;\n+    }\n+\n+    public boolean isEmpty() {\n+        return this.size() == 0;\n+    }\n+\n+    private int setIndexOf(final long val) {\n+        return Integer.remainderUnsigned(longHash(val), numSets);\n+    }\n+\n+    @Override\n+    public boolean equals(final Object o) {\n+        if (this == o) return true;\n+        if (o == null || getClass() != o.getClass()) return false;\n+\n+        final LargeLongHopscotchSet that = (LargeLongHopscotchSet) o;\n+\n+        return numSets == that.numSets && sets.equals(that.sets);\n+\n+    }\n+\n+    @Override\n+    public int hashCode() {\n+        final LongIterator itr = iterator();\n+        int sum = 0;\n+        while (itr.hasNext()) {\n+            sum += LongHopscotchSet.longHash(itr.next());\n+        }\n+        return sum;\n+    }\n+\n+    public static final class Serializer extends com.esotericsoftware.kryo.Serializer<LargeLongHopscotchSet> {\n+        @Override\n+        public void write(final Kryo kryo, final Output output, final LargeLongHopscotchSet hopscotchSet) {\n+            hopscotchSet.serialize(kryo, output);\n+        }\n+\n+        @Override\n+        public LargeLongHopscotchSet read(final Kryo kryo, final Input input, final Class<LargeLongHopscotchSet> klass) {\n+            return new LargeLongHopscotchSet(kryo, input);\n+        }\n+    }\n+\n+    private final class LargeLongHopscotchSetIterator implements LongIterator {","path":"src/main/java/org/broadinstitute/hellbender/tools/spark/utils/LargeLongHopscotchSet.java","position":185,"original_position":185,"commit_id":"fbf4f088d3b4649e30208c483e63ac8fa31cf1f1","original_commit_id":"fbf4f088d3b4649e30208c483e63ac8fa31cf1f1","user":{"login":"tedsharpe","id":9284156,"avatar_url":"https://avatars1.githubusercontent.com/u/9284156?v=3","gravatar_id":"","url":"https://api.github.com/users/tedsharpe","html_url":"https://github.com/tedsharpe","followers_url":"https://api.github.com/users/tedsharpe/followers","following_url":"https://api.github.com/users/tedsharpe/following{/other_user}","gists_url":"https://api.github.com/users/tedsharpe/gists{/gist_id}","starred_url":"https://api.github.com/users/tedsharpe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tedsharpe/subscriptions","organizations_url":"https://api.github.com/users/tedsharpe/orgs","repos_url":"https://api.github.com/users/tedsharpe/repos","events_url":"https://api.github.com/users/tedsharpe/events{/privacy}","received_events_url":"https://api.github.com/users/tedsharpe/received_events","type":"User","site_admin":false},"body":"Just use an outer Iterator<LongHopscotchSet> and an inner LongIterator.\r\nhasNext() checks the inner iterator for null or !hasNext and advances the outer iterator until it finds a new inner iterator that isn't empty, or until the outer iterator is exhausted.","created_at":"2017-05-19T21:40:05Z","updated_at":"2017-05-19T21:40:48Z","html_url":"https://github.com/broadinstitute/gatk/pull/2729#discussion_r117580827","pull_request_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/2729","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments/117580827"},"html":{"href":"https://github.com/broadinstitute/gatk/pull/2729#discussion_r117580827"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/2729"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/gatk/pulls/2729","id":121163536,"html_url":"https://github.com/broadinstitute/gatk/pull/2729","diff_url":"https://github.com/broadinstitute/gatk/pull/2729.diff","patch_url":"https://github.com/broadinstitute/gatk/pull/2729.patch","issue_url":"https://api.github.com/repos/broadinstitute/gatk/issues/2729","number":2729,"state":"open","locked":false,"title":"Add Hopscotch and Bloom filter classes for gigantic sets of longs","user":{"login":"mwalker174","id":5686877,"avatar_url":"https://avatars1.githubusercontent.com/u/5686877?v=3","gravatar_id":"","url":"https://api.github.com/users/mwalker174","html_url":"https://github.com/mwalker174","followers_url":"https://api.github.com/users/mwalker174/followers","following_url":"https://api.github.com/users/mwalker174/following{/other_user}","gists_url":"https://api.github.com/users/mwalker174/gists{/gist_id}","starred_url":"https://api.github.com/users/mwalker174/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mwalker174/subscriptions","organizations_url":"https://api.github.com/users/mwalker174/orgs","repos_url":"https://api.github.com/users/mwalker174/repos","events_url":"https://api.github.com/users/mwalker174/events{/privacy}","received_events_url":"https://api.github.com/users/mwalker174/received_events","type":"User","site_admin":false},"body":"@cwhelan @tedsharpe please review.\r\n\r\nThere are 4 new classes here:\r\n\r\n1. LongHopscotchSet - based on HopscotchCollection/Set but adapted to store primitive longs instead of objects. The most significant bit is used to tell if a bucket is null or not, so the longs being stored must be non-negative. This works for use with k-mers, which we are assume are odd-length up to 31 and thus consume up to 62 bits.\r\n2. LargeLongHopscotchSet - for sets of longs greater than ~2 billion (the max Java array size) using a List of LongHopscotchSets.\r\n3. LongBloomFilter - Bloom filter for long's\r\n4. LargeLongBloomFilter - Bloom filter when the filter index size exceeds 2GB using a List of LongBloomFilters.\r\n\r\n- LongIterator and QueryableLongSet interfaces for convenience.\r\n- Minor change to HopscotchSet max legal size, which was higher than the actual allowed Java array size.\r\n\r\nPS I just had a thought that the Bloom filters could use long instead of byte buckets to expand the max index size 8-fold. Could maybe be done for the Hopscotch sets as well, but with considerably more difficulty. Thoughts? On the other hand, the performance is already adequate so perhaps I'll save this idea for later.\r\n","created_at":"2017-05-17T22:10:50Z","updated_at":"2017-05-19T21:40:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"04273287eb6bc9504c1d53cb274f7b34daf52cf2","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/2729/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/2729/comments","review_comment_url":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments{/number}","comments_url":"https://api.github.com/repos/broadinstitute/gatk/issues/2729/comments","statuses_url":"https://api.github.com/repos/broadinstitute/gatk/statuses/fbf4f088d3b4649e30208c483e63ac8fa31cf1f1","head":{"label":"broadinstitute:mw_sets","ref":"mw_sets","sha":"fbf4f088d3b4649e30208c483e63ac8fa31cf1f1","user":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars3.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"repo":{"id":27452807,"name":"gatk","full_name":"broadinstitute/gatk","owner":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars3.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/broadinstitute/gatk","description":"GATK4 development","fork":false,"url":"https://api.github.com/repos/broadinstitute/gatk","forks_url":"https://api.github.com/repos/broadinstitute/gatk/forks","keys_url":"https://api.github.com/repos/broadinstitute/gatk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/gatk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/gatk/teams","hooks_url":"https://api.github.com/repos/broadinstitute/gatk/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/gatk/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/gatk/events","assignees_url":"https://api.github.com/repos/broadinstitute/gatk/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/gatk/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/gatk/tags","blobs_url":"https://api.github.com/repos/broadinstitute/gatk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/gatk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/gatk/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/gatk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/gatk/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/gatk/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/gatk/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/gatk/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/gatk/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/gatk/subscription","commits_url":"https://api.github.com/repos/broadinstitute/gatk/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/gatk/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/gatk/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/gatk/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/gatk/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/gatk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/gatk/merges","archive_url":"https://api.github.com/repos/broadinstitute/gatk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/gatk/downloads","issues_url":"https://api.github.com/repos/broadinstitute/gatk/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/gatk/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/gatk/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/gatk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/gatk/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/gatk/releases{/id}","deployments_url":"https://api.github.com/repos/broadinstitute/gatk/deployments","created_at":"2014-12-02T20:50:36Z","updated_at":"2017-05-19T17:49:45Z","pushed_at":"2017-05-19T21:39:08Z","git_url":"git://github.com/broadinstitute/gatk.git","ssh_url":"git@github.com:broadinstitute/gatk.git","clone_url":"https://github.com/broadinstitute/gatk.git","svn_url":"https://github.com/broadinstitute/gatk","homepage":"","size":79384,"stargazers_count":114,"watchers_count":114,"language":"Java","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":51,"mirror_url":null,"open_issues_count":460,"forks":51,"open_issues":460,"watchers":114,"default_branch":"master"}},"base":{"label":"broadinstitute:master","ref":"master","sha":"d6d9e9500e3bba8e5d87bd9c97bfbaf8944cab8f","user":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars3.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"repo":{"id":27452807,"name":"gatk","full_name":"broadinstitute/gatk","owner":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars3.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/broadinstitute/gatk","description":"GATK4 development","fork":false,"url":"https://api.github.com/repos/broadinstitute/gatk","forks_url":"https://api.github.com/repos/broadinstitute/gatk/forks","keys_url":"https://api.github.com/repos/broadinstitute/gatk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/gatk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/gatk/teams","hooks_url":"https://api.github.com/repos/broadinstitute/gatk/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/gatk/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/gatk/events","assignees_url":"https://api.github.com/repos/broadinstitute/gatk/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/gatk/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/gatk/tags","blobs_url":"https://api.github.com/repos/broadinstitute/gatk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/gatk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/gatk/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/gatk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/gatk/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/gatk/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/gatk/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/gatk/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/gatk/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/gatk/subscription","commits_url":"https://api.github.com/repos/broadinstitute/gatk/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/gatk/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/gatk/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/gatk/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/gatk/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/gatk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/gatk/merges","archive_url":"https://api.github.com/repos/broadinstitute/gatk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/gatk/downloads","issues_url":"https://api.github.com/repos/broadinstitute/gatk/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/gatk/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/gatk/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/gatk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/gatk/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/gatk/releases{/id}","deployments_url":"https://api.github.com/repos/broadinstitute/gatk/deployments","created_at":"2014-12-02T20:50:36Z","updated_at":"2017-05-19T17:49:45Z","pushed_at":"2017-05-19T21:39:08Z","git_url":"git://github.com/broadinstitute/gatk.git","ssh_url":"git@github.com:broadinstitute/gatk.git","clone_url":"https://github.com/broadinstitute/gatk.git","svn_url":"https://github.com/broadinstitute/gatk","homepage":"","size":79384,"stargazers_count":114,"watchers_count":114,"language":"Java","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":51,"mirror_url":null,"open_issues_count":460,"forks":51,"open_issues":460,"watchers":114,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/2729"},"html":{"href":"https://github.com/broadinstitute/gatk/pull/2729"},"issue":{"href":"https://api.github.com/repos/broadinstitute/gatk/issues/2729"},"comments":{"href":"https://api.github.com/repos/broadinstitute/gatk/issues/2729/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/2729/comments"},"review_comment":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/broadinstitute/gatk/pulls/2729/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/gatk/statuses/fbf4f088d3b4649e30208c483e63ac8fa31cf1f1"}}}}
{"actor":{"display_login":"tedsharpe"}}