class Markov::TransitionMatrix

Attributes

depth[R]
transitions[R]

Public Class Methods

new(transitions={}, depth:) click to toggle source
# File lib/markov/transition_matrix.rb, line 5
def initialize(transitions={}, depth:)
  @depth = depth
  @transitions = transitions
end

Public Instance Methods

add_transition(states) click to toggle source
# File lib/markov/transition_matrix.rb, line 10
def add_transition(states)
  # p [ :add_transition, states: states, depth: depth ]
  if states.is_a?(Array) && states.count > @depth
    states = states[-(@depth)..-1]
  end

  unless states.count == depth
    raise "This transition matrix is depth #@depth, not #{states.count}!"
  end

  *key, last = states
  key.inject(@transitions) { |h,k| h[k] ||= {}; h[k] }
  key.inject(@transitions, :fetch)[last] ||= 0
  key.inject(@transitions, :fetch)[last] += 1
end
transitions_from(states) click to toggle source
# File lib/markov/transition_matrix.rb, line 26
def transitions_from(states)
  states = [states] unless states.is_a?(Array)

  if states.count >= @depth
    states = states[-(@depth-1)..-1]
  end

  if @depth == 1
    states = []
  end

  if states.count > 0
    @transitions.dig(*states)
  else
    @transitions
  end
end