pulsatrix
Loading...
Searching...
No Matches
hpo_sampling.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include <cmath>
10#include <cstdint>
11#include <random>
12#include <stdexcept>
13#include <vector>
14
16
17namespace pulsatrix {
18
26template <typename RNG>
27Configuration RandomSample(const SearchSpace& space, RNG& rng) {
28 Configuration config;
29 for (const auto& spec : space.parameters()) {
30 switch (spec.kind) {
32 std::uniform_real_distribution<double> dist(spec.lower, spec.upper);
33 config[spec.name] = dist(rng);
34 break;
35 }
37 std::uniform_real_distribution<double> dist(std::log(spec.lower), std::log(spec.upper));
38 config[spec.name] = std::exp(dist(rng));
39 break;
40 }
42 std::uniform_int_distribution<int64_t> dist(static_cast<int64_t>(spec.lower),
43 static_cast<int64_t>(spec.upper));
44 config[spec.name] = dist(rng);
45 break;
46 }
48 std::uniform_int_distribution<size_t> dist(0, spec.categories.size() - 1);
49 config[spec.name] = spec.categories[dist(rng)];
50 break;
51 }
52 }
53 }
54 return config;
55}
56
71inline std::vector<Configuration> GridSample(const SearchSpace& space,
72 size_t points_per_continuous_dimension) {
73 if (points_per_continuous_dimension < 2) {
74 throw std::invalid_argument("GridSample: points_per_continuous_dimension must be >= 2");
75 }
76
77 std::vector<std::vector<ConfigValue>> axis_values;
78 axis_values.reserve(space.parameters().size());
79 for (const auto& spec : space.parameters()) {
80 std::vector<ConfigValue> values;
81 const double n_minus_1 = static_cast<double>(points_per_continuous_dimension - 1);
82 switch (spec.kind) {
84 for (size_t i = 0; i < points_per_continuous_dimension; ++i) {
85 double t = static_cast<double>(i) / n_minus_1;
86 values.push_back(spec.lower + t * (spec.upper - spec.lower));
87 }
88 break;
89 }
91 double log_lower = std::log(spec.lower);
92 double log_upper = std::log(spec.upper);
93 for (size_t i = 0; i < points_per_continuous_dimension; ++i) {
94 double t = static_cast<double>(i) / n_minus_1;
95 values.push_back(std::exp(log_lower + t * (log_upper - log_lower)));
96 }
97 break;
98 }
100 for (int64_t v = static_cast<int64_t>(spec.lower); v <= static_cast<int64_t>(spec.upper); ++v) {
101 values.push_back(v);
102 }
103 break;
104 }
106 for (const auto& category : spec.categories) {
107 values.push_back(category);
108 }
109 break;
110 }
111 }
112 axis_values.push_back(std::move(values));
113 }
114
115 std::vector<Configuration> grid;
116 grid.emplace_back();
117 for (size_t param_idx = 0; param_idx < space.parameters().size(); ++param_idx) {
118 const auto& name = space.parameters()[param_idx].name;
119 const auto& values = axis_values[param_idx];
120 std::vector<Configuration> next_grid;
121 next_grid.reserve(grid.size() * values.size());
122 for (const auto& partial : grid) {
123 for (const auto& value : values) {
124 Configuration extended = partial;
125 extended[name] = value;
126 next_grid.push_back(std::move(extended));
127 }
128 }
129 grid = std::move(next_grid);
130 }
131 return grid;
132}
133
134} // namespace pulsatrix
Describes a hyperparameter search space as an ordered list of named, typed parameters....
Definition search_space.hpp:54
const std::vector< ParameterSpec > & parameters() const
Every parameter, in the order added.
Definition search_space.hpp:116
Definition acquisition_functions.hpp:16
std::vector< Configuration > GridSample(const SearchSpace &space, size_t points_per_continuous_dimension)
Enumerates the full cartesian-product grid over space.
Definition hpo_sampling.hpp:71
std::map< std::string, ConfigValue > Configuration
A concrete hyperparameter configuration: parameter name -> concrete value.
Definition search_space.hpp:46
Configuration RandomSample(const SearchSpace &space, RNG &rng)
Draws one configuration uniformly at random from space: Continuous parameters uniform over [lower,...
Definition hpo_sampling.hpp:27
Typed hyperparameter search-space description: named parameters, each continuous, log-uniform,...