Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
pytensor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
testgroup
pytensor
Commits
c855e8d6
提交
c855e8d6
authored
6月 25, 2015
作者:
Pascal Lamblin
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #3030 from abergeron/flake8_temp
[MRG] Ignore E501 (lines too long) for the flake8 test.
上级
ac06a2c4
c3752c29
隐藏空白字符变更
内嵌
并排
正在显示
24 个修改的文件
包含
213 行增加
和
241 行删除
+213
-241
function_module.py
theano/compile/function_module.py
+1
-2
mode.py
theano/compile/mode.py
+2
-4
profilemode.py
theano/compile/profilemode.py
+37
-37
compiledir.py
theano/gof/compiledir.py
+1
-2
compilelock.py
theano/gof/compilelock.py
+1
-1
optdb.py
theano/gof/optdb.py
+1
-1
test_vm.py
theano/gof/tests/test_vm.py
+7
-5
type.py
theano/gof/type.py
+1
-5
elemwise_time_test.py
theano/misc/elemwise_time_test.py
+1
-1
test_fftconv.py
theano/sandbox/cuda/tests/test_fftconv.py
+3
-3
test_type.py
theano/sandbox/cuda/tests/test_type.py
+0
-2
opt.py
theano/sandbox/gpuarray/opt.py
+2
-2
test_basic_sympy.py
theano/scalar/tests/test_basic_sympy.py
+4
-4
elemwise.py
theano/tensor/elemwise.py
+83
-87
inplace.py
theano/tensor/inplace.py
+2
-9
shared_randomstreams.py
theano/tensor/shared_randomstreams.py
+5
-5
slinalg.py
theano/tensor/slinalg.py
+11
-12
subtensor.py
theano/tensor/subtensor.py
+22
-24
var.py
theano/tensor/var.py
+9
-11
breakpoint.py
theano/tests/breakpoint.py
+2
-2
disturb_mem.py
theano/tests/disturb_mem.py
+1
-1
test_dictionary_output.py
theano/tests/test_dictionary_output.py
+2
-2
test_flake8.py
theano/tests/test_flake8.py
+9
-13
test_printing.py
theano/tests/test_printing.py
+6
-6
没有找到文件。
theano/compile/function_module.py
浏览文件 @
c855e8d6
...
...
@@ -1417,8 +1417,7 @@ def _pickle_FunctionMaker(self):
accept_inplace
=
self
.
accept_inplace
,
function_builder
=
self
.
function_builder
,
profile
=
self
.
profile
,
on_unused_input
=
self
.
on_unused_input
,
)
on_unused_input
=
self
.
on_unused_input
)
return
(
_constructor_FunctionMaker
,
(
kwargs
,))
...
...
theano/compile/mode.py
浏览文件 @
c855e8d6
...
...
@@ -71,8 +71,7 @@ predefined_linkers = {
'vm'
:
gof
.
vm
.
VM_Linker
(
use_cloop
=
False
),
# Use allow_gc Theano flag
'cvm'
:
gof
.
vm
.
VM_Linker
(
use_cloop
=
True
),
# Use allow_gc Theano flag
'vm_nogc'
:
gof
.
vm
.
VM_Linker
(
allow_gc
=
False
,
use_cloop
=
False
),
'cvm_nogc'
:
gof
.
vm
.
VM_Linker
(
allow_gc
=
False
,
use_cloop
=
True
),
}
'cvm_nogc'
:
gof
.
vm
.
VM_Linker
(
allow_gc
=
False
,
use_cloop
=
True
)}
def
register_linker
(
name
,
linker
):
...
...
@@ -115,8 +114,7 @@ predefined_optimizers = {
'fast_run'
:
OPT_FAST_RUN
,
'fast_run_stable'
:
OPT_FAST_RUN_STABLE
,
'fast_compile'
:
OPT_FAST_COMPILE
,
'stabilize'
:
OPT_STABILIZE
}
'stabilize'
:
OPT_STABILIZE
}
def
register_optimizer
(
name
,
opt
):
...
...
theano/compile/profilemode.py
浏览文件 @
c855e8d6
...
...
@@ -378,22 +378,22 @@ class ProfileMode(Mode):
print
()
print
(
'Time since import
%.3
fs'
%
(
total_time
))
print
(
'Theano compile time:
%.3
fs (
%.1
f
%%
since import)'
%
(
compile_time
,
compile_time
/
total_time
*
100
))
(
compile_time
,
compile_time
/
total_time
*
100
))
print
(
' Optimization time:
%.3
fs'
%
(
other_time
[
'optimizer_time'
]))
print
(
' Linker time:
%.3
fs'
%
(
other_time
[
'linker_time'
]))
print
(
'Theano fct call
%.3
fs (
%.1
f
%%
since import)'
%
(
total_fct_time
,
total_fct_time
/
total_time
*
100
))
(
total_fct_time
,
total_fct_time
/
total_time
*
100
))
print
(
' Theano Op time
%.3
fs
%.1
f
%%
(since import)
%.1
f
%%
'
'(of fct call)'
%
(
local_time
,
local_time
/
total_time
*
100
,
'(of fct call)'
%
(
local_time
,
local_time
/
total_time
*
100
,
time_pr_in_fct
))
print
(
' Theano function overhead in ProfileMode
%.3
fs
%.1
f
%%
'
'(since import)
%.1
f
%%
(of fct call)'
%
(
overhead_time
,
overhead_time
/
total_time
*
100
,
overhead_time
,
overhead_time
/
total_time
*
100
,
overhead_time_pourcent_fct_time
))
print
(
'
%
i Theano fct call,
%.3
fs per call'
%
(
total_fct_call
,
time_per_call
))
print
(
'Rest of the time since import
%.3
fs
%.1
f
%%
'
%
(
unknown_time
,
unknown_time
/
total_time
*
100
))
(
unknown_time
,
unknown_time
/
total_time
*
100
))
print
()
print
(
'Theano fct summary:'
)
...
...
@@ -402,9 +402,9 @@ class ProfileMode(Mode):
for
key
in
fct_call
:
if
fct_call
[
key
]
>
0
:
print
(
'
%4.1
f
%% %.3
fs
%.2
es
%
d
%
s'
%
(
fct_call_time
[
key
]
/
total_fct_time
*
100
,
(
fct_call_time
[
key
]
/
total_fct_time
*
100
,
fct_call_time
[
key
],
fct_call_time
[
key
]
/
fct_call
[
key
],
fct_call_time
[
key
]
/
fct_call
[
key
],
fct_call
[
key
],
key
.
name
))
else
:
...
...
@@ -448,7 +448,7 @@ class ProfileMode(Mode):
sop_op
[
typ
]
+=
1
sop_cimpl
.
setdefault
(
typ
,
True
)
sop_cimpl
[
typ
]
=
sop_cimpl
[
typ
]
and
op_cimpl
.
get
(
a
,
False
)
sop_call
[
typ
]
=
sop_call
.
get
(
typ
,
0
)
+
op_call
[
a
]
sop_call
[
typ
]
=
sop_call
.
get
(
typ
,
0
)
+
op_call
[
a
]
# Print the summary per op class.
print
()
...
...
@@ -456,7 +456,7 @@ class ProfileMode(Mode):
print
(
'<
%
of local_time spent on this kind of Op> <cumulative
%
> '
'<self seconds> <cumulative seconds> <time per call> [*] '
'<nb_call> <nb_op> <nb_apply> <Op name>'
)
sotimes
=
[(
t
*
100
/
local_time
,
t
,
a
,
sop_cimpl
[
a
],
sop_call
[
a
],
sotimes
=
[(
t
*
100
/
local_time
,
t
,
a
,
sop_cimpl
[
a
],
sop_call
[
a
],
sop_op
[
a
],
sop_apply
[
a
])
for
a
,
t
in
iteritems
(
sop_time
)]
sotimes
.
sort
()
sotimes
.
reverse
()
...
...
@@ -466,17 +466,17 @@ class ProfileMode(Mode):
assert
t
==
0
continue
tot
+=
t
ftot
=
tot
*
100
/
local_time
ftot
=
tot
*
100
/
local_time
if
ci
:
msg
=
'*'
else
:
msg
=
' '
print
(
'
%4.1
f
%% %5.1
f
%% %5.3
fs
%5.3
fs
%.2
es
%
s
%5
d
%2
d '
'
%2
d
%
s'
%
(
f
,
ftot
,
t
,
tot
,
t
/
nb_call
,
msg
,
nb_call
,
'
%2
d
%
s'
%
(
f
,
ftot
,
t
,
tot
,
t
/
nb_call
,
msg
,
nb_call
,
nb_op
,
nb_apply
,
a
))
print
(
' ... (remaining
%
i single Op account for
%.2
f
%%
(
%.2
fs) of '
'the runtime)'
%
(
max
(
0
,
len
(
sotimes
)
-
n_ops_to_print
),
(
max
(
0
,
len
(
sotimes
)
-
n_ops_to_print
),
sum
(
soinfo
[
0
]
for
soinfo
in
sotimes
[
n_ops_to_print
:]),
sum
(
soinfo
[
1
]
for
soinfo
in
sotimes
[
n_ops_to_print
:])))
...
...
@@ -486,7 +486,7 @@ class ProfileMode(Mode):
op_flops
=
{}
for
a
,
t
in
iteritems
(
op_time
):
if
hasattr
(
a
,
'flops'
):
op_flops
[
a
]
=
a
.
flops
*
op_call
[
a
]
/
t
/
1e6
op_flops
[
a
]
=
a
.
flops
*
op_call
[
a
]
/
t
/
1e6
flops_msg
=
''
if
op_flops
:
flops_msg
=
' <MFlops/s>'
...
...
@@ -500,7 +500,7 @@ class ProfileMode(Mode):
'<self seconds> <cumulative seconds> <time per call> [*]
%
s '
'<nb_call> <nb apply> <Op name>'
%
(
flops_msg
))
otimes
=
[(
t
*
100
/
local_time
,
t
,
a
,
op_cimpl
.
get
(
a
,
0
),
otimes
=
[(
t
*
100
/
local_time
,
t
,
a
,
op_cimpl
.
get
(
a
,
0
),
op_call
.
get
(
a
,
0
),
op_apply
.
get
(
a
,
0
))
for
a
,
t
in
iteritems
(
op_time
)]
otimes
.
sort
()
...
...
@@ -511,23 +511,23 @@ class ProfileMode(Mode):
assert
t
==
0
continue
tot
+=
t
ftot
=
tot
*
100
/
local_time
ftot
=
tot
*
100
/
local_time
if
ci
:
msg
=
'*'
else
:
msg
=
' '
if
op_flops
:
print
(
'
%4.1
f
%% %5.1
f
%% %5.3
fs
%5.3
fs
%.2
es
%
s
%7.1
f '
'
%5
d
%2
d
%
s'
%
(
f
,
ftot
,
t
,
tot
,
t
/
nb_call
,
msg
,
'
%5
d
%2
d
%
s'
%
(
f
,
ftot
,
t
,
tot
,
t
/
nb_call
,
msg
,
op_flops
.
get
(
a
,
-
1
),
nb_call
,
nb_apply
,
a
))
else
:
print
(
'
%4.1
f
%% %5.1
f
%% %5.3
fs
%5.3
fs
%.2
es
%
s
%5
d
%2
d '
'
%
s'
%
(
f
,
ftot
,
t
,
tot
,
t
/
nb_call
,
msg
,
nb_call
,
'
%
s'
%
(
f
,
ftot
,
t
,
tot
,
t
/
nb_call
,
msg
,
nb_call
,
nb_apply
,
a
))
print
(
' ... (remaining
%
i Op account for
%6.2
f
%%
(
%.2
fs) of the '
'runtime)'
%
(
max
(
0
,
len
(
otimes
)
-
n_ops_to_print
),
(
max
(
0
,
len
(
otimes
)
-
n_ops_to_print
),
sum
(
f
for
f
,
t
,
a
,
ci
,
nb_call
,
nb_op
in
otimes
[
n_ops_to_print
:]),
sum
(
t
for
f
,
t
,
a
,
ci
,
nb_call
,
nb_op
in
...
...
@@ -540,7 +540,7 @@ class ProfileMode(Mode):
print
(
'<
%
of local_time spent at this position> <cumulative
%%
> '
'<apply time> <cumulative seconds> <time per call> [*] '
'<nb_call> <Apply position> <Apply Op name>'
)
atimes
=
[(
t
*
100
/
local_time
,
t
,
a
,
atimes
=
[(
t
*
100
/
local_time
,
t
,
a
,
[
v
for
k
,
v
in
iteritems
(
fct_call
)
if
k
.
maker
.
fgraph
is
a
[
1
]
.
fgraph
][
0
])
for
a
,
t
in
iteritems
(
apply_time
)]
...
...
@@ -549,7 +549,7 @@ class ProfileMode(Mode):
tot
=
0
for
f
,
t
,
a
,
nb_call
in
atimes
[:
n_apply_to_print
]:
tot
+=
t
ftot
=
tot
*
100
/
local_time
ftot
=
tot
*
100
/
local_time
if
nb_call
==
0
:
continue
if
apply_cimpl
.
get
(
a
[
1
],
False
):
...
...
@@ -558,11 +558,11 @@ class ProfileMode(Mode):
msg
=
' '
print
(
'
%4.1
f
%% %5.1
f
%% %5.3
fs
%5.3
fs
%.2
es
%
s
%
i '
'
%2
i
%
s'
%
(
f
,
ftot
,
t
,
tot
,
t
/
nb_call
,
msg
,
nb_call
,
a
[
0
],
(
f
,
ftot
,
t
,
tot
,
t
/
nb_call
,
msg
,
nb_call
,
a
[
0
],
str
(
a
[
1
])))
print
(
' ... (remaining
%
i Apply instances account for '
'
%.2
f
%%
(
%.2
fs) of the runtime)'
%
(
max
(
0
,
len
(
atimes
)
-
n_apply_to_print
),
(
max
(
0
,
len
(
atimes
)
-
n_apply_to_print
),
sum
(
f
for
f
,
t
,
a
,
nb_call
in
atimes
[
n_apply_to_print
:]),
sum
(
t
for
f
,
t
,
a
,
nb_call
in
atimes
[
n_apply_to_print
:])))
print
(
'(*) Op is running a c implementation'
)
...
...
@@ -603,7 +603,7 @@ Test them first, as they are not guaranteed to always provide a speedup.""")
scal
.
RoundHalfAwayFromZero
,
scal
.
Log
,
scal
.
Log2
,
scal
.
Log10
,
scal
.
Log1p
,
scal
.
Exp
,
scal
.
Sqrt
,
scal
.
Abs
,
scal
.
Cos
,
scal
.
Sin
,
scal
.
Tan
,
scal
.
Tanh
,
scal
.
Sin
,
scal
.
Tan
,
scal
.
Tanh
,
scal
.
Cosh
,
scal
.
Sinh
,
T
.
nnet
.
sigm
.
ScalarSigmoid
,
T
.
nnet
.
sigm
.
ScalarSoftplus
]
...
...
@@ -661,9 +661,9 @@ Test them first, as they are not guaranteed to always provide a speedup.""")
if
not
config
.
lib
.
amdlibm
and
any
([
exp_float32_op
(
a
.
op
)
and
a
.
inputs
[
0
]
.
dtype
==
'float32'
for
i
,
a
in
apply_time
]):
print
(
" - With the default gcc libm, exp in float32 is slower "
"than in float64! Try Theano flag floatX=float64, or "
"install amdlibm and set the theano flags lib.amdlibm=True"
)
print
(
" - With the default gcc libm, exp in float32 is slower "
"than in float64! Try Theano flag floatX=float64, or "
"install amdlibm and set the theano flags lib.amdlibm=True"
)
printed_tip
=
True
# tip 4
...
...
@@ -672,11 +672,11 @@ Test them first, as they are not guaranteed to always provide a speedup.""")
if
(
isinstance
(
node
.
op
,
T
.
Dot
)
and
all
([
len
(
i
.
type
.
broadcastable
)
==
2
for
i
in
node
.
inputs
])):
print
(
(
" - You have a dot operation that was not optimized to"
" dot22 (which is faster). Make sure the inputs are "
"float32 or float64, and are the same for both inputs. "
"Currently they are:
%
s"
%
[
i
.
type
for
i
in
node
.
inputs
])
)
print
(
" - You have a dot operation that was not optimized to"
" dot22 (which is faster). Make sure the inputs are "
"float32 or float64, and are the same for both inputs. "
"Currently they are:
%
s"
%
[
i
.
type
for
i
in
node
.
inputs
]
)
printed_tip
=
True
# tip 5
...
...
@@ -684,13 +684,13 @@ Test them first, as they are not guaranteed to always provide a speedup.""")
node
=
a
[
1
]
if
isinstance
(
node
.
op
,
RandomFunction
):
printed_tip
=
True
print
(
" - Replace the default random number generator by "
"'from theano.sandbox.rng_mrg import MRG_RandomStreams "
"as RandomStreams', as this is is faster. It is still "
"experimental, but seems to work correctly."
)
print
(
" - Replace the default random number generator by "
"'from theano.sandbox.rng_mrg import MRG_RandomStreams "
"as RandomStreams', as this is is faster. It is still "
"experimental, but seems to work correctly."
)
if
config
.
device
.
startswith
(
"gpu"
):
print
(
" - MRG_RandomStreams is the only random number"
" generator supported on the GPU."
)
print
(
" - MRG_RandomStreams is the only random number"
" generator supported on the GPU."
)
break
if
not
printed_tip
:
...
...
theano/gof/compiledir.py
浏览文件 @
c855e8d6
...
...
@@ -63,8 +63,7 @@ compiledir_format_dict = {
"theano_version"
:
theano
.
__version__
,
"numpy_version"
:
numpy
.
__version__
,
"gxx_version"
:
gcc_version_str
.
replace
(
" "
,
"_"
),
"hostname"
:
socket
.
gethostname
(),
}
"hostname"
:
socket
.
gethostname
()}
def
short_platform
(
r
=
None
,
p
=
None
):
...
...
theano/gof/compilelock.py
浏览文件 @
c855e8d6
...
...
@@ -108,7 +108,7 @@ def _get_lock(lock_dir=None, **kw):
raise
Exception
(
"For some unknow reason, the lock was already "
"taken, but no start time was registered."
)
now
=
time
.
time
()
if
now
-
get_lock
.
start_time
>
config
.
compile
.
timeout
/
2
:
if
now
-
get_lock
.
start_time
>
config
.
compile
.
timeout
/
2
:
lockpath
=
os
.
path
.
join
(
get_lock
.
lock_dir
,
'lock'
)
_logger
.
info
(
'Refreshing lock
%
s'
,
str
(
lockpath
))
refresh_lock
(
lockpath
)
...
...
theano/gof/optdb.py
浏览文件 @
c855e8d6
...
...
@@ -312,7 +312,7 @@ class SequenceDB(DB):
positions
=
list
(
self
.
__position__
.
items
())
def
c
(
a
,
b
):
return
cmp
(
a
[
1
],
b
[
1
]
)
return
((
a
[
1
]
>
b
[
1
])
-
(
a
[
1
]
<
b
[
1
])
)
positions
.
sort
(
c
)
print
(
" position"
,
positions
,
file
=
stream
)
...
...
theano/gof/tests/test_vm.py
浏览文件 @
c855e8d6
...
...
@@ -46,7 +46,7 @@ class TestCallbacks(unittest.TestCase):
def
test_callback_with_ifelse
(
self
):
a
,
b
,
c
=
tensor
.
scalars
(
'abc'
)
f
=
function
([
a
,
b
,
c
],
ifelse
(
a
,
2
*
b
,
2
*
c
),
f
=
function
([
a
,
b
,
c
],
ifelse
(
a
,
2
*
b
,
2
*
c
),
mode
=
Mode
(
optimizer
=
None
,
linker
=
vm
.
VM_Linker
(
callback
=
self
.
callback
)))
...
...
@@ -62,7 +62,7 @@ def test_c_thunks():
if
theano
.
config
.
cxx
:
cases
.
append
(
True
)
for
c_thunks
in
cases
:
f
=
function
([
a
,
b
,
c
],
ifelse
(
a
,
a
*
b
,
b
*
c
),
f
=
function
([
a
,
b
,
c
],
ifelse
(
a
,
a
*
b
,
b
*
c
),
mode
=
Mode
(
optimizer
=
None
,
linker
=
vm
.
VM_Linker
(
c_thunks
=
c_thunks
,
...
...
@@ -86,7 +86,7 @@ def test_speed():
def
numpy_version
(
x
,
depth
):
z
=
x
for
d
in
xrange
(
depth
):
z
=
(
z
+
z
)
z
=
(
z
+
z
)
return
z
def
time_numpy
():
...
...
@@ -136,7 +136,7 @@ def test_speed():
print
(
"
%
s takes
%
f s/Kop"
%
(
name
,
(
1000
*
(
t_b
-
t_a
)
/
(
steps_b
-
steps_a
))))
(
1000
*
(
t_b
-
t_a
)
/
(
steps_b
-
steps_a
))))
time_linker
(
'c|py'
,
OpWiseCLinker
)
time_linker
(
'vmLinker'
,
vm
.
VM_Linker
)
...
...
@@ -185,7 +185,7 @@ def test_speed_lazy():
print
(
"
%
s takes
%
f s/Kop"
%
(
name
,
(
1000
*
(
t_b
-
t_a
)
/
(
steps_b
-
steps_a
))))
(
1000
*
(
t_b
-
t_a
)
/
(
steps_b
-
steps_a
))))
time_linker
(
'vmLinker'
,
vm
.
VM_Linker
)
time_linker
(
'vmLinker_nogc'
,
lambda
:
vm
.
VM_Linker
(
allow_gc
=
False
))
...
...
@@ -230,6 +230,8 @@ if run_memory_usage_tests:
a
=
cuda
.
CudaNdarray
(
n
)
a
.
sum
()
assert
c
==
sys
.
getrefcount
(
n
)
# This is to confuse flake8
a
=
a
del
a
if
not
i
%
1000
:
print
(
'.'
,
end
=
' '
)
...
...
theano/gof/type.py
浏览文件 @
c855e8d6
...
...
@@ -282,11 +282,7 @@ class PureType(object):
'Cannot convert Type
%(othertype)
s '
'(of Variable
%(other)
s) into Type
%(self)
s. '
'You can try to manually convert
%(other)
s into a
%(self)
s.'
%
dict
(
othertype
=
other
.
type
,
other
=
other
,
self
=
self
)
)
%
dict
(
othertype
=
other
.
type
,
other
=
other
,
self
=
self
))
return
other
def
is_valid_value
(
self
,
a
):
...
...
theano/misc/elemwise_time_test.py
浏览文件 @
c855e8d6
...
...
@@ -35,7 +35,7 @@ def ElemwiseOpTime(N, script=False, loops=1000):
x
=
T
.
vector
(
'x'
)
np
.
random
.
seed
(
1235
)
v
=
np
.
random
.
random
(
N
)
.
astype
(
theano
.
config
.
floatX
)
f
=
theano
.
function
([
x
],
2
*
x
+
x
*
x
)
f
=
theano
.
function
([
x
],
2
*
x
+
x
*
x
)
f1
=
theano
.
function
([
x
],
T
.
tanh
(
x
))
if
not
script
:
if
theano
.
config
.
openmp
:
...
...
theano/sandbox/cuda/tests/test_fftconv.py
浏览文件 @
c855e8d6
...
...
@@ -194,7 +194,7 @@ class TestConv3dFFT(unittest.TestCase):
res_ref
=
f_ref
()
res_fft
=
f_fft
()
utt
.
assert_allclose
(
res_ref
,
res_fft
,
rtol
=
1e-05
,
atol
=
1e-05
)
utt
.
assert_allclose
(
res_ref
,
res_fft
,
rtol
=
1e-05
,
atol
=
1e-05
)
def
run_conv_full
(
self
,
inputs_shape
,
filters_shape
,
pad
=
False
):
inputs_val
=
numpy
.
random
.
random
(
inputs_shape
)
.
astype
(
'float32'
)
...
...
@@ -220,7 +220,7 @@ class TestConv3dFFT(unittest.TestCase):
res_ref
=
f_ref
()
res_fft
=
f_fft
()
utt
.
assert_allclose
(
res_ref
,
res_fft
,
rtol
=
1e-04
,
atol
=
1e-04
)
utt
.
assert_allclose
(
res_ref
,
res_fft
,
rtol
=
1e-04
,
atol
=
1e-04
)
def
test_valid
(
self
):
self
.
run_conv_valid
(
inputs_shape
=
(
16
,
20
,
32
,
16
,
1
),
...
...
@@ -299,7 +299,7 @@ class TestConv3dFFT(unittest.TestCase):
res_ref
=
f_ref
()
res_fft
=
f_fft
()
utt
.
assert_allclose
(
res_ref
,
res_fft
,
rtol
=
1e-04
,
atol
=
1e-04
)
utt
.
assert_allclose
(
res_ref
,
res_fft
,
rtol
=
1e-04
,
atol
=
1e-04
)
def
test_opt_convtransp3d_fft
(
self
):
inputs_shape
=
(
2
,
9
,
16
,
12
,
10
)
...
...
theano/sandbox/cuda/tests/test_type.py
浏览文件 @
c855e8d6
import
six.moves.cPickle
as
pickle
import
os.path
import
sys
from
nose.tools
import
assert_raises
import
numpy
...
...
theano/sandbox/gpuarray/opt.py
浏览文件 @
c855e8d6
...
...
@@ -255,7 +255,7 @@ def local_gpu_elemwise(node):
scal_op
=
op
.
scalar_op
name
=
op
.
name
if
name
:
name
=
'Gpu'
+
name
name
=
'Gpu'
+
name
res
=
GpuElemwise
(
scal_op
,
name
=
name
,
inplace_pattern
=
copy
.
copy
(
op
.
inplace_pattern
),
nfunc_spec
=
op
.
nfunc_spec
)
...
...
@@ -349,7 +349,7 @@ def local_gpu_pdbbreakpoint_op(node):
nb_monitored_vars
=
len
(
node
.
outputs
)
for
i
in
range
(
nb_monitored_vars
):
inp
=
old_inputs
[
i
+
1
]
inp
=
old_inputs
[
i
+
1
]
out
=
old_outputs
[
i
]
input_is_from_gpu
=
(
inp
.
owner
and
...
...
theano/scalar/tests/test_basic_sympy.py
浏览文件 @
c855e8d6
...
...
@@ -25,12 +25,12 @@ def test_grad():
op
=
SymPyCCode
([
xs
],
xs
**
2
)
zt
=
op
(
xt
)
ztprime
=
theano
.
grad
(
zt
,
xt
)
assert
ztprime
.
owner
.
op
.
expr
==
2
*
xs
assert
ztprime
.
owner
.
op
.
expr
==
2
*
xs
def
test_multivar_grad
():
op
=
SymPyCCode
([
xs
,
ys
],
xs
**
2
+
ys
**
3
)
op
=
SymPyCCode
([
xs
,
ys
],
xs
**
2
+
ys
**
3
)
zt
=
op
(
xt
,
yt
)
dzdx
,
dzdy
=
theano
.
grad
(
zt
,
[
xt
,
yt
])
assert
dzdx
.
owner
.
op
.
expr
==
2
*
xs
assert
dzdy
.
owner
.
op
.
expr
==
3
*
ys
**
2
assert
dzdx
.
owner
.
op
.
expr
==
2
*
xs
assert
dzdy
.
owner
.
op
.
expr
==
3
*
ys
**
2
theano/tensor/elemwise.py
浏览文件 @
c855e8d6
...
...
@@ -136,16 +136,15 @@ class DimShuffle(Op):
# returning False for numpy integers.
# See <http://projects.scipy.org/numpy/ticket/2235>.
if
not
isinstance
(
j
,
(
int
,
numpy
.
integer
)):
raise
TypeError
(
"DimShuffle indices must be python ints."
)
raise
TypeError
(
"DimShuffle indices must be python ints."
)
if
j
>=
len
(
input_broadcastable
):
raise
ValueError
((
"new_order[
%
d] is
%
d, but the input "
"only has
%
d axes."
)
%
(
i
,
j
,
len
(
input_broadcastable
)))
if
j
in
new_order
[(
i
+
1
):]:
raise
ValueError
(
(
"The same input dimension may not appear twice in the "
"list of output dimensions"
,
(
new_order
))
)
raise
ValueError
(
"The same input dimension may not appear "
"twice in the list of output dimensions"
,
new_order
)
# list of dimensions of the input to drop
self
.
drop
=
[]
...
...
@@ -158,8 +157,8 @@ class DimShuffle(Op):
else
:
# we cannot drop non-broadcastable dimensions
raise
ValueError
(
"You cannot drop a non-broadcastable dimension."
,
(
input_broadcastable
,
new_order
))
"You cannot drop a non-broadcastable dimension."
,
(
input_broadcastable
,
new_order
))
# this is the list of the original dimensions that we keep
self
.
shuffle
=
[
x
for
x
in
new_order
if
x
!=
'x'
]
...
...
@@ -246,7 +245,7 @@ class DimShuffle(Op):
raise
TypeError
(
res
)
# transpose
res
=
res
.
transpose
(
self
.
shuffle
+
self
.
drop
)
res
=
res
.
transpose
(
self
.
shuffle
+
self
.
drop
)
# augment
shape
=
list
(
res
.
shape
[:
len
(
self
.
shuffle
)])
...
...
@@ -339,26 +338,27 @@ class DimShuffle(Op):
# npy_intp* strides, void* data, int itemsize, int flags, PyObject* obj)
#
close_bracket
=
[
# create a new array,
(
'
%(res)
s = (PyArrayObject*)PyArray_New(&PyArray_Type, '
''
+
str
(
nd_out
)
+
', dimensions, '
'PyArray_TYPE(
%(basename)
s), strides, '
'PyArray_DATA(
%(basename)
s), PyArray_ITEMSIZE(
%(basename)
s), '
# borrow only the writable flag from the base
# the NPY_OWNDATA flag will default to 0.
'(NPY_ARRAY_WRITEABLE*PyArray_ISWRITEABLE(
%(basename)
s)), NULL)'
),
'if (
%(res)
s == NULL)
%(fail)
s;'
,
# recalculate flags: CONTIGUOUS, FORTRAN, ALIGNED
'PyArray_UpdateFlags(
%(res)
s, NPY_ARRAY_UPDATE_ALL)'
,
# we are making a view in both inplace and non-inplace cases
"""
# create a new array,
(
'
%(res)
s = (PyArrayObject*)PyArray_New(&PyArray_Type, '
''
+
str
(
nd_out
)
+
', dimensions, '
'PyArray_TYPE(
%(basename)
s), strides, '
'PyArray_DATA(
%(basename)
s), PyArray_ITEMSIZE(
%(basename)
s), '
# borrow only the writable flag from the base
# the NPY_OWNDATA flag will default to 0.
'(NPY_ARRAY_WRITEABLE*PyArray_ISWRITEABLE(
%(basename)
s)), '
'NULL)'
),
'if (
%(res)
s == NULL)
%(fail)
s;'
,
# recalculate flags: CONTIGUOUS, FORTRAN, ALIGNED
'PyArray_UpdateFlags(
%(res)
s, NPY_ARRAY_UPDATE_ALL)'
,
# we are making a view in both inplace and non-inplace cases
"""
#if NPY_API_VERSION < 0x00000007
PyArray_BASE(
%(res)
s) = (PyObject*)
%(basename)
s;
#else
PyArray_SetBaseObject(
%(res)
s, (PyObject*)
%(basename)
s);
#endif
"""
'}'
]
'}'
]
full_code
=
statements
(
check_input_nd
+
clear_output
...
...
@@ -529,8 +529,8 @@ class Elemwise(OpenMPOp):
"""
inputs
=
list
(
map
(
as_tensor_variable
,
inputs
))
shadow
=
self
.
scalar_op
.
make_node
(
*
[
get_scalar_type
(
dtype
=
i
.
type
.
dtype
)
.
make_variable
()
for
i
in
inputs
])
*
[
get_scalar_type
(
dtype
=
i
.
type
.
dtype
)
.
make_variable
()
for
i
in
inputs
])
target_length
=
max
([
input
.
type
.
ndim
for
input
in
inputs
])
...
...
@@ -567,9 +567,9 @@ class Elemwise(OpenMPOp):
for
ob
,
ib
in
izip
(
out_broadcastables
[
overwriter
],
inputs
[
overwritten
]
.
type
.
broadcastable
):
if
ib
and
not
ob
:
raise
ValueError
(
(
raise
ValueError
(
"Operation cannot be done inplace on an input "
"with broadcasted dimensions."
)
)
"with broadcasted dimensions."
)
out_dtypes
=
[
o
.
type
.
dtype
for
o
in
shadow
.
outputs
]
if
any
(
inputs
[
i
]
.
type
.
dtype
!=
out_dtypes
[
o
]
...
...
@@ -767,7 +767,7 @@ class Elemwise(OpenMPOp):
res
=
theano
.
tensor
.
constant
(
numpy
.
asarray
(
r
.
data
),
dtype
=
r
.
type
.
dtype
)
return
DimShuffle
((),
[
'x'
]
*
nd
,
inplace
=
False
)(
res
)
new_r
=
Elemwise
(
node
.
op
,
{})(
*
[
transform
(
ipt
)
for
ipt
in
node
.
inputs
])
*
[
transform
(
ipt
)
for
ipt
in
node
.
inputs
])
return
new_r
ret
=
[]
for
scalar_igrad
,
ipt
in
izip
(
scalar_igrads
,
inputs
):
...
...
@@ -1041,15 +1041,15 @@ class Elemwise(OpenMPOp):
# We generate the C code of the inner loop using the scalar op
task_code
=
self
.
scalar_op
.
c_code
(
Apply
(
self
.
scalar_op
,
[
get_scalar_type
(
dtype
=
input
.
type
.
dtype
)
.
make_variable
()
for
input
in
node
.
inputs
],
[
get_scalar_type
(
dtype
=
output
.
type
.
dtype
)
.
make_variable
()
for
output
in
node
.
outputs
]),
nodename
+
'_scalar_'
,
[
"
%
s_i"
%
s
for
s
in
_inames
],
[
"
%
s_i"
%
s
for
s
in
onames
],
sub
)
Apply
(
self
.
scalar_op
,
[
get_scalar_type
(
dtype
=
input
.
type
.
dtype
)
.
make_variable
()
for
input
in
node
.
inputs
],
[
get_scalar_type
(
dtype
=
output
.
type
.
dtype
)
.
make_variable
()
for
output
in
node
.
outputs
]),
nodename
+
'_scalar_'
,
[
"
%
s_i"
%
s
for
s
in
_inames
],
[
"
%
s_i"
%
s
for
s
in
onames
],
sub
)
code
=
"""
{
%(defines)
s
...
...
@@ -1379,7 +1379,7 @@ class CAReduce(Op):
def
__str__
(
self
):
if
self
.
axis
is
not
None
:
return
"Reduce{
%
s}{
%
s}"
%
(
self
.
scalar_op
,
", "
.
join
(
str
(
x
)
for
x
in
self
.
axis
))
self
.
scalar_op
,
", "
.
join
(
str
(
x
)
for
x
in
self
.
axis
))
else
:
return
"Reduce{
%
s}"
%
self
.
scalar_op
...
...
@@ -1462,8 +1462,8 @@ class CAReduce(Op):
if
hasattr
(
self
,
'acc_dtype'
)
and
self
.
acc_dtype
is
not
None
:
acc_type
=
TensorType
(
broadcastable
=
node
.
outputs
[
0
]
.
broadcastable
,
dtype
=
self
.
acc_dtype
)
broadcastable
=
node
.
outputs
[
0
]
.
broadcastable
,
dtype
=
self
.
acc_dtype
)
adtype
=
acc_type
.
dtype_specs
()[
1
]
else
:
adtype
=
odtype
...
...
@@ -1510,12 +1510,12 @@ class CAReduce(Op):
# Allocate output buffer
alloc
+=
cgen
.
make_declare
(
[
list
(
range
(
nnested
))
+
[
'x'
]
*
len
(
axis
)],
[
odtype
],
dict
(
sub
,
lv0
=
oname
))
[
list
(
range
(
nnested
))
+
[
'x'
]
*
len
(
axis
)],
[
odtype
],
dict
(
sub
,
lv0
=
oname
))
alloc
+=
cgen
.
make_alloc
([
order1
],
odtype
,
sub
)
alloc
+=
cgen
.
make_checks
(
[
list
(
range
(
nnested
))
+
[
'x'
]
*
len
(
axis
)],
[
odtype
],
dict
(
sub
,
lv0
=
oname
))
[
list
(
range
(
nnested
))
+
[
'x'
]
*
len
(
axis
)],
[
odtype
],
dict
(
sub
,
lv0
=
oname
))
if
adtype
!=
odtype
:
# Allocate accumulation buffer
...
...
@@ -1523,12 +1523,12 @@ class CAReduce(Op):
sub
[
'olv'
]
=
aname
alloc
+=
cgen
.
make_declare
(
[
list
(
range
(
nnested
))
+
[
'x'
]
*
len
(
axis
)],
[
adtype
],
dict
(
sub
,
lv0
=
aname
))
[
list
(
range
(
nnested
))
+
[
'x'
]
*
len
(
axis
)],
[
adtype
],
dict
(
sub
,
lv0
=
aname
))
alloc
+=
cgen
.
make_alloc
([
order1
],
adtype
,
sub
)
alloc
+=
cgen
.
make_checks
(
[
list
(
range
(
nnested
))
+
[
'x'
]
*
len
(
axis
)],
[
adtype
],
dict
(
sub
,
lv0
=
aname
))
[
list
(
range
(
nnested
))
+
[
'x'
]
*
len
(
axis
)],
[
adtype
],
dict
(
sub
,
lv0
=
aname
))
if
hasattr
(
self
.
scalar_op
,
'identity'
):
identity
=
self
.
scalar_op
.
identity
...
...
@@ -1608,8 +1608,8 @@ for(int i=0;i<PyArray_NDIM(%(iname)s);i++){
else
:
all_code
=
[
task0_decl
+
code1
]
loop
=
cgen
.
make_loop_careduce
(
[
order
,
list
(
range
(
nnested
))
+
[
'x'
]
*
len
(
axis
)],
[
idtype
,
adtype
],
all_code
,
sub
)
[
order
,
list
(
range
(
nnested
))
+
[
'x'
]
*
len
(
axis
)],
[
idtype
,
adtype
],
all_code
,
sub
)
end
=
""
if
adtype
!=
odtype
:
...
...
@@ -1789,19 +1789,16 @@ class CAReduceDtype(CAReduce):
int32
=
'int64'
,
uint8
=
'uint32'
,
uint16
=
'uint32'
,
uint32
=
'uint64'
,
)
.
get
(
idtype
,
idtype
)
uint32
=
'uint64'
)
.
get
(
idtype
,
idtype
)
if
dtype
is
None
:
# If input has a discrete dtype, upcast it to 64
return
dict
(
int8
=
'int64'
,
int16
=
'int64'
,
int32
=
'int64'
,
uint8
=
'uint64'
,
uint16
=
'uint64'
,
uint32
=
'uint64'
,
)
.
get
(
idtype
,
idtype
)
int8
=
'int64'
,
int16
=
'int64'
,
int32
=
'int64'
,
uint8
=
'uint64'
,
uint16
=
'uint64'
,
uint32
=
'uint64'
)
.
get
(
idtype
,
idtype
)
else
:
# The important is that the accumulator dtype does not
# lose precision. Then, the result can be downcasted.
...
...
@@ -1811,16 +1808,15 @@ class CAReduceDtype(CAReduce):
acc_dtype
=
self
.
acc_dtype
if
acc_dtype
is
None
:
return
dict
(
int8
=
'int64'
,
int16
=
'int64'
,
int32
=
'int64'
,
uint8
=
'uint64'
,
uint16
=
'uint64'
,
uint32
=
'uint64'
,
float16
=
'float32'
,
float32
=
'float64'
,
complex64
=
'complex128'
,
)
.
get
(
idtype
,
idtype
)
int8
=
'int64'
,
int16
=
'int64'
,
int32
=
'int64'
,
uint8
=
'uint64'
,
uint16
=
'uint64'
,
uint32
=
'uint64'
,
float16
=
'float32'
,
float32
=
'float64'
,
complex64
=
'complex128'
)
.
get
(
idtype
,
idtype
)
elif
(
acc_dtype
in
theano
.
tensor
.
continuous_dtypes
and
idtype
in
theano
.
tensor
.
discrete_dtypes
):
# Specifying a continuous accumulator for discrete input is OK
...
...
@@ -1830,17 +1826,17 @@ class CAReduceDtype(CAReduce):
upcasted_dtype
=
scalar
.
upcast
(
idtype
,
acc_dtype
)
if
acc_dtype
!=
upcasted_dtype
:
raise
TypeError
(
'Cannot build
%
s node with input dtype
%
s '
'and acc_dtype
%
s, as precision would be lost. '
'To correct this error, you can:
\n
'
' - not specify acc_dtype, or
\n
'
' - use an acc_dtype at least as precise as
%
s.
\n
'
' - specify "dtype" instead of "acc_dtype", so '
'the reduction will be precise, but the result will '
'be casted into "dtype" at the end.
\n
'
'If you are expecting the precision loss, you can '
'use tensor.cast(..., dtype="
%
s"), on your input.'
%
(
self
,
idtype
,
acc_dtype
,
upcasted_dtype
,
acc_dtype
))
'Cannot build
%
s node with input dtype
%
s '
'and acc_dtype
%
s, as precision would be lost. '
'To correct this error, you can:
\n
'
' - not specify acc_dtype, or
\n
'
' - use an acc_dtype at least as precise as
%
s.
\n
'
' - specify "dtype" instead of "acc_dtype", so '
'the reduction will be precise, but the result will '
'be casted into "dtype" at the end.
\n
'
'If you are expecting the precision loss, you can '
'use tensor.cast(..., dtype="
%
s"), on your input.'
%
(
self
,
idtype
,
acc_dtype
,
upcasted_dtype
,
acc_dtype
))
return
acc_dtype
def
make_node
(
self
,
input
):
...
...
@@ -2071,7 +2067,7 @@ class Prod(CAReduceDtype):
where_zeros
=
T
.
eq
(
prod_in
,
0.0
)
sum_where_zeros
=
T
.
sum
(
where_zeros
,
axis
=
self
.
axis
)
groups_with_single_zero
=
T
.
eq
(
sum_where_zeros
,
1
)
.
dimshuffle
(
new_dims
)
new_dims
)
# tensor with 0 everywhere except for those places where
# a 0 part of a group with a single zero was to be found
where_single_zero
=
groups_with_single_zero
*
where_zeros
...
...
@@ -2081,7 +2077,7 @@ class Prod(CAReduceDtype):
# only take ProdWithoutZeros for the groups with single zeros
# with non-null incoming gradient
where_to_take_prod_without_zeros
=
(
groups_with_single_zero
*
where_gz_not_zero
)
groups_with_single_zero
*
where_gz_not_zero
)
# preprocess the original input so that we set 0 everywhere
# except for groups that contain a single zero, to avoid computing
# multiplications on other groups
...
...
@@ -2090,16 +2086,16 @@ class Prod(CAReduceDtype):
# this is pretty efficient already (no multiplication if 0), but
# it'd be even better if we had a lazy if per element
prod_without_zeros
=
ProdWithoutZeros
(
axis
=
self
.
axis
)(
prod_without_zeros_in
)
prod_without_zeros_in
)
prod_without_zeros
=
prod_without_zeros
.
dimshuffle
(
new_dims
)
groups_without_zeros
=
T
.
eq
(
sum_where_zeros
,
0
)
.
dimshuffle
(
new_dims
)
new_dims
)
final_grad
=
T
.
switch
(
groups_without_zeros
,
grad_case_without_zeros
,
T
.
switch
(
where_single_zero
,
prod_without_zeros
,
0.0
)
*
gz
)
groups_without_zeros
,
grad_case_without_zeros
,
T
.
switch
(
where_single_zero
,
prod_without_zeros
,
0.0
)
*
gz
)
return
[
final_grad
]
...
...
theano/tensor/inplace.py
浏览文件 @
c855e8d6
...
...
@@ -29,9 +29,6 @@ def _scal_inplace(symbol):
if
not
r
.
owner
:
return
False
op
=
r
.
owner
.
op
# print op, rval, r.owner and op == rval
# print op.inplace_pattern, rval.inplace_pattern, op.inplace_pattern == rval.inplace_pattern
# print op.scalar_op, rval.scalar_op, op.scalar_op == rval.scalar_op
return
r
.
owner
.
op
==
rval
pprint
.
assign
(
chk
,
printing
.
FunctionPrinter
(
symbolname
.
replace
(
'_inplace'
,
'='
)))
...
...
@@ -348,17 +345,13 @@ def conj_inplace(a):
pprint
.
assign
(
add_inplace
,
printing
.
OperatorPrinter
(
'+='
,
-
2
,
'either'
))
pprint
.
assign
(
mul_inplace
,
printing
.
OperatorPrinter
(
'*='
,
-
1
,
'either'
))
pprint
.
assign
(
sub_inplace
,
printing
.
OperatorPrinter
(
'-='
,
-
2
,
'left'
))
pprint
.
assign
(
neg_inplace
,
printing
.
OperatorPrinter
(
'-='
,
0
,
'either'
))
pprint
.
assign
(
neg_inplace
,
printing
.
OperatorPrinter
(
'-='
,
0
,
'either'
))
pprint
.
assign
(
true_div_inplace
,
printing
.
OperatorPrinter
(
'/='
,
-
1
,
'left'
))
pprint
.
assign
(
int_div_inplace
,
printing
.
OperatorPrinter
(
'//='
,
-
1
,
'left'
))
pprint
.
assign
(
pow_inplace
,
printing
.
OperatorPrinter
(
'**='
,
1
,
'right'
))
def
transpose_inplace
(
x
,
**
kwargs
):
"
""Perform a transpose on a tensor without copying the underlying storage""
"
"
Perform a transpose on a tensor without copying the underlying storage
"
dims
=
list
(
range
(
x
.
ndim
-
1
,
-
1
,
-
1
))
return
elemwise
.
DimShuffle
(
x
.
broadcastable
,
dims
,
inplace
=
True
)(
x
)
#pprint.assign(transpose_inplace, printing.MemberPrinter('T'))
theano/tensor/shared_randomstreams.py
浏览文件 @
c855e8d6
...
...
@@ -24,11 +24,11 @@ def randomstate_constructor(value, name=None, strict=False,
if
not
borrow
:
value
=
copy
.
deepcopy
(
value
)
return
RandomStateSharedVariable
(
type
=
raw_random
.
random_state_type
,
value
=
value
,
name
=
name
,
strict
=
strict
,
allow_downcast
=
allow_downcast
)
type
=
raw_random
.
random_state_type
,
value
=
value
,
name
=
name
,
strict
=
strict
,
allow_downcast
=
allow_downcast
)
class
RandomStreams
(
raw_random
.
RandomStreamsBase
):
...
...
theano/tensor/slinalg.py
浏览文件 @
c855e8d6
...
...
@@ -25,15 +25,14 @@ except ImportError:
imported_scipy
=
False
MATRIX_STRUCTURES
=
(
'general'
,
'symmetric'
,
'lower_triangular'
,
'upper_triangular'
,
'hermitian'
,
'banded'
,
'diagonal'
,
'toeplitz'
,
)
'general'
,
'symmetric'
,
'lower_triangular'
,
'upper_triangular'
,
'hermitian'
,
'banded'
,
'diagonal'
,
'toeplitz'
)
class
Cholesky
(
Op
):
...
...
@@ -168,8 +167,8 @@ class Solve(Op):
assert
A
.
ndim
==
2
assert
b
.
ndim
in
[
1
,
2
]
otype
=
tensor
.
tensor
(
broadcastable
=
b
.
broadcastable
,
dtype
=
(
A
*
b
)
.
dtype
)
broadcastable
=
b
.
broadcastable
,
dtype
=
(
A
*
b
)
.
dtype
)
return
Apply
(
self
,
[
A
,
b
],
[
otype
])
def
perform
(
self
,
node
,
inputs
,
output_storage
):
...
...
@@ -294,7 +293,7 @@ class EigvalshGrad(Op):
(
a
,
b
,
gw
)
=
inputs
w
,
v
=
scipy
.
linalg
.
eigh
(
a
,
b
,
lower
=
self
.
lower
)
gA
=
v
.
dot
(
numpy
.
diag
(
gw
)
.
dot
(
v
.
T
))
gB
=
-
v
.
dot
(
numpy
.
diag
(
gw
*
w
)
.
dot
(
v
.
T
))
gB
=
-
v
.
dot
(
numpy
.
diag
(
gw
*
w
)
.
dot
(
v
.
T
))
# See EighGrad comments for an explanation of these lines
out1
=
self
.
tri0
(
gA
)
+
self
.
tri1
(
gA
)
.
T
...
...
theano/tensor/subtensor.py
浏览文件 @
c855e8d6
...
...
@@ -155,16 +155,16 @@ def get_canonical_form_slice(theslice, length):
1
),
1
)
stop_plus_len
=
stop
+
length
stop
=
switch
(
lt
(
stop
,
0
),
# stop < 0
switch
(
lt
(
stop_plus_len
,
0
),
# stop + len < 0
0
,
# stop + len >= 0
stop_plus_len
),
# stop >= 0: use min(stop, length)
switch
(
lt
(
stop
,
length
),
stop
,
length
))
lt
(
stop
,
0
),
# stop < 0
switch
(
lt
(
stop_plus_len
,
0
),
# stop + len < 0
0
,
# stop + len >= 0
stop_plus_len
),
# stop >= 0: use min(stop, length)
switch
(
lt
(
stop
,
length
),
stop
,
length
))
return
slice
(
0
,
stop
,
1
),
1
elif
is_stop_length
:
# start:length:1
...
...
@@ -173,16 +173,16 @@ def get_canonical_form_slice(theslice, length):
length
,
1
),
1
start_plus_len
=
start
+
length
start
=
switch
(
lt
(
start
,
0
),
# start < 0
switch
(
lt
(
start_plus_len
,
0
),
# start + len < 0
0
,
# start + len >= 0
start_plus_len
),
# start >= 0: use min(start, length)
switch
(
lt
(
start
,
length
),
start
,
length
))
lt
(
start
,
0
),
# start < 0
switch
(
lt
(
start_plus_len
,
0
),
# start + len < 0
0
,
# start + len >= 0
start_plus_len
),
# start >= 0: use min(start, length)
switch
(
lt
(
start
,
length
),
start
,
length
))
return
slice
(
start
,
length
,
1
),
1
# This is the generic case.
...
...
@@ -614,10 +614,8 @@ class Subtensor(Op):
helper_c_code
"""
return
{
"c_prefix"
:
"PyArray"
,
"strides_mul"
:
1
,
}
return
{
"c_prefix"
:
"PyArray"
,
"strides_mul"
:
1
}
@staticmethod
def
helper_c_code
(
node
,
name
,
inputs
,
outputs
,
sub
,
idx_list
,
view_ndim
,
...
...
theano/tensor/var.py
浏览文件 @
c855e8d6
...
...
@@ -389,17 +389,15 @@ class _tensor_py_operators:
axis
=
i
if
advanced
:
if
(
axis
is
not
None
and
all
(
isinstance
(
a
,
slice
)
and
equal_slices
(
a
,
slice
(
None
))
for
a
in
args
[:
axis
])
and
all
(
isinstance
(
a
,
slice
)
and
equal_slices
(
a
,
slice
(
None
))
for
a
in
args
[
axis
+
1
:])
and
isinstance
(
args
[
axis
],
(
numpy
.
ndarray
,
list
,
TensorVariable
,
TensorConstant
,
theano
.
tensor
.
sharedvar
.
TensorSharedVariable
))):
if
(
axis
is
not
None
and
all
(
isinstance
(
a
,
slice
)
and
equal_slices
(
a
,
slice
(
None
))
for
a
in
args
[:
axis
])
and
all
(
isinstance
(
a
,
slice
)
and
equal_slices
(
a
,
slice
(
None
))
for
a
in
args
[
axis
+
1
:])
and
isinstance
(
args
[
axis
],
(
numpy
.
ndarray
,
list
,
TensorVariable
,
TensorConstant
,
theano
.
tensor
.
sharedvar
.
TensorSharedVariable
))):
return
self
.
take
(
args
[
axis
],
axis
)
else
:
return
theano
.
tensor
.
subtensor
.
advanced_subtensor
(
self
,
*
args
)
...
...
theano/tests/breakpoint.py
浏览文件 @
c855e8d6
...
...
@@ -88,7 +88,7 @@ class PdbBreakpoint(Op):
for
i
in
range
(
len
(
monitored_vars
)):
# Every output i is a view of the input i+1 because of the input
# condition.
new_op
.
view_map
[
i
]
=
[
i
+
1
]
new_op
.
view_map
[
i
]
=
[
i
+
1
]
new_op
.
inp_types
.
append
(
monitored_vars
[
i
]
.
type
)
# Build the Apply node
...
...
@@ -125,7 +125,7 @@ class PdbBreakpoint(Op):
else
:
# Simply return views on the monitored variables
for
i
in
range
(
len
(
output_storage
)):
output_storage
[
i
][
0
]
=
inputs
[
i
+
1
]
output_storage
[
i
][
0
]
=
inputs
[
i
+
1
]
def
grad
(
self
,
inputs
,
output_gradients
):
return
([
DisconnectedType
()()]
+
output_gradients
)
...
...
theano/tests/disturb_mem.py
浏览文件 @
c855e8d6
...
...
@@ -20,4 +20,4 @@ def disturb_mem():
ms
=
int
(
ms
)
n
=
ms
%
1000
m
=
ms
//
1000
l
=
[[
0
]
*
m
for
i
in
xrange
(
n
)]
l
=
[[
0
]
*
m
for
i
in
xrange
(
n
)]
theano/tests/test_dictionary_output.py
浏览文件 @
c855e8d6
...
...
@@ -12,8 +12,8 @@ class dictionary_output_checker(unittest.TestCase):
'''
x
=
T
.
scalar
()
f
=
theano
.
function
([
x
],
outputs
=
{
'a'
:
x
,
'c'
:
x
*
2
,
'b'
:
x
*
3
,
'1'
:
x
*
4
})
f
=
theano
.
function
([
x
],
outputs
=
{
'a'
:
x
,
'c'
:
x
*
2
,
'b'
:
x
*
3
,
'1'
:
x
*
4
})
outputs
=
f
(
10.0
)
...
...
theano/tests/test_flake8.py
浏览文件 @
c855e8d6
...
...
@@ -6,7 +6,6 @@ from nose.plugins.skip import SkipTest
import
os
from
fnmatch
import
fnmatch
import
theano
from
theano.compat
import
PY3
try
:
import
flake8.engine
import
flake8.main
...
...
@@ -18,6 +17,10 @@ __authors__ = ("Saizheng Zhang")
__copyright__
=
"(c) 2015, Universite de Montreal"
__contact__
=
"Saizheng Zhang <saizhenglisa..at..gmail.com>"
# This corresponds to "line too long" and it's too much of a pain with
# all of the C code
ignore
=
(
'E501'
,)
whitelist_flake8
=
[
"compat/six.py"
,
# This is bundled code that will be deleted, don't fix it
"__init__.py"
,
...
...
@@ -74,7 +77,6 @@ whitelist_flake8 = [
"tensor/extra_ops.py"
,
"tensor/nlinalg.py"
,
"tensor/blas_c.py"
,
"tensor/io.py"
,
"tensor/elemwise_cgen.py"
,
"tensor/raw_random.py"
,
"tensor/blas_scipy.py"
,
...
...
@@ -93,7 +95,6 @@ whitelist_flake8 = [
"tensor/tests/test_merge.py"
,
"tensor/tests/test_gc.py"
,
"tensor/tests/test_complex.py"
,
"tensor/tests/test_type_other.py"
,
"tensor/tests/test_io.py"
,
"tensor/tests/test_sharedvar.py"
,
"tensor/tests/test_fourier.py"
,
...
...
@@ -160,8 +161,6 @@ whitelist_flake8 = [
"sandbox/cuda/opt.py"
,
"sandbox/cuda/blas.py"
,
"sandbox/cuda/blocksparse.py"
,
"sandbox/cuda/GpuConv3D.py"
,
"sandbox/cuda/extra_ops.py"
,
"sandbox/cuda/rng_curand.py"
,
"sandbox/cuda/fftconv.py"
,
"sandbox/cuda/kernel_codegen.py"
,
...
...
@@ -172,7 +171,6 @@ whitelist_flake8 = [
"sandbox/cuda/tests/test_gradient.py"
,
"sandbox/cuda/tests/test_neighbours.py"
,
"sandbox/cuda/tests/test_conv_cuda_ndarray.py"
,
"sandbox/cuda/tests/test_type.py"
,
"sandbox/cuda/tests/test_var.py"
,
"sandbox/cuda/tests/test_opt.py"
,
"sandbox/cuda/tests/test_blas.py"
,
...
...
@@ -235,7 +233,6 @@ whitelist_flake8 = [
"misc/pycuda_utils.py"
,
"misc/pycuda_example.py"
,
"misc/ordered_set.py"
,
"misc/windows.py"
,
"misc/strutil.py"
,
"misc/gnumpy_utils.py"
,
"misc/may_share_memory.py"
,
...
...
@@ -250,7 +247,6 @@ whitelist_flake8 = [
"misc/tests/test_pycuda_example.py"
,
"misc/hooks/reindent.py"
,
"misc/hooks/check_whitespace.py"
,
"sparse/sharedvar.py"
,
"sparse/type.py"
,
"sparse/__init__.py"
,
"sparse/opt.py"
,
...
...
@@ -308,15 +304,13 @@ def test_format_flake8():
"""
if
not
flake8_available
:
raise
SkipTest
(
"flake8 is not installed"
)
if
PY3
:
raise
SkipTest
(
"not testing in python3 since 2to3 ran"
)
total_errors
=
0
for
path
in
list_files
():
rel_path
=
os
.
path
.
relpath
(
path
,
theano
.
__path__
[
0
])
if
rel_path
in
whitelist_flake8
:
continue
else
:
error_num
=
flake8
.
main
.
check_file
(
path
)
error_num
=
flake8
.
main
.
check_file
(
path
,
ignore
=
ignore
)
total_errors
+=
error_num
if
total_errors
>
0
:
raise
AssertionError
(
"FLAKE8 Format not respected"
)
...
...
@@ -332,7 +326,8 @@ def print_files_information_flake8():
non_infracting_files
=
[]
for
path
in
list_files
():
rel_path
=
os
.
path
.
relpath
(
path
,
theano
.
__path__
[
0
])
number_of_infractions
=
flake8
.
main
.
check_file
(
path
)
number_of_infractions
=
flake8
.
main
.
check_file
(
path
,
ignore
=
ignore
)
if
number_of_infractions
>
0
:
if
rel_path
not
in
whitelist_flake8
:
infracting_files
.
append
(
rel_path
)
...
...
@@ -359,7 +354,8 @@ def check_all_files(dir_path=theano.__path__[0], pattern='*.py'):
for
(
dir
,
_
,
files
)
in
os
.
walk
(
dir_path
):
for
f
in
files
:
if
fnmatch
(
f
,
pattern
):
error_num
=
flake8
.
main
.
check_file
(
os
.
path
.
join
(
dir
,
f
))
error_num
=
flake8
.
main
.
check_file
(
os
.
path
.
join
(
dir
,
f
),
ignore
=
ignore
)
if
error_num
>
0
:
path
=
os
.
path
.
relpath
(
os
.
path
.
join
(
dir
,
f
),
theano
.
__path__
[
0
])
...
...
theano/tests/test_printing.py
浏览文件 @
c855e8d6
...
...
@@ -495,17 +495,17 @@ def test_scan_debugprint3():
def
test_scan_debugprint4
():
def
fn
(
a_m2
,
a_m1
,
b_m2
,
b_m1
):
return
a_m1
+
a_m2
,
b_m1
+
b_m2
return
a_m1
+
a_m2
,
b_m1
+
b_m2
a0
=
theano
.
shared
(
numpy
.
arange
(
2
))
b0
=
theano
.
shared
(
numpy
.
arange
(
2
))
(
a
,
b
),
_
=
theano
.
scan
(
fn
,
outputs_info
=
[
{
'initial'
:
a0
,
'taps'
:
[
-
2
,
-
1
]},
{
'initial'
:
b0
,
'taps'
:
[
-
2
,
-
1
]}],
n_steps
=
5
)
(
a
,
b
),
_
=
theano
.
scan
(
fn
,
outputs_info
=
[
{
'initial'
:
a0
,
'taps'
:
[
-
2
,
-
1
]},
{
'initial'
:
b0
,
'taps'
:
[
-
2
,
-
1
]}],
n_steps
=
5
)
final_result
=
a
+
b
final_result
=
a
+
b
output_str
=
theano
.
printing
.
debugprint
(
final_result
,
file
=
'str'
)
lines
=
[]
for
line
in
output_str
.
split
(
'
\n
'
):
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论