scipy#

Examples using Surfaces with scipy.optimize.


Basic scipy Integration#

import numpy as np
from surfaces.test_functions.algebraic import RosenbrockFunction
from scipy.optimize import minimize

# Create test function
func = RosenbrockFunction(n_dim=5)
space = func.search_space

# Convert to scipy format
def objective(x):
    params = {f"x{i}": x[i] for i in range(len(x))}
    return func(params)

bounds = [(v.min(), v.max()) for v in space.values()]
x0 = np.array([np.mean(v) for v in space.values()])

# Optimize with L-BFGS-B
result = minimize(objective, x0, bounds=bounds, method='L-BFGS-B')

print(f"Success: {result.success}")
print(f"Minimum: {result.fun:.6f}")
print(f"Evaluations: {result.nfev}")

Global Optimization#

import numpy as np
from surfaces.test_functions.algebraic import RastriginFunction
from scipy.optimize import differential_evolution

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

def objective(x):
    params = {f"x{i}": x[i] for i in range(len(x))}
    return func(params)

bounds = [(v.min(), v.max()) for v in space.values()]

# Differential Evolution for multimodal functions
result = differential_evolution(
    objective,
    bounds,
    maxiter=500,
    seed=42
)

print(f"Best value: {result.fun:.6f}")
print(f"Evaluations: {result.nfev}")

Comparing scipy Methods#

"""Compare different scipy optimization methods."""

import numpy as np
from surfaces.test_functions.algebraic import RosenbrockFunction
from scipy.optimize import minimize, differential_evolution

func = RosenbrockFunction(n_dim=5)
space = func.search_space

def objective(x):
    params = {f"x{i}": x[i] for i in range(len(x))}
    return func(params)

bounds = [(v.min(), v.max()) for v in space.values()]
x0 = np.array([np.mean(v) for v in space.values()])

methods = ['Nelder-Mead', 'Powell', 'L-BFGS-B']

print("Local methods:")
for method in methods:
    result = minimize(objective, x0, bounds=bounds, method=method)
    print(f"  {method}: f={result.fun:.4f}, nfev={result.nfev}")

print("\nGlobal method:")
result = differential_evolution(objective, bounds, seed=42, maxiter=200)
print(f"  DE: f={result.fun:.6f}, nfev={result.nfev}")