def __init__(self): threading.Thread.__init__(self) self._observation_store = ObservationStore() self._trigger_condition = threading.Condition() self.p = Problem() self.solver_list = [ 'hst-picosat', 'hst-cache-picosat', 'hst-ci-picosat', 'hst-ci-cache-picosat', 'hsdag-picosat', 'hsdag-cache-picosat', 'hsdag-ci-picosat', 'hsdag-ci-cache-picosat', 'hsdag-sicf-picosat', 'hsdag-sicf-cache-picosat' ] self.o = TUGDescriptionOracle() self._observer_sub = rospy.Subscriber("/observers/info", observer_info, self.observer_callback) self._diagnosis_pub = rospy.Publisher('/diagnosis', diagnosis_set, queue_size=10) self._service = rospy.Service( 'diagnosis_configuration_change', DiagnosisConfiguration, self.handle_diagnosis_configuration_change)
signal.signal(signal.SIGINT, terminate) signal.signal(signal.SIGALRM, terminate) signal.signal(signal.SIGTERM, terminate) algorithm = str(sys.argv[1]) max_card = int(sys.argv[2]) prune = bool(sys.argv[3]) max_time = int(sys.argv[4]) input = sys.stdin.readline() scs = read_sets(input.strip()) description = Description(scs) try: p = Problem() result = p.compute_with_description(description, algorithm, prune=prune, max_time=max_time, max_card=max_card) hs = result.get_diagnoses() stats = result.get_stats() stats['num_hs'] = len(hs) stats['num_cs'] = len(description.scs) stats['num_min_cs'] = len(minimize_sets(description.scs)) signal.signal(signal.SIGHUP, signal.SIG_IGN) signal.signal(signal.SIGINT, signal.SIG_IGN) signal.signal(signal.SIGALRM, signal.SIG_IGN) signal.signal(signal.SIGTERM, signal.SIG_IGN) print write_sets(hs) print str(stats)
signal.signal(signal.SIGTERM, terminate) algorithm = str(sys.argv[1]) max_card = int(sys.argv[2]) prune = bool(sys.argv[3]) max_time = int(sys.argv[4]) input = sys.stdin.readline().strip() spec = eval(input) if len(sys.argv) > 5 and bool(sys.argv[5]): description = IscasOracleOld(*spec) else: description = IscasOracle(*spec) try: p = Problem() result = p.compute_with_description(description, algorithm, prune=prune, max_time=max_time, max_card=max_card) hs = result.get_diagnoses() stats = result.get_stats() stats['num_hs'] = len(hs) stats['num_cs'] = len(description.scs) stats['num_min_cs'] = len(minimize_sets(description.scs)) signal.signal(signal.SIGHUP, signal.SIG_IGN) signal.signal(signal.SIGINT, signal.SIG_IGN) signal.signal(signal.SIGALRM, signal.SIG_IGN) signal.signal(signal.SIGTERM, signal.SIG_IGN)
class Diagnosis(threading.Thread): def __init__(self): threading.Thread.__init__(self) self._observation_store = ObservationStore() self._trigger_condition = threading.Condition() self.p = Problem() self.solver_list = [ 'hst-picosat', 'hst-cache-picosat', 'hst-ci-picosat', 'hst-ci-cache-picosat', 'hsdag-picosat', 'hsdag-cache-picosat', 'hsdag-ci-picosat', 'hsdag-ci-cache-picosat', 'hsdag-sicf-picosat', 'hsdag-sicf-cache-picosat' ] self.o = TUGDescriptionOracle() self._observer_sub = rospy.Subscriber("/observers/info", observer_info, self.observer_callback) self._diagnosis_pub = rospy.Publisher('/diagnosis', diagnosis_set, queue_size=10) self._service = rospy.Service( 'diagnosis_configuration_change', DiagnosisConfiguration, self.handle_diagnosis_configuration_change) def observer_callback(self, observations): for obs in observations.observation_infos: # print obs self._observation_store.add_observation(obs.type, obs.resource, obs.observation, obs.header.stamp) if self._observation_store.has_changed(): self._trigger_condition.acquire() self._trigger_condition.notify_all() self._trigger_condition.release() def handle_diagnosis_configuration_change(self, req): action = req.action config = req.config if action == DiagnosisConfigurationRequest.ADD: result = self.o.net_generator.add_config(config) elif action == DiagnosisConfigurationRequest.REMOVE: result = self.o.net_generator.remove_config(config) elif action == DiagnosisConfigurationRequest.SET: result = self.o.net_generator.set_config(config) elif action == DiagnosisConfigurationRequest.UPDATE: result = self.o.net_generator.update_config(config) else: return DiagnosisConfigurationResponse( errorcode=DiagnosisConfigurationResponse.GENERAL_ERROR, error_msg='unknown action') self.o.setup = False return result def run(self): while not rospy.is_shutdown(): self._trigger_condition.acquire() self._trigger_condition.wait() try: observations = self._observation_store.get_observations() except ValueError as e: rospy.logerr(e) continue # check if all observations are valid if all([j for (i, j) in observations]): continue self._trigger_condition.release() self.o.observations = observations r = self.p.compute_with_description(self.o, self.solver_list[6]) d = r.get_diagnoses() d = map(self.o.numbers_to_nodes, d) corrupt_nodes = [] msg = diagnosis_set() msg.header = Header(stamp=rospy.Time.now()) msg.type = self.solver_list[6] for diag in d: diagnosis_entry = diagnosis() corrupt_set = [] for node in diag: if not self.o.is_real_node(node): continue corrupt_set.append(node) attr = resource_mode_assignement() attr.resource = node attr.mode_msg = "'%s' seems to be corrupt!" % node attr.mode = attr.GENERAL_ERROR diagnosis_entry.diagnosis.append(attr) corrupt_nodes.append(corrupt_set) msg.diagnoses.append(diagnosis_entry) self._diagnosis_pub.publish(msg) rospy.loginfo("new diagnosis done in " + str(r.get_stats()['total_time']) + " with '" + str(self.solver_list[6]) + "':") for corrupt_node in corrupt_nodes: rospy.loginfo(str(corrupt_node)) if not len(corrupt_nodes): rospy.loginfo('no solution')
#!/usr/bin/env python from pymbd.diagnosis.problem import Problem from pymbd.benchmark.iscas.oracle import IscasOracle from pymbd.util.sethelper import write_sets o = IscasOracle('benchmarks/iscas-data/c17.sisc', [0, 1, 1, 1, 1], [1, 1]) p = Problem() r = p.compute_with_description(o, 'hsdag-yices', max_card=2) d = r.get_diagnoses() d = map(o.numbers_to_gates, d) print write_sets(d) print r.get_stats()['total_time']