1- '''
2- Module for the NetworkAgent class that can be subclassed by agents.
3-
4- @author: Joe Schaul <[email protected] > 5- '''
6-
7- from SimPy import Simulation as Sim
8- import networkx as nx
9- import random
10-
11- SEED = 123456789
12-
13- ADD_EDGE = "add edge"
14- REMOVE_EDGE = "remove edge"
15- ADD_NODE = "add node"
16- REMOVE_NODE = "remove node"
17-
18-
19- class NetworkAgent (Sim .Process ):
20- '''NetworkAgent class that can be subclassed by agents. '''
21-
22- #class variables, shared between all instances of this class
23- r = random .Random (SEED )
24- TIMESTEP_DEFAULT = 1.0
25-
26- def __init__ (self , state , initialiser , stateVector = [], name = 'network_process' , ** stateParameters ):
27- Sim .Process .__init__ (self , name )
28- self .state = state
29- self .stateVector = stateVector
30- self .stateParameters = stateParameters
31- self .initialize (* initialiser )
32-
33-
34- def initialize (self , id , sim , globalTopo , globalParams ):
35- ''' this gets called automatically '''
36- self .id = id
37- self .sim = sim
38- self .globalTopology = globalTopo
39- self .globalSharedParameters = globalParams
40-
41- def getAllNodes (self ):
42- return self .globalTopology .nodes ()
43-
44- def getAllAgents (self , state = None ):
45- neighs = self .getAllNodes ()
46- if state is not None :
47- return [self .globalTopology .node [n ]['agent' ] for n in neighs
48- if self .globalTopology .node [n ]['agent' ].state == state ]
49- else :
50- return [self .globalTopology .node [n ]['agent' ] for n in neighs ]
51-
52-
53-
54- def getNeighbouringAgents (self , state = None ):
55- ''' returns list of neighbours, but as agents, not nodes.
56- so e.g. one can set result[0].state = INFECTED '''
57- neighs = self .globalTopology .neighbors (self .id )
58- if state is not None :
59- return [self .globalTopology .node [n ]['agent' ] for n in neighs
60- if self .globalTopology .node [n ]['agent' ].state == state ]
61- else :
62- return [self .globalTopology .node [n ]['agent' ] for n in neighs ]
63-
64- def getNeighbouringAgentsIter (self , state = None ):
65- '''same as getNeighbouringAgents, but returns generator expression,
66- not list.
67- '''
68- neighs = self .globalTopology .neighbors (self .id )
69- if state is not None :
70- return (self .globalTopology .node [n ]['agent' ] for n in neighs
71- if self .globalTopology .node [n ]['agent' ].state == state )
72- else :
73- return (self .globalTopology .node [n ]['agent' ] for n in neighs )
74-
75- def getNeighbouringNodes (self ):
76- ''' returns list of neighbours as nodes.
77- Call self.getAgent() on one of them to get the agent.'''
78- return self .globalTopology .neighbors (self .id )
79-
80- def getAgent (self , id ):
81- '''returns agent of specified ID.'''
82- return self .globalTopology .node [id ]['agent' ]
83-
84- def addNewNode (self , state ):
85- #add & activate new agent
86- return self .sim .addNewNode (state )
87-
88- #add a random edge
89- #u = NetworkAgent.r.choice(self.globalTopology.nodes())
90- #self.globalTopology.add_edge(u, id)
91-
92- def die (self ):
93- self .removeNode (self .id )
94-
95- def removeNode (self , id ):
96- # cancel ? self.getAgent(id)
97- self .globalTopology .remove_node (id )
98-
99- def removeEdge (self , node1 , node2 ):
100-
101- self .globalTopology .remove_edge (self .id , self .currentSupernodeID )
102- self .logTopoChange (REMOVE_EDGE , node1 , node2 )
103-
104-
105- def addEdge (self , node1 , node2 ):
106- self .globalTopology .add_edge (self .id , self .currentSupernodeID )
107- self .logTopoChange (ADD_EDGE , node1 , node2 )
108-
109-
110- def logTopoChange (self , action , node , node2 = None ):
111- #TODO: test, add this to netlogger...
112- print action , node , node2
113-
114-
115-
116-
117-
118-
119-
120-
121-
122-
1+ '''
2+ Module for the NetworkAgent class that can be subclassed by agents.
3+
4+ @author: Joe Schaul <[email protected] > 5+ '''
6+
7+ from SimPy import Simulation as Sim
8+ import networkx as nx
9+ import random
10+
11+ SEED = 123456789
12+
13+ ADD_EDGE = "add edge"
14+ REMOVE_EDGE = "remove edge"
15+ ADD_NODE = "add node"
16+ REMOVE_NODE = "remove node"
17+
18+
19+ class NetworkAgent (Sim .Process ):
20+ '''NetworkAgent class that can be subclassed by agents. '''
21+
22+ #class variables, shared between all instances of this class
23+ r = random .Random (SEED )
24+ TIMESTEP_DEFAULT = 1.0
25+
26+ def __init__ (self , state , initialiser , stateVector = [], name = 'network_process' , ** stateParameters ):
27+ Sim .Process .__init__ (self , name )
28+ self .state = state
29+ self .stateVector = stateVector
30+ self .stateParameters = stateParameters
31+ self .initialize (* initialiser )
32+
33+
34+ def initialize (self , id , sim , globalTopo , globalParams ):
35+ ''' this gets called automatically '''
36+ self .id = id
37+ self .sim = sim
38+ self .globalTopology = globalTopo
39+ self .globalSharedParameters = globalParams
40+
41+ def getAllNodes (self ):
42+ return self .globalTopology .nodes ()
43+
44+ def getAllAgents (self , state = None ):
45+ neighs = self .getAllNodes ()
46+ if state is not None :
47+ return [self .globalTopology .node [n ]['agent' ] for n in neighs
48+ if self .globalTopology .node [n ]['agent' ].state == state ]
49+ else :
50+ return [self .globalTopology .node [n ]['agent' ] for n in neighs ]
51+
52+
53+
54+ def getNeighbouringAgents (self , state = None ):
55+ ''' returns list of neighbours, but as agents, not nodes.
56+ so e.g. one can set result[0].state = INFECTED '''
57+ neighs = self .globalTopology .neighbors (self .id )
58+ if state is not None :
59+ return [self .globalTopology .node [n ]['agent' ] for n in neighs
60+ if self .globalTopology .node [n ]['agent' ].state == state ]
61+ else :
62+ return [self .globalTopology .node [n ]['agent' ] for n in neighs ]
63+
64+ def getNeighbouringAgentsIter (self , state = None ):
65+ '''same as getNeighbouringAgents, but returns generator expression,
66+ not list.
67+ '''
68+ neighs = self .globalTopology .neighbors (self .id )
69+ if state is not None :
70+ return (self .globalTopology .node [n ]['agent' ] for n in neighs
71+ if self .globalTopology .node [n ]['agent' ].state == state )
72+ else :
73+ return (self .globalTopology .node [n ]['agent' ] for n in neighs )
74+
75+ def getNeighbouringNodes (self ):
76+ ''' returns list of neighbours as nodes.
77+ Call self.getAgent() on one of them to get the agent.'''
78+ return self .globalTopology .neighbors (self .id )
79+
80+ def getAgent (self , id ):
81+ '''returns agent of specified ID.'''
82+ return self .globalTopology .node [id ]['agent' ]
83+
84+ def addNewNode (self , state ):
85+ #add & activate new agent
86+ return self .sim .addNewNode (state )
87+
88+ #add a random edge
89+ #u = NetworkAgent.r.choice(self.globalTopology.nodes())
90+ #self.globalTopology.add_edge(u, id)
91+
92+ def die (self ):
93+ self .removeNode (self .id )
94+
95+ def removeNode (self , id ):
96+ # cancel ? self.getAgent(id)
97+ self .globalTopology .remove_node (id )
98+
99+ def removeEdge (self , node1 , node2 ):
100+
101+ self .globalTopology .remove_edge (self .id , self .currentSupernodeID )
102+ self .logTopoChange (REMOVE_EDGE , node1 , node2 )
103+
104+
105+ def addEdge (self , node1 , node2 ):
106+ self .globalTopology .add_edge (self .id , self .currentSupernodeID )
107+ self .logTopoChange (ADD_EDGE , node1 , node2 )
108+
109+
110+ def logTopoChange (self , action , node , node2 = None ):
111+ #TODO: test, add this to netlogger...
112+ print ( action , node , node2 )
113+
114+
115+
116+
117+
118+
119+
120+
121+
122+
123123
0 commit comments