PineForge HPO 1.11.0
Native hyperparameter optimization for PineForge strategies
Loading...
Searching...
No Matches
sampler.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <cstddef>
5#include <memory>
6#include <optional>
7#include <random>
8#include <vector>
9
11
12namespace pineforge::hpo {
13
15class Sampler {
16public:
17 virtual ~Sampler() = default;
18
20 virtual std::optional<Candidate> next() = 0;
22 virtual void reset() = 0;
24 virtual std::uint64_t generated() const noexcept = 0;
25};
26
28class GridSampler final : public Sampler {
29public:
31 explicit GridSampler(SearchSpace space);
32
34 std::optional<Candidate> next() override;
36 void reset() override;
38 std::uint64_t generated() const noexcept override { return generated_; }
40 std::uint64_t total_candidates() const noexcept { return total_candidates_; }
41
42private:
43 SearchSpace space_;
44 std::uint64_t total_candidates_ = 0;
45 std::uint64_t generated_ = 0;
46};
47
52class RandomSampler final : public Sampler {
53public:
55 RandomSampler(SearchSpace space, std::uint64_t seed, std::uint64_t max_candidates = 0);
56
58 std::optional<Candidate> next() override;
60 void reset() override;
62 std::uint64_t generated() const noexcept override { return generated_; }
64 std::uint64_t seed() const noexcept { return seed_; }
65
66private:
67 SearchSpace space_;
68 std::uint64_t seed_;
69 std::uint64_t max_candidates_;
70 std::uint64_t generated_ = 0;
71 std::mt19937_64 engine_;
72};
73
76 Maximize,
77 Minimize,
78};
79
89
91const char* candidate_policy_name(CandidatePolicy policy) noexcept;
92
94std::uint64_t continuation_seed(std::uint64_t seed, std::uint64_t warm_trials) noexcept;
95
99 std::optional<double> objective;
100};
101
105public:
107 virtual ~WarmStartSource() = default;
109 virtual std::uint64_t size() const noexcept = 0;
111 virtual std::uint64_t id(std::uint64_t row) const = 0;
113 virtual ParameterValue parameter(std::uint64_t row, std::size_t dimension) const = 0;
115 virtual std::optional<double> objective(std::uint64_t row) const = 0;
117 WarmStartObservation observation(const SearchSpace& space, std::uint64_t row) const;
118};
119
123 std::uint64_t startup_trials = 10;
124
129 std::uint64_t ei_candidates = 24;
130
132 double gamma_fraction = 0.10;
137 std::uint64_t gamma_cap = 25;
138
140 double prior_weight = 1.0;
141
147 bool constant_liar = true;
148
150 std::optional<std::uint64_t> history_switch = std::nullopt;
151
153 std::uint64_t scale_ei_candidates = 8;
154
156 std::uint64_t bad_reservoir_size = 448;
157
160 std::uint32_t max_threads = 0;
161};
162
181class TpeSampler final : public Sampler {
182public:
189 std::uint64_t seed,
190 ObjectiveDirection direction = ObjectiveDirection::Maximize,
191 std::uint64_t max_candidates = 0,
192 TpeSamplerConfig config = {},
193 CandidatePolicy candidate_policy = CandidatePolicy::SamplerDefault);
194 ~TpeSampler() override;
195
196 TpeSampler(const TpeSampler&) = delete;
197 TpeSampler& operator=(const TpeSampler&) = delete;
199 TpeSampler& operator=(TpeSampler&&) noexcept;
200
202 std::optional<Candidate> next() override;
203
207 std::optional<Candidate> ask();
208
211 void tell(std::uint64_t candidate_id, double objective_value);
212
215 void abandon(std::uint64_t candidate_id);
216
225 bool warm_start(const std::vector<WarmStartObservation>& observations,
226 std::uint64_t replay_batch_size = 0,
227 const std::string& sampler_state = {});
228
231 bool warm_start(std::shared_ptr<const WarmStartSource> source,
232 std::uint64_t replay_batch_size = 0,
233 const std::string& sampler_state = {});
234
239 std::string sampler_state() const;
240
245 void reset() override;
247 std::uint64_t generated() const noexcept override;
249 std::uint64_t completed() const noexcept;
251 std::uint64_t outstanding() const noexcept;
253 std::size_t retained_observations() const;
255 std::uint64_t duplicate_proposals_skipped() const noexcept;
257 std::uint64_t seed() const noexcept { return seed_; }
259 ObjectiveDirection direction() const noexcept { return direction_; }
261 const TpeSamplerConfig& config() const noexcept { return config_; }
263 CandidatePolicy candidate_policy() const noexcept { return candidate_policy_; }
264
265private:
266 class Impl;
267
268 SearchSpace space_;
269 std::uint64_t seed_;
270 ObjectiveDirection direction_;
271 std::uint64_t max_candidates_;
272 TpeSamplerConfig config_;
273 CandidatePolicy candidate_policy_;
274 std::unique_ptr<Impl> impl_;
275};
276
283class DlibGlobalSampler final : public Sampler {
284public:
291 std::uint64_t seed,
292 ObjectiveDirection direction = ObjectiveDirection::Maximize,
293 std::uint64_t max_candidates = 0);
295
299 DlibGlobalSampler& operator=(DlibGlobalSampler&&) noexcept;
300
302 std::optional<Candidate> next() override;
303
305 std::optional<Candidate> ask();
306
311 void tell(std::uint64_t candidate_id, double objective_value);
312
315 void abandon(std::uint64_t candidate_id);
316
318 void reset() override;
320 std::uint64_t generated() const noexcept override;
322 std::uint64_t completed() const noexcept;
324 std::uint64_t outstanding() const noexcept;
326 std::uint64_t seed() const noexcept { return seed_; }
328 ObjectiveDirection direction() const noexcept { return direction_; }
329
330private:
331 class Impl;
332
333 SearchSpace space_;
334 std::uint64_t seed_;
335 ObjectiveDirection direction_;
336 std::uint64_t max_candidates_;
337 std::unique_ptr<Impl> impl_;
338};
339
340} // namespace pineforge::hpo
Adaptive derivative-free optimizer backed by dlib::global_function_search.
Definition sampler.hpp:283
DlibGlobalSampler(const DlibGlobalSampler &)=delete
DlibGlobalSampler & operator=(const DlibGlobalSampler &)=delete
DlibGlobalSampler(DlibGlobalSampler &&) noexcept
ObjectiveDirection direction() const noexcept
Returns the configured optimization direction.
Definition sampler.hpp:328
DlibGlobalSampler(SearchSpace space, std::uint64_t seed, ObjectiveDirection direction=ObjectiveDirection::Maximize, std::uint64_t max_candidates=0)
Constructs a dlib global sampler; max_candidates == 0 means unbounded generation.
Lazy exhaustive sampler over a finite SearchSpace in mixed-radix order.
Definition sampler.hpp:28
std::optional< Candidate > next() override
Returns each finite candidate once, then std::nullopt.
std::uint64_t total_candidates() const noexcept
Returns the exact finite search-space cardinality.
Definition sampler.hpp:40
std::uint64_t generated() const noexcept override
Returns the number of candidates issued since construction or reset.
Definition sampler.hpp:38
GridSampler(SearchSpace space)
void reset() override
Rewinds enumeration to ordinal zero.
Seeded independent sampler with replacement.
Definition sampler.hpp:52
std::uint64_t seed() const noexcept
Returns the reproducibility seed.
Definition sampler.hpp:64
void reset() override
Reseeds the generator and restores the original sequence.
std::optional< Candidate > next() override
Samples one independent candidate, or returns std::nullopt at the configured limit.
std::uint64_t generated() const noexcept override
Returns the number of candidates issued since construction or reset.
Definition sampler.hpp:62
RandomSampler(SearchSpace space, std::uint64_t seed, std::uint64_t max_candidates=0)
Constructs a random sampler; max_candidates == 0 means unbounded generation.
Minimal pull-based interface shared by candidate samplers.
Definition sampler.hpp:15
virtual std::uint64_t generated() const noexcept=0
Returns the number of candidates issued since construction or the last reset.
virtual std::optional< Candidate > next()=0
Returns the next candidate, or std::nullopt when the configured budget is exhausted.
virtual ~Sampler()=default
virtual void reset()=0
Restores the sampler's seeded initial state.
Ordered product of named dimensions with validation and finite-space codecs.
Independent, single-objective Tree-structured Parzen Estimator sampler.
Definition sampler.hpp:181
TpeSampler(SearchSpace space, std::uint64_t seed, ObjectiveDirection direction=ObjectiveDirection::Maximize, std::uint64_t max_candidates=0, TpeSamplerConfig config={}, CandidatePolicy candidate_policy=CandidatePolicy::SamplerDefault)
Constructs a native TPE sampler; max_candidates == 0 means unbounded generation.
CandidatePolicy candidate_policy() const noexcept
Returns the configured uniqueness/coverage policy.
Definition sampler.hpp:263
std::uint64_t generated() const noexcept override
Returns the number of candidates issued since construction or reset.
TpeSampler & operator=(const TpeSampler &)=delete
void reset() override
Restores the seeded initial state and clears finite-space reservations.
TpeSampler(TpeSampler &&) noexcept
ObjectiveDirection direction() const noexcept
Returns the configured optimization direction.
Definition sampler.hpp:259
TpeSampler(const TpeSampler &)=delete
const TpeSamplerConfig & config() const noexcept
Returns the immutable TPE tuning configuration.
Definition sampler.hpp:261
bool warm_start(std::shared_ptr< const WarmStartSource > source, std::uint64_t replay_batch_size=0, const std::string &sampler_state={})
Restores exact ordered observations while retaining the immutable source by reference.
std::string sampler_state() const
Returns a versioned, checksummed checkpoint bound to the configuration and observations.
Immutable, ordered sampler observations, optionally backed by mapped binary columns.
Definition sampler.hpp:104
virtual ~WarmStartSource()=default
Releases the source and any resources retained by its implementation.
virtual std::uint64_t size() const noexcept=0
Returns the number of attempted trials, including abandoned trials.
ObjectiveDirection
Direction used to rank a scalar objective.
Definition sampler.hpp:75
@ Maximize
Larger finite values are better.
@ Minimize
Smaller finite values are better.
CandidatePolicy
Uniqueness and coverage contract applied to sampler proposals.
Definition sampler.hpp:84
@ SamplerDefault
Preserve native sampler behavior, including possible duplicates.
@ WithoutReplacement
Issue at most the requested number of unique finite candidates.
@ Exhaustive
Require a budget equal to cardinality and cover every candidate.
std::uint64_t continuation_seed(std::uint64_t seed, std::uint64_t warm_trials) noexcept
Derives a portable continuation RNG seed; an empty history preserves the original seed.
std::variant< std::int64_t, double, bool, std::string > ParameterValue
Scalar parameter value accepted by search spaces and the PineForge strategy ABI.
Definition types.hpp:11
const char * candidate_policy_name(CandidatePolicy policy) noexcept
Returns the stable StudySpec spelling of policy.
Complete parameter assignment proposed by a sampler.
Definition types.hpp:36
Tuning parameters for the native product-density TPE implementation.
Definition sampler.hpp:121
One previously attempted candidate; only finite, feasible completed objectives are supplied.
Definition sampler.hpp:97
std::optional< double > objective
Definition sampler.hpp:99