import numpy as np

# Constants for PageRank
threshold = 1e-13
beta = 0.85

# Spider Trap Network represented as adjacency matrix
A = [
    [0, 0, 1, 0],
    [1, 0, 0, 0],
    [1, 1, 0, 0],
    [1, 1, 0, 1]
]

# Convert adjacency matrix to a numpy array
arr = np.array(A, dtype=float)

# Calculate summation of columns
s = []
for i in range(len(A)):
    s.append(np.sum(arr[:, i]))

print("Summation of columns: ", s)

# Create the column stochastic probability matrix, M
M = arr.copy()
for j in range(len(A)):
    if s[j] != 0:  # Prevent division by zero
        M[:, j] = M[:, j] / s[j]

print("Column stochastic probability matrix, M:")
print(M)

# Initialize rank vector
r = (1.0 + np.zeros([len(M), 1])) / len(M)
print("Initial rank vector:")
print(r)

# Calculate the uniform rank contribution
uniformR = (1.0 - beta) * r
r_prev = r.copy()

# PageRank iterations
for i in range(1, 1001):
    print("Iteration: ", i)
    r = beta * np.matmul(M, r_prev) + uniformR
    print("The rank vector: ")
    print(r)

    diff = np.sum(abs(r - r_prev))
    if diff < threshold:
        break
    r_prev = r.copy()

# Display the final rank vector
print("The final rank vector: ")
print(r[:, 0])
