Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Prior to this PR
Replacement
objects shared identity with originating variables in a number of ways:var_id
) with originating variables. Intended and required.Replacement
objects in some cases. Not intended, seems likely to lead to bugs.The last of these is a consequence of Firedrake
Constant
andFunction
objects having their counts set independently, and would be resolved more easily by not replacingConstant
s at all -- since in most cases only scalarConstant
s work with the Firedrake backend.This PR fixes this by ensuring that
Replacement
objects have their own UFL counts, meaning that 2., 3., and 4. no longer hold.However
The order of
var_replacement
calls is dependent upon the behaviour of the Python garbage collector. While reference dropping occurs at specific points (controlled by theEquationManager
), precisely which references are dropped and in what order depends upon details of garbage collection. This means that if we wait until thevar_replacement
call to instantiate aReplacement
then their UFL counts might be ordered differently on different processes. which also seems fragile.This PR resolves this with an awkward partial initialization ofThis PR resolves this by generating counts on originating variable instantiation.Replacement
objects, with the count set on originating variable instantiation, and theVariableInterface
bound later on thevar_replacement
call.