diff options
| author | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-11-26 16:02:48 -0500 |
|---|---|---|
| committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2012-11-26 16:02:48 -0500 |
| commit | cb8db5d30ee769304c2c2b00f2a7d9bcb3c4098f (patch) | |
| tree | c5352d84285af565d5246c3eb861ffba709761f1 /common.py | |
| parent | 41c867480f1e20bd3b168258ed71450499ea6ccf (diff) | |
Removed 2-step parse for scheduling statistics.
Diffstat (limited to 'common.py')
| -rw-r--r-- | common.py | 74 |
1 files changed, 74 insertions, 0 deletions
| @@ -1,4 +1,78 @@ | |||
| 1 | import sys | ||
| 1 | from collections import defaultdict | 2 | from collections import defaultdict |
| 3 | from textwrap import dedent | ||
| 4 | |||
| 5 | def recordtype(typename, field_names, default=0): | ||
| 6 | ''' Mutable namedtuple. Recipe from George Sakkis of MIT.''' | ||
| 7 | field_names = tuple(map(str, field_names)) | ||
| 8 | # Create and fill-in the class template | ||
| 9 | numfields = len(field_names) | ||
| 10 | argtxt = ', '.join(field_names) | ||
| 11 | reprtxt = ', '.join('%s=%%r' % f for f in field_names) | ||
| 12 | dicttxt = ', '.join('%r: self.%s' % (f,f) for f in field_names) | ||
| 13 | tupletxt = repr(tuple('self.%s' % f for f in field_names)).replace("'",'') | ||
| 14 | inittxt = '; '.join('self.%s=%s' % (f,f) for f in field_names) | ||
| 15 | itertxt = '; '.join('yield self.%s' % f for f in field_names) | ||
| 16 | eqtxt = ' and '.join('self.%s==other.%s' % (f,f) for f in field_names) | ||
| 17 | template = dedent(''' | ||
| 18 | class %(typename)s(object): | ||
| 19 | '%(typename)s(%(argtxt)s)' | ||
| 20 | |||
| 21 | __slots__ = %(field_names)r | ||
| 22 | |||
| 23 | def __init__(self, %(argtxt)s): | ||
| 24 | %(inittxt)s | ||
| 25 | |||
| 26 | def __len__(self): | ||
| 27 | return %(numfields)d | ||
| 28 | |||
| 29 | def __iter__(self): | ||
| 30 | %(itertxt)s | ||
| 31 | |||
| 32 | def __getitem__(self, index): | ||
| 33 | return getattr(self, self.__slots__[index]) | ||
| 34 | |||
| 35 | def __setitem__(self, index, value): | ||
| 36 | return setattr(self, self.__slots__[index], value) | ||
| 37 | |||
| 38 | def todict(self): | ||
| 39 | 'Return a new dict which maps field names to their values' | ||
| 40 | return {%(dicttxt)s} | ||
| 41 | |||
| 42 | def __repr__(self): | ||
| 43 | return '%(typename)s(%(reprtxt)s)' %% %(tupletxt)s | ||
| 44 | |||
| 45 | def __eq__(self, other): | ||
| 46 | return isinstance(other, self.__class__) and %(eqtxt)s | ||
| 47 | |||
| 48 | def __ne__(self, other): | ||
| 49 | return not self==other | ||
| 50 | |||
| 51 | def __getstate__(self): | ||
| 52 | return %(tupletxt)s | ||
| 53 | |||
| 54 | def __setstate__(self, state): | ||
| 55 | %(tupletxt)s = state | ||
| 56 | ''') % locals() | ||
| 57 | # Execute the template string in a temporary namespace | ||
| 58 | namespace = {} | ||
| 59 | try: | ||
| 60 | exec template in namespace | ||
| 61 | except SyntaxError, e: | ||
| 62 | raise SyntaxError(e.message + ':\n' + template) | ||
| 63 | cls = namespace[typename] | ||
| 64 | |||
| 65 | # Setup defaults | ||
| 66 | init_defaults = tuple(default for f in field_names) | ||
| 67 | cls.__init__.im_func.func_defaults = init_defaults | ||
| 68 | |||
| 69 | # For pickling to work, the __module__ variable needs to be set to the frame | ||
| 70 | # where the named tuple is created. Bypass this step in environments where | ||
| 71 | # sys._getframe is not defined (Jython for example). | ||
| 72 | if hasattr(sys, '_getframe') and sys.platform != 'cli': | ||
| 73 | cls.__module__ = sys._getframe(1).f_globals['__name__'] | ||
| 74 | |||
| 75 | return cls | ||
| 2 | 76 | ||
| 3 | def load_params(fname): | 77 | def load_params(fname): |
| 4 | params = defaultdict(int) | 78 | params = defaultdict(int) |
