Purpose of the notebook

explore pykov

In [4]:
%matplotlib inline
import pykov

T = pykov.Chain({('A','B'): .3, ('A','A'): .7, ('B','A'): 1.})
T.steady()
Out[4]:
{'B': 0.23076923076923075, 'A': 0.76923076923076938}
In [13]:
import numpy as np

from functools import partial
from matplotlib import pyplot as plt

from numpy import linalg as LA

from hypergraph import generators
from hypergraph.analytical import prediction
from hypergraph import utils
from hypergraph.markov_diffusion import create_markov_matrix_model_nodes
from hypergraph.markov_diffusion import create_markov_matrix_model_hyper_edges


def hypergraph_analytical_edges(HG):
    phis = []
    number_of_nodes = len(HG.nodes())
    all_phis = 0
    for edge in HG.hyper_edges():
        phis.append(len(edge))
        all_phis += len(edge)
    
    pis = [phi / all_phis for phi in phis]
    return pis



all_models = {
    "node": {
        "analytical": partial(prediction, model='hypergraph_nodes'),
        "numerical": create_markov_matrix_model_nodes,
        "name": "node",
    },
    "hyperedges": {
        "analytical": partial(prediction, model='hypergraph_edges'),
        "numerical": create_markov_matrix_model_hyper_edges,
        "name": "hyperedges",
    }
}


def show_models(HG):
    model = all_models['node']

    def show_model(model):
        markov_matrix = model["numerical"](HG)
        print(markov_matrix)
    show_model(model)


def transition_matrix_to_pykov_chain(matrix):
    chain = pykov.Chain()
    
    for i, row in enumerate(matrix):
        for j, column in enumerate(row):
            chain[(i, j)] = column
    return chain
In [14]:
HG = generators.generic_hypergraph(9, ((3, 5), (3, 3)))
show_models(HG)
[[ 0.33333333  0.11111111  0.11111111  0.22222222  0.          0.
   0.11111111  0.          0.11111111]
 [ 0.11111111  0.33333333  0.22222222  0.11111111  0.          0.
   0.11111111  0.11111111  0.        ]
 [ 0.08333333  0.16666667  0.33333333  0.25        0.          0.08333333
   0.          0.08333333  0.        ]
 [ 0.16666667  0.08333333  0.25        0.33333333  0.          0.08333333
   0.          0.          0.08333333]
 [ 0.          0.          0.          0.          0.33333333  0.16666667
   0.16666667  0.16666667  0.16666667]
 [ 0.          0.          0.16666667  0.16666667  0.16666667  0.33333333
   0.          0.          0.16666667]
 [ 0.16666667  0.16666667  0.          0.          0.16666667  0.
   0.33333333  0.16666667  0.        ]
 [ 0.          0.16666667  0.16666667  0.          0.16666667  0.
   0.16666667  0.33333333  0.        ]
 [ 0.16666667  0.          0.          0.16666667  0.16666667  0.16666667
   0.          0.          0.33333333]]
In [19]:
def plot_stuff(xs, ys, ys_prediction, freqs_matrix):
    width = 0.2
    plt.figure(figsize=(10, 8))
    plt.bar(xs, ys, width=width, color='crimson', label='Steady state for chains')

    print('prediction', ys_prediction)
    plt.bar(np.array(xs) + 1 * width, ys_prediction, width=width, color='#dcccdd', label='Analytical')
    plt.bar(np.array(xs) + 2 *  width, freqs_matrix, width=width, label='Traversal matrix to N')
    plt.legend(loc=0)
    
In [20]:
mm = create_markov_matrix_model_nodes(HG)
print('Matrix from model nodes')
print(mm)

