Advertisement
Guest User

Untitled

a guest
Mar 26th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.44 KB | None | 0 0
  1. # initialization
  2. from bitarray import bitarray
  3. import matplotlib
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. import random
  7. from time import time
  8.  
  9. def init_sim(p_len):
  10. # processors data-structure - [ time, delay, memory, income-buffer, id ]
  11. p = map(lambda x: {'mem':{},'rx':[],'id':x}, list(range(p_len)))
  12. return p
  13.  
  14. def run_gossip(p_list, exec_gossip, turn_eval, params):
  15. p_len = len(p_list)
  16. msg_queue = [[] for _ in range(params['L'] + 1)]
  17. finish = False
  18.  
  19. inactive_bitmap = bitarray('0' * p_len)
  20. online_error_bitmap = bitarray('0' * p_len)
  21.  
  22. inactive_list = [0]
  23. while 0 in inactive_list:
  24. inactive_list = np.random.permutation(p_len)
  25. inactive_list = inactive_list[:int(round(params['inactive_per'] * p_len)//1)]
  26.  
  27. inactive_list = inactive_list.tolist()
  28.  
  29. for a in inactive_list:
  30. inactive_bitmap[a] = True
  31.  
  32. of_ind_time = []
  33. for i in range(params['online_failures']):
  34. tmp = 2
  35. t = np.random.randint(1, params['total_time'])
  36. while tmp in inactive_list or tmp in map(lambda x: x[0], of_ind_time):
  37. tmp = np.random.randint(1, p_len)
  38. online_error_bitmap[tmp] = True
  39. of_ind_time.append((tmp,t))
  40. # print 'online failures - ', of_ind_time
  41.  
  42. for t in range(params['total_time']):
  43. # online failures
  44. for of_i, of_t in of_ind_time:
  45. if of_t < t:
  46. inactive_list.append(of_i)
  47. of_ind_time = filter(lambda x: x[1] >= t, of_ind_time)
  48.  
  49. #handles the messeging mechanism
  50. for msg in msg_queue.pop(0):
  51. msg['buffer-size'] = len(p_list[msg['dest'] % params['p']]['rx'])
  52. p_list[msg['dest'] % p_len]['rx'].append(msg)
  53. msg_queue.append([])
  54.  
  55. turn_eval(p_list, msg_queue, t)
  56.  
  57. #handles the execution mechanism
  58. for i in range(len(p_list)):
  59. if i not in inactive_list:
  60. _, msg = exec_gossip(p_list[i], params)
  61. if msg == 'finish':
  62. finish = True
  63. break
  64. if msg:
  65. msg_queue[-1].append(msg)
  66.  
  67. if finish:
  68. break
  69.  
  70. #if t % (params['total_time'] // 10) == 0:
  71. # print 'i = ', t, '/', params['total_time']
  72.  
  73. return (p_list, inactive_bitmap, online_error_bitmap, t, finish)
  74.  
  75. def run_sim(exec_gossip, params, sim_init = lambda x: x, turn_eval = lambda x,y,z: 1):
  76. # print '-- init sim --'
  77. p_list = init_sim(params['p'])
  78. p_list = sim_init(p_list, params)
  79. # print '-- run gossip sim --'
  80. p_list, inactive_bitmap, online_error_bitmap, t, finish = run_gossip(p_list, exec_gossip, turn_eval, params)
  81. # print '-- done --'
  82. return (p_list, inactive_bitmap, online_error_bitmap, t, finish)
  83.  
  84. def fcg(p, params):
  85. if not 'timeout' in p['mem'] and not 'type' in p['mem']: # if no message was received until now
  86. if len(p['rx']) > 0:
  87. msg = p['rx'].pop(0)
  88. if msg['type'] == 'ccg-gossip':
  89. p['mem']['timeout'] = msg['timeout']
  90. p['mem']['time'] = msg['time'] + params['L'] # need to fix time with latency?
  91. p['mem']['type'] = 'ccg-gossip'
  92. # p['mem']['data'] = msg['data']
  93. elif msg['type'] == 'ccg-correct':
  94. p['mem']['type'] = 'ccg-finish'
  95. p['mem']['timeout'] = 0
  96. p['mem']['time'] = 0
  97. return (p, None)
  98.  
  99. p['mem']['time'] += 1
  100.  
  101. if p['mem']['type'] == 'ccg-gossip':
  102. if p['mem']['time'] > p['mem']['timeout']:
  103. p['mem']['type'] = 'ccg-correct'
  104. p['mem']['send'] = [True, True]
  105. p['mem']['dist'] = [0, 0]
  106. p['mem']['received'] = [[],[]]
  107.  
  108.  
  109. if p['mem']['type'] == 'ccg-gossip':
  110. # handle received
  111. if len(p['rx']) > 0:
  112. msg = p['rx'].pop(0)
  113. if msg['type'] == 'ccg-gossip':
  114. pass
  115. # p['mem']['time'] = min(p['mem']['time'], msg['time'] + latency)
  116. elif msg['type'] == 'ccg-correct':
  117. p['mem']['type'] = 'ccg-correct'
  118. p['mem']['send'] = [True, True]
  119. p['mem']['dist'] = [0, 0]
  120. p['mem']['received'] = [[],[]]
  121. p['mem']['received'][msg['dir']] = [msg['dist']]
  122. # p['mem']['log'].append(msg)
  123. return (p, None)
  124. # handle send
  125. return (p, {'dest': random.randint(1 if params['fcg_without_first'] else 0, params['p']) , 'timeout': p['mem']['timeout'], 'time': p['mem']['time'], 'type': p['mem']['type']})
  126.  
  127. if p['mem']['type'] == 'ccg-correct':
  128. # handle received
  129. if len(p['rx']) > 0:
  130. msg = p['rx'].pop(0)
  131. if msg['type'] == 'ccg-gossip':
  132. pass
  133. elif msg['type'] == 'ccg-correct':
  134. p['mem']['received'][msg['dir']].append(msg['dist'])
  135. # p['mem']['log'].append(msg)
  136. return (p, None)
  137.  
  138. p['mem']['send'][0] = len(p['mem']['received'][0]) < params['f'] or p['mem']['dist'][0] < max(p['mem']['received'][0])
  139. p['mem']['send'][1] = len(p['mem']['received'][1]) < params['f'] or p['mem']['dist'][1] < max(p['mem']['received'][1])
  140. if any(p['mem']['send']):
  141. # handle send
  142. if (all(p['mem']['send']) and p['mem']['dist'][0] < p['mem']['dist'][1]) or not p['mem']['send'][1]:
  143. p['mem']['dist'][0] += 1
  144. dest = (p['id'] - p['mem']['dist'][0]) % params['p']
  145. dest -= 1 if dest == 0 and params['fcg_without_first'] else 0
  146. msg = {'dest': dest, 'dist': p['mem']['dist'][0], 'dir': 1, 'type': p['mem']['type']}
  147. # p['mem']['send-log'].append(msg)
  148. return (p, msg)
  149. else:
  150. p['mem']['dist'][1] += 1
  151. dest = (p['id'] + p['mem']['dist'][1]) % params['p']
  152. dest += 1 if dest == 0 and params['fcg_without_first'] else 0
  153. msg = {'dest': dest, 'dist': p['mem']['dist'][1], 'dir': 0, 'type': p['mem']['type']}
  154. # p['mem']['send-log'].append(msg)
  155. return (p, msg)
  156. else:
  157. p['mem']['type'] = 'ccg-finish'
  158. return (p, None)
  159.  
  160. def get_closest_alive(bitmap, index, p_len):
  161. li = index - 1
  162. ri = index + 1
  163. while not bitmap[li % p_len]:
  164. li = (li - 1) % p_len
  165. while not bitmap[ri % p_len]:
  166. ri = (ri + 1) % p_len
  167. return (li, ri)
  168.  
  169. def fast_barrier(p, params):
  170. if not 'master' in p['mem']:
  171. # initialize slave
  172. p['mem']['time'] = 0
  173. p['mem']['ll'] = dict()
  174. p['mem']['li'] = (p['id'] - 1) % params['p']
  175. p['mem']['ri'] = (p['id'] + 1) % params['p']
  176. p['mem']['time_to_start'] = random.randint(0 ,params['spread'])
  177. p['mem']['timeout'] = params['Tf'] + p['mem']['time'] + p['mem']['time_to_start']
  178. p['mem']['bitmap_timeout'] = params['Ti'] + p['mem']['time'] + p['mem']['time_to_start']
  179. p['mem']['master'] = 0
  180. p['mem']['type'] = 'ring-valid'
  181. p['mem']['step'] = 0
  182. p['mem']['last_bitmap'] = bitarray('1' * params['p'])
  183. p['mem']['bitmap'] = bitarray('0' * params['p'])
  184. p['mem']['bitmap'][p['id']] = True
  185.  
  186. if p['mem']['master'] == 1 and len(p['rx']) > params['master_buffer_size']:
  187. p['rx'] = p['rx'][:params['master_buffer_size']]
  188.  
  189.  
  190. if p['mem']['type'] != 'ring-valid':
  191. return fcg(p, params)
  192.  
  193. p['mem']['time'] += 1
  194. if p['mem']['master']:
  195. return fast_barrier_master(p, params)
  196. # if p['mem']['time'] > p['mem']['time_to_start']:
  197. return fast_barrier_slave(p, params)
  198. return (p, None)
  199.  
  200.  
  201. def get_bitmap_from_ll(ll, p_len):
  202. if len(ll) < 1:
  203. return bitarray('0' * p_len)
  204. bitmap = ll[0]['bitmap']
  205. for b in map(lambda x: x['bitmap'], ll):
  206. bitmap |= b
  207. for i in range(len(ll)):
  208. for j in range(len(ll[i]['flags'])):
  209. if ll[i]['flags'][j]:
  210. bitmap[ll[i]['ind'][j] % p_len] = False
  211. return bitmap
  212.  
  213. def is_valid_bitmap(bitmap):
  214. return True
  215.  
  216. def fast_barrier_master(p, params):
  217. if 'gossip' in p['mem']:
  218. return (p, {'dest': random.randint(1, params['p']) , 'timeout': p['mem']['timeout'], 'time': p['mem']['time'], 'type': 'ccg-gossip'})
  219.  
  220. if 'last_update' not in p['mem']:
  221. p['mem']['last_update'] = 0
  222.  
  223. if len(p['rx']) > 0:
  224. msg = p['rx'].pop(0)
  225. if msg['type'] in ['error']:
  226. p['mem']['last_received'].append((p['mem']['time'], msg))
  227. return (p, [])
  228.  
  229. p['mem']['last_received'] = filter(lambda x: x[0] > p['mem']['time'] - params['Tf'], p['mem']['last_received'])
  230. p['mem']['bitmap2'] = p['mem']['bitmap1']
  231. p['mem']['bitmap1'] = get_bitmap_from_ll(map(lambda x: x[1], p['mem']['last_received']), params['p'])
  232.  
  233. if p['mem']['bitmap1'] != p['mem']['bitmap2']:
  234. p['mem']['last_update'] = p['mem']['time']
  235.  
  236. #if p['mem']['time'] - p['mem']['last_update'] > Tf and \
  237. if len(p['mem']['last_received']) < 2 * (params['f'] + 1) and \
  238. len(p['mem']['last_received']) >= 2: # p['mem']['bitmap1'].count(True) > p_len // 2:
  239. p['mem']['timeout'] = p['mem']['time'] + params['Tg']
  240. p['mem']['gossip'] = True
  241. # print 'valid!', p['mem']['time']
  242. if not params['barrier_fcg']:
  243. return (p, 'finish')
  244.  
  245. return (p, None)
  246.  
  247. def fast_barrier_slave(p, params):
  248. if p['mem']['time'] < p['mem']['bitmap_timeout']:
  249. p['mem']['li'], p['mem']['ri'] = get_closest_alive(p['mem']['last_bitmap'], p['id'], params['p'])
  250. else:
  251. p['mem']['li'], p['mem']['ri'] = get_closest_alive(p['mem']['bitmap'], p['id'], params['p'])
  252.  
  253.  
  254. if p['mem']['step'] == 0:
  255. if p['mem']['time'] < p['mem']['time_to_start']:
  256. if len(p['rx']) > 0:
  257. msg = p['rx'].pop(0)
  258. if msg['type'] == 'ring-valid':
  259. p['mem']['ll'][msg['id']] = p['mem']['time']
  260. p['mem']['bitmap'] |= msg['bitmap']
  261. return (p, [])
  262. else:
  263. p['mem']['step'] += 1
  264.  
  265. # send alive messages
  266. if p['mem']['step'] == 1:
  267. p['mem']['step'] += 1
  268. return (p, {'dest': p['mem']['li'], 'id' : p['id'], 'type': 'ring-valid', 'bitmap': p['mem']['bitmap']})
  269. if p['mem']['step'] == 2:
  270. p['mem']['step'] += 1
  271. p['mem']['timeout'] = params['Tf'] + p['mem']['time']
  272. return (p, {'dest': p['mem']['ri'], 'id' : p['id'], 'type': 'ring-valid', 'bitmap': p['mem']['bitmap']})
  273.  
  274. # wait for alive messages
  275. if p['mem']['step'] == 3:
  276. if p['mem']['time'] < p['mem']['timeout']:
  277. if len(p['rx']) > 0:
  278. msg = p['rx'].pop(0)
  279. if msg['type'] == 'ring-valid':
  280. p['mem']['ll'][msg['id']] = p['mem']['time']
  281. p['mem']['bitmap'] |= msg['bitmap']
  282. elif msg['type'] == 'ccg-gossip':
  283. p['mem']['timeout'] = msg['timeout']
  284. p['mem']['time'] = msg['time'] + params['L'] + 1 # need to fix time with latency?
  285. p['mem']['type'] = 'ccg-gossip'
  286. # p['mem']['data'] = msg['data']
  287. elif msg['type'] == 'ccg-correct':
  288. p['mem']['type'] = 'ccg-finish'
  289. return (p, None)
  290. else: # len(p['rx']) == 0:
  291. return (p, {'dest': random.randint(1, params['p']), 'id' : p['id'], 'type': 'ring-valid', 'bitmap': p['mem']['bitmap']})
  292. else:
  293. p['mem']['step'] += 1
  294.  
  295. # check for non-responsive nodes
  296. if p['mem']['step'] == 4:
  297. p['mem']['timeout'] = params['Tf'] + p['mem']['time']
  298. for k in p['mem']['ll'].keys():
  299. if p['mem']['time'] - p['mem']['ll'][k] > params['Tf'] * 2:
  300. del p['mem']['ll'][k]
  301. lf = True if not p['mem']['li'] in p['mem']['ll'] else False
  302. rf = True if not p['mem']['ri'] in p['mem']['ll'] else False
  303. flags = [lf, rf]
  304. p['mem']['step'] = 1
  305. if any(flags):
  306. # send error message to the master
  307. cur_bitmap = p['mem']['last_bitmap'] if p['mem']['time'] < p['mem']['bitmap_timeout'] else p['mem']['bitmap']
  308. return (p, {'dest':0, 'bitmap': cur_bitmap, 'ind' : [p['mem']['li'], p['mem']['ri']], 'flags': flags, 'id': p['id'], 'type': 'error'})
  309. return (p, None)
  310.  
  311. def sim_init(p_list, params):
  312. p_list[0]['mem']['master'] = 1
  313. p_list[0]['mem']['type'] = 'ring-valid'
  314. p_list[0]['mem']['time'] = 0
  315. p_list[0]['mem']['timeout'] = params['Tf']
  316. p_list[0]['mem']['last_received'] = []
  317. p_list[0]['mem']['bitmap1'] = bitarray('0' * params['p'])
  318. p_list[0]['mem']['bitmap2'] = bitarray('0' * params['p'])
  319. return p_list
  320.  
  321. def run_one(params):
  322. # t0 = time()
  323. p_list, inactive_bitmap, online_error_bitmap, t, finish = run_sim(fast_barrier, params, sim_init=sim_init)
  324. # print 'time - ', (time()-t0), 'seconds'
  325.  
  326. bitmap = p_list[0]['mem']['bitmap1']
  327. bitmap[0] = True
  328. correct = (bitmap ^ (~inactive_bitmap)) & (~online_error_bitmap)
  329. return (finish, correct.count(), t)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement