onnx-red-chainer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c8aa77d35c9473d25f6528d912569b9c87edd9f011ff84e5542590dff65ca4a6
4
+ data.tar.gz: ea3066bfb22cb81e82983347419143290347efdc79ebe2cce2d869ad90387de9
5
+ SHA512:
6
+ metadata.gz: 285dd52ec849dbe6be77653556748e55256e2c1d19fe93c474b782ea54b20154dbc4e23cfa881de69a49522d7fcf12766ea6193a06effe10091c18a4f625c2de
7
+ data.tar.gz: 51afc59d523458206594b2f60ee6750ab2212ae106bf28ff8eee3c5e2a35ef7b03c09d1acbb23ab153830d5e2fbdde3bc610675061917a8f8fbadceef3f1e524
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in onnx-red-chainer.gemspec
6
+ gemspec
@@ -0,0 +1,35 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ onnx-red-chainer (0.1.0)
5
+ google-protobuf
6
+ numo-narray
7
+ red-chainer
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ csv (3.0.8)
13
+ google-protobuf (3.7.1)
14
+ minitest (5.11.3)
15
+ numo-narray (0.9.1.4)
16
+ rake (10.5.0)
17
+ red-chainer (0.4.1)
18
+ numo-narray (>= 0.9.1.1)
19
+ red-datasets (>= 0.0.6)
20
+ red-datasets (0.0.8)
21
+ csv (>= 3.0.5)
22
+ rubyzip
23
+ rubyzip (1.2.2)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ bundler (~> 1.17)
30
+ minitest (~> 5.0)
31
+ onnx-red-chainer!
32
+ rake (~> 10.0)
33
+
34
+ BUNDLED WITH
35
+ 1.17.2
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 hatappi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,39 @@
1
+ # Onnx RedChainer
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/onnx/chainer`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'onnx-red-chainer'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install onnx-red-chainer
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/onnx-red-chainer.
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "onnx/chainer"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'onnx-chainer/cli'
4
+
5
+ OnnxChainer::CLI.start(ARGV)
@@ -0,0 +1,16 @@
1
+ require 'chainer'
2
+ require "onnx-chainer/version"
3
+ require "onnx-chainer/graph"
4
+ require "onnx-chainer/proto/onnx_pb"
5
+
6
+ module OnnxChainer
7
+ class Error < StandardError; end
8
+
9
+ def self.parse_file(onnx_path)
10
+ raise "File not found. #{onnx_path}" if onnx_path.nil? || !File.exists?(onnx_path)
11
+
12
+ m = Onnx::ModelProto.decode(File.read(onnx_path))
13
+
14
+ OnnxChainer::Graph.parse(m.graph)
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'onnx-chainer'
4
+ require 'json'
5
+ require 'optparse'
6
+ require 'pathname'
7
+
8
+ module OnnxChainer
9
+ class CLI
10
+ def self.start(argv)
11
+ new(argv).run
12
+ end
13
+
14
+ def initialize(argv)
15
+ @argv = argv.dup
16
+ @parser = OptionParser.new do |opts|
17
+ opts.banner = 'onnx-red-chainer [OPTIONS] FILE'
18
+ opts.version = VERSION
19
+ opts.on('-o', '--output_dir=OUTPUT_DIR', 'output path') { |v| @output = v }
20
+ opts.on('-m', '--model_name=MODEL_NAME', 'Model name') { |v| @model_name = v }
21
+ opts.on('-h', '--help', 'show help') { @help = true }
22
+ end
23
+ @onnx_path = argv.pop
24
+ @parser.parse!(argv)
25
+ end
26
+
27
+ def run
28
+ if @help || @argv.empty?
29
+ puts @parser.help
30
+ else
31
+ graph = OnnxChainer.parse_file(@onnx_path)
32
+ graph.export(output_dir: @output, model_name: @model_name)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,125 @@
1
+ require 'onnx-chainer/operators/gemm'
2
+ require 'onnx-chainer/operators/relu'
3
+ require 'numo/narray'
4
+
5
+ module OnnxChainer
6
+ class Graph
7
+ attr_reader :nodes, :input_names, :output_names
8
+
9
+ class << self
10
+ def parse(onnx_graph)
11
+ nodes = onnx_graph.node
12
+ initializers = onnx_graph.initializer
13
+ outputs = onnx_graph.output
14
+
15
+ # take out input
16
+ initializer_names = onnx_graph.initializer.map(&:name)
17
+ call_inputs = onnx_graph.input.reject { |i| initializer_names.include?(i.name) }
18
+ name = 'x'
19
+ input_names = call_inputs.each_with_object({}) do |i, hash|
20
+ hash[i.name] = name
21
+ name = name.succ
22
+ end
23
+
24
+ # parse each node
25
+ output_name_index = {}
26
+ nodes = nodes.map do |n|
27
+ output_name_index[n.op_type] ||= 1
28
+ klass = operator_klass(n.op_type)
29
+ i_names = n.input.reject { |i| initializers.map(&:name).include?(i) }
30
+
31
+ node = klass.parse(n, i_names, onnx_graph.input, output_name_index[n.op_type])
32
+
33
+ output_name_index[n.op_type] += 1
34
+ node
35
+ end
36
+
37
+ # take out output
38
+ output_names = {}
39
+ nodes.each { |n| output_names.merge!(n.output_names) }
40
+
41
+ # parameter
42
+ target = {}
43
+ onnx_graph.initializer.each do |initializer|
44
+ name = initializer.name
45
+ dtype = dtype(initializer.data_type)
46
+
47
+ arr = dtype.from_binary(initializer.raw_data).reshape(*initializer.dims)
48
+
49
+ n = name.split('_')
50
+ target["/@#{n[1].downcase}/@#{n[2].downcase}"] = dtype.from_binary(initializer.raw_data).reshape(*initializer.dims)
51
+ end
52
+
53
+ self.new(onnx_graph.name, nodes, input_names, output_names, target)
54
+ end
55
+
56
+ private
57
+
58
+ def operator_klass(op_type)
59
+ case op_type
60
+ when 'Gemm' then
61
+ return OnnxChainer::Operators::Gemm
62
+ when 'Relu' then
63
+ return OnnxChainer::Operators::Relu
64
+ end
65
+ end
66
+
67
+ def dtype(data_type)
68
+ if data_type == Onnx::TensorProto::DataType::FLOAT
69
+ Numo::SFloat
70
+ elsif data_type == Onnx::TensorProto::DataType::INT8
71
+ Numo::Int8
72
+ else
73
+ raise TypeError, 'unexpected value ' + data_type
74
+ end
75
+ end
76
+ end
77
+
78
+ def initialize(model_name, nodes, input_names, output_names, target)
79
+ @model_name = model_name
80
+ @nodes = nodes
81
+ @input_names = input_names
82
+ @output_names = output_names
83
+ @target = target
84
+ end
85
+
86
+ # export file
87
+ def export(output_dir: nil, model_name: nil)
88
+ model_name = model_name || @model_name
89
+ model_name = model_name.capitalize.gsub(/(?:^|_)(.)/){$1.upcase}
90
+
91
+ output_dir ||= '.'
92
+ FileUtils.mkdir(output_dir) unless Dir.exist?(output_dir)
93
+
94
+ s = <<EOS
95
+ require 'chainer'
96
+
97
+ class #{model_name} < Chainer::Chain
98
+ def initialize()
99
+ super()
100
+ init_scope do
101
+ #{@nodes.select(&:need_initialized).map(&:to_initialize_string).join("\n ")}
102
+ end
103
+ end
104
+
105
+ def call(#{@input_names.values.join(', ')})
106
+ #{
107
+ @nodes.map do |n|
108
+ args = n.input_names.map { |name| @input_names[name] || @output_names[name] }
109
+ n.to_call_string(args)
110
+ end.join("\n ")
111
+ }
112
+ end
113
+ end
114
+ EOS
115
+
116
+ File.open("#{output_dir}/model.rb", 'w') do |f|
117
+ f.puts(s)
118
+ end
119
+
120
+ File.open("#{output_dir}/resume", 'wb+') do |f|
121
+ Marshal.dump(@target, f)
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,24 @@
1
+ module OnnxChainer
2
+ class Operator
3
+ attr_reader :need_initialized,
4
+ :output_names,
5
+ :input_names
6
+
7
+ class << self
8
+ def parse(node)
9
+ end
10
+ end
11
+
12
+ def chainer_class
13
+ raise NotImplementedError
14
+ end
15
+
16
+ def to_initialize_string
17
+ raise NotImplementedError
18
+ end
19
+
20
+ def to_call_string
21
+ raise NotImplementedError
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,44 @@
1
+ require 'onnx-chainer/operator'
2
+
3
+ module OnnxChainer
4
+ module Operators
5
+ class Gemm < Operator
6
+ class << self
7
+ def parse(node, input_names, inputs, output_name_index)
8
+ bias_name = node.input.find { |i| i.match(/_b$/) }
9
+ input = inputs.find { |i| i.name == bias_name }
10
+ output_shape = input.type.tensor_type.shape.dim.map(&:dim_value)
11
+
12
+ need_initialized = node.input.any? { |i| inputs.map(&:name).include?(i) }
13
+
14
+ output_names = {
15
+ node.output.first => "l#{output_name_index}"
16
+ }
17
+ instance_variable_name = "@l#{output_name_index}"
18
+
19
+ self.new(input_names: input_names, output_shape: output_shape, output_names: output_names, instance_variable_name: instance_variable_name, need_initialized: need_initialized)
20
+ end
21
+ end
22
+
23
+ def initialize(input_names:, output_shape:, output_names:, instance_variable_name:, need_initialized:)
24
+ @input_names = input_names
25
+ @output_shape = output_shape
26
+ @output_names = output_names
27
+ @instance_variable_name = instance_variable_name
28
+ @need_initialized = need_initialized
29
+ end
30
+
31
+ def chainer_class
32
+ ::Chainer::Links::Connection::Linear
33
+ end
34
+
35
+ def to_initialize_string
36
+ "#{@instance_variable_name} = #{chainer_class}.new(nil, out_size: #{@output_shape})"
37
+ end
38
+
39
+ def to_call_string(args)
40
+ "#{@output_names.values.first} = #{@instance_variable_name}.(#{args.join(', ')})"
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,35 @@
1
+ require 'onnx-chainer/operator'
2
+
3
+ module OnnxChainer
4
+ module Operators
5
+ class Relu < Operator
6
+ class << self
7
+ def parse(node, input_names, inputs, output_name_index)
8
+ need_initialized = node.input.any? { |i| inputs.map(&:name).include?(i) }
9
+
10
+ output_names = {
11
+ node.output.first => "r#{output_name_index}"
12
+ }
13
+ instance_variable_name = "@r#{output_name_index}"
14
+
15
+ self.new(input_names: input_names, output_names: output_names, instance_variable_name: instance_variable_name, need_initialized: need_initialized)
16
+ end
17
+ end
18
+
19
+ def initialize(input_names:, output_names:, instance_variable_name:, need_initialized:)
20
+ @input_names = input_names
21
+ @output_names = output_names
22
+ @instance_variable_name = instance_variable_name
23
+ @need_initialized = need_initialized
24
+ end
25
+
26
+ def chainer_class
27
+ ::Chainer::Functions::Activation::Relu
28
+ end
29
+
30
+ def to_call_string(args)
31
+ "#{@output_names.values.first} = #{chainer_class}.relu(#{args.join(', ')})"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,483 @@
1
+ //
2
+ // WARNING: This file is automatically generated! Please edit onnx.in.proto.
3
+ //
4
+
5
+
6
+ // Copyright (c) ONNX Project Contributors.
7
+ // Licensed under the MIT license.
8
+
9
+ syntax = "proto2";
10
+
11
+ package onnx;
12
+
13
+ // Overview
14
+ //
15
+ // ONNX is an open specification that is comprised of the following components:
16
+ //
17
+ // 1) A definition of an extensible computation graph model.
18
+ // 2) Definitions of standard data types.
19
+ // 3) Definitions of built-in operators.
20
+ //
21
+ // This document describes the syntax of models and their computation graphs,
22
+ // as well as the standard data types. Together, they are referred to as the ONNX
23
+ // Intermediate Representation, or 'IR' for short.
24
+ //
25
+ // The normative semantic specification of the ONNX IR is found in docs/IR.md.
26
+ // Definitions of the built-in neural network operators may be found in docs/Operators.md.
27
+
28
+ // Notes
29
+ //
30
+ // Release
31
+ //
32
+ // We are still in the very early stage of defining ONNX. The current
33
+ // version of ONNX is a starting point. While we are actively working
34
+ // towards a complete spec, we would like to get the community involved
35
+ // by sharing our working version of ONNX.
36
+ //
37
+ // Protobuf compatibility
38
+ //
39
+ // To simplify framework compatibility, ONNX is defined using the subset of protobuf
40
+ // that is compatible with both protobuf v2 and v3. This means that we do not use any
41
+ // protobuf features that are only available in one of the two versions.
42
+ //
43
+ // Here are the most notable contortions we have to carry out to work around
44
+ // these limitations:
45
+ //
46
+ // - No 'map' (added protobuf 3.0). We instead represent mappings as lists
47
+ // of key-value pairs, where order does not matter and duplicates
48
+ // are not allowed.
49
+
50
+
51
+ // Versioning
52
+ //
53
+ // ONNX versioning is specified in docs/IR.md and elaborated on in docs/Versioning.md
54
+ //
55
+ // To be compatible with both proto2 and proto3, we will use a version number
56
+ // that is not defined by the default value but an explicit enum number.
57
+ enum Version {
58
+ // proto3 requires the first enum value to be zero.
59
+ // We add this just to appease the compiler.
60
+ _START_VERSION = 0;
61
+ // The version field is always serialized and we will use it to store the
62
+ // version that the graph is generated from. This helps us set up version
63
+ // control.
64
+ // For the IR, we are using simple numbers starting with with 0x00000001,
65
+ // which was the version we published on Oct 10, 2017.
66
+ IR_VERSION_2017_10_10 = 0x0000000000000001;
67
+
68
+ // IR_VERSION 2 published on Oct 30, 2017
69
+ // - Added type discriminator to AttributeProto to support proto3 users
70
+ IR_VERSION_2017_10_30 = 0x0000000000000002;
71
+
72
+ // IR VERSION 3 published on Nov 3, 2017
73
+ // - For operator versioning:
74
+ // - Added new message OperatorSetIdProto
75
+ // - Added opset_import in ModelProto
76
+ // - For vendor extensions, added domain in NodeProto
77
+ IR_VERSION_2017_11_3 = 0x0000000000000003;
78
+
79
+ // IR VERSION 4 published on Jan 22, 2019
80
+ // - Relax constraint that initializers should be a subset of graph inputs
81
+ // - Add type BFLOAT16
82
+ IR_VERSION = 0x0000000000000004;
83
+ }
84
+
85
+ // Attributes
86
+ //
87
+ // A named attribute containing either singular float, integer, string, graph,
88
+ // and tensor values, or repeated float, integer, string, graph, and tensor values.
89
+ // An AttributeProto MUST contain the name field, and *only one* of the
90
+ // following content fields, effectively enforcing a C/C++ union equivalent.
91
+ message AttributeProto {
92
+
93
+ // Note: this enum is structurally identical to the OpSchema::AttrType
94
+ // enum defined in schema.h. If you rev one, you likely need to rev the other.
95
+ enum AttributeType {
96
+ UNDEFINED = 0;
97
+ FLOAT = 1;
98
+ INT = 2;
99
+ STRING = 3;
100
+ TENSOR = 4;
101
+ GRAPH = 5;
102
+
103
+ FLOATS = 6;
104
+ INTS = 7;
105
+ STRINGS = 8;
106
+ TENSORS = 9;
107
+ GRAPHS = 10;
108
+ }
109
+
110
+ // The name field MUST be present for this version of the IR.
111
+ optional string name = 1; // namespace Attribute
112
+
113
+ // if ref_attr_name is not empty, ref_attr_name is the attribute name in parent function.
114
+ // In this case, this AttributeProto does not contain data, and it's a reference of attribute
115
+ // in parent scope.
116
+ // NOTE: This should ONLY be used in function (sub-graph). It's invalid to be used in main graph.
117
+ optional string ref_attr_name = 21;
118
+
119
+ // A human-readable documentation for this attribute. Markdown is allowed.
120
+ optional string doc_string = 13;
121
+
122
+ // The type field MUST be present for this version of the IR.
123
+ // For 0.0.1 versions of the IR, this field was not defined, and
124
+ // implementations needed to use has_field hueristics to determine
125
+ // which value field was in use. For IR_VERSION 0.0.2 or later, this
126
+ // field MUST be set and match the f|i|s|t|... field in use. This
127
+ // change was made to accomodate proto3 implementations.
128
+ optional AttributeType type = 20; // discriminator that indicates which field below is in use
129
+
130
+ // Exactly ONE of the following fields must be present for this version of the IR
131
+ optional float f = 2; // float
132
+ optional int64 i = 3; // int
133
+ optional bytes s = 4; // UTF-8 string
134
+ optional TensorProto t = 5; // tensor value
135
+ optional GraphProto g = 6; // graph
136
+ // Do not use field below, it's deprecated.
137
+ // optional ValueProto v = 12; // value - subsumes everything but graph
138
+
139
+ repeated float floats = 7; // list of floats
140
+ repeated int64 ints = 8; // list of ints
141
+ repeated bytes strings = 9; // list of UTF-8 strings
142
+ repeated TensorProto tensors = 10; // list of tensors
143
+ repeated GraphProto graphs = 11; // list of graph
144
+ }
145
+
146
+ // Defines information on value, including the name, the type, and
147
+ // the shape of the value.
148
+ message ValueInfoProto {
149
+ // This field MUST be present in this version of the IR.
150
+ optional string name = 1; // namespace Value
151
+ // This field MUST be present in this version of the IR.
152
+ optional TypeProto type = 2;
153
+ // A human-readable documentation for this value. Markdown is allowed.
154
+ optional string doc_string = 3;
155
+ }
156
+
157
+ // Nodes
158
+ //
159
+ // Computation graphs are made up of a DAG of nodes, which represent what is
160
+ // commonly called a "layer" or "pipeline stage" in machine learning frameworks.
161
+ //
162
+ // For example, it can be a node of type "Conv" that takes in an image, a filter
163
+ // tensor and a bias tensor, and produces the convolved output.
164
+ message NodeProto {
165
+ repeated string input = 1; // namespace Value
166
+ repeated string output = 2; // namespace Value
167
+
168
+ // An optional identifier for this node in a graph.
169
+ // This field MAY be absent in ths version of the IR.
170
+ optional string name = 3; // namespace Node
171
+
172
+ // The symbolic identifier of the Operator to execute.
173
+ optional string op_type = 4; // namespace Operator
174
+ // The domain of the OperatorSet that specifies the operator named by op_type.
175
+ optional string domain = 7; // namespace Domain
176
+
177
+ // Additional named attributes.
178
+ repeated AttributeProto attribute = 5;
179
+
180
+ // A human-readable documentation for this node. Markdown is allowed.
181
+ optional string doc_string = 6;
182
+ }
183
+
184
+ // Models
185
+ //
186
+ // ModelProto is a top-level file/container format for bundling a ML model and
187
+ // associating its computation graph with metadata.
188
+ //
189
+ // The semantics of the model are described by the associated GraphProto.
190
+ message ModelProto {
191
+ // The version of the IR this model targets. See Version enum above.
192
+ // This field MUST be present.
193
+ optional int64 ir_version = 1;
194
+
195
+ // The OperatorSets this model relies on.
196
+ // All ModelProtos MUST have at least one entry that
197
+ // specifies which version of the ONNX OperatorSet is
198
+ // being imported.
199
+ //
200
+ // All nodes in the ModelProto's graph will bind against the operator
201
+ // with the same-domain/same-op_type operator with the HIGHEST version
202
+ // in the referenced operator sets.
203
+ repeated OperatorSetIdProto opset_import = 8;
204
+
205
+ // The name of the framework or tool used to generate this model.
206
+ // This field SHOULD be present to indicate which implementation/tool/framework
207
+ // emitted the model.
208
+ optional string producer_name = 2;
209
+
210
+ // The version of the framework or tool used to generate this model.
211
+ // This field SHOULD be present to indicate which implementation/tool/framework
212
+ // emitted the model.
213
+ optional string producer_version = 3;
214
+
215
+ // Domain name of the model.
216
+ // We use reverse domain names as name space indicators. For example:
217
+ // `com.facebook.fair` or `com.microsoft.cognitiveservices`
218
+ //
219
+ // Together with `model_version` and GraphProto.name, this forms the unique identity of
220
+ // the graph.
221
+ optional string domain = 4;
222
+
223
+ // The version of the graph encoded. See Version enum below.
224
+ optional int64 model_version = 5;
225
+
226
+ // A human-readable documentation for this model. Markdown is allowed.
227
+ optional string doc_string = 6;
228
+
229
+ // The parameterized graph that is evaluated to execute the model.
230
+ optional GraphProto graph = 7;
231
+
232
+ // Named metadata values; keys should be distinct.
233
+ repeated StringStringEntryProto metadata_props = 14;
234
+ };
235
+
236
+ // StringStringEntryProto follows the pattern for cross-proto-version maps.
237
+ // See https://developers.google.com/protocol-buffers/docs/proto3#maps
238
+ message StringStringEntryProto {
239
+ optional string key = 1;
240
+ optional string value= 2;
241
+ };
242
+
243
+ // Graphs
244
+ //
245
+ // A graph defines the computational logic of a model and is comprised of a parameterized
246
+ // list of nodes that form a directed acyclic graph based on their inputs and outputs.
247
+ // This is the equivalent of the "network" or "graph" in many deep learning
248
+ // frameworks.
249
+ message GraphProto {
250
+ // The nodes in the graph, sorted topologically.
251
+ repeated NodeProto node = 1;
252
+
253
+ // The name of the graph.
254
+ optional string name = 2; // namespace Graph
255
+
256
+ // A list of named tensor values, used to specify constant inputs of the graph.
257
+ // Each TensorProto entry must have a distinct name (within the list) that
258
+ // MAY also appear in the input list.
259
+ repeated TensorProto initializer = 5;
260
+
261
+ // A human-readable documentation for this graph. Markdown is allowed.
262
+ optional string doc_string = 10;
263
+
264
+ // The inputs and outputs of the graph.
265
+ repeated ValueInfoProto input = 11;
266
+ repeated ValueInfoProto output = 12;
267
+
268
+ // Information for the values in the graph. The ValueInfoProto.name's
269
+ // must be distinct. It is optional for a value to appear in value_info list.
270
+ repeated ValueInfoProto value_info = 13;
271
+
272
+ // DO NOT USE the following fields, they were deprecated from earlier versions.
273
+ // repeated string input = 3;
274
+ // repeated string output = 4;
275
+ // optional int64 ir_version = 6;
276
+ // optional int64 producer_version = 7;
277
+ // optional string producer_tag = 8;
278
+ // optional string domain = 9;
279
+ }
280
+
281
+ // Tensors
282
+ //
283
+ // A serialized tensor value.
284
+ message TensorProto {
285
+ enum DataType {
286
+ UNDEFINED = 0;
287
+ // Basic types.
288
+ FLOAT = 1; // float
289
+ UINT8 = 2; // uint8_t
290
+ INT8 = 3; // int8_t
291
+ UINT16 = 4; // uint16_t
292
+ INT16 = 5; // int16_t
293
+ INT32 = 6; // int32_t
294
+ INT64 = 7; // int64_t
295
+ STRING = 8; // string
296
+ BOOL = 9; // bool
297
+
298
+ // IEEE754 half-precision floating-point format (16 bits wide).
299
+ // This format has 1 sign bit, 5 exponent bits, and 10 mantissa bits.
300
+ FLOAT16 = 10;
301
+
302
+ DOUBLE = 11;
303
+ UINT32 = 12;
304
+ UINT64 = 13;
305
+ COMPLEX64 = 14; // complex with float32 real and imaginary components
306
+ COMPLEX128 = 15; // complex with float64 real and imaginary components
307
+
308
+ // Non-IEEE floating-point format based on IEEE754 single-precision
309
+ // floating-point number truncated to 16 bits.
310
+ // This format has 1 sign bit, 8 exponent bits, and 7 mantissa bits.
311
+ BFLOAT16 = 16;
312
+
313
+ // Future extensions go here.
314
+ }
315
+
316
+ // The shape of the tensor.
317
+ repeated int64 dims = 1;
318
+
319
+ // The data type of the tensor.
320
+ // This field MUST have a valid TensorProto.DataType value
321
+ optional int32 data_type = 2;
322
+
323
+ // For very large tensors, we may want to store them in chunks, in which
324
+ // case the following fields will specify the segment that is stored in
325
+ // the current TensorProto.
326
+ message Segment {
327
+ optional int64 begin = 1;
328
+ optional int64 end = 2;
329
+ }
330
+ optional Segment segment = 3;
331
+
332
+ // Tensor content must be organized in row-major order.
333
+ //
334
+ // Depending on the data_type field, exactly one of the fields below with
335
+ // name ending in _data is used to store the elements of the tensor.
336
+
337
+ // For float and complex64 values
338
+ // Complex64 tensors are encoded as a single array of floats,
339
+ // with the real components appearing in odd numbered positions,
340
+ // and the corresponding imaginary component apparing in the
341
+ // subsequent even numbered position. (e.g., [1.0 + 2.0i, 3.0 + 4.0i]
342
+ // is encoded as [1.0, 2.0 ,3.0 ,4.0]
343
+ // When this field is present, the data_type field MUST be FLOAT or COMPLEX64.
344
+ repeated float float_data = 4 [packed = true];
345
+
346
+ // For int32, uint8, int8, uint16, int16, bool, and float16 values
347
+ // float16 values must be bit-wise converted to an uint16_t prior
348
+ // to writing to the buffer.
349
+ // When this field is present, the data_type field MUST be
350
+ // INT32, INT16, INT8, UINT16, UINT8, BOOL, or FLOAT16
351
+ repeated int32 int32_data = 5 [packed = true];
352
+
353
+ // For strings.
354
+ // Each element of string_data is a UTF-8 encoded Unicode
355
+ // string. No trailing null, no leading BOM. The protobuf "string"
356
+ // scalar type is not used to match ML community conventions.
357
+ // When this field is present, the data_type field MUST be STRING
358
+ repeated bytes string_data = 6;
359
+
360
+ // For int64.
361
+ // When this field is present, the data_type field MUST be INT64
362
+ repeated int64 int64_data = 7 [packed = true];
363
+
364
+ // Optionally, a name for the tensor.
365
+ optional string name = 8; // namespace Value
366
+
367
+ // A human-readable documentation for this tensor. Markdown is allowed.
368
+ optional string doc_string = 12;
369
+
370
+ // Serializations can either use one of the fields above, or use this
371
+ // raw bytes field. The only exception is the string case, where one is
372
+ // required to store the content in the repeated bytes string_data field.
373
+ //
374
+ // When this raw_data field is used to store tensor value, elements MUST
375
+ // be stored in as fixed-width, little-endian order.
376
+ // Floating-point data types MUST be stored in IEEE 754 format.
377
+ // Complex64 elements must be written as two consecutive FLOAT values, real component first.
378
+ // Complex128 elements must be written as two consecutive DOUBLE values, real component first.
379
+ // Boolean type MUST be written one byte per tensor element (00000001 for true, 00000000 for false).
380
+ //
381
+ // Note: the advantage of specific field rather than the raw_data field is
382
+ // that in some cases (e.g. int data), protobuf does a better packing via
383
+ // variable length storage, and may lead to smaller binary footprint.
384
+ // When this field is present, the data_type field MUST NOT be STRING or UNDEFINED
385
+ optional bytes raw_data = 9;
386
+
387
+ // Data can be stored inside the protobuf file using type-specific fields or raw_data.
388
+ // Alternatively, raw bytes data can be stored in an external file, using the external_data field.
389
+ // external_data stores key-value pairs describing data location. Recognized keys are:
390
+ // - "location" (required) - POSIX filesystem path relative to the directory where the ONNX
391
+ // protobuf model was stored
392
+ // - "offset" (optional) - position of byte at which stored data begins. Integer stored as string.
393
+ // Offset values SHOULD be multiples 4096 (page size) to enable mmap support.
394
+ // - "length" (optional) - number of bytes containing data. Integer stored as string.
395
+ // - "checksum" (optional) - SHA1 digest of file specified in under 'location' key.
396
+ repeated StringStringEntryProto external_data = 13;
397
+
398
+ // Location of the data for this tensor. MUST be one of:
399
+ // - DEFAULT - data stored inside the protobuf message. Data is stored in raw_data (if set) otherwise in type-specified field.
400
+ // - EXTERNAL - data stored in an external location as described by external_data field.
401
+ enum DataLocation {
402
+ DEFAULT = 0;
403
+ EXTERNAL = 1;
404
+ }
405
+
406
+ // If value not set, data is stored in raw_data (if set) otherwise in type-specified field.
407
+ optional DataLocation data_location = 14;
408
+
409
+ // For double
410
+ // Complex128 tensors are encoded as a single array of doubles,
411
+ // with the real components appearing in odd numbered positions,
412
+ // and the corresponding imaginary component apparing in the
413
+ // subsequent even numbered position. (e.g., [1.0 + 2.0i, 3.0 + 4.0i]
414
+ // is encoded as [1.0, 2.0 ,3.0 ,4.0]
415
+ // When this field is present, the data_type field MUST be DOUBLE or COMPLEX128
416
+ repeated double double_data = 10 [packed = true];
417
+
418
+ // For uint64 and uint32 values
419
+ // When this field is present, the data_type field MUST be
420
+ // UINT32 or UINT64
421
+ repeated uint64 uint64_data = 11 [packed = true];
422
+ }
423
+
424
+ // Defines a tensor shape. A dimension can be either an integer value
425
+ // or a symbolic variable. A symbolic variable represents an unknown
426
+ // dimension.
427
+ message TensorShapeProto {
428
+ message Dimension {
429
+ oneof value {
430
+ int64 dim_value = 1;
431
+ string dim_param = 2; // namespace Shape
432
+ };
433
+ // Standard denotation can optionally be used to denote tensor
434
+ // dimensions with standard semantic descriptions to ensure
435
+ // that operations are applied to the correct axis of a tensor.
436
+ // Refer to https://github.com/onnx/onnx/blob/master/docs/DimensionDenotation.md#denotation-definition
437
+ // for pre-defined dimension denotations.
438
+ optional string denotation = 3;
439
+ };
440
+ repeated Dimension dim = 1;
441
+ }
442
+
443
+ // Types
444
+ //
445
+ // The standard ONNX data types.
446
+ message TypeProto {
447
+
448
+ message Tensor {
449
+ // This field MUST NOT have the value of UNDEFINED
450
+ // This field MUST have a valid TensorProto.DataType value
451
+ // This field MUST be present for this version of the IR.
452
+ optional int32 elem_type = 1;
453
+ optional TensorShapeProto shape = 2;
454
+ }
455
+
456
+
457
+ oneof value {
458
+ // The type of a tensor.
459
+ Tensor tensor_type = 1;
460
+
461
+ }
462
+
463
+ // An optional denotation can be used to denote the whole
464
+ // type with a standard semantic description as to what is
465
+ // stored inside. Refer to https://github.com/onnx/onnx/blob/master/docs/TypeDenotation.md#type-denotation-definition
466
+ // for pre-defined type denotations.
467
+ optional string denotation = 6;
468
+ }
469
+
470
+ // Operator Sets
471
+ //
472
+ // OperatorSets are uniquely identified by a (domain, opset_version) pair.
473
+ message OperatorSetIdProto {
474
+ // The domain of the operator set being identified.
475
+ // The empty string ("") or absence of this field implies the operator
476
+ // set that is defined as part of the ONNX specification.
477
+ // This field MUST be present in this version of the IR when referring to any other operator set.
478
+ optional string domain = 1;
479
+
480
+ // The version of the operator set being identified.
481
+ // This field MUST be present in this version of the IR.
482
+ optional int64 version = 2;
483
+ }
@@ -0,0 +1,170 @@
1
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
2
+ # source: lib/onnx.proto
3
+
4
+ require 'google/protobuf'
5
+
6
+ Google::Protobuf::DescriptorPool.generated_pool.build do
7
+ add_file("lib/onnx.proto", :syntax => :proto2) do
8
+ add_message "onnx.AttributeProto" do
9
+ optional :name, :string, 1
10
+ optional :ref_attr_name, :string, 21
11
+ optional :doc_string, :string, 13
12
+ optional :type, :enum, 20, "onnx.AttributeProto.AttributeType"
13
+ optional :f, :float, 2
14
+ optional :i, :int64, 3
15
+ optional :s, :bytes, 4
16
+ optional :t, :message, 5, "onnx.TensorProto"
17
+ optional :g, :message, 6, "onnx.GraphProto"
18
+ repeated :floats, :float, 7
19
+ repeated :ints, :int64, 8
20
+ repeated :strings, :bytes, 9
21
+ repeated :tensors, :message, 10, "onnx.TensorProto"
22
+ repeated :graphs, :message, 11, "onnx.GraphProto"
23
+ end
24
+ add_enum "onnx.AttributeProto.AttributeType" do
25
+ value :UNDEFINED, 0
26
+ value :FLOAT, 1
27
+ value :INT, 2
28
+ value :STRING, 3
29
+ value :TENSOR, 4
30
+ value :GRAPH, 5
31
+ value :FLOATS, 6
32
+ value :INTS, 7
33
+ value :STRINGS, 8
34
+ value :TENSORS, 9
35
+ value :GRAPHS, 10
36
+ end
37
+ add_message "onnx.ValueInfoProto" do
38
+ optional :name, :string, 1
39
+ optional :type, :message, 2, "onnx.TypeProto"
40
+ optional :doc_string, :string, 3
41
+ end
42
+ add_message "onnx.NodeProto" do
43
+ repeated :input, :string, 1
44
+ repeated :output, :string, 2
45
+ optional :name, :string, 3
46
+ optional :op_type, :string, 4
47
+ optional :domain, :string, 7
48
+ repeated :attribute, :message, 5, "onnx.AttributeProto"
49
+ optional :doc_string, :string, 6
50
+ end
51
+ add_message "onnx.ModelProto" do
52
+ optional :ir_version, :int64, 1
53
+ repeated :opset_import, :message, 8, "onnx.OperatorSetIdProto"
54
+ optional :producer_name, :string, 2
55
+ optional :producer_version, :string, 3
56
+ optional :domain, :string, 4
57
+ optional :model_version, :int64, 5
58
+ optional :doc_string, :string, 6
59
+ optional :graph, :message, 7, "onnx.GraphProto"
60
+ repeated :metadata_props, :message, 14, "onnx.StringStringEntryProto"
61
+ end
62
+ add_message "onnx.StringStringEntryProto" do
63
+ optional :key, :string, 1
64
+ optional :value, :string, 2
65
+ end
66
+ add_message "onnx.GraphProto" do
67
+ repeated :node, :message, 1, "onnx.NodeProto"
68
+ optional :name, :string, 2
69
+ repeated :initializer, :message, 5, "onnx.TensorProto"
70
+ optional :doc_string, :string, 10
71
+ repeated :input, :message, 11, "onnx.ValueInfoProto"
72
+ repeated :output, :message, 12, "onnx.ValueInfoProto"
73
+ repeated :value_info, :message, 13, "onnx.ValueInfoProto"
74
+ end
75
+ add_message "onnx.TensorProto" do
76
+ repeated :dims, :int64, 1
77
+ optional :data_type, :int32, 2
78
+ optional :segment, :message, 3, "onnx.TensorProto.Segment"
79
+ repeated :float_data, :float, 4
80
+ repeated :int32_data, :int32, 5
81
+ repeated :string_data, :bytes, 6
82
+ repeated :int64_data, :int64, 7
83
+ optional :name, :string, 8
84
+ optional :doc_string, :string, 12
85
+ optional :raw_data, :bytes, 9
86
+ repeated :external_data, :message, 13, "onnx.StringStringEntryProto"
87
+ optional :data_location, :enum, 14, "onnx.TensorProto.DataLocation"
88
+ repeated :double_data, :double, 10
89
+ repeated :uint64_data, :uint64, 11
90
+ end
91
+ add_message "onnx.TensorProto.Segment" do
92
+ optional :begin, :int64, 1
93
+ optional :end, :int64, 2
94
+ end
95
+ add_enum "onnx.TensorProto.DataType" do
96
+ value :UNDEFINED, 0
97
+ value :FLOAT, 1
98
+ value :UINT8, 2
99
+ value :INT8, 3
100
+ value :UINT16, 4
101
+ value :INT16, 5
102
+ value :INT32, 6
103
+ value :INT64, 7
104
+ value :STRING, 8
105
+ value :BOOL, 9
106
+ value :FLOAT16, 10
107
+ value :DOUBLE, 11
108
+ value :UINT32, 12
109
+ value :UINT64, 13
110
+ value :COMPLEX64, 14
111
+ value :COMPLEX128, 15
112
+ value :BFLOAT16, 16
113
+ end
114
+ add_enum "onnx.TensorProto.DataLocation" do
115
+ value :DEFAULT, 0
116
+ value :EXTERNAL, 1
117
+ end
118
+ add_message "onnx.TensorShapeProto" do
119
+ repeated :dim, :message, 1, "onnx.TensorShapeProto.Dimension"
120
+ end
121
+ add_message "onnx.TensorShapeProto.Dimension" do
122
+ optional :denotation, :string, 3
123
+ oneof :value do
124
+ optional :dim_value, :int64, 1
125
+ optional :dim_param, :string, 2
126
+ end
127
+ end
128
+ add_message "onnx.TypeProto" do
129
+ optional :denotation, :string, 6
130
+ oneof :value do
131
+ optional :tensor_type, :message, 1, "onnx.TypeProto.Tensor"
132
+ end
133
+ end
134
+ add_message "onnx.TypeProto.Tensor" do
135
+ optional :elem_type, :int32, 1
136
+ optional :shape, :message, 2, "onnx.TensorShapeProto"
137
+ end
138
+ add_message "onnx.OperatorSetIdProto" do
139
+ optional :domain, :string, 1
140
+ optional :version, :int64, 2
141
+ end
142
+ add_enum "onnx.Version" do
143
+ value :_START_VERSION, 0
144
+ value :IR_VERSION_2017_10_10, 1
145
+ value :IR_VERSION_2017_10_30, 2
146
+ value :IR_VERSION_2017_11_3, 3
147
+ value :IR_VERSION, 4
148
+ end
149
+ end
150
+ end
151
+
152
+ module Onnx
153
+ AttributeProto = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.AttributeProto").msgclass
154
+ AttributeProto::AttributeType = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.AttributeProto.AttributeType").enummodule
155
+ ValueInfoProto = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.ValueInfoProto").msgclass
156
+ NodeProto = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.NodeProto").msgclass
157
+ ModelProto = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.ModelProto").msgclass
158
+ StringStringEntryProto = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.StringStringEntryProto").msgclass
159
+ GraphProto = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.GraphProto").msgclass
160
+ TensorProto = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.TensorProto").msgclass
161
+ TensorProto::Segment = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.TensorProto.Segment").msgclass
162
+ TensorProto::DataType = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.TensorProto.DataType").enummodule
163
+ TensorProto::DataLocation = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.TensorProto.DataLocation").enummodule
164
+ TensorShapeProto = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.TensorShapeProto").msgclass
165
+ TensorShapeProto::Dimension = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.TensorShapeProto.Dimension").msgclass
166
+ TypeProto = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.TypeProto").msgclass
167
+ TypeProto::Tensor = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.TypeProto.Tensor").msgclass
168
+ OperatorSetIdProto = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.OperatorSetIdProto").msgclass
169
+ Version = Google::Protobuf::DescriptorPool.generated_pool.lookup("onnx.Version").enummodule
170
+ end
@@ -0,0 +1,3 @@
1
+ module OnnxChainer
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,31 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "onnx-chainer/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "onnx-red-chainer"
8
+ spec.version = OnnxChainer::VERSION
9
+ spec.authors = ["hatappi"]
10
+ spec.email = ["hatappi@hatappi.me"]
11
+
12
+ spec.summary = "Automatically generate Ruby code from ONNX"
13
+ spec.description = "Automatically generate Ruby code from ONNX"
14
+ spec.homepage = "https://github.com/hatappi/onnx-red-chainer"
15
+ spec.license = "MIT"
16
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
17
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ end
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_dependency 'google-protobuf'
24
+ spec.add_dependency 'red-chainer'
25
+ spec.add_dependency "numo-narray"
26
+
27
+ spec.add_development_dependency "bundler", "~> 1.17"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "minitest", "~> 5.0"
30
+ end
31
+
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: onnx-red-chainer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - hatappi
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-04-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: google-protobuf
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: red-chainer
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: numo-narray
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.17'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.17'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '5.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '5.0'
97
+ description: Automatically generate Ruby code from ONNX
98
+ email:
99
+ - hatappi@hatappi.me
100
+ executables:
101
+ - onnx-red-chainer
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - Gemfile
106
+ - Gemfile.lock
107
+ - LICENSE.txt
108
+ - README.md
109
+ - Rakefile
110
+ - bin/console
111
+ - bin/setup
112
+ - exe/onnx-red-chainer
113
+ - lib/onnx-chainer.rb
114
+ - lib/onnx-chainer/cli.rb
115
+ - lib/onnx-chainer/graph.rb
116
+ - lib/onnx-chainer/operator.rb
117
+ - lib/onnx-chainer/operators/gemm.rb
118
+ - lib/onnx-chainer/operators/relu.rb
119
+ - lib/onnx-chainer/proto/onnx.proto
120
+ - lib/onnx-chainer/proto/onnx_pb.rb
121
+ - lib/onnx-chainer/version.rb
122
+ - onnx-red-chainer.gemspec
123
+ homepage: https://github.com/hatappi/onnx-red-chainer
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubyforge_project:
143
+ rubygems_version: 2.7.6
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: Automatically generate Ruby code from ONNX
147
+ test_files: []