def test_token_passing_01(self):
        # Tests pattern with a single node
        m = Matcher()

        a1 = A(id='a1')
        p1 = Pattern('p1').add_node(a1)
        m.add_pattern(p1)

        # currently empty
        n  = m.get_pattern('p1')
        self.assertEqual(len(n),0)

        a2 = A()

        tok = token_add_node(a2)
        m.send_token(tok)
        self.assertEqual(len(n),1)

        tok = token_remove_node(a2)
        m.send_token(tok)
        self.assertEqual(len(n),0)

        tok = token_add_node(a2)
        m.send_token(tok)
        self.assertEqual(len(n),1)
    def test_token_passing_02(self):
        # Test single-node pattern with non-matching attributes
        m = Matcher()

        x1 = X(id='x1',ph=True)
        p1 = Pattern('p1').add_node(x1)
        m.add_pattern(p1)

        # currently empty
        n  = m.get_pattern('p1')
        self.assertEqual(len(n),0)

        x2 = X(ph=True,v=0)
        tok = token_add_node(x2)
        m.send_token(tok)
        self.assertEqual(len(n),1)

        tok = token_remove_node(x2)
        m.send_token(tok)
        self.assertEqual(len(n),0)

        tok = token_edit_attrs(x2,['ph'])
        m.send_token(tok)
        self.assertEqual(len(n),1)

        tok = token_edit_attrs(x2,['v'])
        m.send_token(tok)
        self.assertEqual(len(n),1)

        tok = token_add_node(X(ph=False,v=0))
        m.send_token(tok)
        self.assertEqual(len(n),1)
    def test_complex_bookkeeping(self):
        # n1 molecules of A-X
        # n2 molecules of A-X2
        # n3 molecules of A-X3
        # n4 molecules of A-X-bnd-X-A
        # number of complexes = n1 + n2 + n3 + n4
        # number matches to pattern A-X = n1 + 2*n2 + 3*n3 + 2*n4

        pAx = Pattern('pAx').add_node(A(id='a').add_sites(X(id='x')))
        m = Matcher()
        m.add_pattern(pAx)
        n1,n2,n3,n4 = 0,0,0,0
        # n1 molecules of A-X
        n1 = 100
        for i in range(n1):
            a,x = A(),X()
            m.send_tokens([token_add_node(a),token_add_node(x)])
            x.molecule = a
            m.send_tokens([token_add_edge(a,'sites','molecule',x)])

        # n2 molecules of A-X2
        n2 = 50
        for i in range(n2):
            a,x1,x2 = A(), X(), X()
            m.send_tokens([token_add_node(a),token_add_node(x1),token_add_node(x2)])
            x1.molecule = a
            x2.molecule = a
            m.send_tokens([token_add_edge(a,'sites','molecule',x1),token_add_edge(a,'sites','molecule',x2)])

        # n3 molecules of A-X3
        n3 = 25
        for i in range(n3):
            a,x1,x2,x3 = A(), X(), X(), X()
            m.send_tokens([token_add_node(a),token_add_node(x1),token_add_node(x2),token_add_node(x3)])
            x1.molecule = a
            x2.molecule = a
            x3.molecule = a
            m.send_tokens([token_add_edge(a,'sites','molecule',x1),token_add_edge(a,'sites','molecule',x2),token_add_edge(a,'sites','molecule',x3)])

        # n4 molecules of A-X-bnd-X-A
        n4 = 10
        for i in range(n4):
            a1,a2,x1,x2 = A(), A(), X(), X()
            m.send_tokens([token_add_node(a1),token_add_node(x1)])
            m.send_tokens([token_add_node(a2),token_add_node(x2)])
            x1.molecule = a1
            x2.molecule = a2
            m.send_tokens([token_add_edge(a1,'sites','molecule',x1)])
            m.send_tokens([token_add_edge(a2,'sites','molecule',x2)])
            bnd = Bond()
            m.send_tokens([token_add_node(bnd)])
            bnd.add_sites(x1,x2)
            m.send_tokens([token_add_edge(bnd,'sites','bond',x1)])
            m.send_tokens([token_add_edge(bnd,'sites','bond',x2)])
        
        c1 = m.count_complexes()
        c2 = m.count('pAx')
        self.assertEqual(c1,n1 + n2 + n3 + n4)
        self.assertEqual(c2,n1 + 2*n2 + 3*n3 + 2*n4)
Exemple #4
0
    def test_token_passing_10(self):
        # testing loops formed by A(x!0,x!1)
        n = 10
        A_list = []
        x_right_list = []
        x_left_list = []
        for i in range(n):
            a1, xL, xR = A(), X(), X()
            a1.add_sites(xL, xR)
            A_list.append(a1)
            x_left_list.append(xL)
            x_right_list.append(xR)

        for i in range(n):
            bnd = Bond()
            x1 = x_left_list[i]
            x2 = x_right_list[i - 1]
            bnd.add_sites(x1, x2)

        #pattern
        p = Pattern('loop').add_node(A_list[0])
        self.assertEqual(len(p), 4 * n)
        m = Matcher()
        m.add_pattern(p)

        # tokens
        tokens = []
        left = []
        right = []
        for i in range(n):
            a, xL, xR = A(), X(), X()
            left.append(xL)
            right.append(xR)
            tokens = [token_add_node(x) for x in [a, xL, xR]]
            m.send_tokens(tokens)

            a.add_sites(xL, xR)
            tokens = [
                token_add_edge(a, 'sites', 'molecule', x) for x in [xL, xR]
            ]
            m.send_tokens(tokens)

        for i in range(n):
            bnd = Bond()
            tokens = [token_add_node(bnd)]
            m.send_tokens(tokens)

            bnd.add_sites(left[i], right[i - 1])
            tokens = [
                token_add_edge(bnd, 'sites', 'bond', x)
                for x in [left[i], right[i - 1]]
            ]
            m.send_tokens(tokens)

        self.assertEqual(m.count('loop'), 2 * n)
    def test_token_passing_07(self):
        # Test A(<empty>)
        p1 = Pattern('p1').add_node( A('a') )
        p1.add_expression('a.sites empty')
        p2 = Pattern('p2').add_node( A('a') )

        m = Matcher()
        for p in [p1,p2]:
            m.add_pattern(p)

        self.assertEqual(m.count('p1'),0)
        self.assertEqual(m.count('p2'),0)

        # Add new A:
        a001 = A()
        tok = token_add_node(a001)
        m.send_token(tok)
        self.assertEqual(m.count('p1'),1)
        self.assertEqual(m.count('p2'),1)

        # Add new X
        x001 = X()
        tok = token_add_node(x001)
        m.send_token(tok)
        self.assertEqual(m.count('p1'),1)
        self.assertEqual(m.count('p2'),1)

        # X.set_molecule(A)
        x001.set_molecule(a001)
        tok = token_add_edge(a001,'sites','molecule',x001)
        m.send_token(tok)
        self.assertEqual(m.count('p1'),0)
        self.assertEqual(m.count('p2'),1)

        # X.unset_molecule()
        x001.unset_molecule()
        tok = token_remove_edge(a001,'sites','molecule',x001)
        m.send_token(tok)
        self.assertEqual(m.count('p1'),1)
        self.assertEqual(m.count('p2'),1)

        # Remove A
        tok = token_remove_node(a001)
        m.send_token(tok)
        self.assertEqual(m.count('p1'),0)
        self.assertEqual(m.count('p2'),0)
    def test_token_passing_04(self):
        # Test pattern A-X[ph=True,v=0]
        a1 = A(id='a1')
        x1 = X(id='x1',ph=True,v=0).set_molecule(a1)

        p1 = Pattern('p1').add_node(a1)

        m = Matcher()
        m.add_pattern(p1)

        n  = m.get_pattern('p1')
        self.assertEqual(len(n),0)

        a2 = A()
        x2 = X(ph=True,v=0)

        tok = token_add_node(a2)
        m.send_token(tok)
        self.assertEqual(len(n),0)

        tok = token_add_node(x2)
        m.send_token(tok)
        self.assertEqual(len(n),0)

        x2.set_molecule(a2)
        tok = token_add_edge(a2,'sites','molecule',x2)
        m.send_token(tok)
        self.assertEqual(len(n),1)

        tok = token_add_edge(a2,'sites','molecule',x2)
        m.send_token(tok)
        self.assertEqual(len(n),1)

        x2.unset_molecule()
        tok = token_remove_edge(a2,'sites','molecule',x2)
        m.send_token(tok)
        self.assertEqual(len(n),0)

        tok = token_remove_edge(a2,'sites','molecule',x2)
        m.send_token(tok)
        self.assertEqual(len(n),0)
    def test_token_passing_05(self):
        # Test pattern Ax:A(x[id=x]), X:X[id=x] with condition Ax.x in X.x
        p_X = Pattern('X').add_node( X('x',ph=True) )
        p_Ax = Pattern('Ax').add_node( A('a').add_sites(X('x') ) )   \
                .add_expression('x in X.x')

        m = Matcher()
        with self.assertRaises(BuildError):
            for p in reversed([p_X, p_Ax]):
                m.add_pattern(p)

        m = Matcher()
        for p in [p_X, p_Ax]:
            m.add_pattern(p)

        #
        x001 = X(ph=True)
        a001 = A()

        tokens = [token_add_node(a001),token_add_node(x001)]
        m.send_tokens(tokens)

        x001.set_molecule(a001)
        tokens = [token_add_edge(a001,'sites','molecule',x001)]
        m.send_tokens(tokens)

        self.assertEqual(m.count('X'),1)
        self.assertEqual(m.count('Ax'),1)

        #
        x001.ph = False

        tokens = [
            token_edit_attrs(x001,['ph'])
        ]

        m.send_tokens(tokens)
        self.assertEqual(m.count('X'),0)
        self.assertEqual(m.count('Ax'),0)
    def test_token_passing_09(self):
        # multiple var matching
        # Test AxT:A[id=a](X[id=X,ph=True])
        # Ax:A[id=a](X[id=x])
        # with joint condition Ax.[a,x] in AxT.[a,x]
        p_AxT = Pattern('AxT').add_node( A('a').add_sites( X('x',ph=True) )  )
        p_Ax = Pattern('Ax').add_node( A('a').add_sites(X('x')) )    \
                    .add_expression('[a,x] in AxT.[a,x]')
        m = Matcher()
        for p in [p_AxT,p_Ax]:
            m.add_pattern(p)

        n=25
        for i in range(n):
            a001,x001 = A(),X(ph=True)
            tokens = [token_add_node(a001),token_add_node(x001)]
            m.send_tokens(tokens)
            x001.set_molecule(a001)
            tokens = [token_add_edge(a001,'sites','molecule',x001)]
            m.send_tokens(tokens)
        self.assertEqual(m.count('Ax'),n)

        n=25
        for i in range(n):
            a001,x001 = A(),X(ph=False)
            tokens = [token_add_node(a001),token_add_node(x001)]
            m.send_tokens(tokens)
            x001.set_molecule(a001)
            tokens = [token_add_edge(a001,'sites','molecule',x001)]
            m.send_tokens(tokens)
        self.assertEqual(m.count('Ax'),n)

        n=25
        for i in range(n):
            x001 = X(ph=True)
            tokens = [token_add_node(x001)]
            m.send_tokens(tokens)
        self.assertEqual(m.count('Ax'),n)
