I have a generator that implements evaluation of function f() over a grid of parameters:
def gen():
  for a in vec_a:
    for b in vec_b:
      for c in vec_c:
        for ...
          res = f(a, b, c, ...)
          yield (a, b, c, ...), res
vec_* are sorted such that f() is an increasing function of corresponding parameter given all others fixed. More precisely:
if (a2 >= a1) and (b2 >= b1) and (c2 >= c1) and ...:
  assert f(a2, b2, c2, ...) >= f(a1, b1, c1, ...)
Thus, for example, if f(a0, b0, c0, ...) == np.inf, then:
- f(a, b0, c0, ...) == np.inffor every a >= a0
- f(a0, b, c0, ...) == np.inffor every b >= b0
- f(a0, b0, c, ...) == np.inffor every c >= c0
Now I want to write a generic generator that accepts gen and skips unnecessary evaluations of f according to the following rules:
- if f(.) == np.infat some point then I break the innermost loop
- if the innermost loop was interrupted at the very first iteration, I should break the penultimate loop level
- rule #3 applies to all other levels of the nested loop
Example: If I get np.inf at the very first iteration of the grid, I should skip the entire grid and not perform any more evaluations of f.
Example: If I have a grid [0,1,2] x [0,1,2] x [0,1,2] and f(0,1,0) == np.inf, then I jump to evaluation f(1, 0, 0).
How would I implement such a generator?
 
    
 
    
