-
Notifications
You must be signed in to change notification settings - Fork 47
Description
We currently have 25 issues open on co-registration 🙀, and a lot of notes and plans for the way forward dispersed everywhere. I initially tried to organize this in a project: https://github.com/orgs/GlacioHack/projects/3/views/2, but I think that the level of detail of the issues is too inconsistent for this, so I'm writing this summary instead!
Architecture:
We already did a lot in #158 and #329 to re-organize the coding structure to be more consistent and robust, but some points are left:
- A detailed list in Re-organization of
coreg.py#327 especially about cleaning + having consistent subfunctions of class methods + side-features (see next point), - Additional cleaning mentioned in Clean coreg.py #266,
- The discussion of Revamp and simplify the raster-point/P-R/P-P functionality #402 about merging point methods into a single
fitandapply, and call methods depending on Point-Point, Point-Raster or Raster-Raster support, which would also completely solve Allow point clouds forCoreg#134.
Features:
We've been needing for a while to have consistent:
- Plotting: Enable optional plots for coregistration functions #139 (also in Re-organization of
coreg.py#327), - Statistics (in Re-organization of
coreg.py#327), - Weight support: Add weights in coreg functions #59 ,
- Subsampling: Add
random_stateargument toCoregclass forsubsamplecases #243, Allow custom subsampling for eachCoregPipelinestep separately. #137 and mainly the long discussion in Argumentsubsampledoes not work for aCoregPipeline#428.
Most of them are not too far since we introduced a consistent structure for optimizers or binning in #158. It makes weights almost directly supported (but we'll need to raise proper warnings for methods that currently ignore, such as ICP), and will make plotting more easy by consistently treating the type of methods (binning, fit, or both) and the dimensionality of the variables (1D, 2D, ND), which can be re-used for Tilt or NuthKaab fits in the affine functions.
Tests:
Some tests are still a bit old or slow, several related issues could be solved all at once:
- Consistent data fixtures in test modules: Use
pytest.fixtureto provide consistent test data across all test modules? #427, - More varied test data Add DEMs with NaNs (or synthesise them) for tests #64, Improve tests for Coreg, in particular with NaNs #140 and Add example data set with different projections geoutils#310, with synthetic data examples from GeoUtils here: Disable
numbaduring CI tests to get adequate coverage stats #358 (comment).
Performance:
- For reading/writing with georeferencing, this will depend directly on
rioxarray, and Add Xarray accessorgugeoutils#383 and Add Xarray accessordem#392, so not too much to think about! - For
Coreg.fit, as a regression requires all samples at once, it cannot be combined from solutions of different chunks (except in a blockwise way usingBlockwiseCoreg). So it's all about thesubsamplewhich is fairly easy to deal with (read subsample per chunk + return concatenated vector). There's also the computation of derivatives needed, which are also straightforward (slope using overlapping chunks, bias_vars using normal chunks), see the thoughts in Argumentsubsampledoes not work for aCoregPipeline#428 (comment). Most other methodsresiduals,plotcan be based on the same logic as they usesubsample. - It leaves the logic for
Coreg.apply, which might not be trivial. For bias corrections, the solution from the optimized function is applicable independently to every pixel given theirbias_vars(coordinates, angle, etc), so very easy to apply to chunk. However, for affine methods, applying a 3D affine matrix in 4x4 format lazily to independent chunks won't work directly... it would also require a definition of the rotation center of the matrix, and maybe other things... Any thoughts on how to address this @erikmannerfelt? Or maybe @friedrichknuth has some insights? - We could also improve affine pipelines performance with Improve
CoregPipeline.apply()and.fit()performance by merging matrices #79, - And improve memory performance by adding a default resampling logic, see Provide default downsampling logic in
Coregpre-processing for performance #437.
Bugs:
Here there's a lot, but they might solve themselves (or become irrelevant) after changing architecture + tests:
#423, #422, #404, #326, #232, #193
Idea of plan moving forward:
- Think ahead on logic for Performance: already done a bit in Argument
subsampledoes not work for aCoregPipeline#428 (comment). I think we can use the structure proposed there which should work eventually 🤞! Forapply, this should be adaptable down the line... - Focus first on things all related to Architecture: to avoid the effort of adapting all the rest if we did it first (new features, bug fixes and tests). A lot of lessons learned from Add
BiasCorrclasses and rename previouscoreg.BiasCorrincoreg.VerticalShift#158 and Re-organize coreg.py #329. - Add basic architectural Tests to ensure 2. is working as intended with what we already have, and add new data for consistent (and quick!) tests (this specific point might require its own thread of discussion).
- Add support for all new Features: should be made easier by the consistent architecture!
- Add new Tests in parallel of each feature in 4.
- See if the Bugs are still relevant, and fix them if they are! 😄
- Celebrate, for we would have reached quite a way! 🍾
Any thoughts @adehecq @erikmannerfelt? 😄