1classdef EnsembleSolver < Solver
2 % EnsembleSolver Abstract base
class for ensemble model
solvers
4 % EnsembleSolver extends
the base Solver
class to handle ensemble models that
5 % consist of multiple interconnected or related submodels. It provides
the
6 % framework
for iterative solution algorithms that decompose complex systems
7 % into manageable subproblems and coordinate their solution.
9 % @brief Abstract base
class for
solvers handling ensemble/multi-model systems
11 % Key characteristics:
12 % - Manages collections of interconnected models
13 % - Iterative decomposition and solution algorithms
14 % - Convergence checking across multiple submodels
15 % - Coordinated analysis of model ensembles
16 % - Support
for hierarchical and environmental models
18 % Ensemble solver workflow:
19 % 1. Initialize ensemble and submodel
solvers
20 % 2. Iterate until convergence:
21 % a. Pre-iteration operations
22 % b. Analyze each submodel
23 % c. Post-iteration operations
24 % d. Check convergence
25 % 3. Finalize and compute ensemble metrics
27 % Subclasses must implement:
28 % - init(): Initialize before iteration
29 % - pre()/post(): Pre/post iteration operations
30 % - analyze(): Analyze individual submodels
31 % - converged(): Check iteration convergence
32 % - getEnsembleAvg(): Compute ensemble metrics
34 % Copyright (c) 2012-2026, Imperial College London
35 % All rights reserved.
44 function self = EnsembleSolver(ensmodel, name, options)
45 % SELF = ENSEMBLESOLVER(MODEL, NAME, OPTIONS)
47 self@Solver(ensmodel, name);
48 if nargin>=3 %exist(
'options',
'var')
49 self.setOptions(options);
51 self.setOptions(Solver.defaultOptions);
58 init(self); % operations before starting to iterate
59 pre(self, it); % operations before an iteration
60 [results, runtime] = analyze(self, it, e); % operations within an iteration
61 post(self, it); % operations after an iteration
62 finish(self); % operations after ending to iterate
63 bool = converged(self, it); % iteration convergence test
64 [QN,UN,RN,TN,AN,WN] = getEnsembleAvg(self); % get average metrics
for each ensemble model
67 methods %
default implementations
68 function submodels = list(self, it)
69 % SUBMODELS = LIST(IT)
71 % submodels to be considered at iteration it
72 submodels = 1:self.getNumberOfModels;
75 function it = getIteration(self)
78 it = size(self.results,1);
83 function solver = getSolver(self, e) % solver for ensemble model e
84 % SOLVER = GETSOLVER(E)
86 % Return solver for ensemble model E
91 % setSolver(
solvers) : solver cell array
is stored as such
92 % setSolver(solver) : solver
is assigned to all stages
93 % setSolver(solver, e) : solver
is assigned to stage e
94 function solver = setSolver(self, solver, e)
95 % SOLVER = SETSOLVER(SOLVER, E)
99 if nargin<3 %~exist(
'e',
'var')
100 for e=1:self.getNumberOfModels
104 self.solvers{e} = solver;
109 function E = getNumberOfModels(self)
110 % E = GETNUMBEROFMODELS()
112 % Return number of ensemble models
113 E = length(self.ensemble);
116 function
bool = isStochastic(self)
117 % BOOL = ISSTOCHASTIC()
118 % An ensemble solver
is stochastic
if any of its submodel
119 %
solvers is stochastic. Each submodel solver classifies
120 % itself, including from
the method it resolved at runtime.
122 for e = 1:length(self.solvers)
123 if ~isempty(self.
solvers{e}) && self.solvers{e}.isStochastic()
130 function AvgTables = getEnsembleAvgTables(self)
131 E = getNumberOfModels(self);
132 AvgTables = cell(1,E);
134 AvgTables{1,e} = self.solvers{e}.getAvgTable();
138 % Kotlin-style aliases
for get* methods
139 function solver = solver(self, e)
140 % SOLVER Kotlin-style alias
for getSolver
141 solver = self.getSolver(e);
144 function it = iteration(self)
145 % ITERATION Kotlin-style alias
for getIteration
146 it = self.getIteration();
149 function e = numberOfModels(self)
150 % NUMBEROFMODELS Kotlin-style alias
for getNumberOfModels
151 e = self.getNumberOfModels();
154 function avg_tables = ensembleAvgTables(self)
155 % ENSEMBLEAVGTABLES Kotlin-style alias
for getEnsembleAvgTables
156 avg_tables = self.getEnsembleAvgTables();
160 function avg_tables = getEnsembleAvgTs(self)
161 % GETENSEMBLEAVGTS Short alias
for getEnsembleAvgTables
162 avg_tables = self.getEnsembleAvgTables();
165 function avg_tables = ensembleAvgTs(self)
166 % ENSEMBLEAVGTS Short alias
for ensembleAvgTables
167 avg_tables = self.ensembleAvgTables();
170 function varargout = ensembleAvg(self)
171 % ENSEMBLEAVG Kotlin-style alias
for getEnsembleAvg
172 [varargout{1:nargout}] = self.getEnsembleAvg();
177 [runtime, sruntime, results] = iterate(self, options); % core iteration