Advertisement
TridentBoy

The Math of Dying in Pathfinder 2e v2

Aug 17th, 2019
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.51 KB | None | 0 0
  1. import numpy as np
  2. from numpy.linalg import matrix_power as mp, inv
  3.  
  4. def roll_die(state, max_state, die, mod):
  5.     new_state = state
  6.  
  7.     if die == 20: new_state -= 2
  8.     elif (die <= state + mod) or (die == 1): new_state += 2
  9.     elif die >= 10 + state + mod: new_state -= 1
  10.     else: new_state += 1
  11.  
  12.     if new_state >= max_state: new_state = max_state
  13.     elif new_state <= 0: new_state = 0
  14.  
  15.     return new_state
  16.  
  17. def generate_absorbing_matrix(max_state, mod_recovery):
  18.     order_states = [max_state - 1] + [i for i in range(0, max_state-1)] + [max_state]
  19.  
  20.     array_dying_0 = [0 for _ in range(1, max_state)] + [1, 0]
  21.     array_last_dying = [0 for _ in range(1, max_state + 1)] + [1]
  22.  
  23.     transition_absorbing_matrix = []
  24.  
  25.     for state in range(1, max_state):
  26.         state_count = [0] * (max_state + 1)
  27.         for die in range(1,21):
  28.             state_count[order_states[roll_die(state, max_state, die, mod_recovery)]] += 1/20
  29.         transition_absorbing_matrix.append([round(element, 2) for element in state_count])
  30.  
  31.     transition_absorbing_matrix.append(array_dying_0)
  32.     transition_absorbing_matrix.append(array_last_dying)
  33.  
  34.     transition_absorbing_matrix = np.array(transition_absorbing_matrix)
  35.  
  36.     return transition_absorbing_matrix
  37.  
  38. def generate_matrix_without_absorbing(absorbing_matrix, state_to_remove):
  39.     new_matrix = np.delete(np.delete(absorbing_matrix, state_to_remove, axis = 1), state_to_remove, axis = 0)
  40.  
  41.     for i in range(pos_dying_0):
  42.         new_matrix[i] = new_matrix[i] * 1/(1-absorbing_matrix[i][state_to_remove])
  43.  
  44.     return new_matrix
  45.  
  46. def calculate_relevant_statistics(matrix, n_absorbing):
  47.     n_transient = len(matrix) - n_absorbing
  48.     transient_matrix = matrix[0:n_transient, 0:n_transient]
  49.     transient_absorbing_matrix = matrix[0:n_transient, n_transient:len(matrix)]
  50.     identity = np.identity(len(transient_matrix))
  51.  
  52.     fundamental_matrix = inv(identity - transient_matrix)
  53.  
  54.     hadamard_fundamental = fundamental_matrix * fundamental_matrix
  55.     diagonal_fundamental = np.diag(np.diag(fundamental_matrix))
  56.  
  57.     variance_visits = np.matmul(fundamental_matrix, (2 * diagonal_fundamental - identity)) - hadamard_fundamental
  58.  
  59.     expected_steps = np.matmul(fundamental_matrix, np.ones(len(transient_matrix)))
  60.     variance_steps = np.matmul((2 * fundamental_matrix - identity),(expected_steps * expected_steps)) - expected_steps
  61.  
  62.     transient_probabilities = np.matmul(fundamental_matrix - identity, inv(diagonal_fundamental))
  63.     absorbing_probabilities = np.matmul(fundamental_matrix, transient_absorbing_matrix)
  64.  
  65.     print(expected_steps)
  66.     print()
  67.     print(absorbing_probabilities)
  68.     print()
  69.  
  70. max_states = [2, 3, 4, 5]
  71. possible_mod_recovery = [0, -1, -4, -5]
  72.  
  73. for max_state in max_states:
  74.     for mod_recovery in possible_mod_recovery:
  75.         print(f'Max State: {max_state} and Mod Recovery: {mod_recovery}')
  76.         print()
  77.         transition_absorbing_matrix = generate_absorbing_matrix(max_state, mod_recovery)
  78.         # print(transition_absorbing_matrix)
  79.         # print()
  80.  
  81.         pos_last_dying = max_state
  82.         pos_dying_0 = max_state - 1
  83.  
  84.         matrix_only_0 = generate_matrix_without_absorbing(transition_absorbing_matrix, pos_last_dying)
  85.         matrix_only_last = generate_matrix_without_absorbing(transition_absorbing_matrix, pos_dying_0)
  86.  
  87.         calculate_relevant_statistics(transition_absorbing_matrix, 2)
  88.         # calculate_relevant_statistics(matrix_only_0, 1)
  89.         # calculate_relevant_statistics(matrix_only_last, 1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement