@@ -13,6 +13,9 @@ def __init__(self, nodes, edges):
13
13
self .edges = sorted (edges )
14
14
self .child_edges = {node : self .children_edges (node ) for node in self .nodes }
15
15
16
+ def edge_mat_index (self ,edge_mat ):
17
+ return np .array ([self .edges .index (e ) for e in edge_mat ])
18
+
16
19
@classmethod
17
20
def from_networkx (cls , graph , data = False ):
18
21
# cls == GraphStructure
@@ -261,25 +264,30 @@ def sample_edge_first_event_only(self, edge, time):
261
264
return (event_time , edge [1 ])
262
265
263
266
# @profile
264
- # def sample_edge_first_event_only_tuple(self, edge, time):
265
- # index = self.structure.edges.index(edge)
266
-
267
- # # does it occur?
268
- # occurs = np.random.rand() < self.params.p
269
- # if not occurs:
270
- # return []
267
+ def sample_edge_mat_first_event_only (self , edge_mat , time_vec ):
268
+ # index_mat = self.structure.edge_mat_index(edge_mat)
269
+ index_mat = np .array ([self .structure .edges .index (e ) for e in edge_mat ])
270
+ time_mat = time_vec [:,np .newaxis ]
271
+ event_out = np .zeros (shape = index_mat .shape )
272
+ node_out = np .array ([e [1 ] for e in edge_mat ])
273
+ # does it occur?
274
+ occurs = np .random .rand (index_mat .shape ) < self .params .p
275
+ event_out [occurs ],node_out [occurs ] = None
276
+ # if not occurs:
277
+ # return None
271
278
272
- # # how many events?
273
- # num_events = np.random.poisson(lam=self.params.mu[index])
274
- # if num_events == 0:
275
- # return []
279
+ # how many events?
280
+ num_events = np .random .poisson (lam = np .array ([self .params .mu [index ] for index in index_mat ]))
281
+ event_out [num_events == 0 ],node_out [num_events == 0 ] = None
282
+ # if num_events == 0:
283
+ # return None
276
284
277
- # # when do those events occur?
278
- # event_time = time + np.random.exponential(scale=self.params.r[index]/num_events, size=1)
279
- # # event_times.sort()
280
- # # return [(t, edge[1]) for t in event_times]
281
- # return [(event_time, edge[1])]
282
-
285
+ # when do those events occur?
286
+ event_time = time_mat + np .random .exponential (scale = np . array ( self .params .r [index ]/ num_events , size = 1 ) )
287
+ # event_times.sort()
288
+ # return [(t, edge[1]) for t in event_times]
289
+ # import ipdb; ipdb.set_trace()
290
+ return ( event_time , edge_mat [ 1 ])
283
291
284
292
def _sample (self , first_only = True , max_time = 4.0 ):
285
293
pending = [(self .init_time , self .init_node )]
@@ -368,58 +376,46 @@ def _sample_solely_first_events(self, max_time=4.0):
368
376
return np .array ([self ._first_events [node ] for node in self .structure .nodes ])
369
377
370
378
# @profile
371
- def _sample_solely_first_events_better (self , max_time = 4.0 ):
372
- pending = []
373
- heapq .heappush (pending ,(self .init_time , self .init_node ))
374
- # pending = [(self.init_time, self.init_node)]
375
- self ._first_events = {node : np .inf for node in self .structure .nodes }
376
- processed_nodes = set ()
377
- structure_nodes = set (self .structure .nodes )
378
- while len (pending ) > 0 :
379
- # time, node = pending.pop(0)
380
- # import ipdb; ipdb.set_trace()
381
- time , node = heapq .heappop (pending )
382
-
383
- if processed_nodes == structure_nodes or time >= max_time :
384
- # this only works if it is first event only
385
- break
386
-
387
- if node in processed_nodes :
388
- continue
389
- else :
390
- self ._first_events [node ] = time
391
- processed_nodes .add (node )
392
-
393
-
394
- #self._all_events.append((time, node))
395
- # if time < self._first_events[node]:
396
- # self._first_events[node] = time
379
+ def _sample_multi_first_event_sets (self , k = 1 , max_time = 4.0 ):
397
380
381
+ tmp_array = np .zeros (shape = (k ,len (self .structure .nodes )))
382
+ heaplist = [[]]* k
383
+ for i in range (k ):
384
+ self ._first_events = {node : np .inf for node in self .structure .nodes }
385
+ pending = heaplist [i ]
386
+ heapq .heappush (pending ,(self .init_time , self .init_node ))
387
+ # pending = [(self.init_time, self.init_node)]
388
+ # self._all_events = []
389
+ # short_circuit = False
390
+ # import ipdb; ipdb.set_trace()
391
+ processed_nodes = set ()
392
+ structure_nodes = set (self .structure .nodes )
393
+ while len (pending ) > 0 :
394
+ time , node = heapq .heappop (pending )
395
+ if time >= max_time :
396
+ break
398
397
399
- # if processed_nodes==structure_nodes:
400
- # this only works if it is first event only
401
- # break
402
398
403
- children_edges = self .structure .child_edges [node ]
404
- # this goes to each of the children_edges of the node and initiates events along that edge
405
- # import ipdb; ipdb.set_trace()
406
- for edge in children_edges :
407
- if edge [1 ] in processed_nodes :
399
+ if node in processed_nodes :
408
400
continue
409
401
else :
410
- child_events = self .sample_edge_first_event_only (edge , time )
411
- # import ipdb; ipdb.set_trace()
412
- if not child_events :
402
+ processed_nodes .add (node )
403
+ self ._first_events [node ] = time
404
+ if processed_nodes == structure_nodes :
405
+ # this only works if it is first event only
406
+ break
407
+
408
+ children_edges = self .structure .child_edges [node ]
409
+ for edge in children_edges :
410
+ if edge [1 ] in processed_nodes :
413
411
continue
414
- # import ipdb; ipdb.set_trace()
415
- heapq .heappush (pending ,child_events )
416
- # import ipdb; ipdb.set_trace()
417
- # pending.sort()
418
-
419
- #self._all_events.sort()
420
- #self._compute_first_events()
421
- #return np.array(self._first_events)
422
- return np .array ([self ._first_events [node ] for node in self .structure .nodes ])
412
+ else :
413
+ child_events = self .sample_edge_first_event_only (edge , time )
414
+ if not child_events :
415
+ continue
416
+ heapq .heappush (pending ,child_events )
417
+ tmp_array [i ] = np .array ([self ._first_events [node ] for node in self .structure .nodes ])
418
+ return tmp_array
423
419
424
420
def sample (self , k = 1 , first_only = True , max_time = 4.0 ):
425
421
first_events = np .zeros ((k , len (self .structure .nodes )))
@@ -441,6 +437,10 @@ def sample_solely_first_events(self, k=1, first_only=True, max_time=4.0):
441
437
# self._first_events = {node: np.inf for node in self.structure.nodes}
442
438
443
439
return first_events
440
+
441
+ # def sample_solely_first_events(self, k=1, first_only=True, max_time=4.0):
442
+ # # first_events = np.zeros((k, len(self.structure.nodes)))
443
+ # return self._samplee_multi_first_event_sets(k=k,max_time=max_time)
444
444
445
445
def sample_iter_solely_first_events (self , k = 1 , first_only = True , max_time = 4.0 ):
446
446
for i in range (k ):
0 commit comments