89 lines
2.0 KiB
Python
89 lines
2.0 KiB
Python
import numpy as np
|
|
from numpy.random import uniform
|
|
|
|
|
|
def create_test_state() -> np.array:
|
|
return np.array([['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']])
|
|
|
|
|
|
def create_empty_state() -> np.array:
|
|
return np.array([['-', '-', '-'], ['-', '-', '-'], ['-', '-', '-']])
|
|
|
|
|
|
def softmax(values: np.array, eps=1.0E-6) -> np.array:
|
|
result = (values + eps) / (sum(values + eps))
|
|
return result
|
|
|
|
|
|
def sample(values: np.array, with_debug=False):
|
|
# Normalize and sort
|
|
probs = softmax(values)
|
|
sorted_indices = np.argsort(probs)
|
|
sorted_probs = probs[sorted_indices]
|
|
z = uniform()
|
|
if with_debug:
|
|
print(f"Probs={probs}")
|
|
print(f"Z={z:.3f}")
|
|
index = None
|
|
p_sum = 0
|
|
for idx, p in enumerate(sorted_probs):
|
|
p_sum += p
|
|
if z <= p_sum:
|
|
index = sorted_indices[idx]
|
|
break
|
|
|
|
return index
|
|
|
|
|
|
def test_sample(data):
|
|
p = np.array(data)
|
|
c = np.array([0]*len(data))
|
|
|
|
for i in range(0, 1000):
|
|
index = sample(p, with_debug=False)
|
|
c[index] += 1
|
|
|
|
print(c)
|
|
|
|
|
|
def to_state_string(state, state_nex=None):
|
|
sp = ' '
|
|
sp_arrow = ' => '
|
|
sp_ = [sp, sp_arrow, sp]
|
|
|
|
def col(str_in, state):
|
|
str_out = str_in
|
|
for c in range(0, 3):
|
|
char = state[r][c]
|
|
if char == '-':
|
|
char = ' '
|
|
str_out += "|" + char
|
|
str_out += '|'
|
|
return str_out
|
|
|
|
state_str = ''
|
|
for r in range(0, 3):
|
|
if state is not None:
|
|
state_str = col(state_str, state)
|
|
|
|
if state_nex is not None:
|
|
state_str += sp_[r]
|
|
state_str = col(state_str, state_nex)
|
|
|
|
if r != 2:
|
|
state_str += '\x0A'
|
|
|
|
return state_str
|
|
|
|
|
|
if __name__ == '__main__':
|
|
print("Testing sample()")
|
|
test_sample([0.7, 0.1, 0.1, 0.1])
|
|
test_sample([0.1, 0.1, 0.2, 0.1])
|
|
test_sample([0.2, 0.8])
|
|
test_sample([0.1, 0.1])
|
|
test_sample([0.3, 0.0, 0.2, 0.0])
|
|
test_sample([0.0, 0.0, 0.0, 0.0])
|
|
test_sample([0.5, 0.0, 0.2, 0.3])
|
|
test_sample([0.3, 0.1, 0.4, 0.2])
|