def test_local_sigm_times_exp(self): # Test the `local_sigm_times_exp` optimization. # exp(x) * sigm(-x) -> sigm(x) # exp(-x) * sigm(x) -> sigm(-x) def match(func, ops): # print [node.op.scalar_op for node in func.maker.fgraph.toposort()] assert [node.op for node in func.maker.fgraph.toposort()] == ops m = self.get_mode(excluding=["local_elemwise_fusion", "inplace"]) x, y = tt.vectors("x", "y") f = aesara.function([x], sigmoid(-x) * tt.exp(x), mode=m) match(f, [sigmoid]) assert check_stack_trace(f, ops_to_check=sigmoid) f = aesara.function([x], sigmoid(x) * tt.exp(-x), mode=m) match(f, [tt.neg, sigmoid]) assert check_stack_trace(f, ops_to_check=sigmoid) f = aesara.function([x], -(-(-(sigmoid(x)))) * tt.exp(-x), mode=m) match(f, [tt.neg, sigmoid, tt.neg]) # assert check_stack_trace(f, ops_to_check=sigmoid) f = aesara.function( [x, y], (sigmoid(x) * sigmoid(-y) * -tt.exp(-x) * tt.exp(x * y) * tt.exp(y)), mode=m, ) topo = f.maker.fgraph.toposort() for op, nb in [(sigmoid, 2), (tt.mul, 2), (tt.neg, 1), (tt.exp, 1)]: assert sum([n.op == op for n in topo]) == nb
def test_local_ultra_fast_sigmoid(self): x = tt.matrix("x") s = sigmoid(x) mode = self.get_mode("local_ultra_fast_sigmoid") f = aesara.function([x], s, mode=mode) assert check_stack_trace(f, ops_to_check=sigmoid) topo = f.maker.fgraph.toposort() assert len(topo) == 1 assert topo[0].op == sigmoid mode = self.get_mode().including("local_ultra_fast_sigmoid") f = aesara.function([x], s, mode=mode) assert check_stack_trace(f, ops_to_check=ultra_fast_sigmoid) topo = f.maker.fgraph.toposort() assert topo[0].op == ultra_fast_sigmoid assert len(topo) == 1 f([[-50, -10, -4, -1, 0, 1, 4, 10, 50]])
def test_local_hard_sigmoid(self): x = tt.matrix("x") s = sigmoid(x) mode = self.get_mode("local_hard_sigmoid") f = aesara.function([x], s, mode=mode) assert check_stack_trace(f, ops_to_check=sigmoid) topo = f.maker.fgraph.toposort() assert topo[0].op == sigmoid assert len(topo) == 1 mode = self.get_mode().including("local_hard_sigmoid") f = aesara.function([x], s, mode=mode) topo = f.maker.fgraph.toposort() assert not any([n.op == sigmoid for n in topo]) f([[-50, -10, -4, -1, 0, 1, 4, 10, 50]]) mode2 = mode.excluding("fusion").excluding("inplace") f2 = aesara.function([x], s, mode=mode2) assert check_stack_trace(f2, ops_to_check=tt.clip)
def test_1msigmoid(self): if not register_local_1msigmoid: return m = self.get_mode() x = tt.fmatrix() # tests exp_over_1_plus_exp f = aesara.function([x], 1 - tt.exp(x) / (1 + tt.exp(x)), mode=m) assert check_stack_trace(f, ops_to_check=[tt.neg, sigmoid_inplace]) assert [node.op for node in f.maker.fgraph.toposort()] == [ tt.neg, sigmoid_inplace, ] # tests inv_1_plus_exp f = aesara.function([x], 1 - tt.fill(x, 1.0) / (1 + tt.exp(-x)), mode=m) assert check_stack_trace(f, ops_to_check=[tt.neg, sigmoid_inplace]) assert [node.op for node in f.maker.fgraph.toposort()] == [ tt.neg, sigmoid_inplace, ]
def check_diagonal_subtensor_view_traces(fn): assert check_stack_trace(fn, ops_to_check=(DiagonalSubtensor, IncDiagonalSubtensor))