Discussion point: I find the way in which intersect (average) take the intersection (average) of self with its input arguments, and stores the result in self itself (i.e. overwrites in place) a little awkward to deal with.
In my typical setup I derive a number of individual metrics based on the Hessian of the fields (field components) I want to adapt to, which I then have as a list of metrics. Then I want to combine them in a single metric through intersection or averaging which currently leads to the following code:
final_metric = metrics[0]
final_metric.intersect(*metrics[1:])
final_metric.rename('FinalMetric')
final_metric.set_parameters(...)
which I think is a little opaque. If I want to keep metrics[0] - for instance I want to output the individual metrics along with the final metric for debugging - I first need to make a copy of the values of metrics[0] into the final metric
final_metric = RiemannianMetric(TV, name='FinalMetric', metric_parameters=....)
final_metric.assign(metrics[0])
final_metric.intersect(*metrics[1:])
To me, it would be more natural if intersect would simply take the intersection of its input fields only, and store the result in self. In a way it feels a bit similar to implementing the __iadd__ operator before __add__. Also PETSc implements it with a separate output metric, so our in-place implementation actually still needs to make a copy.
Discussion point: I find the way in which intersect (average) take the intersection (average) of self with its input arguments, and stores the result in self itself (i.e. overwrites in place) a little awkward to deal with.
In my typical setup I derive a number of individual metrics based on the Hessian of the fields (field components) I want to adapt to, which I then have as a list of
metrics. Then I want to combine them in a single metric through intersection or averaging which currently leads to the following code:which I think is a little opaque. If I want to keep
metrics[0]- for instance I want to output the individual metrics along with the final metric for debugging - I first need to make a copy of the values ofmetrics[0]into the final metricTo me, it would be more natural if
intersectwould simply take the intersection of its input fields only, and store the result in self. In a way it feels a bit similar to implementing the__iadd__operator before__add__. Also PETSc implements it with a separate output metric, so our in-place implementation actually still needs to make a copy.