提交 3b0e4efe authored 作者: Amjad Almahairi's avatar Amjad Almahairi

optimization for removing div by one

上级 fae5d713
......@@ -2429,7 +2429,6 @@ def local_subtensor_merge(node):
lambda x: isinstance(x, T.Variable))
# Do not call make_node for test_value
out = subtens(x, *sl_ins)
return [out]
......@@ -4398,6 +4397,17 @@ def local_mul_to_sqr(node):
if node.inputs[0] is node.inputs[1]:
return [T.sqr(node.inputs[0])]
@register_specialize
@gof.local_optimizer([T.int_div, T.floor_div])
def local_div_by_one(node):
"""x // 1 -> x
"""
if node.op in [T.int_div]:
if len(node.inputs) == 2:
if isinstance(node.inputs[1], T.TensorConstant) and \
node.inputs[1].value == 1:
return [node.inputs[0]]
@gof.local_optimizer([T.pow])
def local_pow_specialize(node):
......
......@@ -5393,6 +5393,32 @@ def test_assert_op_gradient():
assert func(x_val) == 1
class TestDivByOne(unittest.TestCase):
def test1(self):
y = T.tensor4('y')
mode = theano.compile.mode.get_default_mode()
mode_wo_fusion = mode.excluding('fusion')
f = theano.function([y], y[::-1][::-1], mode=mode_wo_fusion)
graph = f.maker.fgraph.toposort()
divs = [node for node in graph
if isinstance(node.op, T.elemwise.Elemwise) and
isinstance(node.op.scalar_op, theano.scalar.IntDiv)]
assert len(divs) == 0
def test2(self):
y = T.tensor4('y')
z = y // 1
f = theano.function([y], z)
graph = f.maker.fgraph.toposort()
divs = [node for node in graph
if isinstance(node.op, T.elemwise.Elemwise) and
isinstance(node.op.scalar_op, theano.scalar.IntDiv)]
assert len(divs) == 0
if __name__ == '__main__':
t = TestMakeVector('setUp')
t.setUp()
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论