Advertisement
Guest User

Focus supply with wishing well

a guest
Aug 25th, 2019
1,445
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.12 KB | None | 0 0
  1. import numpy as np
  2.  
  3.  
  4. class markov_node:
  5.     def __init__(self, name, arcs):
  6.         self.name = name
  7.         self.arcs = arcs
  8.         self.ssr_flag = False
  9.         self.head_flag = False
  10.         self.guarantee_flag = False
  11.         self.connector_flag = False
  12.  
  13.     def __init__(self, name):
  14.         self.name = name
  15.         self.arcs = []
  16.         self.ssr_flag = False
  17.         self.head_flag = False
  18.         self.guarantee_flag = False
  19.         self.connector_flag = False
  20.  
  21.     def print_indent_details(self):
  22.         print("\tnode: " + self.name)
  23.         summation = 0.0
  24.         for e in self.arcs:
  25.             print("\t\tto " + e[0].name + ", weight = %5.4f" % (e[1]))
  26.             summation = summation + e[1]
  27.         print("\t\tSum of weight = %5.4f" % (summation))
  28.  
  29.  
  30.  
  31. class markov_cluster:
  32.     def __init__(self, name, nodes):
  33.         self.name = name
  34.         self.nodes = nodes
  35.         self.wp_w8 = 2
  36.         self.stg_w8 = 3
  37.         self.dup_w8 = 0
  38.  
  39.     def __init__(self, name):
  40.         self.name = name
  41.         self.nodes = []
  42.         self.wp_w8 = 2
  43.         self.stg_w8 = 3
  44.         self.dup_w8 = 0
  45.  
  46.     def set_weight(self, wp_w8, stg_w8, dup_w8):
  47.         self.wp_w8 = wp_w8
  48.         self.stg_w8 = stg_w8
  49.         self.dup_w8 = dup_w8
  50.  
  51.     def make_normal_cluster(self, r_rate, ssr_rate, single_target_rate):
  52.         self.nodes = []
  53.         target_rate = (self.wp_w8 + self.stg_w8 + self.dup_w8)*single_target_rate
  54.  
  55.         for i in range(10):
  56.             self.nodes.append(markov_node("%i" % (i)))
  57.  
  58.         self.nodes[0].ssr_flag = True
  59.         self.nodes[1].head_flag = True
  60.  
  61.         for i in range(10):
  62.             if i == 9:
  63.                 self.nodes[i].arcs.append((self.nodes[0], 1 - (target_rate/ssr_rate)))
  64.                 self.nodes[i].guarantee_flag = True
  65.             else:
  66.                 self.nodes[i].arcs.append((self.nodes[0], ssr_rate - target_rate))
  67.                 self.nodes[i].arcs.append((self.nodes[i+1], r_rate))
  68.  
  69.     def make_connector(self, r_rate, ssr_rate, single_target_rate):
  70.         target_rate = (self.wp_w8 + self.stg_w8 + self.dup_w8)*single_target_rate
  71.         temp_node = markov_node(self.name + "_connector")
  72.         temp_node.connector_flag = True
  73.         for v in self.nodes:
  74.             if v.ssr_flag:
  75.                 temp_node.arcs.append((v, ssr_rate - target_rate))
  76.             if v.head_flag:
  77.                 temp_node.arcs.append((v, r_rate))
  78.         self.nodes.append(temp_node)
  79.  
  80.     def make_internal_cluster(self, r_rate, ssr_rate, single_target_rate):
  81.         self.make_normal_cluster(r_rate, ssr_rate, single_target_rate)
  82.         self.make_connector(r_rate, ssr_rate, single_target_rate)
  83.  
  84.     def make_terminal_cluster(self):
  85.         self.nodes = []
  86.         temp_node = markov_node(self.name + "_connector")
  87.         temp_node.connector_flag = True
  88.         temp_node.arcs.append((temp_node, 1.0))
  89.         self.nodes.append(temp_node)
  90.  
  91.     def print_details(self):
  92.         print("Cluster: " + self.name)
  93.         print("wp weight = %i, stg weight = %i, dup weight = %i" % (self.wp_w8,
  94.                                                                     self.stg_w8,
  95.                                                                     self.dup_w8))
  96.         for v in self.nodes:
  97.             v.print_indent_details()
  98.  
  99.            
  100.  
  101. ####################################################################################
  102. ##                           Wishing Well Strategy
  103. ####################################################################################
  104.  
  105. def make_chains():
  106.  
  107. ####################################################################################
  108. ## begin parameters
  109.    
  110.     r_rate = 0.876
  111.     ssr_rate = 0.124
  112.     single_target_rate = 0.0124 ## 3 stg * 1, 1 wp * 2
  113.     target_limit = (1,3,2)
  114.     end_state = [(1,2,2),(1,3,0),(1,3,1),(1,3,2)]
  115.     ##if stg == 0 no dup
  116.    
  117. ## end parameters
  118. ####################################################################################
  119.  
  120.  
  121.  
  122. ####################################################################################
  123. ## begin constructing chains
  124.  
  125.     clusters = []
  126.     C_list = {}
  127.     temp_cluster = markov_cluster("C(0,0,0)")
  128.     temp_cluster.state = (0,0,0)
  129.     temp_cluster.set_weight(2,3,0)
  130.     temp_cluster.make_normal_cluster(r_rate, ssr_rate, single_target_rate)
  131.     clusters.append(temp_cluster)
  132.     C_list[(0,0,0)] = temp_cluster
  133.  
  134.     for C in clusters:
  135.  
  136.         if C.state != ("terminal"):
  137.             ##got wp
  138.             if C.state[0] < target_limit[0]:
  139.                 temp_state = (C.state[0]+1, C.state[1], C.state[2])
  140.                 if temp_state in end_state:
  141.                     if ("terminal") not in C_list:
  142.                         temp_cluster = markov_cluster("terminal_cluster")
  143.                         temp_cluster.state = ("terminal")
  144.                         temp_cluster.make_terminal_cluster()
  145.                         clusters.append(temp_cluster)
  146.                         C_list[temp_cluster.state] = temp_cluster
  147.                     else:
  148.                         temp_cluster = C_list[("terminal")]
  149.                 elif temp_state not in C_list:
  150.                     temp_cluster = markov_cluster("C(" +
  151.                                                   str(temp_state[0]) + "," +
  152.                                                   str(temp_state[1]) + "," +
  153.                                                   str(temp_state[2]) + ")")
  154.                     temp_cluster.state = temp_state
  155.                     temp_cluster.set_weight(C.wp_w8 - 2,
  156.                                             C.stg_w8,
  157.                                             C.dup_w8)
  158.                     temp_cluster.make_internal_cluster(r_rate,
  159.                                                        ssr_rate,
  160.                                                        single_target_rate)
  161.                     clusters.append(temp_cluster)
  162.                     C_list[temp_cluster.state] = temp_cluster
  163.                 else:
  164.                     temp_cluster = C_list[temp_state]
  165.  
  166.                 for u in C.nodes:
  167.                     for v in temp_cluster.nodes:
  168.                         if v.connector_flag:
  169.                             if u.guarantee_flag:
  170.                                 u.arcs.append((v, single_target_rate*C.wp_w8/ssr_rate))
  171.                             else:
  172.                                 u.arcs.append((v, single_target_rate*C.wp_w8))
  173.  
  174.             ##got stg
  175.             if C.state[1] < target_limit[1]:
  176.                 temp_state = (C.state[0], C.state[1]+1, C.state[2])
  177.                 if temp_state in end_state:
  178.                     if ("terminal") not in C_list:
  179.                         temp_cluster = markov_cluster("terminal_cluster")
  180.                         temp_cluster.state = ("terminal")
  181.                         temp_cluster.make_terminal_cluster()
  182.                         clusters.append(temp_cluster)
  183.                         C_list[temp_cluster.state] = temp_cluster
  184.                     else:
  185.                         temp_cluster = C_list[("terminal")]
  186.                 elif temp_state not in C_list:
  187.                     temp_cluster = markov_cluster("C(" +
  188.                                                   str(temp_state[0]) + "," +
  189.                                                   str(temp_state[1]) + "," +
  190.                                                   str(temp_state[2]) + ")")
  191.                     temp_cluster.state = temp_state
  192.                     temp_cluster.set_weight(C.wp_w8,
  193.                                             C.stg_w8 - 1,
  194.                                             C.dup_w8 + 1)
  195.                     temp_cluster.make_internal_cluster(r_rate,
  196.                                                        ssr_rate,
  197.                                                        single_target_rate)
  198.                     clusters.append(temp_cluster)
  199.                     C_list[temp_cluster.state] = temp_cluster
  200.                 else:
  201.                     temp_cluster = C_list[temp_state]
  202.  
  203.                 for u in C.nodes:
  204.                     for v in temp_cluster.nodes:
  205.                         if v.connector_flag:
  206.                             if u.guarantee_flag:
  207.                                 u.arcs.append((v, single_target_rate*C.stg_w8/ssr_rate))
  208.                             else:
  209.                                 u.arcs.append((v, single_target_rate*C.stg_w8))
  210.  
  211.             ##got dup
  212.             if C.state[2] < target_limit[2]:
  213.                 temp_state = (C.state[0], C.state[1], C.state[2]+1)
  214.                 if temp_state in end_state:
  215.                     if ("terminal") not in C_list:
  216.                         temp_cluster = markov_cluster("terminal_cluster")
  217.                         temp_cluster.state = ("terminal")
  218.                         temp_cluster.make_terminal_cluster()
  219.                         clusters.append(temp_cluster)
  220.                         C_list[temp_cluster.state] = temp_cluster
  221.                     else:
  222.                         temp_cluster = C_list[("terminal")]
  223.                 elif temp_state not in C_list:
  224.                     temp_cluster = markov_cluster("C(" +
  225.                                                   str(temp_state[0]) + "," +
  226.                                                   str(temp_state[1]) + "," +
  227.                                                   str(temp_state[2]) + ")")
  228.                     temp_cluster.state = temp_state
  229.                     if temp_state[2] == target_limit[2]:
  230.                         temp_cluster.set_weight(C.wp_w8,
  231.                                             C.stg_w8,
  232.                                             0)
  233.                     else:
  234.                         temp_cluster.set_weight(C.wp_w8,
  235.                                             C.stg_w8,
  236.                                             C.dup_w8)
  237.                    
  238.                     temp_cluster.make_internal_cluster(r_rate,
  239.                                                        ssr_rate,
  240.                                                        single_target_rate)
  241.                     clusters.append(temp_cluster)
  242.                     C_list[temp_cluster.state] = temp_cluster
  243.                 else:
  244.                     temp_cluster = C_list[temp_state]
  245.  
  246.                 for u in C.nodes:
  247.                     for v in temp_cluster.nodes:
  248.                         if v.connector_flag:
  249.                             if u.guarantee_flag:
  250.                                 u.arcs.append((v, single_target_rate*C.dup_w8/ssr_rate))
  251.                             else:
  252.                                 u.arcs.append((v, single_target_rate*C.dup_w8))
  253.  
  254.     ter_c_i = 0
  255.     for i in range(len(clusters)):
  256.         if clusters[i].state == ("terminal"):
  257.             ter_c_i = i
  258.             break
  259.     for i in range(ter_c_i,len(clusters) - 1):
  260.         t_1 = clusters[i]
  261.         clusters[i] = clusters[i+1]
  262.         clusters[i+1] = t_1
  263.  
  264.  
  265.     return clusters
  266.  
  267.  
  268. ## end constructing chains
  269. ####################################################################################
  270.  
  271.  
  272. def print_clusters(clusters):
  273. ##    for C in clusters:
  274. ##        C.print_details()
  275.     for C in clusters:
  276.         print(C.name)
  277.  
  278. ##def count(clusters):
  279. ##    m = 0
  280. ##    n = 0
  281. ##    for c in clusters:
  282. ##        for u in c.nodes:
  283. ##            n+=1
  284. ##        m+=1
  285. ##    print("m = %i" % (m))
  286. ##    print("n = %i" % (n))
  287.  
  288. def node_count(clusters):
  289.     counts = 0
  290.     for c in clusters:
  291.         for v in c.nodes:
  292.             counts += 1
  293.     return counts
  294.  
  295. def make_matrix(clusters):
  296.     index = []
  297.     mapping = {}
  298.     counts = 0
  299.     for c in clusters:
  300.         for v in c.nodes:
  301.             index.append(v)
  302.             mapping[v] = counts
  303.             counts += 1
  304.  
  305.     adj_mat = np.array([])
  306.     for i in range(counts):
  307.         temp_row = np.zeros(counts)
  308.         for v in index[i].arcs:
  309.             temp_row[mapping[v[0]]]+=v[1]
  310.         adj_mat = np.append(adj_mat,temp_row)
  311.  
  312.     return adj_mat.reshape(counts,counts).transpose()
  313.        
  314. def test():
  315.     clusters = make_chains()
  316.     test_mat = make_matrix(clusters)
  317.     print(np.matmul(np.ones(node_count(clusters)), test_mat))
  318.     print(test_mat[:,node_count(clusters)-1])
  319.  
  320. def test_pulls(numb):
  321.     clusters = make_chains()
  322.     test_mat = make_matrix(clusters)
  323.     test_mat = np.linalg.matrix_power(test_mat, numb)
  324.     print("%10.9f" % (test_mat[node_count(clusters)-1,0]))
  325. ##    print("%10.9f" % (test_mat[node_count(clusters)-1,0]))
  326.  
  327. def prob_vec(numb):
  328.     return np.linalg.matrix_power(make_matrix(make_chains()), numb)
  329.  
  330. def expected_vec():
  331.     clusters = make_chains()
  332.     test_mat = make_matrix(clusters)
  333.     n = node_count(clusters)
  334.     sub_mat = np.identity(n-1) - test_mat[0:n-1, 0:n-1]
  335.     inverse_mat = np.linalg.inv(sub_mat)
  336.     return np.matmul(np.ones(n-1), inverse_mat)[0:10]
  337.  
  338. def calc_pulls(numb):
  339.     clusters = make_chains()
  340.     test_mat = make_matrix(clusters)
  341.     test_mat = np.linalg.matrix_power(test_mat, numb)
  342.     return test_mat[node_count(clusters)-1,0]
  343.  
  344. def prob_table():
  345.     for i in range(40):
  346.         for j in range(5):
  347.             val = calc_pulls(i*5+j+1)
  348.             print("%3i : %6.5f " % (i*5+j+1,val), end=" ")
  349.         print(" ")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement