Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

suggested points lie outside of domain #7

Closed
basnijholt opened this issue Dec 19, 2018 · 2 comments
Closed

suggested points lie outside of domain #7

basnijholt opened this issue Dec 19, 2018 · 2 comments

Comments

@basnijholt
Copy link
Member

(original issue on GitLab)

opened by Bas Nijholt (@basnijholt) at 2018-12-14T13:25:39.155Z

This happens because of some numerical precision issues.

import adaptive

adaptive.notebook_extension()
def f(xy):
    import random
    import time
    time.sleep(4 + random.random()/10)
    return random.randint(1, 10)
learner = adaptive.Learner2D(
    f,
    bounds=[
        (0.16, 0.2),
        (0.6, 2.4)
        ]
)

runner = adaptive.Runner(learner, goal=lambda l: l.npoints > 1000, ntasks=10, log=True)

runner.live_info()

Will fail after ~20 points.

@basnijholt
Copy link
Member Author

originally posted by Bas Nijholt (@basnijholt) at 2018-12-14T13:42:02.648Z on GitLab

adding assert self.inside_bounds(point_new) inside _fill_stack to see what the problem is with np.clip:

> /Users/basnijholt/Sync/Work/adaptive/adaptive/learner/learner2D.py(439)_fill_stack()
    437             point_new = tuple(self._unscale(point_new))
    438 
--> 439             assert self.inside_bounds(point_new)
    440             # np.clip results in numerical precision problems
    441             # https://gitlab.kwant-project.org/qt/adaptive/issues/132

ipdb> point_new
(0.18, 0.5999999999999999)
ipdb> np.clip(point_new, *self.bounds)
array([0.18, 0.6 ])
ipdb> np.clip(point_new, *self.bounds) == point_new
array([ True,  True])
ipdb> self.inside_bounds(np.clip(point_new, *self.bounds))
False
ipdb> clip = lambda x, l, u: max(l, min(u, x))
ipdb> self.inside_bounds((clip(point_new[0], *self.bounds[0]), clip(point_new[1], *self.bounds[1])))
True

@basnijholt
Copy link
Member Author

originally posted by Bas Nijholt (@basnijholt) at 2018-12-14T14:10:58.534Z on GitLab

To get the numbers:

import numpy as np
import pickle
tup = pickle.loads(b'\x80\x03cnumpy.core.multiarray\nscalar\nq\x00cnumpy\ndtype\nq\x01X\x02\x00\x00\x00f8q\x02K\x00K\x01\x87q\x03Rq\x04(K\x03X\x01\x00\x00\x00<q\x05NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x06bC\x08\n\xd7\xa3p=\n\xc7?q\x07\x86q\x08Rq\th\x00h\x04C\x08233333\xe3?q\n\x86q\x0bRq\x0c\x86q\r.')
bounds = ((0.16, 0.2), (0.6, 2.4))

def inside_bounds(xy):
    x, y = xy
    (xmin, xmax), (ymin, ymax) = bounds
    return xmin <= x <= xmax and ymin <= y <= ymax

def my_clip(xy):
    clip = lambda x, l, u: max(l, min(u, x))
    return (clip(xy[0], *bounds[0]),
            clip(xy[1], *bounds[1]))

(inside_bounds(tup),
 inside_bounds(np.array(tup)),
 inside_bounds(np.clip(tup, *bounds)),
 inside_bounds(my_clip(tup)),
)

(False, False, False, True)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant