Files
EVOLV/wiki/architecture/group-optimization.md
znetsixe 6d19038784 docs: initialize project wiki from production hardening session
12 pages covering architecture, findings, and metrics from the
rotatingMachine + machineGroupControl hardening work:

- Overview: node inventory, what works/doesn't, current scale
- Architecture: 3D pump curves, group optimization algorithm
- Findings: BEP-Gravitation proof (0.1% of optimum), NCog behavior,
  curve non-convexity, pump switching stability
- Metrics: test counts, power comparison table, performance numbers
- Knowledge graph: structured YAML with all data points and provenance
- Session log: 2026-04-07 production hardening
- Tools: query.py, search.sh, lint.sh

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:36:08 +02:00

2.1 KiB

title, created, updated, status, tags, sources
title created updated status tags sources
Group Optimization Architecture 2026-04-07 2026-04-07 proven
machineGroupControl
optimization
BEP-Gravitation
nodes/machineGroupControl/src/specificClass.js

machineGroupControl Optimization

Algorithm: BEP-Gravitation + Marginal-Cost Refinement

Step 1 — Pressure Equalization

Sets all non-operational pumps to the group's max downstream / min upstream pressure. Ensures fair curve evaluation across combinations.

Step 2 — Combination Enumeration

Generates all 2^n pump subsets (n = number of machines). Filters by:

  • Machine state (excludes off, cooling, stopping, emergency)
  • Mode compatibility (execsequence allowed in auto)
  • Flow bounds: sumMinFlow ≤ Qd ≤ sumMaxFlow
  • Optional power cap

Step 3 — BEP-Gravitation Distribution (per combination)

  1. BEP seed: estimatedBEP = minFlow + span * NCog per pump
  2. Slope estimation: samples dP/dQ at BEP ± delta (directional: slopeLeft, slopeRight)
  3. Slope redistribution: iteratively shifts flow from steep to flat curves (weight = 1/slope)
  4. Marginal-cost refinement: after slope redistribution, shifts flow from highest actual dP/dQ to lowest using real inputFlowCalcPower evaluations. Converges regardless of curve convexity. Max 50 iterations, typically 5-15.

Step 4 — Best Selection

Pick combination with lowest total power. Tiebreak by deviation from BEP.

Step 5 — Execution

Start/stop pumps as needed, send flowmovement commands in output units via _canonicalToOutputFlow().

Three Control Modes

Mode Distribution Combination Selection
optimalControl BEP-Gravitation + refinement exhaustive 2^n
priorityControl equal split, priority-ordered sequential add/remove
priorityPercentageControl percentage-based, normalized count-based

Key Design Decision

The flowmovement command sends flow in the machine's output units (m3/h), not canonical (m3/s). The _canonicalToOutputFlow() helper converts before sending. Without this conversion, every pump stays at minimum flow (the critical bug fixed on 2026-04-07).