LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
EnsembleSolver.m
1classdef EnsembleSolver < Solver
2 % EnsembleSolver Abstract base class for ensemble model solvers
3 %
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.
8 %
9 % @brief Abstract base class for solvers handling ensemble/multi-model systems
10 %
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
17 %
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
26 %
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
33 %
34 % Copyright (c) 2012-2026, Imperial College London
35 % All rights reserved.
36
37 properties
38 ensemble;
39 solvers;
40 results;
41 end
42
43 methods (Hidden)
44 function self = EnsembleSolver(ensmodel, name, options)
45 % SELF = ENSEMBLESOLVER(MODEL, NAME, OPTIONS)
46
47 self@Solver(ensmodel, name);
48 if nargin>=3 %exist('options','var')
49 self.setOptions(options);
50 else
51 self.setOptions(Solver.defaultOptions);
52 end
53 self.solvers = {};
54 end
55 end
56
57 methods (Abstract)
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
65 end
66
67 methods % default implementations
68 function submodels = list(self, it)
69 % SUBMODELS = LIST(IT)
70
71 % submodels to be considered at iteration it
72 submodels = 1:self.getNumberOfModels;
73 end
74
75 function it = getIteration(self)
76 % IT = GETITERATION()
77
78 it = size(self.results,1);
79 end
80 end
81
82 methods
83 function solver = getSolver(self, e) % solver for ensemble model e
84 % SOLVER = GETSOLVER(E)
85 %
86 % Return solver for ensemble model E
87
88 solver = self.solvers{e};
89 end
90
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)
96 if iscell(solver)
97 self.solvers = solver;
98 else
99 if nargin<3 %~exist('e','var')
100 for e=1:self.getNumberOfModels
101 self.solvers{e} = solver;
102 end
103 else
104 self.solvers{e} = solver;
105 end
106 end
107 end
108
109 function E = getNumberOfModels(self)
110 % E = GETNUMBEROFMODELS()
111 %
112 % Return number of ensemble models
113 E = length(self.ensemble);
114 end
115
116 function AvgTables = getEnsembleAvgTables(self)
117 E = getNumberOfModels(self);
118 AvgTables = cell(1,E);
119 for e=1:E
120 AvgTables{1,e} = self.solvers{e}.getAvgTable();
121 end
122 end
123
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);
128 end
129
130 function it = iteration(self)
131 % ITERATION Kotlin-style alias for getIteration
132 it = self.getIteration();
133 end
134
135 function e = numberOfModels(self)
136 % NUMBEROFMODELS Kotlin-style alias for getNumberOfModels
137 e = self.getNumberOfModels();
138 end
139
140 function avg_tables = ensembleAvgTables(self)
141 % ENSEMBLEAVGTABLES Kotlin-style alias for getEnsembleAvgTables
142 avg_tables = self.getEnsembleAvgTables();
143 end
144
145 % Table -> T aliases
146 function avg_tables = getEnsembleAvgTs(self)
147 % GETENSEMBLEAVGTS Short alias for getEnsembleAvgTables
148 avg_tables = self.getEnsembleAvgTables();
149 end
150
151 function avg_tables = ensembleAvgTs(self)
152 % ENSEMBLEAVGTS Short alias for ensembleAvgTables
153 avg_tables = self.ensembleAvgTables();
154 end
155
156 function varargout = ensembleAvg(self)
157 % ENSEMBLEAVG Kotlin-style alias for getEnsembleAvg
158 [varargout{1:nargout}] = self.getEnsembleAvg();
159 end
160 end
161
162 methods
163 [runtime, sruntime, results] = iterate(self, options); % core iteration
164 end
165
166end