From 1c9151a7d036624f14304334ff2703a5e0360f84 Mon Sep 17 00:00:00 2001 From: James Hensman Date: Thu, 6 Feb 2014 12:46:56 +0000 Subject: [PATCH] added caching framework --- GPy/util/caching.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 GPy/util/caching.py diff --git a/GPy/util/caching.py b/GPy/util/caching.py new file mode 100644 index 00000000..d8893021 --- /dev/null +++ b/GPy/util/caching.py @@ -0,0 +1,41 @@ +import numpy as np +from ..core.parameterization.array_core import ObservableArray +class Cacher(object): + def __init__(self, operation, limit=5): + self.limit = int(limit) + self.operation=operation + self.cached_inputs = [] + self.cached_outputs = [] + self.inputs_changed = [] + + def __call__(self, X): + assert isinstance(X, ObservableArray) + if X in self.cached_inputs: + i = self.cached_inputs.index(X) + if self.inputs_changed[i]: + self.cached_outputs[i] = self.operation(X) + self.inputs_changed[i] = False + return self.cached_outputs[i] + else: + if len(self.cached_inputs) == self.limit: + X_ = self.cached_inputs.pop(0) + X_.remove_observer(self) + self.inputs_changed.pop(0) + self.cached_outputs.pop(0) + + self.cached_inputs.append(X) + self.cached_outputs.append(self.operation(X)) + self.inputs_changed.append(False) + X.add_observer(self, self.on_cache_changed) + return self.cached_outputs[-1] + + def on_cache_changed(self, X): + print id(X) + i = self.cached_inputs.index(X) + self.inputs_changed[i] = True + + + + + +