{"action":"created","comment":{"url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/comments/39992506","id":39992506,"diff_hunk":"@@ -0,0 +1,286 @@\n+/* -------------------------------------------------------------------------- *\n+ *                            OpenSim:  DataTable.h                           *\n+ * -------------------------------------------------------------------------- *\n+ * The OpenSim API is a toolkit for musculoskeletal modeling and simulation.  *\n+ * See http://opensim.stanford.edu and the NOTICE file for more information.  *\n+ * OpenSim is developed at Stanford University and supported by the US        *\n+ * National Institutes of Health (U54 GM072970, R24 HD065690) and by DARPA    *\n+ * through the Warrior Web program.                                           *\n+ *                                                                            *\n+ * Copyright (c) 2005-2015 Stanford University and the Authors                *\n+ *                                                                            *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\"); you may    *\n+ * not use this file except in compliance with the License. You may obtain a  *\n+ * copy of the License at http://www.apache.org/licenses/LICENSE-2.0.         *\n+ *                                                                            *\n+ * Unless required by applicable law or agreed to in writing, software        *\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,          *\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   *\n+ * See the License for the specific language governing permissions and        *\n+ * limitations under the License.                                             *\n+ * -------------------------------------------------------------------------- */\n+\n+/** \\file\n+This file defines the  DataTable_ class, which is used by OpenSim to provide an \n+in-memory container for data access and manipulation.                         */\n+\n+#ifndef OPENSIM_DATATABLE_H\n+#define OPENSIM_DATATABLE_H\n+\n+// Non-standard headers.\n+#include \"SimTKcommon.h\"\n+#include \"OpenSim/Common/Exception.h\"\n+#include \"OpenSim/Common/ValueArrayDictionary.h\"\n+\n+namespace OpenSim {\n+\n+/** AbstractDataTable is the base-class of all DataTable_(templated) allowing \n+storage of DataTable_ templated on different types to be stored in a container \n+like std::vector. AbstractDataTable_ offers:\n+- Interface to access column metadata of the DataTable_.\n+- A heterogeneous container to store metadata associated with the DataTable_ in\n+  the form of key-value pairs where key is of type std::string and value can be\n+  of any type.\n+\n+This class is abstract and cannot be used directly. Create instances of \n+DataTable_ instead. See DataTable_ for details on ussage.                     */\n+class AbstractDataTable {\n+protected:\n+    class ValueDictionary {\n+    public:\n+        using AbstractValue = SimTK::AbstractValue;\n+\n+        const AbstractValue& getValueForKey(const std::string& key) const {\n+            return _dictionary.getValueArrayForKey(key)[0];\n+        }\n+\n+        template<typename ValueType>\n+        void setValueForKey(const std::string& key,\n+                            const ValueType& value) {\n+            ValueArray<ValueType> value_array{};\n+            value_array.upd().push_back(SimTK::Value<ValueType>{value});\n+            _dictionary.setValueArrayForKey(key, value_array);\n+        }\n+\n+        void removeValueForKey(const std::string& key) {\n+            _dictionary.removeValueArrayForKey(key);\n+        }\n+\n+        std::vector<std::string> getKeys() const {\n+            return _dictionary.getKeys();\n+        }\n+\n+    private:\n+        ValueArrayDictionary _dictionary;\n+    }; // ValueDictionary\n+\n+public:\n+    using TableMetaData       = ValueDictionary;\n+    using DependentsMetaData  = ValueArrayDictionary;\n+    using IndependentMetaData = ValueDictionary;\n+\n+    AbstractDataTable()                                      = default;\n+    AbstractDataTable(const AbstractDataTable&)              = default;\n+    AbstractDataTable(AbstractDataTable&&)                   = default;\n+    AbstractDataTable& operator=(const AbstractDataTable&)   = default;\n+    AbstractDataTable& operator=(AbstractDataTable&&)        = default;\n+    virtual std::unique_ptr<AbstractDataTable> clone() const = 0;\n+    virtual ~AbstractDataTable()                             = default;\n+\n+    /** Get metadata associated with the table.                               */\n+    const TableMetaData& getTableMetaData() const {\n+        return _tableMetaData;\n+    }\n+\n+    /** Update metadata associated with the table.                            */\n+    TableMetaData& updTableMetaData() {\n+        return _tableMetaData;\n+    }\n+\n+    /** Get number of rows.                                                   */\n+    size_t getNumRows() const {\n+        return computeNumRows();\n+    }\n+\n+    /** Get number of columns.                                                */\n+    size_t getNumColumns() const {\n+        return computeNumColumns();\n+    }\n+    \n+    /** Get metadata associated with the independent column.                  */\n+    const IndependentMetaData& getIndependentMetaData() const {\n+        return _independentMetaData;\n+    }\n+    \n+    /** Set metadata associated with the independent column.                  */\n+    void \n+    setIndependentMetaData(const IndependentMetaData& independentMetaData) {\n+        _independentMetaData = independentMetaData;\n+        validateIndependentMetaData();\n+    }\n+\n+    /** Get metadata associated with the dependent columns.                   */\n+    const DependentsMetaData& getDependentsMetaData() const {\n+        return _dependentsMetaData;\n+    }\n+    \n+    /** Set metadata associated with the dependent columns.                   */\n+    void \n+    setDependentsMetaData(const DependentsMetaData& dependentsMetaData) {\n+        _dependentsMetaData = dependentsMetaData;\n+        validateDependentsMetaData();\n+    }\n+\n+protected:\n+    virtual size_t computeNumRows() const            = 0;\n+    virtual size_t computeNumColumns() const         = 0;\n+    virtual void validateIndependentMetaData() const = 0;\n+    virtual void validateDependentsMetaData() const  = 0;\n+\n+    TableMetaData       _tableMetaData;\n+    DependentsMetaData  _dependentsMetaData;\n+    IndependentMetaData _independentMetaData;\n+}; // AbstractDataTable\n+\n+\n+/** DataTable_ is a in-memory storage container for data with support for \n+holding metadata. Data contains an independent column and a set of dependent \n+columns. The type of the independent column can be configured using ETX (\n+template param). The type of the dependent columns, which together form a matrix\n+, can be configured using ETY (template param). Independent and Dependent \n+columns can contain metadata. DataTable_ as a whole can contain metadata.     */\n+template<typename ETX = double, typename ETY = SimTK::Real>\n+class DataTable_ : public AbstractDataTable {\n+public:\n+    using RowVector    = SimTK::RowVector_<ETY>;\n+    using ColumnVector = SimTK::Vector_<ETY>;\n+\n+    DataTable_()                             = default;\n+    DataTable_(const DataTable_&)            = default;\n+    DataTable_(DataTable_&&)                 = default;\n+    DataTable_& operator=(const DataTable_&) = default;\n+    DataTable_& operator=(DataTable_&&)      = default;\n+    ~DataTable_()                            = default;\n+\n+    std::unique_ptr<AbstractDataTable> clone() const override {\n+        return std::unique_ptr<AbstractDataTable>{new DataTable_{*this}};\n+    }\n+\n+    /** Append row to the DataTable_.                                         */\n+    void appendRow(const ETX& indRow, const RowVector& depRow) {\n+        validateAppendRow(indRow, depRow);\n+\n+        _indData.push_back(indRow);\n+\n+        if(_depData.nrow() == 0 || _depData.ncol() == 0) {\n+            try {\n+                auto& labels = \n+                    _dependentsMetaData.getValueArrayForKey(\"labels\");\n+                if(depRow.size() != labels.size())\n+                    throw Exception{\"Number of columns in the input row does \"\n+                            \"not match the number of labels.\"};\n+            } catch(std::out_of_range&) {","path":"OpenSim/Common/DataTable.h","position":182,"original_position":182,"commit_id":"9d994e3d8eaec61bbb2bab30f9af1dc648237911","original_commit_id":"9d994e3d8eaec61bbb2bab30f9af1dc648237911","user":{"login":"sherm1","id":4088016,"avatar_url":"https://avatars.githubusercontent.com/u/4088016?v=3","gravatar_id":"","url":"https://api.github.com/users/sherm1","html_url":"https://github.com/sherm1","followers_url":"https://api.github.com/users/sherm1/followers","following_url":"https://api.github.com/users/sherm1/following{/other_user}","gists_url":"https://api.github.com/users/sherm1/gists{/gist_id}","starred_url":"https://api.github.com/users/sherm1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sherm1/subscriptions","organizations_url":"https://api.github.com/users/sherm1/orgs","repos_url":"https://api.github.com/users/sherm1/repos","events_url":"https://api.github.com/users/sherm1/events{/privacy}","received_events_url":"https://api.github.com/users/sherm1/received_events","type":"User","site_admin":false},"body":"I'm confused by this. When would that get thrown and why is it a no-op?","created_at":"2015-09-21T16:32:53Z","updated_at":"2015-09-21T16:32:53Z","html_url":"https://github.com/opensim-org/opensim-core/pull/628#discussion_r39992506","pull_request_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/628","_links":{"self":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/comments/39992506"},"html":{"href":"https://github.com/opensim-org/opensim-core/pull/628#discussion_r39992506"},"pull_request":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/628"}}},"pull_request":{"url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/628","id":45459721,"html_url":"https://github.com/opensim-org/opensim-core/pull/628","diff_url":"https://github.com/opensim-org/opensim-core/pull/628.diff","patch_url":"https://github.com/opensim-org/opensim-core/pull/628.patch","issue_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/628","number":628,"state":"open","locked":false,"title":"New data interface classes.","user":{"login":"klshrinidhi","id":1181669,"avatar_url":"https://avatars.githubusercontent.com/u/1181669?v=3","gravatar_id":"","url":"https://api.github.com/users/klshrinidhi","html_url":"https://github.com/klshrinidhi","followers_url":"https://api.github.com/users/klshrinidhi/followers","following_url":"https://api.github.com/users/klshrinidhi/following{/other_user}","gists_url":"https://api.github.com/users/klshrinidhi/gists{/gist_id}","starred_url":"https://api.github.com/users/klshrinidhi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/klshrinidhi/subscriptions","organizations_url":"https://api.github.com/users/klshrinidhi/orgs","repos_url":"https://api.github.com/users/klshrinidhi/repos","events_url":"https://api.github.com/users/klshrinidhi/events{/privacy}","received_events_url":"https://api.github.com/users/klshrinidhi/received_events","type":"User","site_admin":false},"body":"Files to review:\r\n* Common/ValueArray.h\r\n* Common/ValueArrayDictionary.h\r\n* Common/DataTable.h\r\n* Common/TimeSeriesTable.h\r\n* Examples/DataTable/example.cpp\r\n* Common/Test/testDataTable.cpp","created_at":"2015-09-18T22:32:30Z","updated_at":"2015-09-21T16:32:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d2bdd9c275a32d8eaa3025c7f25612527a02ffbe","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/628/commits","review_comments_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/628/comments","review_comment_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/628/comments","statuses_url":"https://api.github.com/repos/opensim-org/opensim-core/statuses/9d994e3d8eaec61bbb2bab30f9af1dc648237911","head":{"label":"opensim-org:data_interface_classes","ref":"data_interface_classes","sha":"9d994e3d8eaec61bbb2bab30f9af1dc648237911","user":{"login":"opensim-org","id":4370782,"avatar_url":"https://avatars.githubusercontent.com/u/4370782?v=3","gravatar_id":"","url":"https://api.github.com/users/opensim-org","html_url":"https://github.com/opensim-org","followers_url":"https://api.github.com/users/opensim-org/followers","following_url":"https://api.github.com/users/opensim-org/following{/other_user}","gists_url":"https://api.github.com/users/opensim-org/gists{/gist_id}","starred_url":"https://api.github.com/users/opensim-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opensim-org/subscriptions","organizations_url":"https://api.github.com/users/opensim-org/orgs","repos_url":"https://api.github.com/users/opensim-org/repos","events_url":"https://api.github.com/users/opensim-org/events{/privacy}","received_events_url":"https://api.github.com/users/opensim-org/received_events","type":"Organization","site_admin":false},"repo":{"id":20775600,"name":"opensim-core","full_name":"opensim-org/opensim-core","owner":{"login":"opensim-org","id":4370782,"avatar_url":"https://avatars.githubusercontent.com/u/4370782?v=3","gravatar_id":"","url":"https://api.github.com/users/opensim-org","html_url":"https://github.com/opensim-org","followers_url":"https://api.github.com/users/opensim-org/followers","following_url":"https://api.github.com/users/opensim-org/following{/other_user}","gists_url":"https://api.github.com/users/opensim-org/gists{/gist_id}","starred_url":"https://api.github.com/users/opensim-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opensim-org/subscriptions","organizations_url":"https://api.github.com/users/opensim-org/orgs","repos_url":"https://api.github.com/users/opensim-org/repos","events_url":"https://api.github.com/users/opensim-org/events{/privacy}","received_events_url":"https://api.github.com/users/opensim-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/opensim-org/opensim-core","description":"SimTK OpenSim 4.0 C++ libraries and command-line applications, and Java/Python wrapping.","fork":false,"url":"https://api.github.com/repos/opensim-org/opensim-core","forks_url":"https://api.github.com/repos/opensim-org/opensim-core/forks","keys_url":"https://api.github.com/repos/opensim-org/opensim-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/opensim-org/opensim-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/opensim-org/opensim-core/teams","hooks_url":"https://api.github.com/repos/opensim-org/opensim-core/hooks","issue_events_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/events{/number}","events_url":"https://api.github.com/repos/opensim-org/opensim-core/events","assignees_url":"https://api.github.com/repos/opensim-org/opensim-core/assignees{/user}","branches_url":"https://api.github.com/repos/opensim-org/opensim-core/branches{/branch}","tags_url":"https://api.github.com/repos/opensim-org/opensim-core/tags","blobs_url":"https://api.github.com/repos/opensim-org/opensim-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/opensim-org/opensim-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/opensim-org/opensim-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/opensim-org/opensim-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/opensim-org/opensim-core/statuses/{sha}","languages_url":"https://api.github.com/repos/opensim-org/opensim-core/languages","stargazers_url":"https://api.github.com/repos/opensim-org/opensim-core/stargazers","contributors_url":"https://api.github.com/repos/opensim-org/opensim-core/contributors","subscribers_url":"https://api.github.com/repos/opensim-org/opensim-core/subscribers","subscription_url":"https://api.github.com/repos/opensim-org/opensim-core/subscription","commits_url":"https://api.github.com/repos/opensim-org/opensim-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/opensim-org/opensim-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/opensim-org/opensim-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/opensim-org/opensim-core/contents/{+path}","compare_url":"https://api.github.com/repos/opensim-org/opensim-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/opensim-org/opensim-core/merges","archive_url":"https://api.github.com/repos/opensim-org/opensim-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/opensim-org/opensim-core/downloads","issues_url":"https://api.github.com/repos/opensim-org/opensim-core/issues{/number}","pulls_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls{/number}","milestones_url":"https://api.github.com/repos/opensim-org/opensim-core/milestones{/number}","notifications_url":"https://api.github.com/repos/opensim-org/opensim-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/opensim-org/opensim-core/labels{/name}","releases_url":"https://api.github.com/repos/opensim-org/opensim-core/releases{/id}","created_at":"2014-06-12T16:57:56Z","updated_at":"2015-08-28T09:57:36Z","pushed_at":"2015-09-21T03:47:36Z","git_url":"git://github.com/opensim-org/opensim-core.git","ssh_url":"git@github.com:opensim-org/opensim-core.git","clone_url":"https://github.com/opensim-org/opensim-core.git","svn_url":"https://github.com/opensim-org/opensim-core","homepage":"https://opensim.stanford.edu","size":116349,"stargazers_count":17,"watchers_count":17,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":16,"mirror_url":null,"open_issues_count":244,"forks":16,"open_issues":244,"watchers":17,"default_branch":"master"}},"base":{"label":"opensim-org:master","ref":"master","sha":"7faaf8c921810bb5048b582886cc49900aa7df47","user":{"login":"opensim-org","id":4370782,"avatar_url":"https://avatars.githubusercontent.com/u/4370782?v=3","gravatar_id":"","url":"https://api.github.com/users/opensim-org","html_url":"https://github.com/opensim-org","followers_url":"https://api.github.com/users/opensim-org/followers","following_url":"https://api.github.com/users/opensim-org/following{/other_user}","gists_url":"https://api.github.com/users/opensim-org/gists{/gist_id}","starred_url":"https://api.github.com/users/opensim-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opensim-org/subscriptions","organizations_url":"https://api.github.com/users/opensim-org/orgs","repos_url":"https://api.github.com/users/opensim-org/repos","events_url":"https://api.github.com/users/opensim-org/events{/privacy}","received_events_url":"https://api.github.com/users/opensim-org/received_events","type":"Organization","site_admin":false},"repo":{"id":20775600,"name":"opensim-core","full_name":"opensim-org/opensim-core","owner":{"login":"opensim-org","id":4370782,"avatar_url":"https://avatars.githubusercontent.com/u/4370782?v=3","gravatar_id":"","url":"https://api.github.com/users/opensim-org","html_url":"https://github.com/opensim-org","followers_url":"https://api.github.com/users/opensim-org/followers","following_url":"https://api.github.com/users/opensim-org/following{/other_user}","gists_url":"https://api.github.com/users/opensim-org/gists{/gist_id}","starred_url":"https://api.github.com/users/opensim-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/opensim-org/subscriptions","organizations_url":"https://api.github.com/users/opensim-org/orgs","repos_url":"https://api.github.com/users/opensim-org/repos","events_url":"https://api.github.com/users/opensim-org/events{/privacy}","received_events_url":"https://api.github.com/users/opensim-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/opensim-org/opensim-core","description":"SimTK OpenSim 4.0 C++ libraries and command-line applications, and Java/Python wrapping.","fork":false,"url":"https://api.github.com/repos/opensim-org/opensim-core","forks_url":"https://api.github.com/repos/opensim-org/opensim-core/forks","keys_url":"https://api.github.com/repos/opensim-org/opensim-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/opensim-org/opensim-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/opensim-org/opensim-core/teams","hooks_url":"https://api.github.com/repos/opensim-org/opensim-core/hooks","issue_events_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/events{/number}","events_url":"https://api.github.com/repos/opensim-org/opensim-core/events","assignees_url":"https://api.github.com/repos/opensim-org/opensim-core/assignees{/user}","branches_url":"https://api.github.com/repos/opensim-org/opensim-core/branches{/branch}","tags_url":"https://api.github.com/repos/opensim-org/opensim-core/tags","blobs_url":"https://api.github.com/repos/opensim-org/opensim-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/opensim-org/opensim-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/opensim-org/opensim-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/opensim-org/opensim-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/opensim-org/opensim-core/statuses/{sha}","languages_url":"https://api.github.com/repos/opensim-org/opensim-core/languages","stargazers_url":"https://api.github.com/repos/opensim-org/opensim-core/stargazers","contributors_url":"https://api.github.com/repos/opensim-org/opensim-core/contributors","subscribers_url":"https://api.github.com/repos/opensim-org/opensim-core/subscribers","subscription_url":"https://api.github.com/repos/opensim-org/opensim-core/subscription","commits_url":"https://api.github.com/repos/opensim-org/opensim-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/opensim-org/opensim-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/opensim-org/opensim-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/opensim-org/opensim-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/opensim-org/opensim-core/contents/{+path}","compare_url":"https://api.github.com/repos/opensim-org/opensim-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/opensim-org/opensim-core/merges","archive_url":"https://api.github.com/repos/opensim-org/opensim-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/opensim-org/opensim-core/downloads","issues_url":"https://api.github.com/repos/opensim-org/opensim-core/issues{/number}","pulls_url":"https://api.github.com/repos/opensim-org/opensim-core/pulls{/number}","milestones_url":"https://api.github.com/repos/opensim-org/opensim-core/milestones{/number}","notifications_url":"https://api.github.com/repos/opensim-org/opensim-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/opensim-org/opensim-core/labels{/name}","releases_url":"https://api.github.com/repos/opensim-org/opensim-core/releases{/id}","created_at":"2014-06-12T16:57:56Z","updated_at":"2015-08-28T09:57:36Z","pushed_at":"2015-09-21T03:47:36Z","git_url":"git://github.com/opensim-org/opensim-core.git","ssh_url":"git@github.com:opensim-org/opensim-core.git","clone_url":"https://github.com/opensim-org/opensim-core.git","svn_url":"https://github.com/opensim-org/opensim-core","homepage":"https://opensim.stanford.edu","size":116349,"stargazers_count":17,"watchers_count":17,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":16,"mirror_url":null,"open_issues_count":244,"forks":16,"open_issues":244,"watchers":17,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/628"},"html":{"href":"https://github.com/opensim-org/opensim-core/pull/628"},"issue":{"href":"https://api.github.com/repos/opensim-org/opensim-core/issues/628"},"comments":{"href":"https://api.github.com/repos/opensim-org/opensim-core/issues/628/comments"},"review_comments":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/628/comments"},"review_comment":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/opensim-org/opensim-core/pulls/628/commits"},"statuses":{"href":"https://api.github.com/repos/opensim-org/opensim-core/statuses/9d994e3d8eaec61bbb2bab30f9af1dc648237911"}}}}