class TestCase(unittest.TestCase): def setUp(self): self.config = SPSConfig() self.modulefactory = ModuleFactory(self.config) def tests3rfail(self): results = [] s3r = self.modulefactory.s3rmodule() logger.info("===============built===============") for t in range(4, 5): self.config.setParam("SCREEN_THICKNESS", t) ps = [] xs = [] std_xs = [] for v in [BoundedVariable("day", i) for i in interval(1, 365 * YEAR, 1)]: dose = v.get_value() / 365.0 * (s3r.getConstant("S3R_K").get_value() / self.config.getParam("SCREEN_THICKNESS").get_value()) # 阈值电压漂移 xs.append(dose) x = s3r.getConstant("S3R_DELTAV_THRESHOLD").get_value() / ( s3r.getConstant("S3R_B").get_value() * exp(s3r.getConstant("S3R_B").get_value() * dose)) std_x = (x - s3r.getConstant("S3R_A_MU").get_value()) / s3r.getConstant("S3R_A_SIGMA").get_value() p = 1 - pcf(std_x) ps.append(p) std_xs.append(std_x) logger.info("thickness={}, p_max={}".format(t, ps[-1])) results.append(ps) return results def get_parsed(self): constructor = ModelConstructor() model = constructor._parse("../../prism_model/smalltest.prism") return model # 测试同样的数据for parsed model def testparsing(self): parsed = self.get_parsed() days = range(1, YEAR * 365 + 1) s3r_mdl = parsed.get_module("S3R") results = [] logger.info("===============parsed===============") for thickness in range(4, 5): probs = [] parsed.setConstant("SCREEN_THICKNESS", thickness) for d in days: parsed.setVariable("day", d) fail_prob = s3r_mdl.commands["s3r_fail_cmd"].prob() probs.append(fail_prob) results.append(probs) logger.info("thickness={}, p_max={}".format(thickness, probs[-1])) return results def test_final(self): results_built = self.tests3rfail()[0] results_parsed = self.testparsing()[0] assert len(results_built) == len(results_parsed), "results array length not equal. " precision = 1e-6 for index, (v1, v2) in enumerate(zip(results_parsed, results_built)): assert fabs(v1 - v2) <= precision, "day={}, v1={}, v2={}".format(index+1, v1, v2)
class TestCase(unittest.TestCase): def setUp(self): self.config = SPSConfig() def testExport2PRISM(self): prismfileaddr = "/Users/bitbook/Documents/PostGradCourses/docrepo/hkht/NN/proj/prism_model/SYS.prism" self.config.export2prism(prismfileaddr)
def check(): config = SPSConfig() built = get_built_model() parsed = get_parsed_model() rslt1 = [] rslt2 = [] thickness = range(1, 10, 4) for t in thickness: config.setParam(THICKNESS, Constant(THICKNESS, t)) parsed.setConstant(THICKNESS, t) checker1 = get_checker(built, ltl, DURATION) checker2 = get_checker(parsed, ltl, DURATION) rslt1.append(checker1.run()) rslt2.append(checker2.run()) precision = 2e-2 for v1, v2 in zip(rslt1, rslt2): assert fabs(v1 - v2) < precision, "v1:{}, v2:{}".format(v1, v2)
class ModelFactory(object): module_factory = ModuleFactory(SPSConfig()) model_constructor = ModelConstructor() @classmethod def get_built(cls): def failurecondition(vs, cs): sb_status = vs['sb_status'].get_value() s3r_status = vs['s3r_status'].get_value() bcr_status = vs['bcr_status'].get_value() bdr_status = vs['bdr_status'].get_value() return (sb_status + s3r_status + bcr_status + bdr_status) < 4 labels = {} labels['failure'] = failurecondition model = ModulesFile(ModelType.DTMC, failureCondition=failurecondition, stopCondition=failurecondition, modules=[ cls.module_factory.timermodule(), cls.module_factory.s3rmodule(), cls.module_factory.sbmodule(), cls.module_factory.bcrmodule(), cls.module_factory.bdrmodule() ], labels=labels) model._constants[ 'SCREEN_THICKNESS'] = cls.module_factory.config.getParam( 'SCREEN_THICKNESS') model.duration = 730 return model @classmethod def setParam(cls, name, value): if name not in cls.module_factory.config.params.keys(): return cls.module_factory.config.setParam(name, value) @classmethod def get_parsed(cls, duration=730): sep = get_sep() mdl_dir = sep.join((get_proj_dir(), 'prism_model', 'smalltest.prism')) model = cls.model_constructor._parse(mdl_dir) model.duration = duration return model
class ModelFactory(object): module_factory = ModuleFactory(SPSConfig()) @classmethod def get_built(cls): def failurecondition(vs, cs): result = vs['sb_status'] == 0 or vs['s3r_status'] == 0 or vs[ "bcr_status"] == 0 or vs["bdr_status"] == 0 return result def upcondition(vs, cs): return not failurecondition(vs, cs) labels = {} labels['failure'] = failurecondition labels['up'] = upcondition model = ModulesFile(ModelType.DTMC, failureCondition=failurecondition, stopCondition=failurecondition, modules=[ cls.module_factory.timermodule(), cls.module_factory.s3rmodule(), cls.module_factory.sbmodule(), cls.module_factory.bcrmodule(), cls.module_factory.bdrmodule() ], labels=labels) model.constants[ 'SCREEN_THICKNESS'] = cls.module_factory.config.getParam( 'SCREEN_THICKNESS') return model @staticmethod def get_parsed(): sep = get_sep() mdl_dir = sep.join((get_proj_dir(), 'prism_model', 'smalltest.prism')) return ModelConstructor().parseModelFile(mdl_dir)
def setUp(self): self.config = SPSConfig() self.modulefactory = ModuleFactory(self.config)
timer_turn = Variable('timer_turn', True, set([True, False]), bool, True) timer.addVariable(day) timer.addVariable(timer_turn) def incdayaction(vs, cs): vs['day'].setValue(vs['day'].getValue() + 1) vs['timer_turn'].setValue(False) inc_day = Command( 'inc day', lambda vs, cs: vs['timer_turn'] == True and vs['day'] <= timer. getConstant('TIME_LIMIT').getValue(), incdayaction, timer, 1.0) timer.addCommand(inc_day) config = SPSConfig() # solar battery module of the system sb = Module("solar battery module") # set initial value None to denote uncertainty screenthick = Constant('SCREEN_THICKNESS', None) sb.addConstant(screenthick) # the dose of one year: dose = K_SB * thickness sb.addConstant(config.getParam("SB_K")) sb.addConstant(config.getParam("SB_B")) sb.addConstant(config.getParam("SB_P_THRESHOLD")) sb.addConstant(config.getParam("SB_A_MU")) sb.addConstant(config.getParam("SB_A_SIGMA")) # variables
def setUp(self): if not hasattr(self, 'model'): self.model = ModelFactory(ModuleFactory(SPSConfig())).get_built() self.paths = 120 self.length = 730
def setUp(self): self.config = SPSConfig()