{"action":"created","comment":{"url":"https://api.github.com/repos/onnx/onnx/pulls/comments/181151062","pull_request_review_id":111706953,"id":181151062,"diff_hunk":"@@ -1,127 +1,372 @@\n-Open Neural Network Exchange (ONNX)\n+Open Neural Network Exchange - ONNX\n =========\n \n-ONNX is an open specification that consists of the following components:\n+__Purpose__\n+\n+This document contains the normative specification of the semantics of ONNX. The .proto and .proto3 files found under the ‘onnx’ folder form the normative specification of its syntax. Commentary found in the .proto and .proto3 files are intended to improve readability of those files, but are not normative if they conflict with this document. Such conflicts should be reported as documentation bugs.\n \n-1)  A definition of an extensible computation graph model\n+__Notes on model validation__\n \n-2)  Definitions of built-in operators and standard data types\n+A [Python-based tool](../onnx/checker.py) is available to perform general validation of models against this specification.\n \n __Notes on language in this and all related documents__:\n \n 1. The use of SHOULD, MUST, MAY and so on in this document is consistent with [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt).\n \n 2. The use of 'list' shall denote an ordered collection of items, 'set' shall denote an unordered collection of unique elements, and 'bag' an unordered collection of possibly non-unique elements.\n \n-Extensible computation graph model\n-----------------------------------\n+## Components\n+\n+ONNX is an open specification that consists of the following components:\n+\n+1)  A definition of an extensible computation graph model.\n+\n+2)  Definitions of standard data types.\n+\n+3)  Definitions of built-in operators.\n+\n+Of these, #1 and #2 are covered herein; the built-in operators are covered separately in documents listed at the end of this.\n+\n+There are two official ONNX variants; the main distinction between the two is found in the supported types. The neural-network-only __ONNX__ variant recognizes only tensors as input and output types, while the Classical Machine Learning extension, __ONNX-ML__, also recognizes sequences and maps.\n+\n+## Runtime Agnostic\n+\n+ONNX does not pre-suppose or imply any particular method of runtime implementation. \n+\n+For example, an implementation may consist of a rich runtime which interprets the model; it may be a code generator that translates the model in its entirety to executable code for some target programming language; it may be a hardware implementation; it may be a combination of two or three of those. \n+\n+Nothing in this specification should be construed as advocating one implementation approach over any other; any comments on the inner workings of concrete implementations are to be interpreted as examples.\n+\n+## ONNX Versioning\n+\n+Versioning features in several places in ONNX -- the IR specification itself, the version of a model, and the version of an operator set. Futhermore, each individual operator indicates which version of its containing operator set it was introduced or stabilized in.\n+\n+Version numbers can be used as a simple number, or used to encode semantic versions. If using semver, the convention is to use the two most significant bytes for the major number, the next two bytes for the minor number, and the least significant four bytes for the build/bugfix number.\n+\n+The valid IR versions is defined by an enumeration, which currently has the following values:\n+```\n+  //  version we published on Oct 10, 2017.\n+  IR_VERSION_2017_10_10 = 0x0000000000000001;\n+\n+  // IR_VERSION 0.0.2 published on Oct 30, 2017\n+  IR_VERSION_2017_10_30 = 0x0000000000000002;\n+\n+  // IR VERSION 0.0.3 published on Nov 3, 2017\n+  IR_VERSION = 0x0000000000000003;\n+```\n+\n+Operator sets use a simple number as the version number. This specification does not provide guidance on what versioning scheme model producers should be using.\n+\n+\n+## Extensible computation graph model\n+\n+ONNX specifies the portable, serialized format of a computation graph. It does not have to be the form a framework chooses to use and manipulate the computation internally. For example, an implementation may represent the model differently in memory if it is more efficient to manipulate during optimization passes.\n+\n+An implementation MAY extend ONNX is by adding operators expressing semantics beyond the standard set of operators that all implementations MUST support. The mechanism for this is adding operator sets to the opset_import property in a model that depends on the extension operators.\n \n-ONNX specifies the portable, serialized format of the computation graph. It may not be the form a framework chooses to use and manipulate. For example, a framework may keep the graph in memory in a format that it finds more efficient to manipulate for optimization passes. We make use of protobuf2 (with oneof, added in protobuf 2.6.1) for the serialized format.\n+### Models\n \n-### Model\n+The top-level ONNX construct is a ‘Model.’\n \n-The top-level container object in an ONNX model file is a ModelProto object that combines a computation graph with the following metadata properties.\n+The main purpose of the model structure is to associate metadata with a graph, which is what contains all the executable elements. The metadata is used when first reading the model file, giving an implementation the information that it needs in order to determine whether it will be able to execute the model, generate logging messages, error reports, etc. Further, the metadata is useful to tools, such as IDEs and model galleries, which need it for informing humans about a given model’s purpose and characteristics.\n \n-#### Model Metadata\n+Each model has has the following components:\n \n-|Name|Type|Format|Description|\n-|----|----|------|-----------|\n-|ir_version|int64||The version of the IR format specification|\n-|opset_import|||Custom operator sets imported by the model|\n-|domain|string|Valid DNS name|A namespace for the model, following the style of package names, that is, reverse DNS domain name.|\n-|model_version|int64||The version of the model|\n-|producer_name|string||Name of framework/tool that generated this model|\n-|producer_version|string||Version of the framework/tool that generated this model|\n+|Name|Type|Description|\n+|---|---|---|\n+|ir_version|int64|The ONNX version assumed by the model.|\n+|opset_import|OperatorSetId|A collection of operator set identifiers made available to the model. An implementation must support all operators in the set or reject the model.|\n+|producer_name|string|The name of the tool used to generate the model.|\n+|producer_version|string|A string representing the version of the generating tool.|\n+|domain|string|A reverse-DNS name to indicate the model namespace or domain, for example, 'org.onnx'|\n+|model_version|int64|A version of the model itself, encoded in an integer.|\n+|doc_string|string|A human-readable documentation for this model. Markdown is allowed.|\n+|graph|Graph|The parameterized graph that is evaluated to execute the model.|\n+|metadata_props|map<string,string>|Named metadata values; keys should be distinct.|\n \n-See [versioning documentation](Versioning.md) for more information about the versioning policies.\n-Further metadata may be added to a model via its `metadata_props` field (as described further in the Extensibility section below).\n+ Models MUST specify a domain and use reverse domain names based on the responsible organization's identity, the same convention that is traditionally used for naming Java packages.\n+ \n+\n+### Optional Metadata\n+\n+The 'metadata_props' field in the model is available for any kind of optional metadata that a tool or model developer chooses to place there. The following are the defined “standard” optional metadata properties of a model. \n+\n+Name|Type|Format|Description\n+|---|---|---|---|\n+model_author|string|A comma-separated list of names.|The personal name of the author(s) of the model, and/or their organizations.\n+model_license|string|Name or URL.|The well-known name or URL of the license under which the model is made available.\n+\n+\n+### Operator Sets\n+\n+Each model MUST explicitly name the operator sets that it relies on for its functionality. Operator sets define the available operators, their version, and their status. Each model defines the imported operator sets by their domains. All models implicitly import the default ONNX operator set.\n+\n+Each operator set SHALL be defined in a separate document, also using protobuf as the serialization format. How operator set documents are found at runtime is implementation-dependent.\n+\n+__Note: As of the publication of this document, no ONNX implementation is known to process operator set documents.__\n+\n+The properties of an operator set are:\n+\n+Name|Type|Description\n+|---|---|---|\n+magic|string|The value ‘ONXXOPSET’\n+ir_version|int32|The ONNX version corresponding to the operators.\n+ir_version_prerelease|string|The prerelease component of the SemVer of the IR.\n+ir_build_metadata|string|The symbolic identifier of the operator to invoke.\n+domain|string|The domain of the operator set. Must be unique among all sets.\n+opset_version|int64|The version of the set of operators. \n+doc_string|string|A human-readable documentation for this set of operators. Markdown is allowed.\n+operator|Operator[]|The operators of this operator set.\n+\n+The operator set version is a simple integer value that is monotonically increased as new versions of the operator set are published.\n+\n+Operator sets other than the default operator set MUST specify its domain and use reverse domain names based on the responsible organization's identity, the same convention that is traditionally used for naming Java packages.\n+\n+### Operators\n+\n+Each operator used within a graph MUST be explicitly declared by one of the operator sets imported by the model.\n+\n+The properties of an operator definition are:\n+\n+Name|Type|Description\n+|---|---|---|\n+op_type|string|The name of the operator, as used in graph nodes. MUST be unique within the operator set’s domain.\n+since_version|int64|The version of the operator set when this operator was introduced.\n+status|OperatorStatus|One of ‘EXPERIMENTAL’ or ‘STABLE.’\n+doc_string|string|A human-readable documentation string for this operator. Markdown is allowed.\n+\n+The version value MUST be the same value as the operator set version when the operator was first published. Subsequent versions of the operator set MUST NOT alter the signature or semantics of the operator once published as STABLE.\n+\n+The ‘status’ property indicates whether the syntax, semantics, or presence of the operator is in an experimental or stable stage. Once an operator is published as STABLE, it’s syntax and semantics MUST NOT change in subsequent versions of the operator set.\n+\n+There are two distinct ways to pass information to operators – inputs and attributes. The latter are used for values that are literal constants in the graph, while the former represent graph inputs or values computed elsewhere in the graph. This distinction may be highly relevant to achieving good performance for some implementations, while completely irrelevant to others.\n \n ### Graphs\n \n-Each computation dataflow graph is structured as a list of nodes that form a graph. Each node is a call to an operator. Nodes have zero or more inputs, one or more outputs, and zero or more attribute-value pairs. Additionally, a valid ONNX graph must fulfill the following requirements:\n+A serialized graph is comprised of a set of metadata fields, a list of model parameters, and a list of computation nodes.\n+\n+Each computation dataflow graph is structured as a topologically sorted list of nodes that form a graph, which MUST be free of cycles. Each node represents a call to an operator. Each node has zero or more inputs and one or more outputs.\n \n-- The graph MUST be free of cycles.\n-- The graph MUST be in SSA (static single assignment) form, meaning outputs of all nodes are unique.\n-- The nodes list MUST be in topologically sorted order, meaning if input of node `N2` is the output of node `N1`, `N2` must appear after `N1` in the nodes list.\n+Graphs have the following properties:\n \n-#### Model Graph Metadata\n+|Name|Type|Description|\n+|---|---|---|\n+name|string|The name of the model graph.\n+node|Node[]|A list of nodes, forming a partially ordered computation graph based on input/output data dependencies.\n+initializer|Tensor[]|A list of named tensor values, used to specify default values for some of the inputs of the graph. Each initializer value is associated with an input by name matching.\n+doc_string|string|A human-readable documentation for this model. Markdown is allowed.\n+input|ValueInfo[]|The input “parameters” of the graph, possibly initialized by a default value found in ‘initializer.’\n+output|ValueInfo[]|The output parameters of the graph. Once all output parameters have been written to by a graph execution, the execution is complete.\n+value_info|ValueInfo|__TODO: Write this description__\n \n-The following describes the metadata properties of a model graph:\n+Each graph MUST define the names and types of its inputs and outputs, which are specified as ‘value info’ structures, having the following properties:\n \n-|Name|Type|Format|Description|\n-|----|----|------|-----------|\n-|name|string|Valid C identifier|A name for the model.|\n-|doc_string|string|Free form|A human-readable documentation string intended to summarize the purpose of the model. Markdown is allowed.|\n+Name|Type|Description\n+|---|---|---|\n+name|string|The name of the value/parameter.\n+type|Type|The type of the value.\n+doc_string|string|A human-readable documentation for this value. Markdown is allowed.\n \n-#### Names Within a Graph\n+Each graph MUST specify a name.\n \n-Names are organized into separate namespaces, and must be unique within a namespace. The namespaces include the following:\n- - `Node`: names that identify specific nodes in the graph, but not necessarily any particular input or output of the node.\n- - `Graph`: names that identify graphs in the protobuf.\n- - `Attribute`: names that identify attribute names for extra attributes that are passed to operators.\n- - `Operator`: names that identify particular operators.\n- - `Tensor`: names that identify intermediate tensor values flowing through the computation of a graph.\n+Graphs SHOULD be populated with documentation strings, which MAY be interpreted using GitHub-style markdown syntax. HTML and other text-markup languages MAY NOT be used in documentation strings.\n+\n+### Names Within a Graph\n \n All names MUST adhere to C identifier syntax rules.\n \n-#### Nodes\n+Names of nodes, inputs, outputs, initializers, and attributes are organized into several namespaces. Within a namespace, each name MUST be unique for each given graph. \n+\n+The namespaces are:\n \n-Each computation node consists of a name, the identifier of the operator to be invoked, a list of named inputs and outputs, and a list of attribute-value pairs.\n+Namespace|Description\n+|---|---|\n+Attribute|The names of attributes of an operator. Unique for each operator.\n+Value|The names of values – node inputs & outputs, tensor values (if named), graph inputs, outputs.\n+Node|The names of graph nodes.\n+Graph|The names of graphs within a domain, unique within the model domain.\n+Operator|The names of operators within a domain.\n+Shape|The names of tensor shape variables – scoped to the value information records of a graph, which is where shape variables occur.\n+\n+\n+### Nodes\n+\n+Computation nodes are comprised of a name, the name of an operator that it invokes, a list of named inputs, a list of named outputs, and a list of attributes. \n+\n+Input and outputs are positionally associated with operator inputs and outputs. Attributes are associated with operator attributes by name.\n+\n+They have the following properties:\n+\n+Name|Type|Description\n+|---|---|---|\n+name|string|An optional name of the node, used for diagnostic purposes only.\n+input|string[]|Names of the values used by the node to propagate input values to the node operator. It must refer to either a graph input or a node output.\n+output|string[]|Names of the outputs used by the node to capture data from the operator invoked by the node. It either introduces a  value in the graph or refers to a graph output.\n+op_type|string|The symbolic identifier of the operator to invoke.\n+domain|string|The domain of the operator set that contains the operator named by the op_type.\n+attribute|Attribute[]|Named attributes, another form of operator parameterization, used for constant values rather than propagated values.\n+doc_string|string|A human-readable documentation for this value. Markdown is allowed.\n \n Edges in the computation graph are established by outputs of one node being referenced by name in the inputs of a subsequent node.\n \n-Names of tensor values flowing through the graph are unique - a particular name can reference either a graph input or an output of a single node. Reuse of names for several outputs is not allowed.\n+The outputs of a given node introduce new names into the graph. The values of node outputs are computed by the node's operator. Node inputs MAY refer to node outputs, graph inputs, and graph initializers. When the name of a node output coincides with the name of a graph output, the graph output's value is the corresponding output value computed by that node.\n+\n+The graph must use single-static assignment for all node outputs. All node output namess MUST be unique within the graph.","path":"docs/IR.md","position":254,"original_position":254,"commit_id":"7f62cd639f7002814eed64a7238e85ceeb783cd6","original_commit_id":"7f62cd639f7002814eed64a7238e85ceeb783cd6","user":{"login":"wschin","id":3524474,"avatar_url":"https://avatars1.githubusercontent.com/u/3524474?v=4","gravatar_id":"","url":"https://api.github.com/users/wschin","html_url":"https://github.com/wschin","followers_url":"https://api.github.com/users/wschin/followers","following_url":"https://api.github.com/users/wschin/following{/other_user}","gists_url":"https://api.github.com/users/wschin/gists{/gist_id}","starred_url":"https://api.github.com/users/wschin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wschin/subscriptions","organizations_url":"https://api.github.com/users/wschin/orgs","repos_url":"https://api.github.com/users/wschin/repos","events_url":"https://api.github.com/users/wschin/events{/privacy}","received_events_url":"https://api.github.com/users/wschin/received_events","type":"User","site_admin":false},"body":"\"single static assignment\" is a magic word to some poor users like me. My background is applied math.","created_at":"2018-04-12T16:54:23Z","updated_at":"2018-04-12T16:54:23Z","html_url":"https://github.com/onnx/onnx/pull/720#discussion_r181151062","pull_request_url":"https://api.github.com/repos/onnx/onnx/pulls/720","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/onnx/onnx/pulls/comments/181151062"},"html":{"href":"https://github.com/onnx/onnx/pull/720#discussion_r181151062"},"pull_request":{"href":"https://api.github.com/repos/onnx/onnx/pulls/720"}},"in_reply_to_id":180932717},"pull_request":{"url":"https://api.github.com/repos/onnx/onnx/pulls/720","id":179766270,"html_url":"https://github.com/onnx/onnx/pull/720","diff_url":"https://github.com/onnx/onnx/pull/720.diff","patch_url":"https://github.com/onnx/onnx/pull/720.patch","issue_url":"https://api.github.com/repos/onnx/onnx/issues/720","number":720,"state":"open","locked":false,"title":"Spec clarity: IR.md modifications.","user":{"login":"NiklasGustafsson","id":1791495,"avatar_url":"https://avatars0.githubusercontent.com/u/1791495?v=4","gravatar_id":"","url":"https://api.github.com/users/NiklasGustafsson","html_url":"https://github.com/NiklasGustafsson","followers_url":"https://api.github.com/users/NiklasGustafsson/followers","following_url":"https://api.github.com/users/NiklasGustafsson/following{/other_user}","gists_url":"https://api.github.com/users/NiklasGustafsson/gists{/gist_id}","starred_url":"https://api.github.com/users/NiklasGustafsson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NiklasGustafsson/subscriptions","organizations_url":"https://api.github.com/users/NiklasGustafsson/orgs","repos_url":"https://api.github.com/users/NiklasGustafsson/repos","events_url":"https://api.github.com/users/NiklasGustafsson/events{/privacy}","received_events_url":"https://api.github.com/users/NiklasGustafsson/received_events","type":"User","site_admin":false},"body":"This is part of a series of pull requests related to achieving better clarity in the ONNX specification, a task Microsoft took on driving a couple of weeks ago.\r\n\r\nThis PR mostly consists of significant changes to the IR.md document, an attempt to reach better clarity and precision in defining the semantics of the ONNX IR and type system. The changes are so substantial that there is little point in reviewing the changes as a 'diff'.\r\n\r\nIn attempting to reach improved clarity, a few things may have been misunderstood, a few clarificiations may be controversial, and a few things have been left open.\r\n\r\nLeft Open:\r\n\r\n1. There is no description of the optional 'value_info' field in GraphProto.\r\n2. I left out a proposed convention for versioning to distinguish semantic versioning from simple monotonically increasing numbers. The convention would have implied a change to IR versions from semver to simple numbers. Conventions aren't technically normative, but they are strongly encouraged, and it is worth more discussion first.\r\n3. A systematic scrubbing of the .proto files, looking for explanations of semantics that potentially remain uncovered in this document.\r\n4. An explanation of name scoping rules for nested graphs (graph attributes).\r\n5. Version numbers are declared as 64-bit integers in the .proto files, but the 'Versioning.md' document clearly states that version numbers are packed in 32 bits. This needs to be resolved.\r\n\r\nPotentially misunderstood:\r\n\r\n1. The discussion in this recent PR https://github.com/onnx/onnx/pull/690 suggested that initializers were usable not just as default values for graph inputs. I formalized those rules in the specification based on my understanding of the change in PR #690. \r\n2. Various explanations of fields. I took a lot of the text from the .proto files, but edited many, and errors may have been introduced in the process.\r\n3. Stuff I'm blissfully unaware of.\r\n\r\nPotentially \"controversial\":\r\n\r\n1. The document establishes itself as the normative authority on the semantics of the IR and type system, meaning that comments on semantics found in the .proto files take a back seat and are not normative.\r\n2. It raises the importance of explicitly defining operator sets to a point that no framework actually implements the specification, as far as I know.\r\n3. Explicit mention of the existence of two variants of ONNX.\r\n\r\nI probably forgot a number of things that belong on these lists.\r\n\r\nIn reviewing this, please pay attention not only to whether the text accurately reflects the intended semantics, but also on word choice details. A normative specification requires precision and clarity, so proper language is essential.\r\n\r\nThanks,\r\n\r\nNiklas","created_at":"2018-04-05T18:57:50Z","updated_at":"2018-04-12T16:54:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5180b07bc0a74490e2e68b5659cf31851d6a3381","assignee":null,"assignees":[],"requested_reviewers":[{"login":"ezyang","id":13564,"avatar_url":"https://avatars0.githubusercontent.com/u/13564?v=4","gravatar_id":"","url":"https://api.github.com/users/ezyang","html_url":"https://github.com/ezyang","followers_url":"https://api.github.com/users/ezyang/followers","following_url":"https://api.github.com/users/ezyang/following{/other_user}","gists_url":"https://api.github.com/users/ezyang/gists{/gist_id}","starred_url":"https://api.github.com/users/ezyang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ezyang/subscriptions","organizations_url":"https://api.github.com/users/ezyang/orgs","repos_url":"https://api.github.com/users/ezyang/repos","events_url":"https://api.github.com/users/ezyang/events{/privacy}","received_events_url":"https://api.github.com/users/ezyang/received_events","type":"User","site_admin":false},{"login":"yuanbyu","id":2342391,"avatar_url":"https://avatars1.githubusercontent.com/u/2342391?v=4","gravatar_id":"","url":"https://api.github.com/users/yuanbyu","html_url":"https://github.com/yuanbyu","followers_url":"https://api.github.com/users/yuanbyu/followers","following_url":"https://api.github.com/users/yuanbyu/following{/other_user}","gists_url":"https://api.github.com/users/yuanbyu/gists{/gist_id}","starred_url":"https://api.github.com/users/yuanbyu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yuanbyu/subscriptions","organizations_url":"https://api.github.com/users/yuanbyu/orgs","repos_url":"https://api.github.com/users/yuanbyu/repos","events_url":"https://api.github.com/users/yuanbyu/events{/privacy}","received_events_url":"https://api.github.com/users/yuanbyu/received_events","type":"User","site_admin":false},{"login":"lupesko","id":3321001,"avatar_url":"https://avatars1.githubusercontent.com/u/3321001?v=4","gravatar_id":"","url":"https://api.github.com/users/lupesko","html_url":"https://github.com/lupesko","followers_url":"https://api.github.com/users/lupesko/followers","following_url":"https://api.github.com/users/lupesko/following{/other_user}","gists_url":"https://api.github.com/users/lupesko/gists{/gist_id}","starred_url":"https://api.github.com/users/lupesko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lupesko/subscriptions","organizations_url":"https://api.github.com/users/lupesko/orgs","repos_url":"https://api.github.com/users/lupesko/repos","events_url":"https://api.github.com/users/lupesko/events{/privacy}","received_events_url":"https://api.github.com/users/lupesko/received_events","type":"User","site_admin":false},{"login":"dzhulgakov","id":17890620,"avatar_url":"https://avatars2.githubusercontent.com/u/17890620?v=4","gravatar_id":"","url":"https://api.github.com/users/dzhulgakov","html_url":"https://github.com/dzhulgakov","followers_url":"https://api.github.com/users/dzhulgakov/followers","following_url":"https://api.github.com/users/dzhulgakov/following{/other_user}","gists_url":"https://api.github.com/users/dzhulgakov/gists{/gist_id}","starred_url":"https://api.github.com/users/dzhulgakov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dzhulgakov/subscriptions","organizations_url":"https://api.github.com/users/dzhulgakov/orgs","repos_url":"https://api.github.com/users/dzhulgakov/repos","events_url":"https://api.github.com/users/dzhulgakov/events{/privacy}","received_events_url":"https://api.github.com/users/dzhulgakov/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/onnx/onnx/pulls/720/commits","review_comments_url":"https://api.github.com/repos/onnx/onnx/pulls/720/comments","review_comment_url":"https://api.github.com/repos/onnx/onnx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/onnx/onnx/issues/720/comments","statuses_url":"https://api.github.com/repos/onnx/onnx/statuses/7f62cd639f7002814eed64a7238e85ceeb783cd6","head":{"label":"NiklasGustafsson:ir","ref":"ir","sha":"7f62cd639f7002814eed64a7238e85ceeb783cd6","user":{"login":"NiklasGustafsson","id":1791495,"avatar_url":"https://avatars0.githubusercontent.com/u/1791495?v=4","gravatar_id":"","url":"https://api.github.com/users/NiklasGustafsson","html_url":"https://github.com/NiklasGustafsson","followers_url":"https://api.github.com/users/NiklasGustafsson/followers","following_url":"https://api.github.com/users/NiklasGustafsson/following{/other_user}","gists_url":"https://api.github.com/users/NiklasGustafsson/gists{/gist_id}","starred_url":"https://api.github.com/users/NiklasGustafsson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NiklasGustafsson/subscriptions","organizations_url":"https://api.github.com/users/NiklasGustafsson/orgs","repos_url":"https://api.github.com/users/NiklasGustafsson/repos","events_url":"https://api.github.com/users/NiklasGustafsson/events{/privacy}","received_events_url":"https://api.github.com/users/NiklasGustafsson/received_events","type":"User","site_admin":false},"repo":{"id":127017326,"name":"onnx","full_name":"NiklasGustafsson/onnx","owner":{"login":"NiklasGustafsson","id":1791495,"avatar_url":"https://avatars0.githubusercontent.com/u/1791495?v=4","gravatar_id":"","url":"https://api.github.com/users/NiklasGustafsson","html_url":"https://github.com/NiklasGustafsson","followers_url":"https://api.github.com/users/NiklasGustafsson/followers","following_url":"https://api.github.com/users/NiklasGustafsson/following{/other_user}","gists_url":"https://api.github.com/users/NiklasGustafsson/gists{/gist_id}","starred_url":"https://api.github.com/users/NiklasGustafsson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NiklasGustafsson/subscriptions","organizations_url":"https://api.github.com/users/NiklasGustafsson/orgs","repos_url":"https://api.github.com/users/NiklasGustafsson/repos","events_url":"https://api.github.com/users/NiklasGustafsson/events{/privacy}","received_events_url":"https://api.github.com/users/NiklasGustafsson/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/NiklasGustafsson/onnx","description":"Open Neural Network Exchange","fork":true,"url":"https://api.github.com/repos/NiklasGustafsson/onnx","forks_url":"https://api.github.com/repos/NiklasGustafsson/onnx/forks","keys_url":"https://api.github.com/repos/NiklasGustafsson/onnx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NiklasGustafsson/onnx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NiklasGustafsson/onnx/teams","hooks_url":"https://api.github.com/repos/NiklasGustafsson/onnx/hooks","issue_events_url":"https://api.github.com/repos/NiklasGustafsson/onnx/issues/events{/number}","events_url":"https://api.github.com/repos/NiklasGustafsson/onnx/events","assignees_url":"https://api.github.com/repos/NiklasGustafsson/onnx/assignees{/user}","branches_url":"https://api.github.com/repos/NiklasGustafsson/onnx/branches{/branch}","tags_url":"https://api.github.com/repos/NiklasGustafsson/onnx/tags","blobs_url":"https://api.github.com/repos/NiklasGustafsson/onnx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NiklasGustafsson/onnx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NiklasGustafsson/onnx/git/refs{/sha}","trees_url":"https://api.github.com/repos/NiklasGustafsson/onnx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NiklasGustafsson/onnx/statuses/{sha}","languages_url":"https://api.github.com/repos/NiklasGustafsson/onnx/languages","stargazers_url":"https://api.github.com/repos/NiklasGustafsson/onnx/stargazers","contributors_url":"https://api.github.com/repos/NiklasGustafsson/onnx/contributors","subscribers_url":"https://api.github.com/repos/NiklasGustafsson/onnx/subscribers","subscription_url":"https://api.github.com/repos/NiklasGustafsson/onnx/subscription","commits_url":"https://api.github.com/repos/NiklasGustafsson/onnx/commits{/sha}","git_commits_url":"https://api.github.com/repos/NiklasGustafsson/onnx/git/commits{/sha}","comments_url":"https://api.github.com/repos/NiklasGustafsson/onnx/comments{/number}","issue_comment_url":"https://api.github.com/repos/NiklasGustafsson/onnx/issues/comments{/number}","contents_url":"https://api.github.com/repos/NiklasGustafsson/onnx/contents/{+path}","compare_url":"https://api.github.com/repos/NiklasGustafsson/onnx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NiklasGustafsson/onnx/merges","archive_url":"https://api.github.com/repos/NiklasGustafsson/onnx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NiklasGustafsson/onnx/downloads","issues_url":"https://api.github.com/repos/NiklasGustafsson/onnx/issues{/number}","pulls_url":"https://api.github.com/repos/NiklasGustafsson/onnx/pulls{/number}","milestones_url":"https://api.github.com/repos/NiklasGustafsson/onnx/milestones{/number}","notifications_url":"https://api.github.com/repos/NiklasGustafsson/onnx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NiklasGustafsson/onnx/labels{/name}","releases_url":"https://api.github.com/repos/NiklasGustafsson/onnx/releases{/id}","deployments_url":"https://api.github.com/repos/NiklasGustafsson/onnx/deployments","created_at":"2018-03-27T16:42:59Z","updated_at":"2018-04-11T03:36:39Z","pushed_at":"2018-04-11T03:36:37Z","git_url":"git://github.com/NiklasGustafsson/onnx.git","ssh_url":"git@github.com:NiklasGustafsson/onnx.git","clone_url":"https://github.com/NiklasGustafsson/onnx.git","svn_url":"https://github.com/NiklasGustafsson/onnx","homepage":"https://onnx.ai/","size":3528,"stargazers_count":0,"watchers_count":0,"language":"PureBasic","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"onnx:master","ref":"master","sha":"50fe321d053245178cf2441201d13cdeca5e9c6f","user":{"login":"onnx","id":31675368,"avatar_url":"https://avatars3.githubusercontent.com/u/31675368?v=4","gravatar_id":"","url":"https://api.github.com/users/onnx","html_url":"https://github.com/onnx","followers_url":"https://api.github.com/users/onnx/followers","following_url":"https://api.github.com/users/onnx/following{/other_user}","gists_url":"https://api.github.com/users/onnx/gists{/gist_id}","starred_url":"https://api.github.com/users/onnx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/onnx/subscriptions","organizations_url":"https://api.github.com/users/onnx/orgs","repos_url":"https://api.github.com/users/onnx/repos","events_url":"https://api.github.com/users/onnx/events{/privacy}","received_events_url":"https://api.github.com/users/onnx/received_events","type":"Organization","site_admin":false},"repo":{"id":102692863,"name":"onnx","full_name":"onnx/onnx","owner":{"login":"onnx","id":31675368,"avatar_url":"https://avatars3.githubusercontent.com/u/31675368?v=4","gravatar_id":"","url":"https://api.github.com/users/onnx","html_url":"https://github.com/onnx","followers_url":"https://api.github.com/users/onnx/followers","following_url":"https://api.github.com/users/onnx/following{/other_user}","gists_url":"https://api.github.com/users/onnx/gists{/gist_id}","starred_url":"https://api.github.com/users/onnx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/onnx/subscriptions","organizations_url":"https://api.github.com/users/onnx/orgs","repos_url":"https://api.github.com/users/onnx/repos","events_url":"https://api.github.com/users/onnx/events{/privacy}","received_events_url":"https://api.github.com/users/onnx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/onnx/onnx","description":"Open Neural Network Exchange","fork":false,"url":"https://api.github.com/repos/onnx/onnx","forks_url":"https://api.github.com/repos/onnx/onnx/forks","keys_url":"https://api.github.com/repos/onnx/onnx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/onnx/onnx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/onnx/onnx/teams","hooks_url":"https://api.github.com/repos/onnx/onnx/hooks","issue_events_url":"https://api.github.com/repos/onnx/onnx/issues/events{/number}","events_url":"https://api.github.com/repos/onnx/onnx/events","assignees_url":"https://api.github.com/repos/onnx/onnx/assignees{/user}","branches_url":"https://api.github.com/repos/onnx/onnx/branches{/branch}","tags_url":"https://api.github.com/repos/onnx/onnx/tags","blobs_url":"https://api.github.com/repos/onnx/onnx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/onnx/onnx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/onnx/onnx/git/refs{/sha}","trees_url":"https://api.github.com/repos/onnx/onnx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/onnx/onnx/statuses/{sha}","languages_url":"https://api.github.com/repos/onnx/onnx/languages","stargazers_url":"https://api.github.com/repos/onnx/onnx/stargazers","contributors_url":"https://api.github.com/repos/onnx/onnx/contributors","subscribers_url":"https://api.github.com/repos/onnx/onnx/subscribers","subscription_url":"https://api.github.com/repos/onnx/onnx/subscription","commits_url":"https://api.github.com/repos/onnx/onnx/commits{/sha}","git_commits_url":"https://api.github.com/repos/onnx/onnx/git/commits{/sha}","comments_url":"https://api.github.com/repos/onnx/onnx/comments{/number}","issue_comment_url":"https://api.github.com/repos/onnx/onnx/issues/comments{/number}","contents_url":"https://api.github.com/repos/onnx/onnx/contents/{+path}","compare_url":"https://api.github.com/repos/onnx/onnx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/onnx/onnx/merges","archive_url":"https://api.github.com/repos/onnx/onnx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/onnx/onnx/downloads","issues_url":"https://api.github.com/repos/onnx/onnx/issues{/number}","pulls_url":"https://api.github.com/repos/onnx/onnx/pulls{/number}","milestones_url":"https://api.github.com/repos/onnx/onnx/milestones{/number}","notifications_url":"https://api.github.com/repos/onnx/onnx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/onnx/onnx/labels{/name}","releases_url":"https://api.github.com/repos/onnx/onnx/releases{/id}","deployments_url":"https://api.github.com/repos/onnx/onnx/deployments","created_at":"2017-09-07T04:53:45Z","updated_at":"2018-04-12T14:10:15Z","pushed_at":"2018-04-12T10:59:20Z","git_url":"git://github.com/onnx/onnx.git","ssh_url":"git@github.com:onnx/onnx.git","clone_url":"https://github.com/onnx/onnx.git","svn_url":"https://github.com/onnx/onnx","homepage":"https://onnx.ai/","size":3327,"stargazers_count":3094,"watchers_count":3094,"language":"PureBasic","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":362,"mirror_url":null,"archived":false,"open_issues_count":134,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":362,"open_issues":134,"watchers":3094,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/onnx/onnx/pulls/720"},"html":{"href":"https://github.com/onnx/onnx/pull/720"},"issue":{"href":"https://api.github.com/repos/onnx/onnx/issues/720"},"comments":{"href":"https://api.github.com/repos/onnx/onnx/issues/720/comments"},"review_comments":{"href":"https://api.github.com/repos/onnx/onnx/pulls/720/comments"},"review_comment":{"href":"https://api.github.com/repos/onnx/onnx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/onnx/onnx/pulls/720/commits"},"statuses":{"href":"https://api.github.com/repos/onnx/onnx/statuses/7f62cd639f7002814eed64a7238e85ceeb783cd6"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"wschin"}}