|
1 | 1 | import pytest
|
| 2 | +from pandas import concat |
2 | 3 |
|
3 | 4 | import bofire.data_models.strategies.api as data_models
|
4 | 5 | import bofire.strategies.api as strategies
|
|
7 | 8 | LinearEqualityConstraint,
|
8 | 9 | LinearInequalityConstraint,
|
9 | 10 | NChooseKConstraint,
|
| 11 | + NonlinearEqualityConstraint, |
| 12 | + NonlinearInequalityConstraint, |
10 | 13 | )
|
11 | 14 | from bofire.data_models.domain.api import Constraints, Domain, Inputs
|
12 | 15 | from bofire.data_models.features.api import CategoricalInput, ContinuousInput
|
13 | 16 |
|
| 17 | +inputs = [ContinuousInput(key=f"if{i}", bounds=(0, 1)) for i in range(1, 4)] |
| 18 | +c1 = LinearInequalityConstraint( |
| 19 | + features=["if1", "if2", "if3"], coefficients=[1, 1, 1], rhs=1 |
| 20 | +) |
| 21 | +c2 = LinearEqualityConstraint( |
| 22 | + features=["if1", "if2", "if3"], coefficients=[1, 1, 1], rhs=1 |
| 23 | +) |
| 24 | +c3 = NonlinearEqualityConstraint( |
| 25 | + expression="if1**2 + if2**2 - if3", features=["if1", "if2", "if3"] |
| 26 | +) |
| 27 | +c4 = NonlinearInequalityConstraint( |
| 28 | + expression="if1**2 + if2**2 - if3", features=["if1", "if2", "if3"] |
| 29 | +) |
| 30 | +c5 = NChooseKConstraint( |
| 31 | + features=["if1", "if2", "if3"], min_count=0, max_count=1, none_also_valid=True |
| 32 | +) |
| 33 | + |
| 34 | + |
| 35 | +domains = [ |
| 36 | + Domain.from_lists(inputs=inputs, constraints=[c1]), |
| 37 | + Domain.from_lists(inputs=inputs, constraints=[c2]), |
| 38 | + Domain.from_lists(inputs=inputs, constraints=[c3]), |
| 39 | + Domain.from_lists(inputs=inputs, constraints=[c4]), |
| 40 | + Domain.from_lists(inputs=inputs, constraints=[c5]), |
| 41 | +] |
| 42 | + |
| 43 | + |
| 44 | +@pytest.mark.parametrize( |
| 45 | + "domain, num_samples", |
| 46 | + [(domain, candidate_count) for domain in domains for candidate_count in [1, 16]], |
| 47 | +) |
| 48 | +def test_UniversalConstraintSampler(domain, num_samples): |
| 49 | + data_model = data_models.UniversalConstraintSampler(domain=domain) |
| 50 | + sampler = strategies.UniversalConstraintSampler(data_model=data_model) |
| 51 | + samples = sampler.ask(num_samples) |
| 52 | + assert len(samples) == num_samples |
| 53 | + |
| 54 | + |
| 55 | +def test_UniversalConstraintSampler_pending_candidates(): |
| 56 | + data_model = data_models.UniversalConstraintSampler(domain=domains[0]) |
| 57 | + sampler = strategies.UniversalConstraintSampler(data_model=data_model) |
| 58 | + pending_candidates = sampler.ask(2, add_pending=True) |
| 59 | + samples = sampler.ask(1) |
| 60 | + assert len(samples) == 1 |
| 61 | + all_samples = concat( |
| 62 | + [samples, pending_candidates], axis=0, ignore_index=True |
| 63 | + ).drop_duplicates() |
| 64 | + assert len(all_samples) == 3 |
| 65 | + |
| 66 | + |
14 | 67 | inputs = Inputs(
|
15 | 68 | features=[ContinuousInput(key=f"if{i}", bounds=(0, 1)) for i in range(1, 4)]
|
16 | 69 | )
|
|
0 commit comments