1function [R, names] = getAvgReward(self)
2% [R, NAMES] = GETAVGREWARD() Steady-state expected Markov reward via LDES simulation
4% Computes
the steady-state expected value E[r]=sum_s pi(s) r(s) of each reward
5% function defined on
the model via setReward. The LDES simulator exports
the exact
6% joint-state residence-time histogram;
the reward functions are evaluated here on
7% each visited state, so
the result
is correct also for nonlinear rewards (e.g. E[n^2]).
10% R - Vector of steady-state expected rewards [nRewards x 1]
11% names - Cell array of reward names {nRewards x 1}
13% Copyright (c) 2012-2026, Imperial College London
16if GlobalConstants.DummyMode
21sn = self.model.getStruct(
true);
23 line_error(mfilename, 'No rewards defined. Use model.setReward(name, @(state) ...) before calling getAvgReward.');
26% Run
the LDES simulation (fully JSON-mediated) requesting
the exact
27% joint-state residence-time histogram via --export-histogram.
28data = self.solveCli(self.getOptions, {
'--export-histogram'});
31if isstruct(data) && isfield(data,
'stateHistogram') && ~isempty(data.stateHistogram)
32 space = ldesJson2mat(ldesGetField(data.stateHistogram, 'space', []), [], []);
33 time = ldesJson2mat(ldesGetField(data.stateHistogram, 'time', []), [], []);
36nRewards = length(sn.reward);
37names = cell(nRewards, 1);
38R = zeros(nRewards, 1);
40if isempty(space) || isempty(time) || sum(time) <= 0
42 names{r} = sn.reward{r}.name;
47w = time(:) / sum(time);
49% Build index maps
for RewardState (station-major aggregated layout)
50nodeToStationMap = containers.Map(
'KeyType',
'int32',
'ValueType',
'int32');
51classToIndexMap = containers.Map(
'KeyType',
'int32',
'ValueType',
'int32');
54 nodeToStationMap(int32(ind)) = sn.nodeToStation(ind);
58 classToIndexMap(int32(r)) = r;
61nstates = size(space, 1);
63 names{r} = sn.reward{r}.name;
64 rewardFn = sn.reward{r}.fn;
67 stateRow = space(s, :);
68 rewardState = RewardState(stateRow, sn, nodeToStationMap, classToIndexMap);
70 val = rewardFn(rewardState);
73 val = rewardFn(stateRow, sn);
78 acc = acc + w(s) * val;