11# frozen_string_literal: true
22
3- require ' tmpdir'
4- require ' json'
3+ require " tmpdir"
4+ require " json"
55
66module Interscript
77 module ML
@@ -16,7 +16,7 @@ class PlaneModel
1616 attr_reader :classes , :k_passes
1717
1818 def initialize ( graph :, classes :, k_passes : 2 )
19- Interscript ::ML . require_optional! ( ' onnxruntime' )
19+ Interscript ::ML . require_optional! ( " onnxruntime" )
2020 @classes = classes . freeze
2121 @n_classes = classes . length
2222 @mask_id = @n_classes
@@ -27,8 +27,8 @@ def initialize(graph:, classes:, k_passes: 2)
2727 @class_to_id = classes . each_with_index . to_h . freeze
2828 # the onnxruntime gem loads from paths, not bytes (as byt5_onnx):
2929 # verified bytes go to a tmpfile owned by this instance
30- @graph_tmpdir = Dir . mktmpdir ( ' isx-plane' )
31- path = File . join ( @graph_tmpdir , ' plane.onnx' )
30+ @graph_tmpdir = Dir . mktmpdir ( " isx-plane" )
31+ path = File . join ( @graph_tmpdir , " plane.onnx" )
3232 File . binwrite ( path , graph )
3333 @sess = OnnxRuntime ::Model . new ( path )
3434 end
@@ -58,7 +58,7 @@ def split_planes(text)
5858 else
5959 close . call
6060 skeleton << ch
61- classes << ''
61+ classes << ""
6262 end
6363 end
6464 close . call
@@ -75,18 +75,18 @@ def translate(text, preserve_diacritics: false)
7575 ch = skeleton [ i ]
7676 n = ch . bytesize
7777 cls = if user_cls . empty?
78- votes = tok_preds [ pos , n ] || [ ]
79- cid = votes . tally . max_by { |_ , c | c } &.first || @n_classes
80- cid < @n_classes ? @classes [ cid ] : ''
81- else
82- user_cls # user diacritics round-trip byte-exactly
83- end
78+ votes = tok_preds [ pos , n ] || [ ]
79+ cid = votes . tally . max_by { |_ , c | c } &.first || @n_classes
80+ ( cid < @n_classes ) ? @classes [ cid ] : ""
81+ else
82+ user_cls # user diacritics round-trip byte-exactly
83+ end
8484 pos += n
8585 cls
8686 end
8787 out = +""
8888 skeleton . each_char . with_index do |ch , i |
89- out << ( ch == "\x00 " ? final [ i ] : ch + final [ i ] )
89+ out << ( ( ch == "\x00 " ) ? final [ i ] : ch + final [ i ] )
9090 end
9191 out
9292 end
@@ -102,7 +102,7 @@ def translate_plain(text)
102102 votes = preds [ pos , nbytes ] || [ ]
103103 cid = votes . tally . max_by { |_ , c | c } &.first || @n_classes
104104 pos += nbytes
105- cid < @n_classes ? @classes [ cid ] : ''
105+ ( cid < @n_classes ) ? @classes [ cid ] : ""
106106 end
107107 PlaneModel . render_plane ( text , char_preds )
108108 end
@@ -111,7 +111,7 @@ def k_pass_decode(ids, plane0)
111111 plane = plane0
112112 preds = nil
113113 @k_passes . times do
114- logits = @sess . predict ( { ' input_ids' => [ ids ] , ' plane_ids' => [ plane ] } ) [ ' class_logits' ] [ 0 ]
114+ logits = @sess . predict ( { " input_ids" => [ ids ] , " plane_ids" => [ plane ] } ) [ " class_logits" ] [ 0 ]
115115 preds = logits . each_with_index . map { |row , i | row . index ( row . max ) }
116116 plane = preds
117117 end
@@ -129,11 +129,11 @@ def decode_pinned(skeleton, char_classes)
129129 pid = @class_to_id . fetch ( cls , @mask_id )
130130 ch . bytesize . times { per_token_pin << pid }
131131 end
132- plane0 = per_token_pin . map { |p | p == @mask_id ? @mask_id : p }
132+ plane0 = per_token_pin . map { |p | ( p == @mask_id ) ? @mask_id : p }
133133 k_pass_decode ( ids , plane0 )
134134 end
135135
136- def self . render_plane ( skeleton , char_classes )
136+ def self . render_plane ( skeleton , char_classes ) # rubocop:disable Lint/IneffectiveAccessModifier
137137 skeleton . each_char . with_index . map do |ch , i |
138138 ch + char_classes [ i ] . to_s
139139 end . join
@@ -142,14 +142,15 @@ def self.render_plane(skeleton, char_classes)
142142 # The zip contract: metadata.yaml (kind=plane, k_passes, member
143143 # sha256s) + plane.onnx + classes.json, every member sha-verified
144144 # before the session is created.
145+ # rubocop:disable Lint/IneffectiveAccessModifier
145146 def self . from_zip ( data )
146- require ' zip'
147+ require " zip"
147148 zf = Zip ::File . open_buffer ( data )
148149 names = zf . entries . map ( &:name )
149- meta = YAML . safe_load ( zf . read ( ' metadata.yaml' ) , permitted_classes : [ ] , aliases : false )
150- raise IMF ::FormatError , "plane zip: kind=#{ meta [ ' kind' ] . inspect } , expected 'plane'" if meta [ ' kind' ] != ' plane'
150+ meta = YAML . safe_load ( zf . read ( " metadata.yaml" ) , permitted_classes : [ ] , aliases : false )
151+ raise IMF ::FormatError , "plane zip: kind=#{ meta [ " kind" ] . inspect } , expected 'plane'" if meta [ " kind" ] != " plane"
151152
152- members = meta [ ' members' ] || { }
153+ members = meta [ " members" ] || { }
153154 plane_graph = nil
154155 classes_bytes = nil
155156 %w[ plane.onnx classes.json ] . each do |member |
@@ -161,18 +162,20 @@ def self.from_zip(data)
161162 got = Digest ::SHA256 . hexdigest ( bytes )
162163 raise IMF ::FormatError , "plane zip: #{ member } sha256 mismatch (#{ got } )" if want != got
163164
164- plane_graph = bytes if member == ' plane.onnx'
165- classes_bytes = bytes if member == ' classes.json'
165+ plane_graph = bytes if member == " plane.onnx"
166+ classes_bytes = bytes if member == " classes.json"
166167 end
167168 classes = JSON . parse ( classes_bytes )
168- new ( graph : plane_graph , classes : classes , k_passes : meta . fetch ( ' k_passes' , 2 ) )
169+ new ( graph : plane_graph , classes : classes , k_passes : meta . fetch ( " k_passes" , 2 ) )
169170 ensure
170171 zf &.close
171172 end
172173 end
173174
174175 module_function
175176
177+ # rubocop:enable Lint/IneffectiveAccessModifier
178+
176179 def render_plane ( skeleton , char_classes )
177180 PlaneModel . render_plane ( skeleton , char_classes )
178181 end
0 commit comments