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
88 solver = self.solvers{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)
97 self.solvers = solver;
99 if nargin<3 %~exist(
'e',
'var')
100 for e=1:self.getNumberOfModels
101 self.solvers{e} = solver;
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 AvgTables = getEnsembleAvgTables(self)
117 E = getNumberOfModels(self);
118 AvgTables = cell(1,E);
120 AvgTables{1,e} = self.solvers{e}.getAvgTable();
124 % Kotlin-style aliases
for get* methods
125 function solver = solver(self, e)
126 % SOLVER Kotlin-style alias
for getSolver
127 solver = self.getSolver(e);
130 function it = iteration(self)
131 % ITERATION Kotlin-style alias
for getIteration
132 it = self.getIteration();
135 function e = numberOfModels(self)
136 % NUMBEROFMODELS Kotlin-style alias
for getNumberOfModels
137 e = self.getNumberOfModels();
140 function avg_tables = ensembleAvgTables(self)
141 % ENSEMBLEAVGTABLES Kotlin-style alias
for getEnsembleAvgTables
142 avg_tables = self.getEnsembleAvgTables();
146 function avg_tables = getEnsembleAvgTs(self)
147 % GETENSEMBLEAVGTS Short alias
for getEnsembleAvgTables
148 avg_tables = self.getEnsembleAvgTables();
151 function avg_tables = ensembleAvgTs(self)
152 % ENSEMBLEAVGTS Short alias
for ensembleAvgTables
153 avg_tables = self.ensembleAvgTables();
156 function varargout = ensembleAvg(self)
157 % ENSEMBLEAVG Kotlin-style alias
for getEnsembleAvg
158 [varargout{1:nargout}] = self.getEnsembleAvg();
163 [runtime, sruntime, results] = iterate(self, options); % core iteration