提交 1790864c authored 作者: Pascal Lamblin's avatar Pascal Lamblin

Add `clone` method to Mode and sub-classes

上级 5fbaa031
...@@ -2620,4 +2620,5 @@ class DebugMode(Mode): ...@@ -2620,4 +2620,5 @@ class DebugMode(Mode):
return "DebugMode(linker=%s, optimizer=%s)" % ( return "DebugMode(linker=%s, optimizer=%s)" % (
self.provided_linker, self.provided_optimizer) self.provided_linker, self.provided_optimizer)
register_mode('DEBUG_MODE', DebugMode(optimizer='fast_run')) register_mode('DEBUG_MODE', DebugMode(optimizer='fast_run'))
...@@ -320,6 +320,21 @@ class Mode(object): ...@@ -320,6 +320,21 @@ class Mode(object):
self.provided_optimizer) self.provided_optimizer)
return self.__class__(linker=link, optimizer=opt.requiring(*tags)) return self.__class__(linker=link, optimizer=opt.requiring(*tags))
def clone(self, link_kwargs=None, **kwargs):
"""
Create a new instance of this Mode.
Keyword arguments can be provided for the linker,
in which case its `clone` method will be called with these
arguments.
"""
new_linker = self.linker.clone(**link_kwargs)
new_optimizer = self.provided_optimizer
new_mode = type(self)(linker=new_linker,
optimizer=new_optimizer)
return new_mode
# If a string is passed as the mode argument in function or # If a string is passed as the mode argument in function or
# FunctionMaker, the Mode will be taken from this dictionary using the # FunctionMaker, the Mode will be taken from this dictionary using the
# string as the key # string as the key
......
...@@ -92,6 +92,20 @@ class MonitorMode(Mode): ...@@ -92,6 +92,20 @@ class MonitorMode(Mode):
ret.post_func = self.post_func ret.post_func = self.post_func
return ret return ret
def clone(self, opt_kwargs=None, **kwargs):
"""
Create a new instance of this Mode.
Keyword arguments can be provided for the linker,
but they will be ignored, because ProfileMode needs
to use its own linker.
"""
new_mode = type(self)(pre_func=self.pre_func,
post_func=self.post_func,
linker=None,
optimizer=self.provided_optimizer)
return new_mode
def detect_nan(i, node, fn): def detect_nan(i, node, fn):
for output in fn.outputs: for output in fn.outputs:
......
...@@ -695,6 +695,29 @@ Test them first, as they are not guaranteed to always provide a speedup.""") ...@@ -695,6 +695,29 @@ Test them first, as they are not guaranteed to always provide a speedup.""")
if not printed_tip: if not printed_tip:
print(" Sorry, no tip for today.") print(" Sorry, no tip for today.")
def clone(self, link_kwargs=None, message=None):
"""
Create a new instance of this Mode.
Keyword arguments can be provided for the linker,
in which case its `clone` method will be called with these
arguments.
"""
new_linker = self.linker.clone(**link_kwargs)
new_optimizer = self.provided_optimizer
new_mode = type(self)(linker=new_linker,
optimizer=new_optimizer)
# If self is in the list or profiles to print, then add the
# new one as well
if self in prof_mode_instance_to_print:
prof_mode_instance_to_print.append(new_mode)
if message:
new_mode.message = message
return new_mode
register_mode('PROFILE_MODE', ProfileMode()) register_mode('PROFILE_MODE', ProfileMode())
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论