Skip to content

Commit

Permalink
Allow recall of alternatives in saved model without data
Browse files Browse the repository at this point in the history
  • Loading branch information
jpn-- committed May 10, 2017
1 parent d0ac17f commit db2b622
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 12 deletions.
22 changes: 17 additions & 5 deletions py/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,13 @@ def _set_link(self, *args):
edge = property(_core.Model2_link_get, _set_link, None, "an alias for :attr:`link`")

def alternatives(self):
return {code:name for code,name in zip(self.alternative_codes(),self.alternative_names())}
result = {code:name for code,name in zip(self.alternative_codes(),self.alternative_names())}
if len(result):
return result
try:
return self._alternatives_recall
except AttributeError:
return result

def alternative_name(self, code):
codes = numpy.asarray(self.alternative_codes())
Expand Down Expand Up @@ -579,10 +585,15 @@ def save(self, filename, overwrite=False, spool=True, report=False, report_cats=
# f.write(self.report(lineprefix="#\t", cats=report_cats))
# f.write("\n\n\n")
import time
import pickle
f.write("# saved at %s"%time.strftime("%I:%M:%S %p %Z"))
f.write(" on %s\n"%time.strftime("%d %b %Y"))
f.write(self.save_buffer())

f.write("self.recall(alternatives = pickle.loads( base64.standard_b64decode('")
f.write( base64.standard_b64encode(pickle.dumps(self.alternatives())).decode('utf8') )
f.write("')))\n")

f.write("self.covariance_matrix = numpy.loads( base64.standard_b64decode('")
f.write( base64.standard_b64encode(self.covariance_matrix.dumps()).decode('utf8') )
f.write("'))\n")
Expand Down Expand Up @@ -612,7 +623,6 @@ def save(self, filename, overwrite=False, spool=True, report=False, report_cats=
f.write("self.{} = {!r}\n".format(a,getattr(self,a)))
else:
if not aliens_found:
import pickle
f.write("import pickle\n")
aliens_found = True
try:
Expand Down Expand Up @@ -663,9 +673,11 @@ def copy(self, other="@@@"):
exec(code)
return self

def recall(self, nCases=None):
def recall(self, nCases=None, alternatives=None):
if nCases is not None:
self._nCases_recall = nCases
if alternatives is not None:
self._alternatives_recall = alternatives

def __utility_get(self):
return _core.Model2_utility_get(self)
Expand Down Expand Up @@ -925,15 +937,15 @@ def new_nest(self, nest_name=None, param_name="", branch=None, **kwargs):
new_node = new_nest

def report_(self, cats='*', **kwargs):
with XHTML('temp', quickhead=self, **kwargs) as f:
with XHTML('temp', quickhead=self, embed_model=self, **kwargs) as f:
f << self.report(cats=cats, style='xml')

def report_1(self, filename="/tmp/larchreport.html", **kwargs):
from .util.filemanager import next_stack
print("from filename",filename)
filename = next_stack(filename,suffix='html')
print("to filename", filename)
with XHTML(filename, quickhead=self, **kwargs) as f:
with XHTML(filename, quickhead=self, embed_model=self, **kwargs) as f:
f << self.report(cats='*', style='xml')


Expand Down
2 changes: 1 addition & 1 deletion py/model_reporter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def report(self, style, *args, filename=None, tempfile=False, **kwargs):
if filename is None and tempfile==False:
return rpt
else:
f = XHTML("temp" if tempfile else filenext(filename), quickhead=self, **kwargs)
f = XHTML("temp" if tempfile else filenext(filename), quickhead=self, embed_model=self, **kwargs)
f << rpt
f.dump()
return f
Expand Down
6 changes: 3 additions & 3 deletions py/model_reporter/xhtml.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ def xhtml_report_v0(self, cats=None, raw_xml=False, throw_exceptions=False, file
x = Elem('div', {'class':'model_report'})
else:
import base64
x = XHTML(quickhead=self)
x = XHTML(quickhead=self,embed_model=self)

icats = iter(cats) # do not know why this is important, but crashes sometimes without it

Expand Down Expand Up @@ -414,7 +414,7 @@ def xhtml_report(self, cats=None, raw_xml=False, throw_exceptions=False, filenam
x = Elem('div', {'class':'model_report'})
else:
import base64
x = XHTML(quickhead=self)
x = XHTML(quickhead=self,embed_model=self)

icats = iter(self._inflate_cats(cats)) # do not know why this is important, but crashes sometimes without it

Expand Down Expand Up @@ -554,7 +554,7 @@ def __call__(self, *args, force_Elem=False, filename=None, view_on_exit=False, r
elif isinstance(arg, list):
div << self( *(self._model._inflate_cats(arg)), force_Elem=True )
if filename is not None or return_html or self._return_xhtml:
with XHTML(quickhead=self._model, view_on_exit=view_on_exit, filename=filename or None, **kwarg) as f:
with XHTML(quickhead=self._model, embed_model=self._model, view_on_exit=view_on_exit, filename=filename or None, **kwarg) as f:
f << div
if return_html or self._return_xhtml:
temphtml = f.dump()
Expand Down
2 changes: 1 addition & 1 deletion py/util/roll.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ def roll(self, filename=None, loglevel=baselogging.INFO, cats='-', use_ce=False,
.strut2 {min-width:1in}
"""

with XHTML(use_filename, quickhead=m, css=css) as f:
with XHTML(use_filename, quickhead=m, embed_model=m, css=css) as f:
f << m.report(cats=cats, style='xml', **format)
if sourcecode:
f << xhtml_rawtext_as_div(filename=sourcefile, classtype='raw_source', title="Source Code")
Expand Down
5 changes: 3 additions & 2 deletions py/util/xhtml.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ def __lshift__(self,other):

class XHTML():
"""A class used to conveniently build xhtml documents."""
def __init__(self, filename=None, *, overwrite=False, spool=True, quickhead=None, css=None, extra_css=None, view_on_exit=True, jquery=True, jqueryui=True, floating_tablehead=True):
def __init__(self, filename=None, *, overwrite=False, spool=True, quickhead=None, css=None, extra_css=None, view_on_exit=True, jquery=True, jqueryui=True, floating_tablehead=True, embed_model=None):
self.view_on_exit = view_on_exit
self.root = Elem(tag="html", xmlns="http://www.w3.org/1999/xhtml")
self.head = Elem(tag="head")
Expand Down Expand Up @@ -441,13 +441,14 @@ def __init__(self, filename=None, *, overwrite=False, spool=True, quickhead=None
except AttributeError:
pass
self.style.text = css.replace('\n',' ').replace('\t',' ')
self.head << Elem(tag="meta", name='pymodel', content=base64.standard_b64encode(quickhead.__getstate__()).decode('ascii'))
else:
if css is None:
css = default_css
if extra_css is not None:
css += extra_css
self.style.text = css.replace('\n',' ').replace('\t',' ')
if embed_model is not None:
self.head << Elem(tag="meta", name='pymodel', content=base64.standard_b64encode(embed_model.__getstate__()).decode('ascii'))


def __enter__(self):
Expand Down

0 comments on commit db2b622

Please sign in to comment.