from ..utilities import phi import numpy as np def another_random_cube(objective, size, budget, seed=None): prng = np.random.default_rng(seed) fopt = None xopt = None for i in range(budget): x = prng.uniform(size=size) fx = objective(x) if fopt is None or xopt is None or fx < fopt: fopt = fx xopt = x return fopt, xopt, budget def quasirandom_cube(objective, size, budget): # http://extremelearning.com.au/unreasonable-effectiveness-of-quasirandom-sequences/ magic = phi(size) alpha = np.zeros(size) for i in range(size): alpha[i] = pow(1 / magic, i + 1) % 1 xs = np.zeros((size, budget)) xs[0, :] = 0.5 # first point is always dead center for i in range(1, budget): xs[i] = (xs[i - 1] + alpha) % 1 best_so_far = None for i, x in zip(range(budget), xs): fx = objective(x) if best_so_far is None or fx < best_so_far[0]: best_so_far = (fx, x) fopt, xopt = best_so_far return fopt, xopt, budget