123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- # coding: utf-8
- """
- Author: Sten Vercamman
- Univeristy of Antwerp
- Example code for paper: Efficient model transformations for novices
- url: http://msdl.cs.mcgill.ca/people/hv/teaching/MSBDesign/projects/Sten.Vercammen
- The main goal of this code is to give an overview, and an understandable
- implementation, of known techniques for pattern matching and solving the
- sub-graph homomorphism problem. The presented techniques do not include
- performance adaptations/optimizations. It is not optimized to be efficient
- but rather for the ease of understanding the workings of the algorithms.
- The paper does list some possible extensions/optimizations.
- It is intended as a guideline, even for novices, and provides an in-depth look
- at the workings behind various techniques for efficient pattern matching.
- """
- from generator import *
- from patternMatching import *
- import graphToDot
- import random
- debug = False
- if __name__ == '__main__':
- """
- The main function called when running from the command line.
- """
- nr_of_vertices = 50
- nr_of_diff_types_v = 2
- nr_of_edges = 150
- nr_of_diff_types_e = 2
- dv = [random.randint(0, nr_of_diff_types_v) for _ in range(nr_of_vertices)]
- de = [random.randint(0, nr_of_diff_types_e) for _ in range(nr_of_edges)]
- dc_inc = [random.randint(0, nr_of_vertices-1) for _ in range(nr_of_edges)]
- dc_out = [random.randint(0, nr_of_vertices-1) for _ in range(nr_of_edges)]
- # override random graph by copy pasting output from terminal
- # dv = [ 10,5,4,0,8,6,8,0,4,8,5,5,7,0,10,0,5,6,10,4,0,3,0,8,2,7,5,8,1,0,2,10,0,0,1,6,8,4,7,6,4,2,10,10,6,4,6,0,2,7 ]
- # de = [ 8,10,8,1,6,7,4,3,5,2,0,0,9,6,0,3,8,3,2,7,2,3,10,8,10,8,10,2,5,5,10,6,7,5,1,2,1,2,2,3,7,7,2,1,7,2,9,10,8,1,9,4,1,3,1,1,8,2,2,9,10,9,1,9,4,10,10,10,9,3,5,3,6,6,9,1,2,6,3,2,4,10,9,6,5,6,2,4,3,2,4,10,6,2,8,8,0,5,1,7,3,4,3,8,7,3,0,8,3,3,8,5,10,5,9,3,1,10,3,2,6,3,10,0,5,10,9,10,0,1,4,7,10,3,1,9,1,2,3,7,4,3,7,8,8,4,5,10,1,4 ]
- # dc_inc = [ 0,25,18,47,22,25,16,45,38,25,5,45,15,44,17,46,6,17,35,8,16,29,48,47,25,34,4,20,24,1,47,44,8,25,32,3,16,6,33,21,6,13,41,10,17,25,21,33,31,30,5,4,45,26,16,42,12,25,29,3,32,30,14,26,11,13,7,13,3,43,43,22,48,37,20,28,15,40,19,33,43,16,49,36,11,25,9,42,3,22,16,40,42,44,27,30,1,18,10,35,19,6,9,43,37,38,45,19,41,14,37,45,0,31,29,31,24,20,44,46,8,45,43,3,38,38,35,12,19,45,7,34,20,28,12,17,45,17,35,49,20,21,49,1,35,38,38,36,33,30 ]
- # dc_out = [ 9,2,49,49,37,33,16,21,5,46,4,15,9,6,14,22,16,33,23,21,15,31,37,23,47,3,30,26,35,9,29,21,39,32,22,43,5,9,41,30,31,30,37,33,31,34,23,22,34,26,44,36,38,33,48,5,9,34,13,7,48,41,43,26,26,7,12,6,12,28,22,8,29,22,24,27,16,4,31,41,32,15,19,20,38,0,26,18,43,46,40,17,29,14,34,14,32,17,32,47,16,45,7,4,35,22,42,11,38,2,0,29,4,38,17,44,9,23,5,10,31,17,1,11,16,5,37,27,35,32,45,16,18,1,14,4,42,24,43,31,21,38,6,34,39,46,20,1,38,47 ]
- dv = [0, 1, 0, 1, 0]
- de = [0, 0, 0]
- dc_inc = [0, 2, 4]
- dc_out = [1, 3, 3]
-
- gg = GraphGenerator(dv, de, dc_inc, dc_out, debug)
- graph = gg.getRandomGraph()
- print(graph.vertices)
- pattern = gg.getRandomPattern(3, 15, debug=debug)
- print(pattern.vertices)
- # override random pattern by copy pasting output from terminal to create
- # pattern, paste it in the createConstantPattern function in the generator.py
- # pattern = gg.createConstantPattern()
- # generate here to know pattern and graph before searching it
- graphToDot.printGraph('randomPattern.dot', pattern)
- graphToDot.printGraph('randomGraph.dot', graph)
-
- #PM = PatternMatching('naive')
- #PM = PatternMatching('SP')
- # PM = PatternMatching('Ullmann')
- PM = PatternMatching('VF2')
- matches = [m for m in PM.matchVF2(pattern, graph)]
- print("found", len(matches), "matches:", matches)
- # regenerate graph, to show matched pattern
- for i, (v,e) in enumerate(matches):
- graphToDot.printGraph(f'randomGraph-{i}.dot', graph, v, e)
- if debug:
- print(len(v))
- print('___')
- print(v)
- for key, value in v.items():
- print(value.type)
- print(len(e))
- print(e)
- print('___')
- for key, value in e.items():
- print(value.type)
|