Exemple #9
0
    def test_token_passing_06(self):
        # Test Ax:A(X[id=x]), X:X[id=x,ph=True] with condition A.x not in X.x
        p_X = Pattern('X').add_node(X('x', ph=True))
        p_Ax = Pattern('Ax').add_node( A('a').add_sites(X('x') ) )   \
                .add_expression('x not in X.x')

        m = Matcher()
        for p in [p_X, p_Ax]:
            m.add_pattern(p)

        #
        a001 = A()
        x001 = X(ph=True)
        tokens = [token_add_node(a001), token_add_node(x001)]
        m.send_tokens(tokens)

        x001.set_molecule(a001)
        tokens = [
            token_add_edge(a001, 'sites', 'molecule', x001),
        ]
        m.send_tokens(tokens)

        self.assertEqual(m.count('X'), 1)
        self.assertEqual(m.count('Ax'), 0)

        #
        x001.ph = False
        tokens = [token_edit_attrs(x001, ['ph'])]
        m.send_tokens(tokens)
        self.assertEqual(m.count('X'), 0)
        self.assertEqual(m.count('Ax'), 1)

        #
        x001.ph = True
        tokens = [token_edit_attrs(x001, ['ph'])]
        m.send_tokens(tokens)
        self.assertEqual(m.count('X'), 1)
        self.assertEqual(m.count('Ax'), 0)
