Search Space#

Working with search spaces and parameter bounds.


Getting the Search Space#

from surfaces.test_functions.algebraic import RastriginFunction

func = RastriginFunction(n_dim=3)

# Get the default search space (property, not method)
space = func.search_space

print(f"Parameters: {list(space.keys())}")
# Output: ['x0', 'x1', 'x2']

for name, values in space.items():
    print(f"{name}: [{values.min():.2f}, {values.max():.2f}]")

Sampling from Search Space#

import numpy as np
from surfaces.test_functions.algebraic import RastriginFunction

func = RastriginFunction(n_dim=3)
space = func.search_space

# Get a random sample from the search space
sample = {k: np.random.choice(v) for k, v in space.items()}
print(f"Random sample: {sample}")

# Evaluate at the sample
result = func(sample)
print(f"Result: {result}")

Search Space Structure#

from surfaces.test_functions.algebraic import RastriginFunction

func = RastriginFunction(n_dim=3)
space = func.search_space

# Each dimension contains an array of allowed values
print(f"Points per dimension: {len(space['x0'])}")
print(f"x0 range: [{space['x0'].min():.2f}, {space['x0'].max():.2f}]")

Complete Example#

"""Working with search spaces."""

import numpy as np
from surfaces.test_functions.algebraic import RosenbrockFunction

def main():
    func = RosenbrockFunction(n_dim=5)

    # Get search space
    space = func.search_space

    print("Search Space:")
    for name, values in space.items():
        print(f"  {name}: [{values.min():.1f}, {values.max():.1f}]")

    # Random sampling
    print("\nRandom samples:")
    for i in range(5):
        sample = {k: np.random.choice(v) for k, v in space.items()}
        result = func(sample)
        print(f"  Sample {i+1}: f = {result:.4f}")

    # Grid evaluation
    print("\nGrid evaluation (first 2 dims):")
    x0_values = np.linspace(-2, 2, 5)
    x1_values = np.linspace(-2, 2, 5)

    for x0 in x0_values:
        for x1 in x1_values:
            params = {f"x{i}": 0.0 for i in range(5)}
            params["x0"] = x0
            params["x1"] = x1
            result = func(params)
            print(f"  f({x0:.1f}, {x1:.1f}, 0, 0, 0) = {result:.2f}")

if __name__ == "__main__":
    main()