probabilities/2_point_plot.py

77 lines
2.1 KiB
Python
Raw Normal View History

2023-01-01 23:45:51 +00:00
import numpy as np
import matplotlib.pyplot as plt
def flip(n, index):
return n ^ (1 << index)
def distance(i, j):
return bin(i ^ j).count('1')
def matrix_system_with_two_knowns(p, q, N):
S = 2 ** N
mat = np.zeros((S, S))
val = np.zeros(S)
for i in range(0, S):
if i == p:
mat[i][i] = 1.0
val[i] = 1.0
elif i == q:
mat[i][i] = 1.0
else:
mat[i][i] = -1.0
for j in range(0, N):
mat[i][flip(i,j)] = 1.0 / N
return (mat, val)
def main():
final_values = []
final_x = []
final_y = []
for N in range(11, 12):
print(N)
S = 2 ** N
distances = np.zeros((S, S))
for i in range(0, S):
for j in range(0, S):
distances[i][j] = distance(i,j)
# final_values = []
# final_basis = []
visited_distances = set()
for p in range(0, S):
for q in range(p + 1, S):
pq_distance = distances[p, q]
if pq_distance in visited_distances:
continue
visited_distances.add(pq_distance)
(mat, val) = matrix_system_with_two_knowns(p, q, N)
solution = np.linalg.inv(mat).dot(val)
for i in range(0, len(solution)):
final_x.append(distances[i, p] / N)
final_y.append(distances[i, q] / N)
final_values.append(solution[i])
# values = list(set(solution))
# values.sort()
# if len(values) <= 1:
# continue
# basis = [1.0 * i / (len(values) - 1) for i in range(len(values))]
# final_values.extend(values)
# final_basis.extend(basis)
# fig, ax = plt.subplots()
# ax.scatter(final_values, final_basis)
# print(np.linalg.lstsq((final_x, final_y), final_values))
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.scatter(final_x, final_y, final_values)
ax.grid(True)
plt.show()
if __name__ == "__main__":
main()