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