Skip to content

Commit

Permalink
instance, nodequery and graphquery messages for SimulationState
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsekar committed Nov 14, 2017
1 parent 53c36ed commit 10f9a60
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 0 deletions.
46 changes: 46 additions & 0 deletions tests/test_sim.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from obj_model import core
from wc_rules.base import BaseClass
from wc_rules.query import NodeTypeQuery,NodeQuery,GraphQuery
from wc_rules.sim import SimulationState, UpdateMessage
import wc_rules.graph_utils as g
import unittest

class A(BaseClass):
x = core.ManyToManyAttribute('A',related_name='x')
b = core.BooleanAttribute(default=False)
class GraphMeta(BaseClass.GraphMeta):
semantic = ('b',)


class TestSim(unittest.TestCase):


def test_update_scheme(self):

# initialization
# This a 3-clique with a boolean attribute (currently True) on each node
instances = [A(id='inst1',b=True), A(id='inst2',b=True), A(id='inst3',b=True)]
instances[0].x.extend([instances[1],instances[2]])
instances[1].x.append(instances[2])

# This is a 2-graph with True on both nodes
queries = [A(id='query1',b=True),A(id='query2',b=True)]
queries[0].x.append(queries[1])
sim = SimulationState()
sim.add_as_graphquery(queries)

# Test 1
# First time adding instances
for x in instances:
sim.agents.append(x)
msg = UpdateMessage(update_attr='instance',instance=x)
sim.add_message(msg)
sim.process_message_queue()

# Now, it should update nodequeries and graphqueries automatically
# Each nodequery should have three matches
# The graphquery should have six matches
for x in sim.nodequeries:
self.assertEqual(len(x.matches),3)
for x in sim.graphqueries:
self.assertEqual(len(x.matches),6)
44 changes: 44 additions & 0 deletions wc_rules/sim.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,50 @@ def pop_message(self):

def process_message(self,update_message):
# processes and returns a list of messages
# print('processing message ',update_message.__str__())
update_attr = update_message['update_attr']
update_type = update_message['update_type']
msgs = []
if update_attr == 'instance':
instance = update_message['instance']
for nq in self.nodetypequery[instance.__class__]:
msgs.extend(self.generate_nodequery_message(nq,instance))
if update_attr == 'nodequery':
instance = update_message['instance']
nq = update_message['nodequery']
if update_type == 'add':
nq.add_match(instance)
msgs.extend(self.generate_graphquery_message(nq,instance,'add'))
if update_type == 'remove':
nq.remove_match(instance)
msgs.extend(self.generate_graphquery_message(nq,instance,'remove'))
if update_attr == 'graphquery':
instance = update_message['instance']
nq = update_message['nodequery']
gq = update_message['graphquery']
if update_type == 'add':
gq.seed_graphmatches([(nq,instance)])
gq.process_partial_matches()
if update_type == 'remove':
gq.remove_graphmatches([(nq,instance)])
return msgs

def generate_nodequery_message(self,nq,instance):
# returns a message
match_verified = nq.verify_match(instance)
if match_verified and instance not in nq.matches:
return [UpdateMessage(update_attr='nodequery',update_type='add',nodequery=nq,instance=instance)]
if not match_verified and instance in nq.matches:
return [UpdateMessage(update_attr='nodequery',update_type='add',nodequery=nq,instance=instance)]
return []

def generate_graphquery_message(self,nq,instance,update_type):
if nq.graphquery is not None:
gq = nq.graphquery
if update_type=='add':
return [UpdateMessage(update_attr='graphquery',update_type='add',nodequery=nq,instance=instance,graphquery=gq)]
if update_type=='remove':
return [UpdateMessage(update_attr='graphquery',update_type='remove',nodequery=nq,instance=instance,graphquery=gq)]
return []

def process_message_queue(self):
Expand Down

0 comments on commit 10f9a60

Please sign in to comment.