[varLib] Speed up IUP DP some more when forced set is empty

Pass a maximum lookback of n to the circle-breaking DP of size 2*n.

This should theoretically speed up that DP by a factor of 4 or 8 or something...
Empirically it's far from that, but solidly measurable.

Again, gvar table size got a slight improvement, which I didn't expect... It
might be that my one test is hitting lucky cases with point encodings.. or it
might be just me wishfully thinking so.
This commit is contained in:
Behdad Esfahbod 2017-07-22 18:43:03 -07:00
parent 91e4220193
commit e5ac044969

View File

@ -246,7 +246,7 @@ def _iup_contour_bound_forced_set(delta, coords, tolerance=0):
return forced return forced
def _iup_contour_optimize_dp(delta, coords, forced={}, tolerance=0): def _iup_contour_optimize_dp(delta, coords, forced={}, tolerance=0, lookback=None):
"""Straightforward Dynamic-Programming. For each index i, find least-costly encoding of """Straightforward Dynamic-Programming. For each index i, find least-costly encoding of
points i to n-1 where i is explicitly encoded. We find this by considering all next points i to n-1 where i is explicitly encoded. We find this by considering all next
explicit points j and check whether interpolation can fill points between i and j. explicit points j and check whether interpolation can fill points between i and j.
@ -257,6 +257,8 @@ def _iup_contour_optimize_dp(delta, coords, forced={}, tolerance=0):
As major speedup, we stop looking further whenever we see a "forced" point.""" As major speedup, we stop looking further whenever we see a "forced" point."""
n = len(delta) n = len(delta)
if lookback is None:
lookback = n
costs = {-1:0} costs = {-1:0}
chain = {-1:None} chain = {-1:None}
for i in range(0, n): for i in range(0, n):
@ -268,7 +270,7 @@ def _iup_contour_optimize_dp(delta, coords, forced={}, tolerance=0):
if i - 1 in forced: if i - 1 in forced:
continue continue
for j in range(i-2, -2, -1): for j in range(i-2, max(i-lookback, -2), -1):
cost = costs[j] + 1 cost = costs[j] + 1
@ -343,8 +345,7 @@ def _iup_contour_optimize(delta, coords, tolerance=0.):
delta = _rot_list(delta, -k) delta = _rot_list(delta, -k)
else: else:
chain, costs = _iup_contour_optimize_dp(delta+delta, coords+coords, forced, tolerance) chain, costs = _iup_contour_optimize_dp(delta+delta, coords+coords, forced, tolerance, n)
# TODO add lookback=n to DP
best_sol, best_cost = None, n+1 best_sol, best_cost = None, n+1
for start in range(n-1, 2*n-1): for start in range(n-1, 2*n-1):