Change 'ScaffoldClient.collect_aux_var' behavior on unused module.
This MR introduces a small behavior change of the Scaffold-implementing pair of OptiModule classes.
- Until now, calling the
collect_aux_var
method of aScaffoldClient
module that had not processed any gradients raised a RuntimeError. - This commit changes that behavior for something less stringent: warn a RuntimeWarning that such a call is unexpected, but return a conventional, zero-valued scalar state.
- Conversely, upon receiving such states,
ScaffoldServer
ignores the client (i.e. it is not part of the global state's update calculation). - The rationale behind this change is that it may happen that a client does not perform any optimization step, e.g. due to their DP budget having been saturated. In that case, we do not want the FL process to crash, but rather the client to be ignored as part of the update process.