From f9e23889e96a2c9979499acfd36600f119996f58 Mon Sep 17 00:00:00 2001 From: Malar Kannan Date: Mon, 3 Jul 2017 12:09:09 +0530 Subject: [PATCH] added cycle limit checking --- cyclic_contracts.py | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/cyclic_contracts.py b/cyclic_contracts.py index 567d8c7..de8b04b 100644 --- a/cyclic_contracts.py +++ b/cyclic_contracts.py @@ -56,33 +56,41 @@ class Transporter(object): for r in c.routes: all_routes.append(r) if routes_map.has_key(r.src): - routes_map[r.src].append(r.dst) + routes_map[r.src].append(r) else: - routes_map[r.src]= [r.dst] - return all_routes,routes_map + routes_map[r.src]= [r] + for r in all_routes: + if not routes_map.has_key(r.dst): + routes_map[r.dst]= [] + return routes_map def is_cyclic(self): - return circular_dep(self.routes()[1]) + return circular_dep(self.routes()) -def find_loop(elem,dep_elem,deps,checked=set()): +CYCLE_LIMIT = 3 + +def find_loop(elem,dep_elem,deps,checked,path): if dep_elem in checked or not deps.has_key(dep_elem): - return (False,len(checked)) + return (False,[]) else: checked.add(dep_elem) for c in deps[dep_elem]: - if elem == c: - return (True,len(checked)) - for c in deps[dep_elem]: - c_loop = find_loop(elem,c,deps,checked) - if c_loop[0]: - return c_loop - return (False,len(checked)) - + path.append(c) + if elem == c.dst and len(path) <= CYCLE_LIMIT: + return (True,path) + loop_path = find_loop(elem,c.dst,deps,checked,path) + if loop_path[0]: + return loop_path + else: + del(path[-1]) + return (False,[]) + def circular_dep(deps): dep_state = [] for k in deps.keys(): - circ_dep_k = find_loop(k,k,deps,set()) + circ_dep_k = find_loop(k,k,deps,set(),[]) + # print path dep_state.append((k,circ_dep_k)) return dep_state -print Transporter.from_file('./contracts_test.txt').is_cyclic() +print Transporter.from_file('./contracts.txt').is_cyclic()