Class ProductionOptimizer
This class provides comprehensive optimization capabilities for NeqSim process models, supporting single-variable and multi-variable optimization with multiple search algorithms. It can maximize throughput subject to equipment capacity constraints, or optimize arbitrary objective functions with configurable constraints.
Supported Search Algorithms
- BINARY_FEASIBILITY - Traditional monotonic binary search on feasibility. Fast for single-variable problems where feasibility is monotonic with respect to the decision variable.
- GOLDEN_SECTION_SCORE - Golden-section search on a composite score. Suitable for single-variable non-monotonic responses.
- NELDER_MEAD_SCORE - Nelder-Mead simplex algorithm for multi-dimensional optimization. Does not require gradients; works well for 2-10 decision variables.
- PARTICLE_SWARM_SCORE - Particle swarm optimization for global search. Good for non-convex problems with multiple local optima.
Multi-Objective Optimization
The optimizer supports Pareto multi-objective optimization via weighted-sum scalarization. This
generates a Pareto front by solving multiple single-objective problems with different weight
combinations. Use optimizePareto(ProcessSystem, StreamInterface, ProductionOptimizer.OptimizationConfig, List, List) for multi-objective problems.
Usage Example (Java)
// Create process model
ProcessSystem process = new ProcessSystem();
Stream feed = new Stream("feed", fluid);
feed.setFlowRate(100000.0, "kg/hr");
Compressor compressor = new Compressor("compressor", feed);
process.add(feed);
process.add(compressor);
process.run();
// Configure and run optimization
ProductionOptimizer optimizer = new ProductionOptimizer();
OptimizationConfig config = new OptimizationConfig(50000.0, 200000.0).tolerance(100.0)
.searchMode(SearchMode.GOLDEN_SECTION_SCORE).maxIterations(30);
OptimizationResult result = optimizer.optimize(process, feed, config, null, null);
System.out.println("Optimal rate: " + result.getOptimalRate() + " kg/hr");
Usage Example (Python via neqsim-python/JPype)
from neqsim.neqsimpython import jneqsim
# Import classes
ProductionOptimizer = jneqsim.process.util.optimizer.ProductionOptimizer
OptimizationConfig = ProductionOptimizer.OptimizationConfig
SearchMode = ProductionOptimizer.SearchMode
# Create optimizer and config
optimizer = ProductionOptimizer()
config = OptimizationConfig(50000.0, 200000.0) \
.tolerance(100.0) \
.searchMode(SearchMode.GOLDEN_SECTION_SCORE)
# Run optimization
result = optimizer.optimize(process, feed, config, None, None)
print(f"Optimal rate: {result.getOptimalRate():.0f} kg/hr")
Multi-Variable Optimization Example
// Define manipulated variables
List<ManipulatedVariable> variables = Arrays.asList(
new ManipulatedVariable("flowRate", 50000, 200000, "kg/hr",
(proc, val) -> proc.getUnit("feed").setFlowRate(val, "kg/hr")),
new ManipulatedVariable("pressure", 100, 200, "bara",
(proc, val) -> ((Compressor) proc.getUnit("comp")).setOutletPressure(val, "bara")));
OptimizationConfig config = new OptimizationConfig(0, 1) // bounds ignored for multi-var
.searchMode(SearchMode.NELDER_MEAD_SCORE);
OptimizationResult result = optimizer.optimize(process, variables, config, objectives, null);
- Version:
- 1.0
- Author:
- NeqSim Development Team
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static interfaceFunction to compute capacity duty/limit for a specific equipment.(package private) static final classRange container to support percentile-based capacity evaluations.(package private) static final classPair of capacity duty/max providers.static enumDirection of a constraint comparison.static enumSeverity classification for constraints.static final classOutcome for a single constraint evaluation.(package private) static final classConstraint template applied to each matching equipment.(package private) static interfaceMetric to evaluate per-equipment constraints.private static final classResult of a single iteration.static final classSnapshot of each iteration to support diagnostics and plotting.static final classDefinition of a manipulated decision variable for multi-variable optimization.static enumObjective optimization direction.static final classBuilder-style configuration for the production optimizer.static final classConstraint on a process-level metric such as total power, pressure, or temperature.static final classContainer for optimization objective configuration.static final classResult container for a completed optimization attempt.static final classLightweight summary of an optimization run intended for quick-consumption APIs.static final classA single point on the Pareto front representing a non-dominated solution.static final classResult of a multi-objective Pareto optimization containing the Pareto front.static final classPer-scenario KPI values and deltas versus the baseline scenario.static final classDefinition of a KPI to report alongside scenario comparisons.static final classScenario definition to enable side-by-side optimization comparisons.static final classOptimization result paired with a scenario name to aid reporting/comparison.static enumSupported search algorithms.static final classHolds the utilization status for an equipment item.static final classSeries-friendly representation of utilization across iterations for plotting/reporting. -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final doubleDefault maximum utilization used when no specific equipment rule is provided.private static final org.apache.logging.log4j.LoggerLogger for this class. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionbinaryFeasibilitySearch(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<ProductionOptimizer.IterationRecord> iterationHistory) buildUtilizationSeries(List<ProductionOptimizer.IterationRecord> iterationHistory) Build utilization series for each equipment across the provided iteration history to facilitate charting or CSV export.private StringbuildVectorCacheKey(double[] candidate, ProductionOptimizer.OptimizationConfig config) private double[]clampToBounds(double[] candidate, List<ProductionOptimizer.ManipulatedVariable> variables) Clamp all values in the candidate array to the bounds defined by the manipulated variables.compareScenarios(List<ProductionOptimizer.ScenarioRequest> scenarios, List<ProductionOptimizer.ScenarioKpi> kpis) Optimize multiple scenarios and compute KPI deltas versus the baseline (first) scenario.private double[]computeCentroid(double[][] simplex, int count) private double[]contract(double[] centroid, double[] point, double factor) private Map<String, ProductionOptimizer.Evaluation> createLruCacheString(int maxSize) Creates an LRU cache with the specified maximum size for String keys.createWeightedObjectives(List<ProductionOptimizer.OptimizationObjective> originals, double[] weights) Create weighted objectives from original objectives and weights.determineCapacityRange(ProcessEquipmentInterface unit, ProductionOptimizer.OptimizationConfig config) private ProductionOptimizer.CapacityRuledetermineCapacityRule(ProcessEquipmentInterface unit, ProductionOptimizer.OptimizationConfig config) Determines the capacity rule for a given equipment unit.private ProductionOptimizer.CapacityRuledetermineCapacityRuleByType(ProcessEquipmentInterface unit, ProductionOptimizer.OptimizationConfig config) Type-specific capacity rules for common equipment types.private doubledetermineUtilizationLimit(ProcessEquipmentInterface unit, ProductionOptimizer.OptimizationConfig config) private ProductionOptimizer.EvaluationevaluateCandidate(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, double[] candidate, Map<String, ProductionOptimizer.Evaluation> cache) private ProductionOptimizer.EvaluationevaluateCandidateInternal(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, double[] candidate) private ProductionOptimizer.EvaluationevaluateProcess(ProcessSystem process, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, Map<String, Double> decisionVariables) private doublefeasibilityScore(ProductionOptimizer.Evaluation evaluation) Computes a penalized score for constraint-violating evaluations.private List<ProductionOptimizer.ParetoPoint> filterToPareto(List<ProductionOptimizer.ParetoPoint> allPoints, Map<String, ProductionOptimizer.ObjectiveType> objectiveTypes) Filter points to keep only Pareto-optimal (non-dominated) solutions.static StringformatScenarioComparisonTable(ProductionOptimizer.ScenarioComparisonResult comparison, List<ProductionOptimizer.ScenarioKpi> kpis) Render scenario KPIs and bottleneck information side-by-side.static StringRender a compact Markdown table describing utilization per unit.static StringformatUtilizationTimeline(List<ProductionOptimizer.IterationRecord> iterationHistory) Render a compact Markdown timeline showing bottlenecks across iterations.private List<double[]> generateWeightCombinations(int numObjectives, int gridSize) Generates all weight combinations for a given number of objectives and grid size.private voidgenerateWeightCombinationsRecursive(int numObjectives, int divisions, double[] current, int index, double remaining, List<double[]> combinations) Recursively generates weight combinations that sum to 1.0 on a simplex lattice.goldenSectionSearch(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<ProductionOptimizer.IterationRecord> iterationHistory) gradientDescentSearch(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<ProductionOptimizer.IterationRecord> iterationHistory) Gradient descent search for multi-variable optimization using finite-difference gradients.nelderMeadSearch(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<ProductionOptimizer.IterationRecord> iterationHistory) optimize(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints) Optimize multiple manipulated variables using multi-dimensional search strategies.optimize(ProcessSystem process, StreamInterface feedStream, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints) Optimize the feed stream rate of a process to respect utilization limits and constraints.optimizePareto(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints) Perform multi-objective Pareto optimization with multiple manipulated variables.optimizePareto(ProcessSystem process, StreamInterface feedStream, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints) Perform multi-objective Pareto optimization using weighted-sum scalarization.private List<ProductionOptimizer.ParetoPoint> optimizeParetoParallel(ProcessSystem process, StreamInterface feedStream, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<double[]> weightCombinations, List<String> objectiveNames) Runs Pareto weight combinations in parallel using a fixed thread pool.optimizeScenarios(List<ProductionOptimizer.ScenarioRequest> scenarios) Optimize a collection of named scenarios and return results for side-by-side comparison.private List<ProductionOptimizer.ScenarioResult> Optimize scenarios in parallel using a thread pool.optimizeThroughput(ProcessSystem process, StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, List<ProductionOptimizer.OptimizationConstraint> additionalConstraints) Convenience wrapper to maximize throughput with optional constraints and custom search config.particleSwarmSearch(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<ProductionOptimizer.IterationRecord> iterationHistory) quickOptimize(ProcessSystem process, StreamInterface feedStream) Convenience wrapper that derives reasonable bounds from the current feed rate and returns a concise summary (max rate, limiting equipment, utilization margin).quickOptimize(ProcessSystem process, StreamInterface feedStream, String rateUnit, List<ProductionOptimizer.OptimizationConstraint> constraints) Convenience wrapper that derives reasonable bounds from the current feed rate and returns a concise summary (max rate, limiting equipment, utilization margin).private voidrecordIteration(List<ProductionOptimizer.IterationRecord> iterationHistory, double candidate, String rateUnit, ProductionOptimizer.Evaluation evaluation, boolean feasible) private double[]reflect(double[] centroid, double[] point, double factor) private voidshrink(double[][] simplex, List<ProductionOptimizer.ManipulatedVariable> variables) private voidsortSimplexByScore(double[][] simplex, ProductionOptimizer.Evaluation[] evaluations) toResult(double rate, String unit, int iteration, ProductionOptimizer.Evaluation evaluation, List<ProductionOptimizer.IterationRecord> iterationHistory)
-
Field Details
-
logger
private static final org.apache.logging.log4j.Logger loggerLogger for this class. -
DEFAULT_UTILIZATION_LIMIT
public static final double DEFAULT_UTILIZATION_LIMITDefault maximum utilization used when no specific equipment rule is provided.- See Also:
-
-
Constructor Details
-
ProductionOptimizer
public ProductionOptimizer()
-
-
Method Details
-
optimize
public ProductionOptimizer.OptimizationResult optimize(ProcessSystem process, StreamInterface feedStream, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints) Optimize the feed stream rate of a process to respect utilization limits and constraints.This is the primary optimization method for single-variable (flow rate) optimization. It adjusts the flow rate of the specified feed stream to maximize throughput while respecting equipment utilization limits and any specified constraints.
Algorithm Selection
The search algorithm is determined by
ProductionOptimizer.OptimizationConfig.searchMode:- BINARY_FEASIBILITY - Fast binary search assuming monotonic feasibility
- GOLDEN_SECTION_SCORE - Golden-section search for non-monotonic responses
- NELDER_MEAD_SCORE - Simplex method (overkill for 1D, but supported)
- PARTICLE_SWARM_SCORE - Global search for multi-modal problems
Java Example
ProductionOptimizer optimizer = new ProductionOptimizer(); OptimizationConfig config = new OptimizationConfig(50000.0, 200000.0) .searchMode(SearchMode.GOLDEN_SECTION_SCORE).tolerance(100.0); OptimizationResult result = optimizer.optimize(process, feedStream, config, null, null); System.out.println("Optimal: " + result.getOptimalRate() + " " + result.getRateUnit());Python Example (via JPype)
optimizer = ProductionOptimizer() config = OptimizationConfig(50000.0, 200000.0) \ .searchMode(SearchMode.GOLDEN_SECTION_SCORE) \ .tolerance(100.0) result = optimizer.optimize(process, feed_stream, config, None, None) print(f"Optimal: {result.getOptimalRate():.0f} {result.getRateUnit()}")- Parameters:
process- the process model to evaluate (must not be null)feedStream- the feed stream whose flow rate will be adjusted (must not be null)config- optimizer configuration including bounds and algorithm (must not be null)objectives- list of objectives to compute weighted scores (may be null or empty)constraints- list of constraints with optional penalties (may be null or empty)- Returns:
- optimization result containing optimal rate, bottleneck, and diagnostics
- Throws:
NullPointerException- if process, feedStream, or config is nullIllegalArgumentException- if config is invalid
-
optimize
public ProductionOptimizer.OptimizationResult optimize(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints) Optimize multiple manipulated variables using multi-dimensional search strategies.This method extends single-variable optimization to multiple decision variables such as flow rates, pressures, temperatures, or split ratios. It uses Nelder-Mead or Particle Swarm algorithms for multi-dimensional search.
Algorithm Selection for Multi-Variable
- NELDER_MEAD_SCORE - Recommended for 2-10 variables, derivative-free
- PARTICLE_SWARM_SCORE - Better for non-convex problems with local optima
Java Example
List<ManipulatedVariable> variables = Arrays.asList( new ManipulatedVariable("flow", 50000, 200000, "kg/hr", (p, v) -> ((Stream) p.getUnit("feed")).setFlowRate(v, "kg/hr")), new ManipulatedVariable("pressure", 100, 200, "bara", (p, v) -> ((Compressor) p.getUnit("comp")).setOutletPressure(v, "bara"))); OptimizationConfig config = new OptimizationConfig(0, 1) // bounds from variables .searchMode(SearchMode.NELDER_MEAD_SCORE); OptimizationResult result = optimizer.optimize(process, variables, config, objectives, null); Map<String, Double> optimalValues = result.getDecisionVariables();Python Example (via JPype)
from jpype import JImplements, JOverride Arrays = jneqsim.java.util.Arrays @JImplements("java.util.function.BiConsumer") class FlowSetter: @JOverride def accept(self, proc, val): proc.getUnit("feed").setFlowRate(float(val), "kg/hr") variables = Arrays.asList([ ManipulatedVariable("flow", 50000, 200000, "kg/hr", FlowSetter()) ]) result = optimizer.optimize(process, variables, config, None, None)- Parameters:
process- the process model to evaluate (must not be null)variables- list of manipulated variables with bounds and setters (must not be empty)config- optimizer configuration (must not be null)objectives- list of objectives (may be null or empty)constraints- list of constraints (may be null or empty)- Returns:
- optimization result with optimal variable values in
getDecisionVariables() - Throws:
NullPointerException- if process, variables, or config is nullIllegalArgumentException- if variables is empty or algorithm doesn't support multi-variable
-
optimizeScenarios
public List<ProductionOptimizer.ScenarioResult> optimizeScenarios(List<ProductionOptimizer.ScenarioRequest> scenarios) Optimize a collection of named scenarios and return results for side-by-side comparison.If parallel evaluations are enabled in any scenario's config, scenarios will be optimized concurrently using a thread pool.
- Parameters:
scenarios- scenarios containing process, feed, config, objectives, and constraints- Returns:
- list of scenario results in the same order as provided
-
optimizeScenariosParallel
private List<ProductionOptimizer.ScenarioResult> optimizeScenariosParallel(List<ProductionOptimizer.ScenarioRequest> scenarios) Optimize scenarios in parallel using a thread pool.- Parameters:
scenarios- list of scenario requests to optimize- Returns:
- list of scenario results in the same order as input
-
optimizePareto
public ProductionOptimizer.ParetoResult optimizePareto(ProcessSystem process, StreamInterface feedStream, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints) Perform multi-objective Pareto optimization using weighted-sum scalarization.This method generates a Pareto front by solving a series of single-objective problems with different weight combinations. The weighted-sum approach converts the multi-objective problem into a sequence of single-objective problems by combining objectives with weights.
How It Works
- Generate weight combinations based on
paretoGridSize(e.g., for 2 objectives with gridSize=11: [1.0,0.0], [0.9,0.1], ..., [0.0,1.0]) - For each weight combination, solve the weighted single-objective problem
- Filter dominated solutions to obtain the Pareto front
Java Example
List<OptimizationObjective> objectives = Arrays.asList( new OptimizationObjective("throughput", p -> p.getUnit("outlet").getFlowRate("kg/hr"), 1.0, ObjectiveType.MAXIMIZE), new OptimizationObjective("power", p -> ((Compressor) p.getUnit("comp")).getPower("kW"), 1.0, ObjectiveType.MINIMIZE)); OptimizationConfig config = new OptimizationConfig(50000, 200000).paretoGridSize(11) // generates // 11 weight // combinations .searchMode(SearchMode.GOLDEN_SECTION_SCORE); ParetoResult pareto = optimizer.optimizePareto(process, feed, config, objectives, null); System.out.println("Pareto front size: " + pareto.getParetoFrontSize()); System.out.println(pareto.toMarkdownTable());Python Example (via JPype)
objectives = Arrays.asList([throughput_obj, power_obj]) config = OptimizationConfig(50000, 200000).paretoGridSize(11) pareto = optimizer.optimizePareto(process, feed, config, objectives, None) print(f"Pareto front: {pareto.getParetoFrontSize()} points") print(pareto.toMarkdownTable())- Parameters:
process- the process model to evaluate (must not be null)feedStream- the feed stream whose flow rate will be adjusted (must not be null)config- optimizer configuration;paretoGridSizecontrols weight granularityobjectives- list of objectives (must have at least 2 for Pareto optimization)constraints- list of constraints (may be null or empty)- Returns:
- Pareto result containing the Pareto front, utopia/nadir points, and all evaluated points
- Throws:
NullPointerException- if process, feedStream, config, or objectives is nullIllegalArgumentException- if fewer than 2 objectives are provided
- Generate weight combinations based on
-
optimizePareto
public ProductionOptimizer.ParetoResult optimizePareto(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints) Perform multi-objective Pareto optimization with multiple manipulated variables.This extends Pareto optimization to support multiple decision variables (e.g., flow rate and pressure simultaneously). Uses Nelder-Mead or PSO for multi-dimensional search at each weight combination.
Java Example
List<ManipulatedVariable> variables = Arrays.asList(new ManipulatedVariable("flow", 50000, 200000, "kg/hr", flowSetter), new ManipulatedVariable("pressure", 100, 200, "bara", pressureSetter)); List<OptimizationObjective> objectives = Arrays.asList(throughputObj, powerObj); OptimizationConfig config = new OptimizationConfig(0, 1).paretoGridSize(11).searchMode(SearchMode.NELDER_MEAD_SCORE); ParetoResult pareto = optimizer.optimizePareto(process, variables, config, objectives, null);- Parameters:
process- the process model to evaluate (must not be null)variables- list of manipulated decision variables (must not be empty)config- optimizer configuration (must not be null)objectives- list of objectives (must have at least 2)constraints- list of constraints (may be null or empty)- Returns:
- Pareto result containing the Pareto front and all evaluated points
- Throws:
NullPointerException- if process, variables, config, or objectives is nullIllegalArgumentException- if fewer than 2 objectives or no variables provided
-
optimizeParetoParallel
private List<ProductionOptimizer.ParetoPoint> optimizeParetoParallel(ProcessSystem process, StreamInterface feedStream, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<double[]> weightCombinations, List<String> objectiveNames) Runs Pareto weight combinations in parallel using a fixed thread pool.- Parameters:
process- the process system template (copied per thread)feedStream- the feed stream to varyconfig- optimization configurationobjectives- the optimization objectivesconstraints- the optimization constraintsweightCombinations- the weight vectors to evaluateobjectiveNames- names for each objective- Returns:
- list of Pareto points, one per weight combination
-
generateWeightCombinations
Generates all weight combinations for a given number of objectives and grid size.For 2 objectives, uses linear interpolation. For 3+ objectives, uses recursive simplex lattice design.
- Parameters:
numObjectives- the number of objectivesgridSize- the number of grid points (must be at least 2)- Returns:
- list of weight arrays, each summing to 1.0
-
generateWeightCombinationsRecursive
private void generateWeightCombinationsRecursive(int numObjectives, int divisions, double[] current, int index, double remaining, List<double[]> combinations) Recursively generates weight combinations that sum to 1.0 on a simplex lattice.- Parameters:
numObjectives- total number of objectivesdivisions- number of divisions along each axiscurrent- working array for partial weight assignmentindex- current objective dimension being filledremaining- remaining weight budgetcombinations- accumulator list for completed weight arrays
-
createWeightedObjectives
private List<ProductionOptimizer.OptimizationObjective> createWeightedObjectives(List<ProductionOptimizer.OptimizationObjective> originals, double[] weights) Create weighted objectives from original objectives and weights. -
filterToPareto
private List<ProductionOptimizer.ParetoPoint> filterToPareto(List<ProductionOptimizer.ParetoPoint> allPoints, Map<String, ProductionOptimizer.ObjectiveType> objectiveTypes) Filter points to keep only Pareto-optimal (non-dominated) solutions. -
compareScenarios
public ProductionOptimizer.ScenarioComparisonResult compareScenarios(List<ProductionOptimizer.ScenarioRequest> scenarios, List<ProductionOptimizer.ScenarioKpi> kpis) Optimize multiple scenarios and compute KPI deltas versus the baseline (first) scenario.- Parameters:
scenarios- list of scenarios to optimize; first entry is treated as baselinekpis- KPIs to compute per scenario (optional)- Returns:
- comparison result with KPI deltas and raw results
-
optimizeThroughput
public ProductionOptimizer.OptimizationResult optimizeThroughput(ProcessSystem process, StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, List<ProductionOptimizer.OptimizationConstraint> additionalConstraints) Convenience wrapper to maximize throughput with optional constraints and custom search config.- Parameters:
process- process system to runfeedStream- feed stream that will be adjustedlowerBound- lower bound on the manipulated feed rateupperBound- upper bound on the manipulated feed raterateUnit- engineering unit for rateadditionalConstraints- optional hard/soft constraints- Returns:
- optimization result with utilization and constraint history
-
formatUtilizationTable
Render a compact Markdown table describing utilization per unit. -
formatScenarioComparisonTable
public static String formatScenarioComparisonTable(ProductionOptimizer.ScenarioComparisonResult comparison, List<ProductionOptimizer.ScenarioKpi> kpis) Render scenario KPIs and bottleneck information side-by-side. -
buildUtilizationSeries
public static List<ProductionOptimizer.UtilizationSeries> buildUtilizationSeries(List<ProductionOptimizer.IterationRecord> iterationHistory) Build utilization series for each equipment across the provided iteration history to facilitate charting or CSV export. -
formatUtilizationTimeline
public static String formatUtilizationTimeline(List<ProductionOptimizer.IterationRecord> iterationHistory) Render a compact Markdown timeline showing bottlenecks across iterations. -
toResult
private ProductionOptimizer.OptimizationResult toResult(double rate, String unit, int iteration, ProductionOptimizer.Evaluation evaluation, List<ProductionOptimizer.IterationRecord> iterationHistory) -
quickOptimize
public ProductionOptimizer.OptimizationSummary quickOptimize(ProcessSystem process, StreamInterface feedStream) Convenience wrapper that derives reasonable bounds from the current feed rate and returns a concise summary (max rate, limiting equipment, utilization margin). -
quickOptimize
public ProductionOptimizer.OptimizationSummary quickOptimize(ProcessSystem process, StreamInterface feedStream, String rateUnit, List<ProductionOptimizer.OptimizationConstraint> constraints) Convenience wrapper that derives reasonable bounds from the current feed rate and returns a concise summary (max rate, limiting equipment, utilization margin). -
evaluateProcess
private ProductionOptimizer.Evaluation evaluateProcess(ProcessSystem process, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, Map<String, Double> decisionVariables) -
binaryFeasibilitySearch
private ProductionOptimizer.OptimizationResult binaryFeasibilitySearch(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<ProductionOptimizer.IterationRecord> iterationHistory) -
goldenSectionSearch
private ProductionOptimizer.OptimizationResult goldenSectionSearch(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<ProductionOptimizer.IterationRecord> iterationHistory) -
nelderMeadSearch
private ProductionOptimizer.OptimizationResult nelderMeadSearch(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<ProductionOptimizer.IterationRecord> iterationHistory) -
particleSwarmSearch
private ProductionOptimizer.OptimizationResult particleSwarmSearch(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<ProductionOptimizer.IterationRecord> iterationHistory) -
gradientDescentSearch
private ProductionOptimizer.OptimizationResult gradientDescentSearch(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, List<ProductionOptimizer.IterationRecord> iterationHistory) Gradient descent search for multi-variable optimization using finite-difference gradients.Uses Armijo backtracking line search to find a suitable step size. Gradients are approximated via central differences for better accuracy. The search direction is the negative gradient (steepest ascent since we maximize feasibility score).
-
sortSimplexByScore
-
computeCentroid
private double[] computeCentroid(double[][] simplex, int count) -
reflect
private double[] reflect(double[] centroid, double[] point, double factor) -
contract
private double[] contract(double[] centroid, double[] point, double factor) -
clampToBounds
private double[] clampToBounds(double[] candidate, List<ProductionOptimizer.ManipulatedVariable> variables) Clamp all values in the candidate array to the bounds defined by the manipulated variables.- Parameters:
candidate- the array of candidate values to clampvariables- the list of manipulated variables defining the bounds- Returns:
- the clamped array
-
shrink
-
createLruCacheString
Creates an LRU cache with the specified maximum size for String keys.- Parameters:
maxSize- maximum number of entries before eviction- Returns:
- a LinkedHashMap configured for LRU eviction
-
evaluateCandidate
private ProductionOptimizer.Evaluation evaluateCandidate(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, double[] candidate, Map<String, ProductionOptimizer.Evaluation> cache) -
evaluateCandidateInternal
private ProductionOptimizer.Evaluation evaluateCandidateInternal(ProcessSystem process, List<ProductionOptimizer.ManipulatedVariable> variables, ProductionOptimizer.OptimizationConfig config, List<ProductionOptimizer.OptimizationObjective> objectives, List<ProductionOptimizer.OptimizationConstraint> constraints, double[] candidate) -
buildVectorCacheKey
private String buildVectorCacheKey(double[] candidate, ProductionOptimizer.OptimizationConfig config) -
recordIteration
private void recordIteration(List<ProductionOptimizer.IterationRecord> iterationHistory, double candidate, String rateUnit, ProductionOptimizer.Evaluation evaluation, boolean feasible) -
feasibilityScore
Computes a penalized score for constraint-violating evaluations.When the evaluation is feasible (utilization within limits and all hard constraints satisfied), returns the raw objective score. Otherwise, applies an adaptive penalty that scales with the magnitude of the objective value so that the penalty dominates regardless of the problem's unit scale.
- Parameters:
evaluation- the candidate evaluation- Returns:
- penalized score (higher is better)
-
determineUtilizationLimit
private double determineUtilizationLimit(ProcessEquipmentInterface unit, ProductionOptimizer.OptimizationConfig config) -
determineCapacityRule
private ProductionOptimizer.CapacityRule determineCapacityRule(ProcessEquipmentInterface unit, ProductionOptimizer.OptimizationConfig config) Determines the capacity rule for a given equipment unit.Resolution order:
- Name-specific rules from config
- Type-specific rules from config
- CapacityConstrainedEquipment interface (if enabled)
EquipmentCapacityStrategyRegistrylookup- Hard-coded type-specific fallbacks for columns, separators, etc.
- Default getCapacityDuty / getCapacityMax
- Parameters:
unit- the equipment to evaluateconfig- optimizer configuration- Returns:
- a capacity rule for computing utilization and limit
-
determineCapacityRuleByType
private ProductionOptimizer.CapacityRule determineCapacityRuleByType(ProcessEquipmentInterface unit, ProductionOptimizer.OptimizationConfig config) Type-specific capacity rules for common equipment types.Returns a capacity rule for known equipment types, or
nullif the equipment type is not recognized. Whennullis returned, the caller should try theEquipmentCapacityStrategyRegistryor a generic fallback.- Parameters:
unit- the equipment to evaluateconfig- optimizer configuration- Returns:
- a capacity rule for the equipment, or null if the type is not recognized
-
determineCapacityRange
private ProductionOptimizer.CapacityRange determineCapacityRange(ProcessEquipmentInterface unit, ProductionOptimizer.OptimizationConfig config)
-