def decode(solution): """Convert solution into dict of hyperparameters.""" # Start with out stationary (locked) paramaters hyperparameters = locked_values # Obtain moving hyperparameters from binary solution index = 0 for name, parameters in meta_parameters.items(): # Obtain binary for this hyperparameter binary_size = parameters['binary_size'] binary = solution[index:index + binary_size] index += binary_size # Just index to start of next hyperparameter # Decode binary if parameters['type'] == 'discrete': i = helpers.binary_to_int( binary, upper_bound=len(parameters['values']) - 1) value = parameters['values'][i] elif parameters['type'] == 'int': value = helpers.binary_to_int(binary, offset=parameters['min'], upper_bound=parameters['max']) elif parameters['type'] == 'float': value = helpers.binary_to_float(binary, minimum=parameters['min'], maximum=parameters['max']) else: raise ValueError( 'Parameter type "{}" does not match known values'.format( parameters['type'])) # Store value hyperparameters[name] = value return hyperparameters
def test_binary_to_float_neg_lower_bound(): assert helpers.binary_to_float([0], -1.0, 1.0) == -1.0 assert helpers.binary_to_float([1], -1.0, 1.0) == 1.0 assert helpers.binary_to_float([0, 0], -1.0, 1.0) == -1.0 assert _approx_equal(helpers.binary_to_float([0, 1], -1.0, 1.0), -0.3333333333) assert _approx_equal(helpers.binary_to_float([1, 0], -1.0, 1.0), 0.3333333333) assert helpers.binary_to_float([1, 1], -1.0, 1.0) == 1.0
def test_binary_to_float_neg_lower_and_upper_bound(): assert helpers.binary_to_float([0], -2.0, -1.0) == -2.0 assert helpers.binary_to_float([1], -2.0, -1.0) == -1.0 assert helpers.binary_to_float([0, 0], -2.0, -1.0) == -2.0 assert _approx_equal(helpers.binary_to_float([0, 1], -2.0, -1.0), -1.6666666666) assert _approx_equal(helpers.binary_to_float([1, 0], -2.0, -1.0), -1.3333333333) assert helpers.binary_to_float([1, 1], -2.0, -1.0) == -1.0
def decode(solution): """Convert solution into dict of hyperparameters.""" # Start with out stationary (locked) paramaters hyperparameters = copy.deepcopy(locked_values) # Obtain moving hyperparameters from binary solution index = 0 for name, parameters in meta_parameters.iteritems(): # Obtain binary for this hyperparameter binary_size = parameters['binary_size'] binary = solution[index:index + binary_size] index += binary_size # Just index to start of next hyperparameter # Decode binary if parameters['type'] == 'discrete': i = helpers.binary_to_int( binary, upper_bound=len(parameters['values']) - 1) value = parameters['values'][i] elif parameters['type'] == 'int': value = helpers.binary_to_int( binary, lower_bound=parameters['min'], upper_bound=parameters['max']) elif parameters['type'] == 'float': value = helpers.binary_to_float( binary, lower_bound=parameters['min'], upper_bound=parameters['max']) else: raise ValueError( 'Parameter type "{}" does not match known values'.format( parameters['type'])) # Store value hyperparameters[name] = value return hyperparameters
def decode_binary(binary, min_, max_): # Helpful functions from helpers are used to convert binary to floats x1 = helpers.binary_to_float(binary[0:16], min_, max_) x2 = helpers.binary_to_float(binary[16:32], min_, max_) return x1, x2
def decode_ackley(binary): # Helpful functions from helpers are used to convert binary to float # x1 and x2 range from -5.0 to 5.0 x1 = helpers.binary_to_float(binary[0:16], -5.0, 5.0) x2 = helpers.binary_to_float(binary[16:32], -5.0, 5.0) return x1, x2
def decode_param(binary): learning_rate = helpers.binary_to_float(binary[0:16], 0.4, 1.0) neuron = helpers.binary_to_int(binary[16:32], 10, 15) return learning_rate, neuron
def test_binary_to_float_zero_one_bounds(): assert helpers.binary_to_float([0], 0.0, 1.0) == 0.0 assert helpers.binary_to_float([1], 0.0, 1.0) == 1.0 assert helpers.binary_to_float([0, 0], 0.0, 1.0) == 0.0 assert _approx_equal(helpers.binary_to_float([0, 1], 0.0, 1.0), 0.3333333333) assert _approx_equal(helpers.binary_to_float([1, 0], 0.0, 1.0), 0.6666666666) assert helpers.binary_to_float([1, 1], 0.0, 1.0) == 1.0 assert helpers.binary_to_float([0, 0, 0], 0.0, 1.0) == 0.0 assert _approx_equal(helpers.binary_to_float([0, 0, 1], 0.0, 1.0), 0.14285714285714285) assert _approx_equal(helpers.binary_to_float([0, 1, 0], 0.0, 1.0), 0.2857142857142857) assert _approx_equal(helpers.binary_to_float([0, 1, 1], 0.0, 1.0), 0.42857142857142855) assert _approx_equal(helpers.binary_to_float([1, 0, 0], 0.0, 1.0), 0.5714285714285714) assert _approx_equal(helpers.binary_to_float([1, 0, 1], 0.0, 1.0), 0.7142857142857142) assert _approx_equal(helpers.binary_to_float([1, 1, 0], 0.0, 1.0), 0.8571428571428571) assert helpers.binary_to_float([1, 1, 1], 0.0, 1.0) == 1.0
def test_binary_to_float_empty_binary_list(): """An empty list can represent one value, and defaults to lower_bound.""" assert helpers.binary_to_float([], 0.0, 1.0) == 0.0
def test_binary_to_float_zero_one_bounds(): assert helpers.binary_to_float([0], 0.0, 1.0) == 0.0 assert helpers.binary_to_float([1], 0.0, 1.0) == 1.0 assert helpers.binary_to_float([0, 0], 0.0, 1.0) == 0.0 assert _approx_equal( helpers.binary_to_float([0, 1], 0.0, 1.0), 0.3333333333) assert _approx_equal( helpers.binary_to_float([1, 0], 0.0, 1.0), 0.6666666666) assert helpers.binary_to_float([1, 1], 0.0, 1.0) == 1.0 assert helpers.binary_to_float([0, 0, 0], 0.0, 1.0) == 0.0 assert _approx_equal( helpers.binary_to_float([0, 0, 1], 0.0, 1.0), 0.14285714285714285) assert _approx_equal( helpers.binary_to_float([0, 1, 0], 0.0, 1.0), 0.2857142857142857) assert _approx_equal( helpers.binary_to_float([0, 1, 1], 0.0, 1.0), 0.42857142857142855) assert _approx_equal( helpers.binary_to_float([1, 0, 0], 0.0, 1.0), 0.5714285714285714) assert _approx_equal( helpers.binary_to_float([1, 0, 1], 0.0, 1.0), 0.7142857142857142) assert _approx_equal( helpers.binary_to_float([1, 1, 0], 0.0, 1.0), 0.8571428571428571) assert helpers.binary_to_float([1, 1, 1], 0.0, 1.0) == 1.0
def decode_anfisga_search_space(binary): sigma_lb = helpers.binary_to_float(binary[0:16], 0.25, 5) sigma_ub = helpers.binary_to_float(binary[16:32], 5, 10) return sigma_lb, sigma_ub
def decode_svmga_search_space(binary): c = helpers.binary_to_float(binary[0:16], 1, 20.0) epsilon = helpers.binary_to_float(binary[16:32], 0.001, 0.01) return c, epsilon
def decode_small_binary(binary, min_, max_): x1 = helpers.binary_to_float(binary[0:6], min_, max_) x2 = helpers.binary_to_float(binary[6:12], min_, max_) return x1, x2