Skip to content
Snippets Groups Projects
Commit d12c97fb authored by Radek Hušek's avatar Radek Hušek
Browse files

split Gadget.eval() to eval() and eval_gadget()

parent 3db33263
Branches
No related tags found
No related merge requests found
...@@ -87,10 +87,16 @@ def _init_(): ...@@ -87,10 +87,16 @@ def _init_():
_gadget_cache = utils.DynamicLRU() _gadget_cache = utils.DynamicLRU()
def eval(self, p):
assert self.is_graph()
return p.finalize(self.eval_gadget(p))
@staticmethod @staticmethod
def join(gadgets, joins, outs): def join(gadgets, joins, outs):
assert all( isinstance(g, Gadget) for g in gadgets ), \ assert all( isinstance(g, Gadget) for g in gadgets ), \
"Not all gadgets of the same size: %s" % gadgets "Not all gadgets are instance of Gadget: %s" % gadgets
assert sorted(list(chain.from_iterable(joins)) + outs) == \
[ (i+1, j+1) for i in range(len(gadgets)) for j in range(gadgets[i].size()) ]
info = (tuple(gadgets), tuple(joins), tuple(outs)) info = (tuple(gadgets), tuple(joins), tuple(outs))
return Gadget._gadget_cache.get(info, lambda: JoinGadget(*info)) return Gadget._gadget_cache.get(info, lambda: JoinGadget(*info))
...@@ -100,12 +106,12 @@ def _init_(): ...@@ -100,12 +106,12 @@ def _init_():
super().__init__(size) super().__init__(size)
self.value = value self.value = value
def eval(self, _): def eval_gadget(self, _):
return self.value return self.value
class BaseGadget(Gadget): class BaseGadget(Gadget):
def eval(self, parameter): def eval_gadget(self, parameter):
try: try:
if self is CUBIC_VERTEX: if self is CUBIC_VERTEX:
return parameter.CUBIC_VERTEX return parameter.CUBIC_VERTEX
...@@ -136,16 +142,14 @@ def _init_(): ...@@ -136,16 +142,14 @@ def _init_():
self._info = (tuple(gadgets), joins, outs) self._info = (tuple(gadgets), joins, outs)
def eval(self, parameter): def eval_gadget(self, parameter):
gadgets, joins, outs = self._info gadgets, joins, outs = self._info
def do_eval(): def do_eval():
ret = parameter.eval_join( ret = parameter.eval_join(
[ g.eval(parameter) for g in gadgets ], [ g.eval_gadget(parameter) for g in gadgets ],
gadgets, joins, outs, self.offsets gadgets, joins, outs, self.offsets
) )
if self.is_graph():
return parameter.finalize(ret)
return ret return ret
return self._cache.get((parameter, self._info), do_eval) return self._cache.get((parameter, self._info), do_eval)
...@@ -194,7 +198,7 @@ def _init_(): ...@@ -194,7 +198,7 @@ def _init_():
def stabilize(self, parameter): def stabilize(self, parameter):
from sage.all import matrix, QQ from sage.all import matrix, QQ
boundaries = set() boundaries = set()
new_boundaries = set( b.boundary for b in self.base_gadget.eval(parameter) ) new_boundaries = set( b.boundary for b in self.base_gadget.eval_gadget(parameter) )
i = 0 i = 0
while True: while True:
...@@ -206,7 +210,7 @@ def _init_(): ...@@ -206,7 +210,7 @@ def _init_():
self.base_gadget.size(), self.base_gadget.size(),
[ Boundary(k, 1) for k in boundaries ] [ Boundary(k, 1) for k in boundaries ]
) )
out = self._next_gadget(gadget).eval(parameter) out = self._next_gadget(gadget).eval_gadget(parameter)
new_boundaries = set( b.boundary for b in out ) new_boundaries = set( b.boundary for b in out )
print("Loop %i done - %i boundaries (%i new)" % \ print("Loop %i done - %i boundaries (%i new)" % \
(i, len(new_boundaries), len(new_boundaries.difference(boundaries)))) (i, len(new_boundaries), len(new_boundaries.difference(boundaries))))
...@@ -219,11 +223,11 @@ def _init_(): ...@@ -219,11 +223,11 @@ def _init_():
m = matrix(QQ, size, size, { m = matrix(QQ, size, size, {
(rename[row], rename[col]): value (rename[row], rename[col]): value
for col in sorted_boundaries for col in sorted_boundaries
for row, value in self._next_gadget(FakeGadget(self.base_gadget.size(), [ Boundary(col, 1) ])).eval(parameter) for row, value in self._next_gadget(FakeGadget(self.base_gadget.size(), [ Boundary(col, 1) ])).eval_gadget(parameter)
}) })
iv = matrix(QQ, size, 1, { iv = matrix(QQ, size, 1, {
(rename[row], 0): v for row, v in self.base_gadget.eval(parameter) (rename[row], 0): v for row, v in self.base_gadget.eval_gadget(parameter)
}) })
fin = matrix(QQ, 1, size, { fin = matrix(QQ, 1, size, {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment