提交 b089bfb0 authored 作者: goodfeli's avatar goodfeli

Merge pull request #278 from nouiz/scipy_test

Fixed test when scipy is not there.
...@@ -15,8 +15,10 @@ from theano.gof.opt import Optimizer ...@@ -15,8 +15,10 @@ from theano.gof.opt import Optimizer
try: try:
import scipy.linalg import scipy.linalg
imported_scipy = True
except ImportError: except ImportError:
pass # some ops (e.g. Cholesky) won't work # some ops (e.g. Cholesky, Solve, A_Xinv_b) won't work
imported_scipy = False
class Hint(Op): class Hint(Op):
""" """
...@@ -195,6 +197,8 @@ def is_positive(v): ...@@ -195,6 +197,8 @@ def is_positive(v):
@register_stabilize @register_stabilize
@local_optimizer([]) @local_optimizer([])
def inv_as_solve(node): def inv_as_solve(node):
if not imported_scipy:
return False
if node.op == dot: if node.op == dot:
l,r = node.inputs l,r = node.inputs
if l.owner and l.owner.op == matrix_inverse: if l.owner and l.owner.op == matrix_inverse:
...@@ -342,6 +346,8 @@ class Cholesky(Op): ...@@ -342,6 +346,8 @@ class Cholesky(Op):
return 'Cholesky{%s,%s}' % (lu, destr) return 'Cholesky{%s,%s}' % (lu, destr)
def make_node(self, x): def make_node(self, x):
assert imported_scipy, (
"Scipy not available. Scipy is needed for the Cholesky op")
x = as_tensor_variable(x) x = as_tensor_variable(x)
return Apply(self, [x], [x.type()]) return Apply(self, [x], [x.type()])
...@@ -544,6 +550,8 @@ class Solve(Op): ...@@ -544,6 +550,8 @@ class Solve(Op):
def __repr__(self): def __repr__(self):
return 'Solve{%s}'%str(self.props()) return 'Solve{%s}'%str(self.props())
def make_node(self, A, b): def make_node(self, A, b):
assert imported_scipy, (
"Scipy not available. Scipy is needed for the Solve op")
A = as_tensor_variable(A) A = as_tensor_variable(A)
b = as_tensor_variable(b) b = as_tensor_variable(b)
otype = tensor.tensor( otype = tensor.tensor(
...@@ -731,6 +739,8 @@ def spectral_radius_bound(X, log2_exponent): ...@@ -731,6 +739,8 @@ def spectral_radius_bound(X, log2_exponent):
class A_Xinv_b(Op): class A_Xinv_b(Op):
"""Product of form a inv(X) b""" """Product of form a inv(X) b"""
def make_node(self, a, X, b): def make_node(self, a, X, b):
assert imported_scipy, (
"Scipy not available. Scipy is needed for the A_Xinv_b op")
a = as_tensor_variable(a) a = as_tensor_variable(a)
b = as_tensor_variable(b) b = as_tensor_variable(b)
X = as_tensor_variable(X) X = as_tensor_variable(X)
......
...@@ -24,7 +24,8 @@ from theano.sandbox.linalg.ops import (cholesky, ...@@ -24,7 +24,8 @@ from theano.sandbox.linalg.ops import (cholesky,
#PSD_hint, #PSD_hint,
trace, trace,
matrix_dot, matrix_dot,
spectral_radius_bound spectral_radius_bound,
imported_scipy,
) )
from nose.plugins.skip import SkipTest from nose.plugins.skip import SkipTest
...@@ -47,6 +48,9 @@ def check_upper_triangular(pd, ch_f): ...@@ -47,6 +48,9 @@ def check_upper_triangular(pd, ch_f):
def test_cholesky(): def test_cholesky():
if not imported_scipy:
raise SkipTest("Scipy needed for the Cholesky op.")
rng = numpy.random.RandomState(utt.fetch_seed()) rng = numpy.random.RandomState(utt.fetch_seed())
r = rng.randn(5, 5).astype(config.floatX) r = rng.randn(5, 5).astype(config.floatX)
pd = numpy.dot(r, r.T) pd = numpy.dot(r, r.T)
...@@ -66,6 +70,8 @@ def test_cholesky(): ...@@ -66,6 +70,8 @@ def test_cholesky():
def test_cholesky_grad(): def test_cholesky_grad():
if not imported_scipy:
raise SkipTest("Scipy needed for the Cholesky op.")
rng = numpy.random.RandomState(utt.fetch_seed()) rng = numpy.random.RandomState(utt.fetch_seed())
r = rng.randn(5, 5).astype(config.floatX) r = rng.randn(5, 5).astype(config.floatX)
pd = numpy.dot(r, r.T) pd = numpy.dot(r, r.T)
...@@ -78,6 +84,9 @@ def test_cholesky_grad(): ...@@ -78,6 +84,9 @@ def test_cholesky_grad():
def test_cholesky_and_cholesky_grad_shape(): def test_cholesky_and_cholesky_grad_shape():
if not imported_scipy:
raise SkipTest("Scipy needed for the Cholesky op.")
rng = numpy.random.RandomState(utt.fetch_seed()) rng = numpy.random.RandomState(utt.fetch_seed())
x = tensor.matrix() x = tensor.matrix()
for l in (cholesky(x), Cholesky(lower=True)(x), Cholesky(lower=False)(x)): for l in (cholesky(x), Cholesky(lower=True)(x), Cholesky(lower=False)(x)):
......
...@@ -9,7 +9,7 @@ import numpy ...@@ -9,7 +9,7 @@ import numpy
import theano import theano
from numpy import (arange, array, common_type, complex64, complex128, float32, from numpy import (arange, array, common_type, complex64, complex128, float32,
float64, newaxis, shape, transpose, zeros) float64, newaxis, shape, transpose, zeros)
from numpy.testing import assert_, assert_array_almost_equal from numpy.testing import assert_array_almost_equal
#from numpy.testing import dec #from numpy.testing import dec
#from numpy.testing.noseclasses import KnownFailureTest #from numpy.testing.noseclasses import KnownFailureTest
...@@ -1003,7 +1003,7 @@ def matrixmultiply(a, b): ...@@ -1003,7 +1003,7 @@ def matrixmultiply(a, b):
b = b[:,newaxis] b = b[:,newaxis]
else: else:
b_is_vector = False b_is_vector = False
assert_(a.shape[1] == b.shape[0]) assert a.shape[1] == b.shape[0]
c = zeros((a.shape[0], b.shape[1]), common_type(a, b)) c = zeros((a.shape[0], b.shape[1]), common_type(a, b))
for i in xrange(a.shape[0]): for i in xrange(a.shape[0]):
for j in xrange(b.shape[1]): for j in xrange(b.shape[1]):
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论