Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
pytensor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
testgroup
pytensor
Commits
42116a64
提交
42116a64
authored
11月 30, 2012
作者:
Ian Goodfellow
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
made destroyhandler more deterministic
上级
2db0017d
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
34 行增加
和
32 行删除
+34
-32
destroyhandler.py
theano/gof/destroyhandler.py
+34
-32
没有找到文件。
theano/gof/destroyhandler.py
浏览文件 @
42116a64
...
...
@@ -12,6 +12,8 @@ import theano
import
toolbox
import
graph
from
theano.gof.python25
import
deque
from
theano.gof.python25
import
OrderedDict
from
theano.misc.ordered_set
import
OrderedSet
from
fg
import
InconsistencyError
...
...
@@ -220,7 +222,7 @@ def add_impact(r, view_o, impact):
add_impact
(
v
,
view_o
,
impact
)
def
get_impact
(
root
,
view_o
):
impact
=
s
et
()
impact
=
OrderedS
et
()
add_impact
(
root
,
view_o
,
impact
)
return
impact
...
...
@@ -320,7 +322,7 @@ if 0:
fgraph
.
destroy_handler
=
self
self
.
fgraph
=
fgraph
self
.
destroyers
=
s
et
()
#set of Apply instances with non-null destroy_map
self
.
destroyers
=
OrderedS
et
()
#set of Apply instances with non-null destroy_map
self
.
view_i
=
{}
# variable -> variable used in calculation
self
.
view_o
=
{}
# variable -> set of variables that use this one as a direct input
#clients: how many times does an apply use a given variable
...
...
@@ -402,7 +404,7 @@ if 0:
o
=
app
.
outputs
[
o_idx
]
i
=
app
.
inputs
[
i_idx_list
[
0
]]
self
.
view_i
[
o
]
=
i
self
.
view_o
.
setdefault
(
i
,
s
et
())
.
add
(
o
)
self
.
view_o
.
setdefault
(
i
,
OrderedS
et
())
.
add
(
o
)
# update self.clients
for
i
,
input
in
enumerate
(
app
.
inputs
):
...
...
@@ -420,7 +422,7 @@ if 0:
#self.debug_all_apps.remove(app)
#UPDATE self.clients
for
i
,
input
in
enumerate
(
s
et
(
app
.
inputs
)):
for
i
,
input
in
enumerate
(
OrderedS
et
(
app
.
inputs
)):
del
self
.
clients
[
input
][
app
]
if
getattr
(
app
.
op
,
'destroy_map'
,
{}):
...
...
@@ -480,7 +482,7 @@ if 0:
if
not
self
.
view_o
[
old_r
]:
del
self
.
view_o
[
old_r
]
self
.
view_o
.
setdefault
(
new_r
,
s
et
())
.
add
(
output
)
self
.
view_o
.
setdefault
(
new_r
,
OrderedS
et
())
.
add
(
output
)
self
.
stale_droot
=
True
...
...
@@ -513,7 +515,7 @@ if 0:
c) an Apply destroys (illegally) one of its own inputs by aliasing
"""
rval
=
{}
rval
=
OrderedDict
()
if
self
.
destroyers
:
# BUILD DATA STRUCTURES
...
...
@@ -574,11 +576,11 @@ if 0:
#CHECK FOR INPUT ALIASING
# OPT: pre-compute this on import
tolerate_same
=
getattr
(
app
.
op
,
'destroyhandler_tolerate_same'
,
[])
tolerated
=
s
et
(
idx1
for
idx0
,
idx1
in
tolerate_same
tolerated
=
OrderedS
et
(
idx1
for
idx0
,
idx1
in
tolerate_same
if
idx0
==
destroyed_idx
)
tolerated
.
add
(
destroyed_idx
)
tolerate_aliased
=
getattr
(
app
.
op
,
'destroyhandler_tolerate_aliased'
,
[])
ignored
=
s
et
(
idx1
for
idx0
,
idx1
in
tolerate_aliased
ignored
=
OrderedS
et
(
idx1
for
idx0
,
idx1
in
tolerate_aliased
if
idx0
==
destroyed_idx
)
#print 'tolerated', tolerated
#print 'ignored', ignored
...
...
@@ -592,7 +594,7 @@ if 0:
# add the rule: app must be preceded by all other Apply instances that
# depend on destroyed_input
root_clients
=
s
et
()
root_clients
=
OrderedS
et
()
for
r
in
root_impact
:
assert
not
[
a
for
a
,
c
in
self
.
clients
[
r
]
.
items
()
if
not
c
]
root_clients
.
update
([
a
for
a
,
c
in
self
.
clients
[
r
]
.
items
()
if
c
])
...
...
@@ -710,14 +712,14 @@ class DestroyHandler(toolbox.Bookkeeper):
fgraph
.
destroy_handler
=
self
self
.
fgraph
=
fgraph
self
.
destroyers
=
s
et
()
#set of Apply instances with non-null destroy_map
self
.
view_i
=
{}
# variable -> variable used in calculation
self
.
view_o
=
{}
# variable -> set of variables that use this one as a direct input
self
.
destroyers
=
OrderedS
et
()
#set of Apply instances with non-null destroy_map
self
.
view_i
=
OrderedDict
()
# variable -> variable used in calculation
self
.
view_o
=
OrderedDict
()
# variable -> set of variables that use this one as a direct input
#clients: how many times does an apply use a given variable
self
.
clients
=
{}
# variable -> apply -> ninputs
self
.
clients
=
OrderedDict
()
# variable -> apply -> ninputs
self
.
stale_droot
=
True
self
.
debug_all_apps
=
s
et
()
self
.
debug_all_apps
=
OrderedS
et
()
if
self
.
do_imports_on_attach
:
toolbox
.
Bookkeeper
.
on_attach
(
self
,
fgraph
)
...
...
@@ -728,9 +730,9 @@ class DestroyHandler(toolbox.Bookkeeper):
(see docstrings for these properties above)
"""
if
self
.
stale_droot
:
droot
=
{}
# destroyed view + nonview variables -> foundation
impact
=
{}
# destroyed nonview variable -> it + all views of it
root_destroyer
=
{}
# root -> destroyer apply
droot
=
OrderedDict
()
# destroyed view + nonview variables -> foundation
impact
=
OrderedDict
()
# destroyed nonview variable -> it + all views of it
root_destroyer
=
OrderedDict
()
# root -> destroyer apply
for
app
in
self
.
destroyers
:
for
output_idx
,
input_idx_list
in
app
.
op
.
destroy_map
.
items
():
...
...
@@ -775,25 +777,25 @@ class DestroyHandler(toolbox.Bookkeeper):
#print 'DH IMPORT', app, id(app), id(self), len(self.debug_all_apps)
# If it's a destructive op, add it to our watch list
if
getattr
(
app
.
op
,
'destroy_map'
,
{}
):
if
getattr
(
app
.
op
,
'destroy_map'
,
OrderedDict
()
):
self
.
destroyers
.
add
(
app
)
# add this symbol to the forward and backward maps
for
o_idx
,
i_idx_list
in
getattr
(
app
.
op
,
'view_map'
,
{}
)
.
items
():
for
o_idx
,
i_idx_list
in
getattr
(
app
.
op
,
'view_map'
,
OrderedDict
()
)
.
items
():
if
len
(
i_idx_list
)
>
1
:
raise
NotImplementedError
(
'destroying this output invalidates multiple inputs'
,
(
app
.
op
))
o
=
app
.
outputs
[
o_idx
]
i
=
app
.
inputs
[
i_idx_list
[
0
]]
self
.
view_i
[
o
]
=
i
self
.
view_o
.
setdefault
(
i
,
s
et
())
.
add
(
o
)
self
.
view_o
.
setdefault
(
i
,
OrderedS
et
())
.
add
(
o
)
# update self.clients
for
i
,
input
in
enumerate
(
app
.
inputs
):
self
.
clients
.
setdefault
(
input
,
{}
)
.
setdefault
(
app
,
0
)
self
.
clients
.
setdefault
(
input
,
OrderedDict
()
)
.
setdefault
(
app
,
0
)
self
.
clients
[
input
][
app
]
+=
1
for
i
,
output
in
enumerate
(
app
.
outputs
):
self
.
clients
.
setdefault
(
output
,
{}
)
self
.
clients
.
setdefault
(
output
,
OrderedDict
()
)
self
.
stale_droot
=
True
...
...
@@ -803,10 +805,10 @@ class DestroyHandler(toolbox.Bookkeeper):
self
.
debug_all_apps
.
remove
(
app
)
#UPDATE self.clients
for
i
,
input
in
enumerate
(
s
et
(
app
.
inputs
)):
for
i
,
input
in
enumerate
(
OrderedS
et
(
app
.
inputs
)):
del
self
.
clients
[
input
][
app
]
if
getattr
(
app
.
op
,
'destroy_map'
,
{}
):
if
getattr
(
app
.
op
,
'destroy_map'
,
OrderedDict
()
):
self
.
destroyers
.
remove
(
app
)
# Note: leaving empty client dictionaries in the struct.
...
...
@@ -814,7 +816,7 @@ class DestroyHandler(toolbox.Bookkeeper):
# deleted on_detach().
#UPDATE self.view_i, self.view_o
for
o_idx
,
i_idx_list
in
getattr
(
app
.
op
,
'view_map'
,
{}
)
.
items
():
for
o_idx
,
i_idx_list
in
getattr
(
app
.
op
,
'view_map'
,
OrderedDict
()
)
.
items
():
if
len
(
i_idx_list
)
>
1
:
#destroying this output invalidates multiple inputs
raise
NotImplementedError
()
...
...
@@ -843,11 +845,11 @@ class DestroyHandler(toolbox.Bookkeeper):
if
self
.
clients
[
old_r
][
app
]
==
0
:
del
self
.
clients
[
old_r
][
app
]
self
.
clients
.
setdefault
(
new_r
,
{}
)
.
setdefault
(
app
,
0
)
self
.
clients
.
setdefault
(
new_r
,
OrderedDict
()
)
.
setdefault
(
app
,
0
)
self
.
clients
[
new_r
][
app
]
+=
1
#UPDATE self.view_i, self.view_o
for
o_idx
,
i_idx_list
in
getattr
(
app
.
op
,
'view_map'
,
{}
)
.
items
():
for
o_idx
,
i_idx_list
in
getattr
(
app
.
op
,
'view_map'
,
OrderedDict
()
)
.
items
():
if
len
(
i_idx_list
)
>
1
:
#destroying this output invalidates multiple inputs
raise
NotImplementedError
()
...
...
@@ -863,7 +865,7 @@ class DestroyHandler(toolbox.Bookkeeper):
if
not
self
.
view_o
[
old_r
]:
del
self
.
view_o
[
old_r
]
self
.
view_o
.
setdefault
(
new_r
,
s
et
())
.
add
(
output
)
self
.
view_o
.
setdefault
(
new_r
,
OrderedS
et
())
.
add
(
output
)
self
.
stale_droot
=
True
...
...
@@ -896,7 +898,7 @@ class DestroyHandler(toolbox.Bookkeeper):
c) an Apply destroys (illegally) one of its own inputs by aliasing
"""
rval
=
{}
rval
=
OrderedDict
()
if
self
.
destroyers
:
# BUILD DATA STRUCTURES
...
...
@@ -956,11 +958,11 @@ class DestroyHandler(toolbox.Bookkeeper):
#CHECK FOR INPUT ALIASING
# OPT: pre-compute this on import
tolerate_same
=
getattr
(
app
.
op
,
'destroyhandler_tolerate_same'
,
[])
tolerated
=
s
et
(
idx1
for
idx0
,
idx1
in
tolerate_same
tolerated
=
OrderedS
et
(
idx1
for
idx0
,
idx1
in
tolerate_same
if
idx0
==
destroyed_idx
)
tolerated
.
add
(
destroyed_idx
)
tolerate_aliased
=
getattr
(
app
.
op
,
'destroyhandler_tolerate_aliased'
,
[])
ignored
=
s
et
(
idx1
for
idx0
,
idx1
in
tolerate_aliased
ignored
=
OrderedS
et
(
idx1
for
idx0
,
idx1
in
tolerate_aliased
if
idx0
==
destroyed_idx
)
#print 'tolerated', tolerated
#print 'ignored', ignored
...
...
@@ -974,7 +976,7 @@ class DestroyHandler(toolbox.Bookkeeper):
# add the rule: app must be preceded by all other Apply instances that
# depend on destroyed_input
root_clients
=
s
et
()
root_clients
=
OrderedS
et
()
for
r
in
root_impact
:
assert
not
[
a
for
a
,
c
in
self
.
clients
[
r
]
.
items
()
if
not
c
]
root_clients
.
update
([
a
for
a
,
c
in
self
.
clients
[
r
]
.
items
()
if
c
])
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论