Module pymake.frontend.manager
Source code
import sys, os
import inspect
# Model Manager Utilities
import numpy as np
from numpy import ma
# Frontend Manager Utilities
from .frontend import DataBase
from pymake import Model, Corpus, GramExp
import pymake.io as io
import logging
class FrontendManager(object):
""" Utility Class who aims at mananing/Getting the datastructure at the higher level.
Parameters
----------
get: return a frontend object.
load: return a frontend object where data are
loaded and filtered (sampled...) according to expe.
"""
log = logging.getLogger('root')
@classmethod
def load(cls, expe):
""" Return the frontend suited for the given expe"""
corpus_name = expe.get('corpus') or expe.get('random') or expe.get('concept')
if expe.get('driver'):
corpus_name += '.' + expe.driver.strip('.')
if '.' in corpus_name:
c_split = corpus_name.split('.')
c_name, c_ext = '.'.join(c_split[:-1]), c_split[-1]
else:
c_name = corpus_name
c_ext = None
_corpus = Corpus.get(c_name)
if c_ext in GramExp._frontend_ext:
# graph-tool object
# @Todo: Corpus integration!
if not _corpus:
dt_lut = {'gt':'network'}
_corpus = dict(data_type = dt_lut[c_ext])
_corpus.update(data_format=c_ext)
elif _corpus is False:
raise ValueError('Unknown Corpus `%s\'!' % c_name)
elif _corpus is None:
return None
if _corpus['data_type'] == 'text':
from .frontendtext import frontendText
frontend = frontendText(expe)
elif _corpus['data_type'] == 'network':
if _corpus.get('data_format') == 'gt':
from .frontendnetwork import frontendNetwork_gt
frontend = frontendNetwork_gt.from_expe(expe, corpus=_corpus)
else:
from .frontendnetwork import frontendNetwork
# Obsolete loading design. @Todo
frontend = frontendNetwork(expe)
frontend.load_data(randomize=False)
if hasattr(frontend, 'configure'):
frontend.configure()
return frontend
class ModelManager(object):
""" Utility Class for Managing I/O and debugging Models
Notes
-----
This class is more a wrapper or a **Meta-Model**.
"""
log = logging.getLogger('root')
def __init__(self, expe=None):
self.expe = expe
def is_model(self, m, _type):
if _type == 'pymake':
# __init__ method should be of type (expe, frontend, ...)
pmk = inspect.signature(m).parameters.keys()
score = []
for wd in ('frontend', 'expe'):
score.append(wd in pmk)
return all(score)
else:
raise ValueError('Model type unkonwn: %s' % _type)
def _get_model(self, frontend=None):
''' Get model with lookup in the following order :
* pymake.model
* mla
* scikit-learn
'''
_model = Model.get(self.expe.model)
if not _model:
self.log.error('Model Unknown : %s' % (self.expe.model))
raise NotImplementedError(self.expe.model)
# @Improve: * initialize all model with expe
# * fit with frontend, transform with frontend (as sklearn do)
if self.is_model(_model, 'pymake'):
model = _model(self.expe, frontend)
else:
model = _model(self.expe)
return model
@classmethod
def _load_model(cls, fn):
_fn = io.resolve_filename(fn)
if not os.path.isfile(_fn):
# io integration?
_fn += '.gz'
if not os.path.isfile(_fn) or os.stat(_fn).st_size == 0:
cls.log.error('No file for this model : %s' %_fn)
cls.log.debug('The following are available :')
for f in GramExp.model_walker(os.path.dirname(_fn), fmt='list'):
cls.log.debug(f)
return
cls.log.info('Loading Model: %s' % fn)
model = io.load(fn, silent=True)
return model
@staticmethod
def update_expe(expe, model):
''' Configure some pymake settings if present in model. '''
pmk_settings = ['_csv_typo', '_fmt']
for _set in pmk_settings:
if getattr(model, _set, None) and not expe.get(_set):
expe[_set] = getattr(model, _set)
@classmethod
def from_expe(cls, expe, frontend=None, load=False):
# frontend params is deprecated and will be removed soon...
if load is False:
mm = cls(expe)
model = mm._get_model(frontend)
else:
fn = expe._output_path
model = cls._load_model(fn)
cls.update_expe(expe, model)
return model
Classes
class FrontendManager (*args, **kwargs)
-
Utility Class who aims at mananing/Getting the datastructure at the higher level.
Parameters
- get: return a frontend object.
load
:return
a
frontend
object
where
data
are
- loaded and filtered (sampled…) according to expe.
Source code
class FrontendManager(object): """ Utility Class who aims at mananing/Getting the datastructure at the higher level. Parameters ---------- get: return a frontend object. load: return a frontend object where data are loaded and filtered (sampled...) according to expe. """ log = logging.getLogger('root') @classmethod def load(cls, expe): """ Return the frontend suited for the given expe""" corpus_name = expe.get('corpus') or expe.get('random') or expe.get('concept') if expe.get('driver'): corpus_name += '.' + expe.driver.strip('.') if '.' in corpus_name: c_split = corpus_name.split('.') c_name, c_ext = '.'.join(c_split[:-1]), c_split[-1] else: c_name = corpus_name c_ext = None _corpus = Corpus.get(c_name) if c_ext in GramExp._frontend_ext: # graph-tool object # @Todo: Corpus integration! if not _corpus: dt_lut = {'gt':'network'} _corpus = dict(data_type = dt_lut[c_ext]) _corpus.update(data_format=c_ext) elif _corpus is False: raise ValueError('Unknown Corpus `%s\'!' % c_name) elif _corpus is None: return None if _corpus['data_type'] == 'text': from .frontendtext import frontendText frontend = frontendText(expe) elif _corpus['data_type'] == 'network': if _corpus.get('data_format') == 'gt': from .frontendnetwork import frontendNetwork_gt frontend = frontendNetwork_gt.from_expe(expe, corpus=_corpus) else: from .frontendnetwork import frontendNetwork # Obsolete loading design. @Todo frontend = frontendNetwork(expe) frontend.load_data(randomize=False) if hasattr(frontend, 'configure'): frontend.configure() return frontend
Class variables
var log
Static methods
def load(expe)
-
Return the frontend suited for the given expe
Source code
@classmethod def load(cls, expe): """ Return the frontend suited for the given expe""" corpus_name = expe.get('corpus') or expe.get('random') or expe.get('concept') if expe.get('driver'): corpus_name += '.' + expe.driver.strip('.') if '.' in corpus_name: c_split = corpus_name.split('.') c_name, c_ext = '.'.join(c_split[:-1]), c_split[-1] else: c_name = corpus_name c_ext = None _corpus = Corpus.get(c_name) if c_ext in GramExp._frontend_ext: # graph-tool object # @Todo: Corpus integration! if not _corpus: dt_lut = {'gt':'network'} _corpus = dict(data_type = dt_lut[c_ext]) _corpus.update(data_format=c_ext) elif _corpus is False: raise ValueError('Unknown Corpus `%s\'!' % c_name) elif _corpus is None: return None if _corpus['data_type'] == 'text': from .frontendtext import frontendText frontend = frontendText(expe) elif _corpus['data_type'] == 'network': if _corpus.get('data_format') == 'gt': from .frontendnetwork import frontendNetwork_gt frontend = frontendNetwork_gt.from_expe(expe, corpus=_corpus) else: from .frontendnetwork import frontendNetwork # Obsolete loading design. @Todo frontend = frontendNetwork(expe) frontend.load_data(randomize=False) if hasattr(frontend, 'configure'): frontend.configure() return frontend
class ModelManager (expe=None)
-
Utility Class for Managing I/O and debugging Models
Notes
This class is more a wrapper or a Meta-Model.
Source code
class ModelManager(object): """ Utility Class for Managing I/O and debugging Models Notes ----- This class is more a wrapper or a **Meta-Model**. """ log = logging.getLogger('root') def __init__(self, expe=None): self.expe = expe def is_model(self, m, _type): if _type == 'pymake': # __init__ method should be of type (expe, frontend, ...) pmk = inspect.signature(m).parameters.keys() score = [] for wd in ('frontend', 'expe'): score.append(wd in pmk) return all(score) else: raise ValueError('Model type unkonwn: %s' % _type) def _get_model(self, frontend=None): ''' Get model with lookup in the following order : * pymake.model * mla * scikit-learn ''' _model = Model.get(self.expe.model) if not _model: self.log.error('Model Unknown : %s' % (self.expe.model)) raise NotImplementedError(self.expe.model) # @Improve: * initialize all model with expe # * fit with frontend, transform with frontend (as sklearn do) if self.is_model(_model, 'pymake'): model = _model(self.expe, frontend) else: model = _model(self.expe) return model @classmethod def _load_model(cls, fn): _fn = io.resolve_filename(fn) if not os.path.isfile(_fn): # io integration? _fn += '.gz' if not os.path.isfile(_fn) or os.stat(_fn).st_size == 0: cls.log.error('No file for this model : %s' %_fn) cls.log.debug('The following are available :') for f in GramExp.model_walker(os.path.dirname(_fn), fmt='list'): cls.log.debug(f) return cls.log.info('Loading Model: %s' % fn) model = io.load(fn, silent=True) return model @staticmethod def update_expe(expe, model): ''' Configure some pymake settings if present in model. ''' pmk_settings = ['_csv_typo', '_fmt'] for _set in pmk_settings: if getattr(model, _set, None) and not expe.get(_set): expe[_set] = getattr(model, _set) @classmethod def from_expe(cls, expe, frontend=None, load=False): # frontend params is deprecated and will be removed soon... if load is False: mm = cls(expe) model = mm._get_model(frontend) else: fn = expe._output_path model = cls._load_model(fn) cls.update_expe(expe, model) return model
Class variables
var log
Static methods
def from_expe(expe, frontend=None, load=False)
-
Source code
@classmethod def from_expe(cls, expe, frontend=None, load=False): # frontend params is deprecated and will be removed soon... if load is False: mm = cls(expe) model = mm._get_model(frontend) else: fn = expe._output_path model = cls._load_model(fn) cls.update_expe(expe, model) return model
def update_expe(expe, model)
-
Configure some pymake settings if present in model.
Source code
@staticmethod def update_expe(expe, model): ''' Configure some pymake settings if present in model. ''' pmk_settings = ['_csv_typo', '_fmt'] for _set in pmk_settings: if getattr(model, _set, None) and not expe.get(_set): expe[_set] = getattr(model, _set)
Methods
def is_model(self, m, _type)
-
Source code
def is_model(self, m, _type): if _type == 'pymake': # __init__ method should be of type (expe, frontend, ...) pmk = inspect.signature(m).parameters.keys() score = [] for wd in ('frontend', 'expe'): score.append(wd in pmk) return all(score) else: raise ValueError('Model type unkonwn: %s' % _type)