def __init__(self, logic='FirstOrderLogic', grammar='PRACGrammar', mlnfile=None): # instantiate the logic and grammar logic_str = '%s("%s", self)' % (logic, grammar) self.logic = eval(logic_str) logger.debug('Creating MLN with %s syntax and %s semantics' % (grammar, logic)) self._predicates = { } # maps from predicate name to the predicate instance self.domains = {} # maps from domain names to list of values self._formulas = [] # list of MLNFormula instances self.domain_decls = [] self.weights = [] self.fixweights = [] self.vars = {} self._unique_templvars = [] self._probreqs = [] self._materialized = False self.fuzzypreds = [ ] # for saving fuzzy predicates that have been converted to binary preds if mlnfile is not None: MLN.load(mlnfile, logic=logic, grammar=grammar, mln=self) return self.closedWorldPreds = [] self.formulaGroups = [] self.templateIdx2GroupIdx = {} self.posteriorProbReqs = [] self.watch = StopWatch()
def __init__(self, logic='FirstOrderLogic', grammar='PRACGrammar', mlnfile=None): # instantiate the logic and grammar logic_str = '%s("%s", self)' % (logic, grammar) self.logic = eval(logic_str) logger.debug('Creating MLN with %s syntax and %s semantics' % (grammar, logic)) self._predicates = {} # maps from predicate name to the predicate instance self.domains = {} # maps from domain names to list of values self._formulas = [] # list of MLNFormula instances self.domain_decls = [] self.weights = [] self.fixweights = [] self.vars = {} self._unique_templvars = [] self._probreqs = [] self._materialized = False self.fuzzypreds = [] # for saving fuzzy predicates that have been converted to binary preds if mlnfile is not None: MLN.load(mlnfile, logic=logic, grammar=grammar, mln=self) return self.closedWorldPreds = [] self.formulaGroups = [] self.templateIdx2GroupIdx = {} self.posteriorProbReqs = [] # self.parameterType = parameterType # self.probabilityFittingInferenceMethod = InferenceMethods.Exact # self.probabilityFittingThreshold = 0.002 # maximum difference between desired and computed probability # self.probabilityFittingMaxSteps = 20 # maximum number of steps to run iterative proportional fitting # self.defaultInferenceMethod = defaultInferenceMethod # self.allSoft = False self.watch = StopWatch()
def __init__(self, mln_, dbs, method, **params): ''' :param dbs: list of :class:`mln.database.Database` objects to be used for learning. :param mln_: the MLN object to be used for learning :param method: the algorithm to be used for learning. Must be a class provided by :class:`mln.methods.LearningMethods`. :param **params: additional parameters handed over to the base learners. ''' self.dbs = dbs self._params = edict(params) if not mln_._materialized: self.mln = mln_.materialize(*dbs) else: self.mln = mln_ self.watch = StopWatch() self.learners = [None] * len(dbs) self.watch.tag('setup learners', verbose=self.verbose) if self.verbose: bar = ProgressBar(steps=len(dbs), color='green') if self.multicore: pool = Pool(maxtasksperchild=1) logger.debug( 'Setting up multi-core processing for {} cores'.format( pool._processes)) try: for i, learner in pool.imap(with_tracing(_setup_learner), self._iterdbs(method)): self.learners[i] = learner if self.verbose: bar.label('Database %d, %s' % ((i + 1), learner.name)) bar.inc() except Exception as e: logger.error('Error in child process. Terminating pool...') pool.close() raise e finally: pool.terminate() pool.join() # as MLNs and formulas have been copied to the separate processes, # the mln pointers of the formulas now point to the MLNs in these child processes # we have to copy the materialized weight back to our parent process self.mln.weights = list(first(self.learners).mrf.mln.weights) else: for i, db in enumerate(self.dbs): _, learner = _setup_learner( (i, self.mln, db, method, self._params + { 'multicore': False })) self.learners[i] = learner if self.verbose: bar.label('Database %d, %s' % ((i + 1), learner.name)) bar.inc() if self.verbose: print 'set up', self.name self.watch.finish('setup learners')
def __init__(self, mrf, queries=ALL, **params): self.mrf = mrf self.mln = mrf.mln self._params = edict(params) if not queries: self.queries = [ self.mln.logic.gnd_lit(ga, negated=False, mln=self.mln) for ga in self.mrf.gndatoms if self.mrf.evidence[ga.idx] is None ] else: # check for single/multiple query and expand if type(queries) is not list: queries = [queries] self.queries = self._expand_queries(queries) # fill in the missing truth values of variables that have only one remaining value for variable in self.mrf.variables: if variable.valuecount(self.mrf.evidence_dicti( )) == 1: # the var is fully determined by the evidence for _, value in variable.itervalues(self.mrf.evidence): break self.mrf.set_evidence(variable.value2dict(value), erase=False) # apply the closed world assumptions to the explicitly specified predicates if self.cwpreds: for pred in self.cwpreds: if isinstance(self.mln.predicate(pred), SoftFunctionalPredicate): if self.verbose: logger.warning( 'Closed world assumption will be applied to soft functional predicate %s' % pred) elif isinstance(self.mln.predicate(pred), FunctionalPredicate): raise Exception( 'Closed world assumption is inapplicable to functional predicate %s' % pred) for gndatom in self.mrf.gndatoms: if gndatom.predname != pred: continue if self.mrf.evidence[gndatom.idx] is None: self.mrf.evidence[gndatom.idx] = 0 # apply the closed world assumption to all remaining ground atoms that are not in the queries if self.closedworld: qpreds = set() for q in self.queries: qpreds.update(q.prednames()) for gndatom in self.mrf.gndatoms: if isinstance(self.mln.predicate(gndatom.predname), FunctionalPredicate) \ or isinstance(self.mln.predicate(gndatom.predname), SoftFunctionalPredicate): continue if gndatom.predname not in qpreds and self.mrf.evidence[ gndatom.idx] is None: self.mrf.evidence[gndatom.idx] = 0 for var in self.mrf.variables: if isinstance(var, FuzzyVariable): var.consistent(self.mrf.evidence, strict=True) self._watch = StopWatch()
def __init__(self, mln_, dbs, method, **params): ''' :param dbs: list of :class:`mln.database.Database` objects to be used for learning. :param mln_: the MLN object to be used for learning :param method: the algorithm to be used for learning. Must be a class provided by :class:`mln.methods.LearningMethods`. :param **params: additional parameters handed over to the base learners. ''' self.dbs = dbs self._params = edict(params) if not mln_._materialized: self.mln = mln_.materialize(*dbs) else: self.mln = mln_ self.watch = StopWatch() self.learners = [None] * len(dbs) self.watch.tag('setup learners', verbose=self.verbose) if self.verbose: bar = ProgressBar(width=100, steps=len(dbs), color='green') if self.multicore: pool = Pool(maxtasksperchild=1) logger.debug('Setting up multi-core processing for %d cores' % pool._processes) for i, learner in pool.imap(with_tracing(_setup_learner), self._iterdbs(method)): self.learners[i] = learner if self.verbose: bar.label('Database %d, %s' % ((i + 1), learner.name)) bar.inc() pool.close() pool.join() else: for i, db in enumerate(self.dbs): _, learner = _setup_learner( (i, self.mln, db, method, self._params + { 'multicore': False })) self.learners[i] = learner if self.verbose: bar.label('Database %d, %s' % ((i + 1), learner.name)) bar.inc() if self.verbose: print 'set up', self.name self.watch.finish('setup learners')
def __init__(self, mrf, simplify=False, unsatfailure=False, formulas=None, cache=auto, **params): self.mrf = mrf self.formulas = ifNone(formulas, list(self.mrf.formulas)) self.total_gf = 0 for f in self.formulas: self.total_gf += f.countgroundings(self.mrf) self.grounder = None self._cachesize = CACHE_SIZE if cache is auto else cache self._cache = None self.__cacheinit = False self.__cachecomplete = False self._params = params self.watch = StopWatch() self.simplify = simplify self.unsatfailure = unsatfailure
def run(self): ''' Run the MLN learning with the given parameters. ''' # load the MLN if isinstance(self.mln, MLN): mln = self.mln else: raise Exception('No MLN specified') # load the training databases if type(self.db) is list and all( [isinstance(e, Database) for e in self.db]): dbs = self.db elif isinstance(self.db, Database): dbs = [self.db] elif isinstance(self.db, str): db = self.db if db is None or not db: raise Exception('no trainig data given!') dbpaths = [os.path.join(self.directory, 'db', db)] dbs = [] for p in dbpaths: dbs.extend(Database.load(mln, p, self.ignore_unknown_preds)) else: raise Exception( 'Unexpected type of training databases: %s' % type(self.db)) if self.verbose: print(('loaded %d database(s).' % len(dbs))) watch = StopWatch() if self.verbose: confg = dict(self._config) confg.update(eval("dict(%s)" % self.params)) if type(confg.get('db', None)) is list: confg['db'] = '%d Databases' % len(confg['db']) print((tabulate( sorted(list(confg.items()), key=lambda key_v: str(key_v[0])), headers=('Parameter:', 'Value:')))) params = dict([(k, getattr(self, k)) for k in ( 'multicore', 'verbose', 'profile', 'ignore_zero_weight_formulas')]) # for discriminative learning if issubclass(self.method, DiscriminativeLearner): if self.discr_preds == QUERY_PREDS: # use query preds params['qpreds'] = self.qpreds elif self.discr_preds == EVIDENCE_PREDS: # use evidence preds params['epreds'] = self.epreds # gaussian prior settings if self.use_prior: params['prior_mean'] = self.prior_mean params['prior_stdev'] = self.prior_stdev # expand the parameters params.update(self.params) if self.profile: prof = Profile() print('starting profiler...') prof.enable() else: prof = None # set the debug level olddebug = logger.level logger.level = eval('logs.%s' % params.get('debug', 'WARNING').upper()) mlnlearnt = None try: # run the learner mlnlearnt = mln.learn(dbs, self.method, **params) if self.verbose: print() print(headline('LEARNT MARKOV LOGIC NETWORK')) print() mlnlearnt.write() except SystemExit: print('Cancelled...') finally: if self.profile: prof.disable() print(headline('PROFILER STATISTICS')) ps = pstats.Stats(prof, stream=sys.stdout).sort_stats( 'cumulative') ps.print_stats() # reset the debug level logger.level = olddebug print() watch.finish() watch.printSteps() return mlnlearnt
def run(self): watch = StopWatch() watch.tag('inference', self.verbose) # load the MLN if isinstance(self.mln, MLN): mln = self.mln else: raise Exception('No MLN specified') if self.use_emln and self.emln is not None: mlnstrio = io.StringIO() mln.write(mlnstrio) mlnstr = mlnstrio.getvalue() mlnstrio.close() emln = self.emln mln = parse_mln(mlnstr + emln, grammar=self.grammar, logic=self.logic) # load the database if isinstance(self.db, Database): db = self.db elif isinstance(self.db, list) and len(self.db) == 1: db = self.db[0] elif isinstance(self.db, list) and len(self.db) == 0: db = Database(mln) elif isinstance(self.db, list): raise Exception( 'Got {} dbs. Can only handle one for inference.'.format( len(self.db))) else: raise Exception('DB of invalid format {}'.format(type(self.db))) # expand the # parameters params = dict(self._config) if 'params' in params: params.update(eval("dict(%s)" % params['params'])) del params['params'] params['verbose'] = self.verbose if self.verbose: print((tabulate(sorted(list(params.items()), key=lambda k_v: str(k_v[0])), headers=('Parameter:', 'Value:')))) if type(db) is list and len(db) > 1: raise Exception('Inference can only handle one database at a time') elif type(db) is list: db = db[0] params['cw_preds'] = [x for x in self.cw_preds if bool(x)] # extract and remove all non-algorithm for s in GUI_SETTINGS: if s in params: del params[s] if self.profile: prof = Profile() print('starting profiler...') prof.enable() # set the debug level olddebug = logger.level logger.level = (eval('logs.%s' % params.get('debug', 'WARNING').upper())) result = None try: mln_ = mln.materialize(db) mrf = mln_.ground(db) inference = self.method(mrf, self.queries, **params) if self.verbose: print() print((headline('EVIDENCE VARIABLES'))) print() mrf.print_evidence_vars() result = inference.run() if self.verbose: print() print((headline('INFERENCE RESULTS'))) print() inference.write() if self.verbose: print() inference.write_elapsed_time() except SystemExit: traceback.print_exc() print('Cancelled...') finally: if self.profile: prof.disable() print((headline('PROFILER STATISTICS'))) ps = pstats.Stats(prof, stream=sys.stdout).sort_stats('cumulative') ps.print_stats() # reset the debug level logger.level = olddebug if self.verbose: print() watch.finish() watch.printSteps() return result
def run(self): watch = StopWatch() watch.tag('inference', self.verbose) # load the MLN if isinstance(self.mln, MLN): mln = self.mln else: raise Exception('No MLN specified') if self.use_emln and self.emln is not None: mlnstr = StringIO.StringIO() mln.write(mlnstr) mlnstr.close() mlnstr = str(mlnstr) emln = self.emln mln = parse_mln(mlnstr + emln, grammar=self.grammar, logic=self.logic) # load the database if isinstance(self.db, Database): db = self.db elif isinstance(self.db, list) and len(self.db) == 1: db = self.db[0] elif isinstance(self.db, list): raise Exception( 'Got {} dbs. Can only handle one for inference.'.format( len(self.db))) else: raise Exception('DB of invalid format {}'.format(type(self.db))) # expand the # parameters params = dict(self._config) if 'params' in params: params.update(eval("dict(%s)" % params['params'])) del params['params'] if self.verbose: print tabulate(sorted(list(params.viewitems()), key=lambda (k, v): str(k)), headers=('Parameter:', 'Value:')) # create the MLN and evidence database and the parse the queries # mln = parse_mln(modelstr, searchPath=self.dir.get(), logic=self.config['logic'], grammar=self.config['grammar']) # db = parse_db(mln, db_content, ignore_unknown_preds=params.get('ignore_unknown_preds', False)) if type(db) is list and len(db) > 1: raise Exception('Inference can only handle one database at a time') elif type(db) is list: db = db[0] # parse non-atomic params # if type(self.queries) is not list: # queries = parse_queries(mln, str(self.queries)) params['cw_preds'] = filter(lambda x: bool(x), self.cw_preds) # extract and remove all non-algorithm for s in GUI_SETTINGS: if s in params: del params[s] if self.profile: prof = Profile() print 'starting profiler...' prof.enable() # set the debug level olddebug = praclog.level() praclog.level( eval('logging.%s' % params.get('debug', 'WARNING').upper())) result = None try: mln_ = mln.materialize(db) mrf = mln_.ground(db) inference = self.method(mrf, self.queries, **params) if self.verbose: print print headline('EVIDENCE VARIABLES') print mrf.print_evidence_vars() result = inference.run() if self.verbose: print print headline('INFERENCE RESULTS') print inference.write() if self.verbose: print inference.write_elapsed_time() except SystemExit: print 'Cancelled...' finally: if self.profile: prof.disable() print headline('PROFILER STATISTICS') ps = pstats.Stats(prof, stream=sys.stdout).sort_stats('cumulative') ps.print_stats() # reset the debug level praclog.level(olddebug) if self.verbose: print watch.finish() watch.printSteps() return result