chain = transition_matrix_to_pykov_chain(mm)
print('\nChain')
print(chain)
Matrix from model nodes
[[ 0.33333333  0.11111111  0.11111111  0.22222222  0.          0.
   0.11111111  0.          0.11111111]
 [ 0.11111111  0.33333333  0.22222222  0.11111111  0.          0.
   0.11111111  0.11111111  0.        ]
 [ 0.08333333  0.16666667  0.33333333  0.25        0.          0.08333333
   0.          0.08333333  0.        ]
 [ 0.16666667  0.08333333  0.25        0.33333333  0.          0.08333333
   0.          0.          0.08333333]
 [ 0.          0.          0.          0.          0.33333333  0.16666667
   0.16666667  0.16666667  0.16666667]
 [ 0.          0.          0.16666667  0.16666667  0.16666667  0.33333333
   0.          0.          0.16666667]
 [ 0.16666667  0.16666667  0.          0.          0.16666667  0.
   0.33333333  0.16666667  0.        ]
 [ 0.          0.16666667  0.16666667  0.          0.16666667  0.
   0.16666667  0.33333333  0.        ]
 [ 0.16666667  0.          0.          0.16666667  0.16666667  0.16666667
   0.          0.          0.33333333]]

Chain
{(4, 7): 0.16666666666666666, (1, 3): 0.1111111111111111, (6, 6): 0.33333333333333331, (3, 0): 0.16666666666666666, (8, 0): 0.16666666666666666, (5, 4): 0.16666666666666666, (2, 1): 0.16666666666666666, (1, 6): 0.1111111111111111, (2, 5): 0.083333333333333329, (8, 5): 0.16666666666666666, (0, 3): 0.22222222222222221, (5, 8): 0.16666666666666666, (1, 2): 0.22222222222222221, (3, 8): 0.083333333333333329, (6, 7): 0.16666666666666666, (5, 5): 0.33333333333333331, (2, 0): 0.083333333333333329, (7, 6): 0.16666666666666666, (4, 8): 0.16666666666666666, (4, 4): 0.33333333333333331, (3, 3): 0.33333333333333331, (7, 2): 0.16666666666666666, (2, 2): 0.33333333333333331, (6, 4): 0.16666666666666666, (5, 3): 0.16666666666666666, (1, 1): 0.33333333333333331, (0, 1): 0.1111111111111111, (3, 2): 0.25, (0, 0): 0.33333333333333331, (7, 1): 0.16666666666666666, (4, 5): 0.16666666666666666, (6, 0): 0.16666666666666666, (7, 7): 0.33333333333333331, (2, 3): 0.25, (1, 0): 0.1111111111111111, (0, 8): 0.1111111111111111, (3, 5): 0.083333333333333329, (2, 7): 0.083333333333333329, (8, 3): 0.16666666666666666, (4, 6): 0.16666666666666666, (6, 1): 0.16666666666666666, (3, 1): 0.083333333333333329, (7, 4): 0.16666666666666666, (0, 6): 0.1111111111111111, (8, 8): 0.33333333333333331, (1, 7): 0.1111111111111111, (5, 2): 0.16666666666666666, (0, 2): 0.1111111111111111, (8, 4): 0.16666666666666666}
In [21]:
chain_transposed = pykov.Chain(chain)
xs, ys = zip(*chain_transposed.steady().items())
print(xs, ys)
print(chain_transposed.succ(1))
print('steady pykov', chain_transposed.steady())

freqs_matrix = LA.matrix_power(mm, 40)[0]
model = all_models['node']     
        
xs = list(map(int, xs))
ys_prediction = model["analytical"](HG)

plot_stuff(xs, ys, ys_prediction, freqs_matrix)
(0, 1, 2, 3, 4, 5, 6, 7, 8) (0.12499999999999994, 0.12499999999999993, 0.16666666666666657, 0.16666666666666666, 0.083333333333333356, 0.08333333333333337, 0.083333333333333287, 0.083333333333333287, 0.083333333333333523)
{0: 0.1111111111111111, 1: 0.33333333333333331, 2: 0.22222222222222221, 3: 0.1111111111111111, 6: 0.1111111111111111, 7: 0.1111111111111111}
steady pykov {0: 0.12499999999999994, 1: 0.12499999999999993, 2: 0.16666666666666657, 3: 0.16666666666666666, 4: 0.083333333333333356, 5: 0.08333333333333337, 6: 0.083333333333333287, 7: 0.083333333333333287, 8: 0.083333333333333523}
prediction [0.125, 0.125, 0.16666666666666666, 0.16666666666666666, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333, 0.08333333333333333]