Source code for bxa.sherpa.cachedmodel
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
"""
BXA (Bayesian X-ray Analysis) for Sherpa
Copyright: Johannes Buchner (C) 2013-2016
"""
import os
if 'MAKESPHINXDOC' not in os.environ:
from sherpa.models import ArithmeticModel, CompositeModel
from sherpa.models.parameter import Parameter
else:
ArithmeticModel = object
CompositeModel = list
Parameter = None
[docs]
class VariableCachedModel(CompositeModel, ArithmeticModel):
"""Wrapper that caches the most recent model call."""
def __init__(self, othermodel):
"""*othermodel* can be any sherpa model"""
self.othermodel = othermodel
self.cache = None
self.lastp = None
print('calling CompositeModel...')
CompositeModel.__init__(self, name='cached(%s)' % othermodel.name, parts=(othermodel,))
[docs]
def calc(self, p, left, right, *args, **kwargs):
if self.cache is None or self.lastp != p:
self.cache = self.othermodel.calc(p, left, right, *args, **kwargs)
self.lastp = p
return self.cache
[docs]
def startup(self):
self.othermodel.startup()
CompositeModel.startup(self)
[docs]
def teardown(self):
self.othermodel.teardown()
CompositeModel.teardown(self)
[docs]
def guess(self, dep, *args, **kwargs):
self.othermodel.guess(dep, *args, **kwargs)
CompositeModel.guess(self, dep, *args, **kwargs)
[docs]
class CachedModel(CompositeModel, ArithmeticModel):
"""Wrapper that caches the first model call forever."""
def __init__(self, othermodel):
"""*othermodel* can be any sherpa model"""
self.othermodel = othermodel
self.cache = None
self.relnorm = Parameter('cache', 'relnorm', 1, 0, 1e10, 0, 1e10)
CompositeModel.__init__(self, name='cached(%s)' % othermodel.name, parts=(othermodel,))
[docs]
def calc(self, *args, **kwargs):
if self.cache is None:
print(' computing cached model ... ')
self.cache = self.othermodel.calc(*args, **kwargs)
return self.cache * self.relnorm.val
[docs]
def startup(self):
self.othermodel.startup()
CompositeModel.startup(self)
[docs]
def teardown(self):
self.othermodel.teardown()
CompositeModel.teardown(self)
[docs]
def guess(self, dep, *args, **kwargs):
self.othermodel.guess(dep, *args, **kwargs)
CompositeModel.guess(self, dep, *args, **kwargs)