@@ -238,10 +238,12 @@ QString LambdaSchedule::toString() const
238
238
auto keys = this ->stage_equations [i].keys ();
239
239
std::sort (keys.begin (), keys.end ());
240
240
241
- for (auto lever : keys)
241
+ for (const auto & lever : keys)
242
242
{
243
+ auto output_name = lever;
244
+ output_name.replace (" *::" , " " );
243
245
lines.append (QString (" %1: %2" )
244
- .arg (lever. replace ( " *:: " , " " ) )
246
+ .arg (output_name )
245
247
.arg (this ->stage_equations [i][lever].toOpenMMString ()));
246
248
}
247
249
}
@@ -956,20 +958,35 @@ SireCAS::Expression LambdaSchedule::_getEquation(int stage,
956
958
CODELOC);
957
959
958
960
const auto default_lever = _get_lever_name (" *" , lever);
961
+ const auto default_force = _get_lever_name (force, " *" );
962
+ const auto lever_name = _get_lever_name (force, lever);
959
963
960
- if (force == " *" )
964
+ const auto equations = this ->stage_equations [stage];
965
+
966
+ // search from most specific to least specific
967
+ auto it = equations.find (lever_name);
968
+
969
+ if (it != equations.end ())
961
970
{
962
- return this ->stage_equations [stage].value (
963
- default_lever, this ->default_equations [stage]);
971
+ return it.value ();
964
972
}
965
- else
973
+
974
+ it = equations.find (default_force);
975
+
976
+ if (it != equations.end ())
977
+ {
978
+ return it.value ();
979
+ }
980
+
981
+ it = equations.find (default_lever);
982
+
983
+ if (it != equations.end ())
966
984
{
967
- return this ->stage_equations [stage].value (
968
- _get_lever_name (force, lever),
969
- this ->stage_equations [stage].value (
970
- default_lever,
971
- this ->default_equations [stage]));
985
+ return it.value ();
972
986
}
987
+
988
+ // we don't have any match, so return the default equation for this stage
989
+ return this ->default_equations [stage];
973
990
}
974
991
975
992
/* * Return the equation used to control the specified 'lever'
@@ -1142,15 +1159,33 @@ QHash<QString, QVector<double>> LambdaSchedule::getLeverValues(
1142
1159
QVector<double > values (lambda_values.count (), NAN);
1143
1160
1144
1161
QHash<QString, QVector<double >> lever_values;
1145
- lever_values.reserve (this ->lever_names .count () + 1 );
1162
+
1163
+ // get all of the lever / force combinations in use
1164
+ QSet<QString> all_levers;
1165
+
1166
+ for (const auto &equations : this ->stage_equations )
1167
+ {
1168
+ for (const auto &lever : equations.keys ())
1169
+ {
1170
+ all_levers.insert (lever);
1171
+ }
1172
+ }
1173
+
1174
+ QStringList levers = all_levers.values ();
1175
+ std::sort (levers.begin (), levers.end ());
1176
+
1177
+ lever_values.reserve (levers.count () + 2 );
1146
1178
1147
1179
lever_values.insert (" λ" , values);
1148
1180
1149
1181
lever_values.insert (" default" , values);
1150
1182
1151
- for (const auto &lever_name : this -> lever_names )
1183
+ for (const auto &lever : levers )
1152
1184
{
1153
- lever_values.insert (lever_name, values);
1185
+ if (lever.startsWith (" *::" ))
1186
+ lever_values.insert (lever.mid (3 ), values);
1187
+ else
1188
+ lever_values.insert (lever, values);
1154
1189
}
1155
1190
1156
1191
if (this ->nStages () == 0 )
@@ -1174,12 +1209,16 @@ QHash<QString, QVector<double>> LambdaSchedule::getLeverValues(
1174
1209
const auto equation = this ->default_equations [stage];
1175
1210
lever_values[" default" ][i] = equation (input_values);
1176
1211
1177
- for (const auto &lever_name : lever_names )
1212
+ for (const auto &lever : levers )
1178
1213
{
1179
- const auto equation = this ->stage_equations [stage].value (
1180
- lever_name, this ->default_equations [stage]);
1214
+ auto parts = lever.split (" ::" );
1215
+
1216
+ const auto equation = this ->_getEquation (stage, parts[0 ], parts[1 ]);
1181
1217
1182
- lever_values[lever_name][i] = equation (input_values);
1218
+ if (lever.startsWith (" *::" ))
1219
+ lever_values[lever.mid (3 )][i] = equation (input_values);
1220
+ else
1221
+ lever_values[lever][i] = equation (input_values);
1183
1222
}
1184
1223
}
1185
1224
0 commit comments