optimize method

Map<String, dynamic> optimize({
  1. int budget = 20,
})

Implementation

Map<String, dynamic> optimize({int budget = 20}) {
  final gp = _GP(kernel: _rbf);
  final X = List<List<double>>.from(initialX);
  final Y = List<double>.from(initialY);
  final dim = lower.length;

  List<double> proposeEI() {
    // random sample many candidates and pick best EI (cheap approximation)
    final candidates = List.generate(200, (_) {
      return List.generate(
        dim,
        (d) => lower[d] + _rand.nextDouble() * (upper[d] - lower[d]),
      );
    });
    double bestEI = double.negativeInfinity;
    List<double>? bestX;
    for (var cand in candidates) {
      final pred = gp.predict(X, Y, cand);
      final mu = pred['mu'] as double;
      final sigma = sqrt(pred['sigma2'] as double);
      final fBest = Y.reduce((a, b) => a > b ? a : b);
      final imp = mu - fBest;
      final z = sigma > 0 ? imp / sigma : 0.0;
      final ei = imp * _normalCdf(z) + sigma * _normalPdf(z);
      if (ei > bestEI) {
        bestEI = ei;
        bestX = cand;
      }
    }
    return bestX!;
  }

  for (var i = 0; i < budget; i++) {
    final xnext = proposeEI();
    final ynext = _evaluate(xnext);
    X.add(xnext);
    Y.add(ynext);
  }

  final bestIdx =
      Y.asMap().entries.reduce((a, b) => a.value > b.value ? a : b).key;
  return {'bestX': X[bestIdx], 'bestY': Y[bestIdx]};
}