#!/usr/bin/env python # # Copyright (c) 2015-2019 Artur Meski # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # from rs import * from smt import * from logics import * from rsltl_shortcuts import * from itertools import chain, combinations import sys import resource def generate_system(chainLen, maxConc): """ This function generates the reaction system with concentrations for the scalable chain benchmark chainLen is the length of the chain maxConc is the maximal concentration """ r = ReactionSystemWithConcentrations() r.add_bg_set_entity(("inc",1)) r.add_bg_set_entity(("dec",1)) for i in range(1,chainLen+1): r.add_bg_set_entity(("e_" + str(i),maxConc)) for i in range(1,chainLen+1): ent = "e_" + str(i) r.add_reaction_inc(ent, "inc", [(ent, 1)],[(ent,maxConc)]) r.add_reaction_dec(ent, "dec", [(ent, 1)],[]) if i < chainLen: r.add_reaction([(ent,maxConc)],[],[("e_"+str(i+1),1)]) r.add_reaction([("e_" + str(chainLen),maxConc)],[("dec",1)],[("e_" + str(chainLen),maxConc)]) c = ContextAutomatonWithConcentrations(r) c.add_init_state("init") c.add_state("working") c.add_transition("init", [("e_1",1),("inc",1)], "working") c.add_transition("working", [("inc",1)], "working") rc = ReactionSystemWithAutomaton(r,c) return rc def generate_formula(formula_number, chainLen, maxConc): """ This function generates the rsLTL formula corresponding to the formula_number parameter """ if formula_number == 1: ret = Formula_rsLTL.f_F( BagDescription.f_entity("inc") > 0, (BagDescription.f_entity('e_'+str(chainLen)) >= maxConc) ) elif formula_number == 2: f_tmp = Formula_rsLTL.f_F( BagDescription.f_entity("inc") > 0, (BagDescription.f_entity('e_'+str(chainLen)) == maxConc) ) for i in range(chainLen-1,0,-1): f_tmp = Formula_rsLTL.f_F( BagDescription.f_entity("inc") > 0, f_tmp & (BagDescription.f_entity('e_'+str(i)) == maxConc) ) ret = f_tmp elif formula_number == 3: ret = Formula_rsLTL.f_G( BagDescription.f_TRUE(), Formula_rsLTL.f_Implies( (BagDescription.f_entity('e_1') == 1), Formula_rsLTL.f_F( BagDescription.f_entity("inc") > 0, (BagDescription.f_entity('e_'+str(chainLen)) == maxConc) ) ) ) elif formula_number == 4: ret = Formula_rsLTL.f_F( BagDescription.f_entity("inc") > 0 , BagDescription.f_entity('e_1') == maxConc ) elif formula_number == 5: ret = Formula_rsLTL.f_X(BagDescription.f_TRUE(), Formula_rsLTL.f_U( BagDescription.f_entity("inc") > 0 , BagDescription.f_entity('e_1') > 0, BagDescription.f_entity('e_2') > 0 ) ) else: ret = None assert ret is not None, "Unknown formula" return ret def save_statistics(smt_rsc, formula_number, chainLen, maxConc): """ Saves the statistics fetched from smt_rsc into files """ time=0 mem_usage=resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/(1024*1024) filename_t="bench_rsc_F" + str(formula_number) + "_time.log" filename_m="bench_rsc_F" + str(formula_number) + "_mem.log" time=smt_rsc.get_verification_time() f=open(filename_t, 'a') log_str="(" + str(chainLen) + "," + str(maxConc) + "," + str(time) + ")\n" f.write(log_str) f.close() f=open(filename_m, 'a') log_str="(" + str(chainLen) + "," + str(maxConc) + "," + str(mem_usage) + ")\n" f.write(log_str) f.close() def scalable_chain(print_system=False): """ This is the entry point for the benchmark """ if len(sys.argv) < 1+3: print("arguments: ") exit(1) chainLen=int(sys.argv[1]) # chain length maxConc=int(sys.argv[2]) # depth (max concentration) formula_number=int(sys.argv[3]) if chainLen < 1 or maxConc < 1: print("be reasonable") exit(1) if not formula_number in range(1,5+1): print("formulaNumber must be in 1..5") exit(1) # Generate the reaction systems with concentrations rc = generate_system(chainLen, maxConc) # Generate the formula form = generate_formula(formula_number, chainLen, maxConc) # Optional dump/print of the system if print_system: rc.show() # Create an instance of the SMT checker for RS with concentrations smt_rsc = SmtCheckerRSC(rc) # Start the verification process smt_rsc.check_rsltl(formula=form) save_statistics(smt_rsc, formula_number, chainLen, maxConc) def main(): scalable_chain(print_system=True) if __name__ == "__main__": main()