Exemple #10
0
    def test_token_passing_08(self):
        # Test A(x)
        # One-edge
        p_Ax = Pattern('Ax').add_node( A('a').add_sites(X('x') ) )
        m = Matcher()
        for p in [p_Ax]:
            m.add_pattern(p)

        a001 = A()
        tokens = [token_add_node(a001)]
        m.send_tokens(tokens)
        n = 100
        for i in range(n):
            x = X()
            tokens = [token_add_node(x)]
            m.send_tokens(tokens)

            x.set_molecule(a001)
            tokens = [token_add_edge(x,'molecule','sites',a001)]
            m.send_tokens(tokens)

        self.assertEqual(m.count('Ax'),n)

        # Test A(x,x)
        # Two edges
        p_Axx = Pattern('Axx').add_node( A('a').add_sites( X('x1'),X('x2') ) )
        m = Matcher()
        for p in [p_Axx]:
            m.add_pattern(p)

        a001 = A()
        tokens = [token_add_node(a001)]
        m.send_tokens(tokens)
        n = 25
        for i in range(n):
            x = X()
            tokens = [token_add_node(x)]
            m.send_tokens(tokens)

            x.set_molecule(a001)
            tokens = [token_add_edge(x,'molecule','sites',a001)]
            m.send_tokens(tokens)

        self.assertEqual(m.count('Axx'),n*(n-1))

        # Three edges
        # Test A(x,x,x)
        p_Axxx = Pattern('Axxx').add_node( A('a').add_sites( X('x1'),X('x2'),X('x3') ) )
        m = Matcher()
        for p in [p_Axxx]:
            m.add_pattern(p)

        a001 = A()
        tokens = [token_add_node(a001)]
        m.send_tokens(tokens)
        n = 25
        for i in range(n):
            x = X()
            tokens = [token_add_node(x)]
            m.send_tokens(tokens)

            x.set_molecule(a001)
            tokens = [token_add_edge(x,'molecule','sites',a001)]
            m.send_tokens(tokens)

        self.assertEqual(m.count('Axxx'),n*(n-1)*(n-2))
