提交 f4895027 authored 作者: Frederic's avatar Frederic

Some fixes: make the merge opt registered correctly as clean up and fix crash.

上级 d7f8cfb5
...@@ -204,7 +204,10 @@ optdb.register('canonicalize', gof.EquilibriumDB(ignore_newtrees=False), ...@@ -204,7 +204,10 @@ optdb.register('canonicalize', gof.EquilibriumDB(ignore_newtrees=False),
# Without this, as the equilibrium have ignore_newtrees=False, we # Without this, as the equilibrium have ignore_newtrees=False, we
# won't merge all nodes if it is set as a global optimizer with # won't merge all nodes if it is set as a global optimizer with
# final_opt=True. # final_opt=True.
optdb['canonicalize'].register("merge", gof.opt.merge_optimizer, 'fast_run',
# We need a new instance of MergeOptimizer to don't have its name
# changed by other usage of it.
optdb['canonicalize'].register("merge", gof.opt.MergeOptimizer(), 'fast_run',
"fast_compile", cleanup=True) "fast_compile", cleanup=True)
optdb.register('merge1.2', gof.MergeOptimizer(), optdb.register('merge1.2', gof.MergeOptimizer(),
......
...@@ -873,9 +873,17 @@ class MergeOptimizer(Optimizer): ...@@ -873,9 +873,17 @@ class MergeOptimizer(Optimizer):
if i[1] > 0: if i[1] > 0:
print(i) print(i)
@staticmethod
merge_optimizer = MergeOptimizer() def merge_profile(prof1, prof2):
nb_fail = prof1[0] + prof2[0]
replace_time = prof1[1] + prof2[1]
validate_time = prof1[2] + prof2[2]
callback_time = prof1[3] + prof2[3]
callbacks_time = merge_dict(prof1[4], prof2[4])
nb_merged = prof1[5] + prof2[5]
nb_constant = prof1[6] + prof2[6]
return (nb_fail, replace_time, validate_time,
callback_time, callbacks_time, nb_merged, nb_constant)
def is_same_graph_with_merge(var1, var2, givens=None): def is_same_graph_with_merge(var1, var2, givens=None):
""" """
...@@ -1975,6 +1983,18 @@ class ChangeTracker: ...@@ -1975,6 +1983,18 @@ class ChangeTracker:
fgraph.change_tracker = self fgraph.change_tracker = self
def merge_dict(d1, d2):
"""
merge 2 dicts by adding the values.
"""
d = d1.copy()
for k, v in iteritems(d2):
if k in d:
d[k] += v
else:
d[k] = v
return d
class EquilibriumOptimizer(NavigatorOptimizer): class EquilibriumOptimizer(NavigatorOptimizer):
""" """
Apply optimizations until equilibrium point. Apply optimizations until equilibrium point.
...@@ -2091,14 +2111,14 @@ class EquilibriumOptimizer(NavigatorOptimizer): ...@@ -2091,14 +2111,14 @@ class EquilibriumOptimizer(NavigatorOptimizer):
time_opts.setdefault(opt, 0) time_opts.setdefault(opt, 0)
node_created.setdefault(opt, 0) node_created.setdefault(opt, 0)
def apply_cleanup(iter_cleanup_sub_profs): def apply_cleanup(profs_dict):
for copt in self.cleanup_optimizers: for copt in self.cleanup_optimizers:
change_tracker.reset() change_tracker.reset()
nb = change_tracker.nb_imported nb = change_tracker.nb_imported
t_opt = time.time() t_opt = time.time()
sub_prof = copt.apply(fgraph) sub_prof = copt.apply(fgraph)
time_opts[copt] += time.time() - t_opt time_opts[copt] += time.time() - t_opt
iter_cleanup_sub_profs[copt].append(sub_prof) profs_dict[copt].append(sub_prof)
if change_tracker.changed: if change_tracker.changed:
process_count.setdefault(copt, 0) process_count.setdefault(copt, 0)
process_count[copt] += 1 process_count[copt] += 1
...@@ -2111,6 +2131,9 @@ class EquilibriumOptimizer(NavigatorOptimizer): ...@@ -2111,6 +2131,9 @@ class EquilibriumOptimizer(NavigatorOptimizer):
t0 = time.time() t0 = time.time()
changed = False changed = False
iter_cleanup_sub_profs = {} iter_cleanup_sub_profs = {}
for copt in self.cleanup_optimizers:
iter_cleanup_sub_profs[copt] = []
# apply global optimizers # apply global optimizers
sub_profs = [] sub_profs = []
for gopt in self.global_optimizers: for gopt in self.global_optimizers:
...@@ -2387,15 +2410,6 @@ class EquilibriumOptimizer(NavigatorOptimizer): ...@@ -2387,15 +2410,6 @@ class EquilibriumOptimizer(NavigatorOptimizer):
l.append(nb) l.append(nb)
return l return l
def merge_dict(d1, d2):
d = d1.copy()
for k, v in iteritems(d2):
if k in d:
d[k] += v
else:
d[k] = v
return d
loop_timing = merge_list(prof1[1], prof2[1]) loop_timing = merge_list(prof1[1], prof2[1])
loop_process_count = list(prof1[2]) loop_process_count = list(prof1[2])
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论