class Matrix
Patches built-in Matrix
class with methods that generate code for direct vector access. This is used in simulation. It is imaginable and desirable that this way of simulation be refactored, and also, a faster way of simulation provided using NMatrix class.
Public Class Methods
column_vector_access_code(vector: (fail ArgumentError, "No vector!"), indices: (fail ArgumentError, "No indices!"))
click to toggle source
Builds a code string for accessing the vector values at given indices.
# File lib/y_petri/simulation/matrix.rb, line 14 def column_vector_access_code vector: (fail ArgumentError, "No vector!"), indices: (fail ArgumentError, "No indices!") indices.map { |i| "#{vector}[#{i}, 0]" }.join( ", " ) end
column_vector_assignment_code(vector: (fail ArgumentError, "No vector!"), indices: (fail ArgumentError, "No indices!"), source: (fail ArgumentError, "No source!"))
click to toggle source
Builds a code string for assigning to a vector at given indices.
# File lib/y_petri/simulation/matrix.rb, line 21 def column_vector_assignment_code vector: (fail ArgumentError, "No vector!"), indices: (fail ArgumentError, "No indices!"), source: (fail ArgumentError, "No source!") code_lines = indices.map.with_index do |i, source_pos| "#{vector}.send( :[]=, #{i}, 0, #{source}.fetch( #{source_pos} ) )" if i end code_lines.compact.join( "\n" ) << "\n" end
column_vector_increment_by_array_code(vector: (fail ArgumentError, "No vector!"), indices: (fail ArgumentError, "No indices!"), source: (fail ArgumentError, "No source!"))
click to toggle source
Builds a code string for incrementing a vector at given indices. Source is an array.
# File lib/y_petri/simulation/matrix.rb, line 46 def column_vector_increment_by_array_code vector: (fail ArgumentError, "No vector!"), indices: (fail ArgumentError, "No indices!"), source: (fail ArgumentError, "No source!") code_lines = indices.map.with_index do |i, source_pos| "#{vector}.send( :[]=, #{i}, 0, %s )" % "#{vector}[#{i}, 0] + #{source}[#{source_pos}]" if i end code_lines.compact.join( "\n" ) << "\n" end
column_vector_increment_code(vector: (fail ArgumentError, "No vector!"), indices: (fail ArgumentError, "No indices!"), source: (fail ArgumentError, "No source!"))
click to toggle source
Builds a code string for incrementing a vector at given indices. Source is a vector.
# File lib/y_petri/simulation/matrix.rb, line 33 def column_vector_increment_code vector: (fail ArgumentError, "No vector!"), indices: (fail ArgumentError, "No indices!"), source: (fail ArgumentError, "No source!") code_lines = indices.map.with_index do |i, source_pos| "#{vector}.send( :[]=, #{i}, 0, %s )" % "#{vector}[#{i}, 0] + #{source}[#{source_pos}, 0]" if i end code_lines.compact.join( "\n" ) << "\n" end
Public Instance Methods
assign_at_indices_closure(indices: (fail ArgumentError, "No indices!"))
click to toggle source
Builds a closure for assigning to a column at given indices.
# File lib/y_petri/simulation/matrix.rb, line 69 def assign_at_indices_closure indices: (fail ArgumentError, "No indices!") v = self eval "-> ass do\n%s\nend" % self.class.column_vector_assignment_code( vector: ?v, indices: indices, source: "ass" ) end
increment_at_indices_closure(indices: (fail ArgumentError, "No indices!"))
click to toggle source
Builds a closure for incrementing a column at given indices.
# File lib/y_petri/simulation/matrix.rb, line 59 def increment_at_indices_closure indices: (fail ArgumentError, "No indices!") v = self eval "-> delta do\n%s\nend" % self.class.column_vector_increment_code( vector: "v", indices: indices, source: "delta" ) end