Exemple #11
0
    def test_rete_construction(self):
        bnd = Bond(id='bnd')
        a1 = A(id='A1').add_sites(X(id='x1',ph=True,v=0).set_bond(bnd))
        a2 = A(id='A2').add_sites(X(id='x2',ph=True,v=1).set_bond(bnd))
        p4 = Pattern('p4').add_node(a1)

        p5 = Pattern('p5').add_node( A(id='a3') )
        m = Matcher()
        for p in [p4,p5]:
            m.add_pattern(p)
        textgen = m.rete_net.draw_as_gml(as_string=True)

        text = '''graph
[
 directed 1
node [id 0 graphics [ hasOutline 0 fill "#FBB4AE" ]  LabelGraphics [text "(0)root" ]  ]
node [id 1 graphics [ hasOutline 0 fill "#DECBE4" ]  LabelGraphics [text "(1)*0.bond--*1.sites" ]  ]
node [id 10 graphics [ hasOutline 0 fill "#B3CDE3" ]  LabelGraphics [text "(10)p4:x2,p4:bnd" ]  ]
node [id 11 graphics [ hasOutline 0 fill "#DECBE4" ]  LabelGraphics [text "(11)*0.molecule--*1.sites" ]  ]
node [id 12 graphics [ hasOutline 0 fill "#E5D8BD" ]  LabelGraphics [text "(12)store" ]  ]
node [id 13 graphics [ hasOutline 0 fill "#B3CDE3" ]  LabelGraphics [text "(13)p4:x1,p4:A1" ]  ]
node [id 14 graphics [ hasOutline 0 fill "#FFFFCC" ]  LabelGraphics [text "(14)p4:A1,p4:x1" ]  ]
node [id 15 graphics [ hasOutline 0 fill "#FFFFCC" ]  LabelGraphics [text "(15)p4:A1,p4:x1" ]  ]
node [id 16 graphics [ hasOutline 0 fill "#B3CDE3" ]  LabelGraphics [text "(16)p4:x2,p4:A2" ]  ]
node [id 17 graphics [ hasOutline 0 fill "#FED9A6" ]  LabelGraphics [text "(17)isinstance(*,Entity)" ]  ]
node [id 18 graphics [ hasOutline 0 fill "#FED9A6" ]  LabelGraphics [text "(18)isinstance(*,Bond)" ]  ]
node [id 19 graphics [ hasOutline 0 fill "#E5D8BD" ]  LabelGraphics [text "(19)store" ]  ]
node [id 2 graphics [ hasOutline 0 fill "#E5D8BD" ]  LabelGraphics [text "(2)store" ]  ]
node [id 20 graphics [ hasOutline 0 fill "#B3CDE3" ]  LabelGraphics [text "(20)p4:bnd" ]  ]
node [id 21 graphics [ hasOutline 0 fill "#FED9A6" ]  LabelGraphics [text "(21)isinstance(*,Molecule)" ]  ]
node [id 22 graphics [ hasOutline 0 fill "#FED9A6" ]  LabelGraphics [text "(22)isinstance(*,A)" ]  ]
node [id 23 graphics [ hasOutline 0 fill "#E5D8BD" ]  LabelGraphics [text "(23)store" ]  ]
node [id 24 graphics [ hasOutline 0 fill "#B3CDE3" ]  LabelGraphics [text "(24)p4:A1" ]  ]
node [id 25 graphics [ hasOutline 0 fill "#B3CDE3" ]  LabelGraphics [text "(25)p4:A2" ]  ]
node [id 26 graphics [ hasOutline 0 fill "#B3CDE3" ]  LabelGraphics [text "(26)p5:a3" ]  ]
node [id 27 graphics [ hasOutline 0 fill "#FED9A6" ]  LabelGraphics [text "(27)isinstance(*,Site)" ]  ]
node [id 28 graphics [ hasOutline 0 fill "#FED9A6" ]  LabelGraphics [text "(28)isinstance(*,X)" ]  ]
node [id 29 graphics [ hasOutline 0 fill "#CCEBC5" ]  LabelGraphics [text "(29)*.ph==True
*.v==0" ]  ]
node [id 3 graphics [ hasOutline 0 fill "#B3CDE3" ]  LabelGraphics [text "(3)p4:x1,p4:bnd" ]  ]
node [id 30 graphics [ hasOutline 0 fill "#E5D8BD" ]  LabelGraphics [text "(30)store" ]  ]
node [id 31 graphics [ hasOutline 0 fill "#B3CDE3" ]  LabelGraphics [text "(31)p4:x1" ]  ]
node [id 32 graphics [ hasOutline 0 fill "#CCEBC5" ]  LabelGraphics [text "(32)*.ph==True
*.v==1" ]  ]
node [id 33 graphics [ hasOutline 0 fill "#E5D8BD" ]  LabelGraphics [text "(33)store" ]  ]
node [id 34 graphics [ hasOutline 0 fill "#B3CDE3" ]  LabelGraphics [text "(34)p4:x2" ]  ]
node [id 4 graphics [ hasOutline 0 fill "#FFFFCC" ]  LabelGraphics [text "(4)p4:A1,p4:bnd,p4:x1" ]  ]
node [id 5 graphics [ hasOutline 0 fill "#FFFFCC" ]  LabelGraphics [text "(5)p4:A1,p4:bnd,p4:x1" ]  ]
node [id 6 graphics [ hasOutline 0 fill "#FFFFCC" ]  LabelGraphics [text "(6)p4:A1,p4:bnd,p4:x1,p4:x2" ]  ]
node [id 7 graphics [ hasOutline 0 fill "#FFFFCC" ]  LabelGraphics [text "(7)p4:A1,p4:bnd,p4:x1,p4:x2" ]  ]
node [id 8 graphics [ hasOutline 0 fill "#FFFFCC" ]  LabelGraphics [text "(8)p4:A1,p4:A2,p4:bnd,p4:x1,p4:x2" ]  ]
node [id 9 graphics [ hasOutline 0 fill "#FFFFCC" ]  LabelGraphics [text "(9)p4:A1,p4:A2,p4:bnd,p4:x1,p4:x2" ]  ]
edge [ source 0 target 1 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 0 target 11 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 0 target 17 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 1 target 2 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 10 target 6 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 11 target 12 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 12 target 13 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 12 target 16 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 13 target 14 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 14 target 15 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 15 target 4 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 16 target 8 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 17 target 18 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 17 target 21 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 17 target 27 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 18 target 19 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 19 target 20 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 2 target 10 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 2 target 3 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 20 target 5 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 21 target 22 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 22 target 23 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 23 target 24 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 23 target 25 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 23 target 26 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 24 target 14 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 25 target 9 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 27 target 28 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 28 target 29 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 28 target 32 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 29 target 30 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 3 target 4 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 30 target 31 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 31 target 15 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 32 target 33 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 33 target 34 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 34 target 7 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 4 target 5 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 5 target 6 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 6 target 7 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 7 target 8 graphics [ fill "#999999" targetArrow "standard" ]  ]
edge [ source 8 target 9 graphics [ fill "#999999" targetArrow "standard" ]  ]
]
'''

        textgen_split = [x.strip() for x in textgen.split('\n')]
        text_split = [x.strip() for x in text.split('\n')]
        self.assertEqual(len(textgen_split),len(text_split))

        for line1,line2 in zip(textgen_split,text_split):
            self.assertEqual(line1,line2)
        return