def test_nested_while(self): # weights = [AdaptType(1), AdaptType(1), AdaptType("k"), AdaptType("k"), AdaptType("k"), AdaptType("k * k"), AdaptType("k * k")] query = [0, 1, 0, 0, 1, 0, 1] edges = [(0, 2), (1, 4), (1, 6), (2, 2), (2, 3), (3, 5), (5, 5), (6, 4), (6, 6)] weights = [AdaptType("INF")]*len(query) ctl_edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (6, 2), (7, 8), (8, 6)] transitions = [ (0, [DifferenceConstraint("i", None, "k", DifferenceConstraint.DCType.RESET)], 1, [0]), (1, [DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET)], 2, [1]), (1, [], 1, []), (1, [DifferenceConstraint("i", None, "1", DifferenceConstraint.DCType.DEC)], 1, [2]), (1, [DifferenceConstraint("j", None, "k", DifferenceConstraint.DCType.RESET)], 1, [3]), (1, [DifferenceConstraint("y", "x", "Q", DifferenceConstraint.DCType.RESET)], 1, [4]), (1, [], 1, []), (1, [], 1, []), (1, [DifferenceConstraint("j", None, "1", DifferenceConstraint.DCType.DEC)], 2, [5]), (1, [DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET)], 2, [6]) ] bound_infer = self.ALG(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) bound_infer.attach_weights() print("The Reachability Bounds Expected for Vertices in the Simple Nested While Graph are: [1, 1, k, k, k, k^2, k^2] ") print("The Reachability Bounds Calculated for Vertices in This Graph are: ", bound_infer.get_weights()) adapt_search = AdaptSearchAlgRefined(bound_infer.graph) adapt_search.search_adapt() print("The Adaptivity Expected for Simple Nested While Algorithm is: 2 + k * k ") print("The Adaptivity From This Graph is: ", adapt_search.get_adapt())
def seq_multivar(self): query = [1, 1, 1, 1] edges = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3)] weights = [AdaptType("INF")] * len(query) # adapt_search = self.ALG(Graph(edges, weights, query)) ctl_edges = [(2, 3), (1, 2), (0, 1), (3, 4)] transitions = [ (2, [ DifferenceConstraint("z", None, "Q", DifferenceConstraint.DCType.RESET) ], 3, [2]), (1, [ DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET) ], 2, [1]), (0, [ DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [0]), (3, [ DifferenceConstraint("w", None, "Q", DifferenceConstraint.DCType.RESET) ], -1, [3]) ] AdaptEstimate.adapt_estimate(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) print( "The Reachability Bounds Expected for Vertices in Pure Sequence Graph are: [1,1,1,1] " ) print("The Adaptivity Expected for Simple Seq Algorithm is: 4 ")
def test_multiple_constriants(self): query = [0, 0, 0, 1, 0, 1] edges = [(0, 2), (1, 2), (1,4), (2,2), (2, 3), (3, 4), (4, 4), (4, 5)] weights = [AdaptType("INF")]*len(query) ctl_edges = [(0, 1), (1, 1), (1, 2)] transitions = [(0, [DifferenceConstraint("i", None, "k", DifferenceConstraint.DCType.RESET), DifferenceConstraint("l", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [0, 1]), (1, [DifferenceConstraint("i", None, "1", DifferenceConstraint.DCType.DEC), DifferenceConstraint("a", None, "Q", DifferenceConstraint.DCType.RESET), DifferenceConstraint("l", "a", "0", DifferenceConstraint.DCType.INC)], 1, [2, 3, 4]), (1, [DifferenceConstraint("b", "l", "Q", DifferenceConstraint.DCType.RESET)], 2, [5])] bound_infer = self.ALG(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) bound_infer.attach_weights() print("The Reachability Bounds Expected for Vertices in the Two Round Graph are: [1, 1, k, k, k, 1] ") print("The Reachability Bounds Calculated for Vertices in This Graph are: ", bound_infer.get_weights()) adapt_search = AdaptSearchAlgRefined(bound_infer.graph) adapt_search.search_adapt() print("The Adaptivity Expected for Two Round Algorithm is: 2 ") print("The Adaptivity From This Graph is: ", adapt_search.get_adapt())
def test_simple_nested_approximated(self): # weights = [AdaptType(1), AdaptType("k"), AdaptType("k"), AdaptType(1)] query = [0, 0, 0, 1, 0, 1] edges = [(0, 4), (1, 2), (1, 3), (2, 3), (3, 2), (3, 3)] weights = [AdaptType("INF")]*len(query) ctl_edges = [(0, 1), (1, 2), (2, 1), (2, 2)] transitions = [ (0, [DifferenceConstraint("i", None, "k", DifferenceConstraint.DCType.RESET)], 1, [0]), (1, [DifferenceConstraint("i", None, "1", DifferenceConstraint.DCType.DEC), DifferenceConstraint("j", "i", "0", DifferenceConstraint.DCType.RESET)], 2, [1, 2]), (2, [DifferenceConstraint("j", None, "1", DifferenceConstraint.DCType.DEC)], 2, [3]), (2, [], 1, []) ] bound_infer = self.ALG(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) bound_infer.attach_weights() print("The Reachability Bounds Expected for Vertices in the Simple Nested While Graph are: [1, k, k, k!] ") print("The Reachability Bounds Calculated for Vertices in This Graph are: ", bound_infer.get_weights()) adapt_search = AdaptSearchAlgRefined(bound_infer.graph) adapt_search.search_adapt() print("The Adaptivity Expected for Simple Nested While Algorithm is: 2 + k! ") print("The Adaptivity From This Graph is: ", adapt_search.get_adapt())
def test_if_val(self): weights = [AdaptType(1), AdaptType(1), AdaptType(1), AdaptType(1)] query = [1, 1, 1, 0] edges = [(0, 2), (1, 2), (1, 3)] adapt_search = self.ALG(Graph(edges, weights, query)) adapt_search.search_adapt() print("The Adaptivity Expected for This Graph is: 2 ") print("The Adaptivity From This Graph is: ", adapt_search.get_adapt())
def nested_while_multivaldep(self): # weights = [AdaptType(1), AdaptType(1), AdaptType("k"), AdaptType("k"), AdaptType("k"), AdaptType("k * k"), AdaptType("k * k")] query = [0, 1, 1, 0, 1, 0, 0, 1] edges = [(0, 3), (1, 4), (1, 7), (2, 4), (4, 4), (4, 7), (7, 4), (7, 7)] weights = [AdaptType("INF")] * len(query) ctl_edges = [(8, 9), (7, 8), (9, 7), (6, 7), (5, 6), (4, 5), (3, 4), (7, 3), (2, 3), (1, 2), (0, 1), (3, 10)] transitions = [ (7, [ DifferenceConstraint("j", None, " 1 ", DifferenceConstraint.DCType.DEC) ], 8, [6]), (6, [], 7, []), (9, [ DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET) ], 7, [7]), (6, [ DifferenceConstraint("j", None, "k", DifferenceConstraint.DCType.RESET) ], 7, [5]), (5, [ DifferenceConstraint("z", None, "Q", DifferenceConstraint.DCType.RESET) ], 6, [4]), (4, [ DifferenceConstraint("i", None, " 1 ", DifferenceConstraint.DCType.DEC) ], 5, [3]), (2, [], 3, []), (6, [], 2, []), (2, [ DifferenceConstraint("z", None, "Q", DifferenceConstraint.DCType.RESET) ], 3, [2]), (1, [ DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET) ], 2, [1]), (0, [ DifferenceConstraint("i", None, "k", DifferenceConstraint.DCType.RESET) ], 1, [0]), (2, [], -1, []) ] AdaptEstimate.adapt_estimate(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) # bound_infer = self.ALG(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) # bound_infer.attach_weights() print( "The Reachability Bounds Expected for Vertices in the Simple Nested While Graph are: [1, 1, k, k, k, k^2, k^2] " ) print( "The Adaptivity Expected for Simple Nested While Algorithm is: 1 + k + k * k " )
def dcfg_parse(self): with open(self.args.dcfg, "r") as graphdata: n = int(graphdata.readline()) query = [ int(q) for q in graphdata.readline().strip("\n").split(",") ] edges = [([int(v) for v in e.split(",")]) for e in graphdata.readline().split(";")] print(n, query, edges) return Graph(edges, [AdaptType(0)] * n, query)
def while_multivaldep(self): query = [0, 1, 1, 0, 1, 1, 1] edges = [(0, 3), (0, 4), (1, 4), (2, 4), (4, 6), (6, 4), (4, 5), (5, 4)] weights = [AdaptType("INF")] * len(query) ctl_edges = [(6, 7), (5, 6), (4, 5), (3, 4), (7, 3), (2, 3), (1, 2), (0, 1), (3, 8)] transitions = [ (6, [ DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET) ], 7, [5]), (5, [ DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET) ], 6, [4]), (4, [ DifferenceConstraint("i", None, "1", DifferenceConstraint.DCType.DEC) ], 5, [3]), (3, [], 4, []), (7, [ DifferenceConstraint("z", None, "Q", DifferenceConstraint.DCType.RESET) ], 3, [6]), (2, [ DifferenceConstraint("z", None, "Q", DifferenceConstraint.DCType.RESET) ], 3, [2]), (1, [ DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET) ], 2, [1]), (0, [ DifferenceConstraint("i", None, "k", DifferenceConstraint.DCType.RESET) ], 1, [0]), (3, [], -1, []) ] AdaptEstimate.adapt_estimate(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) print( "The Reachability Bounds Expected for Vertices in while Multi Variable Dependency: [1, 1, 1, k, k, k, k] " ) print( "The Adaptivity Expected for while with (Multi Variable Dependency) Algorithm is: 1 + 2 * k" )
def while_multipath_ctldep(self): query = [1, 0, 1, 1, 0, 1] edges = [(0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (2, 2), (2, 5), (3, 3), (3, 5), (4, 4)] weights = [AdaptType("INF")] * len(query) ctl_edges = [(3, 4), (3, 5), (4, 6), (5, 6), (2, 3), (6, 2), (2, 7), (1, 2), (0, 1), (7, 8)] transitions = [ (3, [], 4, []), (3, [], 5, []), (4, [ DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET) ], 6, [2]), (5, [ DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET) ], 6, [3]), (2, [], 3, []), (6, [ DifferenceConstraint("x", None, " 1 ", DifferenceConstraint.DCType.DEC) ], 2, [4]), (2, [], 7, []), (1, [ DifferenceConstraint("y", None, " 0 ", DifferenceConstraint.DCType.RESET) ], 2, [1]), (0, [ DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [0]), (7, [ DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET) ], -1, [5]) ] AdaptEstimate.adapt_estimate(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) print( "The Reachability Bounds Expected for Vertices in while with If Banch inside are: [1, 1, Q, Q, Q, 1] " ) print( "The Adaptivity Expected for while with If Banch (Multi-Path While Loop) Algorithm is: 2 + Q" )
def two_round(self): query = [0, 0, 0, 1, 0, 1] edges = [(0, 2), (1, 4), (2, 2), (2, 3), (2, 4), (3, 4), (4, 4), (4, 5)] weights = [AdaptType("INF")] * len(query) ctl_edges = [(4, 5), (3, 4), (2, 3), (5, 2), (2, 6), (1, 2), (0, 1), (6, 7)] transitions = [ (4, [ DifferenceConstraint("a", None, "Q", DifferenceConstraint.DCType.RESET) ], 5, [3]), (3, [ DifferenceConstraint("i", None, " 1 ", DifferenceConstraint.DCType.DEC) ], 4, [2]), (2, [], 3, []), (5, [ DifferenceConstraint("l", None, "INF", DifferenceConstraint.DCType.RESET) ], 2, [4]), (2, [], 6, []), (1, [ DifferenceConstraint("l", None, " 0 ", DifferenceConstraint.DCType.RESET) ], 2, [1]), (0, [ DifferenceConstraint("i", None, " k ", DifferenceConstraint.DCType.RESET) ], 1, [0]), (6, [ DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET) ], 7, [5]) ] AdaptEstimate.adapt_estimate(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) print( "The Reachability Bounds Expected for Vertices in the Two Round Graph are: [1, 1, k, k, k, 1] " ) # print("The Reachability Bounds Calculated for Vertices in This Graph are: ", bound_infer.get_weights()) # adapt_search = AdaptSearchAlgRefined(bound_infer.graph) # adapt_search.search_adapt() print("The Adaptivity Expected for Two Round Algorithm is: 2 ")
def test_seq(self): weights = [AdaptType(0), AdaptType(0), AdaptType(0), AdaptType(0)] query = [1, 1, 1, 1] edges = [(0, 1), (1, 2), (1, 3), (2, 3)] # adapt_search = self.ALG(Graph(edges, weights, query)) ctl_edges = [(0, 1)] transitions = [(0, [DifferenceConstraint("x", None, "k", DifferenceConstraint.DCType.RESET)], 1, [0, 1, 2 ,3])] bound_infer = self.ALG(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) bound_infer.attach_weights() print("The Reachability Bounds Expected for Vertices in Pure Sequence Graph are: [1,1,1,1] ") print("The Reachability Bounds Calculated for Vertices in This Graph are: ", bound_infer.get_weights()) adapt_search = AdaptSearchAlgRefined(bound_infer.graph) adapt_search.search_adapt() print("The Adaptivity Expected for Simple Seq Algorithm is: 4 ") print("The Adaptivity From This Graph is: ", adapt_search.get_adapt())
def while_valdep(self): query = [0, 0, 1, 0, 0] edges = [(0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (2, 3), (3, 2), (3, 3), (4, 4)] weights = [AdaptType("INF")] * len(query) ctl_edges = [(4, 5), (3, 4), (2, 3), (5, 2), (1, 2), (0, 1), (2, 7)] transitions = [ (4, [ DifferenceConstraint("l", None, "INF", DifferenceConstraint.DCType.RESET) ], 5, [3]), (3, [ DifferenceConstraint("a", None, "Q", DifferenceConstraint.DCType.RESET) ], 4, [2]), (2, [], 3, []), (5, [ DifferenceConstraint("i", None, " 1 ", DifferenceConstraint.DCType.DEC) ], 2, [4]), (1, [ DifferenceConstraint("l", None, " 0 ", DifferenceConstraint.DCType.RESET) ], 2, [1]), (0, [ DifferenceConstraint("i", None, " 100 ", DifferenceConstraint.DCType.RESET) ], 1, [0]), (2, [], -1, []) ] AdaptEstimate.adapt_estimate(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) print( "The Reachability Bounds Expected for Vertices in Simple while are: [1, 1, 100, 100, 100] " ) # print("The Reachability Bounds Calculated for Vertices in This Graph are: ", bound_infer.get_weights()) # adapt_search = AdaptSearchAlgRefined(bound_infer.graph) # adapt_search.search_adapt() print("The Adaptivity Expected for Simple While Algorithm is: 100 ")
def if_ctldep(self): query = [1, 1, 1, 1] edges = [(0, 1), (1, 2), (1, 3)] weights = [AdaptType("INF")] * len(query) ctl_edges = [(0, 1), (1, 2), (2, 3), (2, 4), (3, 5), (4, 5)] transitions = [ (0, [ DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [0]), (0, [ DifferenceConstraint("z", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [1]), (0, [], 1, []), (0, [], 1, []), (0, [ DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [2]), (0, [ DifferenceConstraint("w", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [3]), ] AdaptEstimate.adapt_estimate(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) # bound_infer = self.ALG(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) # bound_infer.attach_weights() print( "The Reachability Bounds Expected for Vertices in If Branch with Control Dependency Graph are: [1, 1, 1, 1] " ) print( "The Adaptivity Expected for Mutli-path Dependency in If branch Algorithm is: 3 " )
def if_valdep(self): query = [1, 0, 1, 1] edges = [(0, 2), (1, 2), (1, 3)] weights = [AdaptType("INF")] * len(query) ctl_edges = [(0, 1), (1, 2), (2, 3), (2, 4), (3, 5), (4, 5)] transitions = [ (0, [ DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [0]), (0, [ DifferenceConstraint("z", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [1]), (0, [], 1, []), (0, [], 1, []), (0, [ DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [2]), (0, [ DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [3]), ] AdaptEstimate.adapt_estimate(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) print( "The Reachability Bounds Expected for Mutli-path Dependency in If branch Algorithm are: [1,1,1,1] " ) # adapt_search = AdaptSearchAlgRefined(bound_infer.graph) # adapt_search.search_adapt() print( "The Adaptivity Expected for Mutli-path Dependency in If branch Algorithm is: 2 " )
def while_valctldep(self): query = [1, 1, 1, 1] edges = [(0, 2), (0, 3), (1, 2), (2, 3), (3, 2)] weights = [AdaptType("INF")] * len(query) ctl_edges = [(3, 4), (2, 3), (4, 2), (1, 2), (0, 1), (2, 5)] transitions = [ (3, [ DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET) ], 4, [2]), (2, [], 3, []), (4, [ DifferenceConstraint("z", None, "Q", DifferenceConstraint.DCType.RESET) ], 2, [3]), (1, [ DifferenceConstraint("z", None, "Q", DifferenceConstraint.DCType.RESET) ], 2, [1]), (0, [ DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET) ], 1, [0]), (2, [], -1, []) ] AdaptEstimate.adapt_estimate(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) print( "The Reachability Bounds Expected for Vertices in While with Control and Value Dependency Overlapped are: [1, 1, INF, INF] " ) # print("The Reachability Bounds Calculated for Vertices in This Graph are: ", bound_infer.get_weights()) # adapt_search = AdaptSearchAlgRefined(bound_infer.graph) # adapt_search.search_adapt() print( "The Adaptivity Expected for While with Control and Value Dependency Overlapped Algorithm is: INF " )
def test_while_multipath_if(self): query = [0, 1, 0, 1, 1, 1] edges = [(0, 4), (1, 2), (1, 3), (2, 3), (3, 2), (3, 3)] weights = [AdaptType("INF")]*len(query) ctl_vertices_num = 4 ctl_edges = [(0, 1), (1, 2), (2, 3), (2, 3), (3, 1)] transitions = [ (0, [DifferenceConstraint("i", None, "k", DifferenceConstraint.DCType.RESET), DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET)], 1, [0, 1]), (1, [DifferenceConstraint("i", None, "1", DifferenceConstraint.DCType.DEC)], 2, [2]), (2, [DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET)], 3, [3]), (2, [DifferenceConstraint("y", None, "Q", DifferenceConstraint.DCType.RESET)], 3, [4]), (3, [DifferenceConstraint("x", None, "Q", DifferenceConstraint.DCType.RESET)], 2, [5]) ] is_scc = [False, True, True, True, True] bound_infer = self.ALG(Graph(edges, weights, query), TransitionGraph(ctl_edges, transitions)) bound_infer.attach_weights() print("The Reachability Bounds Expected for Vertices in the Multiple Path Simple While Graph are: [1, 1, k, k/2, k/2, k] ") print("The Reachability Bounds Calculated for Vertices in This Graph are: ", bound_infer.get_weights())
def __init__( self, graph=Graph(), transition_graph=TransitionGraph()) -> None: self.graph = graph self.transition_graph = transition_graph