Changelog
0.42.0 - 2025-08-19
Added
Changed
- Update workflow defaults for larger half-window and nearest-3 (#634)
Fixed
- Fixed JAX CRLB outputs for singular matrix cases
- Updated
docs/sample_dolphin_config.yamlfor newer structure - Fix defaults in dolphin config CLI for interferogram_network settings (#636)
0.41.0 - 2025-08-11
Added
stitching.py: Add support for specifying output projection by @scottstanie in #607- Added Cramér–Rao lower bound (CRLB) estimation output to phase linking results by @scottstanie in #577
- Add UAVSAR_WAVELENGTH to constants by @scottstanie in #620
- Add sequential closure phase rasters to phase linking output by @scottstanie in #618
- Add
apply_mask_to_timeseriesto set masked pixels to nodata in outputs by @scottstanie in #627 - Stitch and output all per-ministack
temporal_coherence_andsimilarity_files by @scottstanie in #615
Changed
- Fix numerical issues with CRLB calculation by @scottstanie in #626
Fixed
- Fix hardcoded port 5000 for moto tests by @scottstanie in #617
masking.py: RaiseMaskingErrorafter creating an empty mask by @scottstanie in #619
0.40.0 - 2025-06-30
Added
- Added Cramér-Rao Lower Bound (CRLB) estimate rasters in https://github.com/isce-framework/dolphin/pull/577
0.40.0 - 2025-06-
Fixed
- Throw a better error for
dolphinwithout any args
Changed
- Remove
avg_cohfrom optional phase linking outputs unwrap.py: Combine sliding window mask with similarity mask for masking / interpolation
0.39.0 - 2025-06-09
Largest visible change: Switch CLI to use tyro by @scottstanie in https://github.com/isce-framework/dolphin/pull/578
This involves multiple fixes and some breaking changes:
- Fixed
- Missing arguments that were not configurable via the command line
dolphin unwrapanddolphin timesrieshas several issues resulting from the function API being out of sync with the argparse APIconfigChanges:- Strides must be specified as
--sx 6 --sy 3, not--strides 6 3 - Several worker settings options like
--threads-per-workerare not longer top-level command line options; you can specify them with--worker-settings.threads-per-worker
Added
- Parallelize phase linking for single-swath case in
single.pyby @scottstanie in https://github.com/isce-framework/dolphin/pull/576 - DOC: Add phase linking theory notebook to docs by @scottstanie in https://github.com/isce-framework/dolphin/pull/597
- Add Github link to docs by @scottstanie in https://github.com/isce-framework/dolphin/pull/575
- Add script to read GAMMA
.rslcbinary SLCs by @scottstanie in https://github.com/isce-framework/dolphin/pull/569 - Add
keep_bitstoBackgroundBlockWriterAPI so writers canround_mantissaby @scottstanie in https://github.com/isce-framework/dolphin/pull/536
Changed
- Make
referenceoptional for velocity fitting by @scottstanie in https://github.com/isce-framework/dolphin/pull/571 - Allow
Iterator[Filename]to all readers with.from_file_listby @scottstanie in https://github.com/isce-framework/dolphin/pull/579 - Fix to be
Iterable, notIteratorAPI change for_readersfrom #579 by @scottstanie in https://github.com/isce-framework/dolphin/pull/582 - Simplify reference index logic for
ALWAYS_FIRSTinstack.py, cutFIRST_PER_MINISTACKby @scottstanie in https://github.com/isce-framework/dolphin/pull/588 - Remove single-burst special case in phase linking outputs by @scottstanie in https://github.com/isce-framework/dolphin/pull/574
- Add
fmt=file_date_fmtto allget_datescall to avoid file format assumptions by @scottstanie in https://github.com/isce-framework/dolphin/pull/585
Fixed
- Run
fix_typos.shon repo by @scottstanie in https://github.com/isce-framework/dolphin/pull/572 - Remove per-burst phase linking dirs that are empty by @scottstanie in https://github.com/isce-framework/dolphin/pull/595
stitching.py: fix strides check for either x or y by @scottstanie in https://github.com/isce-framework/dolphin/pull/596- Pass through
timeseries_options.reference_pointduringdisplacement.pyworkflow by @scottstanie in https://github.com/isce-framework/dolphin/pull/602 unwrapping.py: fix comparison to avoid mask warping by @scottstanie in https://github.com/isce-framework/dolphin/pull/600
Removed
- Remove unused
_utilshelper functions by @scottstanie in https://github.com/isce-framework/dolphin/pull/581 OutputOptions: Only requirebounds_epsgif specifyingbounds, cutresolutionby @scottstanie in https://github.com/isce-framework/dolphin/pull/591- Remove old
glrt_cutoffs.csvfromMANIFEST.inby @scottstanie in https://github.com/isce-framework/dolphin/pull/573
0.38.0 - 2025-04-15
Added
demo-filtering-sizes.ipynbfor high-pass filtering cutoff demo by @scottstanie in https://github.com/isce-framework/dolphin/pull/561
Changed
- Breaking change: Split corrections, remove raider pulled modules by @scottstanie in https://github.com/isce-framework/dolphin/pull/531
Fixed
- Use
is_symlinkwhen checking for existing scratch files in spurt by @scottstanie in https://github.com/isce-framework/dolphin/pull/568
0.37.0 - 2025-03-27
Changed
filtering.py: Change defaultsigmacalculation, add docstring explanation by @scottstanie in https://github.com/isce-framework/dolphin/pull/560
0.36.2 - 2025-03-25
Fixed
- Update notebook walkthrough for new output structure by @scottstanie in https://github.com/isce-framework/dolphin/pull/558
- Adding subdataset as input arguments because it is different for S1 and NISAR by @mirzaees in https://github.com/isce-framework/dolphin/pull/559
0.36.1 - 2025-03-06
Fixed
- Fix ionosphere reading and delay computation by @scottstanie in https://github.com/isce-framework/dolphin/pull/554
- Let amp_dispersion_threshold be 0 to select no PS points by @scottstanie in https://github.com/isce-framework/dolphin/pull/553
- Move
WriteArraycalls afterSetNoDataValuecalls by @scottstanie in https://github.com/isce-framework/dolphin/pull/555
Added
- Add nisar wavelengths to
constantsby @mirzaees in https://github.com/isce-framework/dolphin/pull/551
0.36.0 - 2025-02-21
Added
utils.grow_nodata_regionto remove bad borders from images
Changed
timeseries.py: Auto reference point selection- Picks the center of mass instead of arbitrary
argmaxresult - Rename
condition_filetoquality_file - Convert
glrtSHP method to use JAX instead of Numba - Remove import for
goldsteinandfilteringfrom top level__init_.py
Removed
- Removed
conditionparameter intimeseriesreference point functions - Removed
CallFuncenum
Fixed
- docs: Fix mathjax render, fix broken
DateOrDatetimeerror - Replace
__name__with "dolphin" ingetLoggerto fix missing log entries from.jsonllog files - Used
utils.grow_nodata_regionto remove bad borders fromshp_counts.tif
0.35.1 - 2025-01-15
Fixed
filtering.pyFix in_bounds_pixels masking, set default to 25 km- Set
output_reference_idxseparately fromcompressed_reference_idxduring phase linking setup
0.35.0 - 2025-01-09
Added
- Compute timeseries inversion and save to rasters
use_seasonal_coherenceparameter to simulate.py
Changed
keepdimsoptions to reader classes to avoid squeezing singleton dims- Using L1 inversion by default for timeseries
- Using most recent compressed SLC as output for
LAST_PER_MINISTACK - Adapted short wavelength filter to use
gdal_fillnodatafor edge effects mitigation - Removed Numba dependency from
simulate.py
Fixed
- Documentation grammar on VRT size check
0.34.0 - 2024-11-26
Added
--use-evdoption todolphin configCLICITATION.cfffile for better zenodo parsing
Changed
- Spurt changes
- Logging redirect, add a log file, multiprocess during final interpolation
- Improved speed of post-spurt 2-pi ambiguity interpolation
- Default ministack_size changed to 15 in PhaseLinkingOptions
- Using nearest sampling for stitching static layers
Fixed
- Unit string written to
velocity.tif extra_reference_datelogic for single reference unwrapping- Missing annotations for Python 3.9 compatibility
- Pinned
mkdocs-jupyterto 0.25.0 - Make
--condition-filenot required fordolphin timeseries - Removed
.flake8
0.33.0 - 2024-11-07
Added
fill_valueparameter tofilter_long_wavelength- Function to create counts of valid unwrapped outputs (
create_nonzero_conncomp_counts)
Changed
- Modified logging capture from spurt to be more selective
0.32.0 - 2024-11-05
Fixed
- Merge documentation improvements from
jossbranch - Add a retry to spurt for
BrokenProcessPools
0.31 - 2024-11-03
Changed
- Skip nodata values of interferograms when interpolating
0.30 - 2024-11-01
Added
- Support for specifying output bounds as WKT
- Ability to calculate similarity using nearest-3 interferograms
- Add configuration option for single tile reoptimize functionality for snaphu-py. Turn off by default.
- Support for layover shadow mask files to mask pixels during wrapped phase
- Zero correlation threshold parameter for phase linking
- Censored least squares solving capability for missing data
- Support for reading from S3 using osgeo.gdal with
/vsis3conversion
Changed
- Updated dolphin timeseries CLI for new options, using L1 by default
- Increased spurt
max_tilesdefault to 49 for smaller MCF problems - Modified compressed_reference_idx with relative index fix
- Replaced CSVs with
chi2.ppffor GLRT test - Lowered
min_conncomp_fracdefault to 0.001 - Using
output_reference_idxas default for creating compressed SLCs withALWAYS_FIRST - Increased
buffer_pixelswhen making OPERA CSLC mask - Refactored
repack_rasterto work in blocks for lower memory usage
Fixed
- Fixed ministack output and compressed SLC indexing
- Fixed
in_trim_slicesize for non-overlapping blocks - Fixed units passthrough during timeseries._redo_reference
- Improved spurt subprocess handling to avoid fork issues
- Fixed block_shape passthrough to create_similarities after phase linking
0.29.0 - 2024-10-14
Added
- Sample dolphin_config.yaml to the documentation
- Stitched phase cosine similarity raster to outputs
- Post-processing step to fill NaN gaps after running spurt
- Outside input range options to get_nearest_date_idx
Changed
- Set EVD input to be weighted by correlation
- Using dataclasses instead of NamedTuple for displacement and stitched outputs
- Passing through phase_linking.output_reference_idx to avoid reference resets
Fixed
- Added logic to reset extra_reference_date after network unwrapping
- Applied nan/0 mask to output of goldstein filter
- Added references/url fixes from JOSS branch
0.28.0 - 2024-09-19
Added
num_parallel_tilesandnum_parallel_ifgstoSpurtOptions- L1-norm-based inversion to
timeseries - Config option to avoid PS pixels during phase linking
block_shapeto timeseries parameterswavelengthattribute to workflow to convert rasters to meters- Larger
Nrows to computed GLRT cutoffs - Logic for manually specifying reference dates mid-stack
- ADMM to minimize L1-norm of
Ax - b - Instructions for building Docker image in documentation
- Link to notebook in
simulate-demofunction - Printing of unwrapping options in
show_versions - Update walkthrough notebook for docs
- Add clarifications and suggested changes to documentation
Changed
- Remove transposed versions of functions in
covariance - Set
use_slc_ampdefault to False during phase linking - Use the same mask for unwrapping and conncomp regrowing steps
- Turn off correlation weighting for velocity by default
- Use less memory for L1 inversion
- Include layover shadow mask when stitching in
prepare_geometry - Create
.conncompfiles forspurtfrom temporal coherence - Add
like_filenameforspurtconnected components
Fixed
- Fix plotting/imports for walkthrough
- Fix
displacement.runto avoid troposphere computation with empty list - Pass through EPSG code to
_get_mask - Fix
n_parallel_tilesto be an integer, not float - Skip
combine_mask_filesif the output already exists - Fix typos in walkthrough configuration
- Fix
simulate-demofunction usage - Fix mismatching docs and missing log statements
- Pass through
add_overviews, run even if single-reference network - Add
ignore_errors=Truetormtreefor scratch removal - Setup
gaussian_filter_nanin utils, use inestimate_correlation_from_phase - Fix Apache end template
- Fix ionospheric date parsing and grouping
- Fix handling of
nodataduring timeseries conversion to meters
0.27.1 - 2024-08-12
Changed
- Set the default
input_conventionsto be same asoutput_conventions
0.27.0 - 2024-08-12
Added
- Ability to mask a subset of input SLCs
Changed
- Temporarily removed resampling during stitching final crop
0.26.0 - 2024-08-02
Added
mapoption forDummyProcessPoolExecutor- PR template
dolphin filterCLI to run a long wavelength filter on a set of rasters
Changed
- Changed datetime format for reading tropospheric corrections
- Copy over unwrapped to
timeseries/even with 1 file - Removed
atmosphereimports from the main path
0.25.0 - 2024-08-01
Changed
- Moved reference point selection back to always be run if not specified
- Reference correction outputs to a point in space and convert to meters
Fixed
- Fixed
timeseriesto mkdir right away
0.24.0 - 2024-08-01
Added
- Skip correlation estimate for files that exist
- Save
ReferencePointinto file intimeseries/folder
Changed
- Clip
nlooksto a max of 20 forwhirlwind - Refactor
filter_long_wavelengthto avoid boundary issues for images with lots of no data region - Skip zero raster output by timeseries inversions
Fixed
- Fixed reference point selection labels
0.23.0 - 2024-07-29
Added
whirlwindunwrapper- Option to redirect other loggers to same JSON file
- Interleave GTiffs by band, not pixel
Changed
- Updated
show_versionsto readimportlib.metadata, usekeep_bitsinstead oflerc - Made network formation
staticmethods public - Shrunk
nlooksfor whirlwind - Improved code for transferring unwrapped phase ambiguities
- Moved mask loading function into
masking.py
Fixed
- Fixed Spurt tests
- Updated
spurtimports for exported interface - Set the
final_arrnodata to be same as original ifg mask - Fixed filtering ambiguity transfer for interp/goldstein
- Fixed confusing name for scratchdirs
0.22.1 - 2024-07-17
Fixed
- Fixed v0.22.0 imports
0.22.0 - 2024-07-16
Added
- Output velocities in units per year in
timeseries
Changed
- Minor changes in
spurtconfig to match its naming conventions - Vendored
mdx_bibto avoid direct URL indocs/requirements.txt
0.21.0 2024-07-16
Added
- Continuous deployment Github action workflow to publish to pypi
- Conversion from NetCDF tropospheric correction files
Changed
- Round mantissa bits instead of truncate, call the argument
keep_bitsfor clarity
0.20.0 - 2027-07-08
Added
- Functions in
psto combine amplitude dispersions from older rasters truncate_mantissaoption torepackfunctions for simple compressionbandoption towrite_blockand background writers- Option to run
merge_datesandestimate_interferometric_correlationswiththread_mapfor parallel processing - Baseline lag option for "STBAS" phase linking inversion
Changed
- Logging now uses
dictConfigand always logs JSON to a file for the Displacement workflow - Set modulus of compressed SLCs to be real SLC magnitude means
- Updated Docker requirements and specfile
- Delete intermediate unwrapping
scratchdirs by default
Fixed
use_max_pswould occasionally fail with certain stride/window configurations- Unwrapped phase files did not always contain the right geographic metadata
- Filenames in the
timeseries/folder were wrong - Set upsampled boundary to
nanincompress - Unwrapped file output path
0.19.0 - 2024-06-21
Added
filteringmodule for filtering out long wavelength signals from the unwrapped phasebaselinemodule for computing the perpendicular baseline. Initial version has logic for OPERA CSLCs, usesisce3- Interface only for 3D unwrapping
- Faster correlated noise simulation, along with 3d stack simulation with synthetic deformation
- Added ability to read rasters on S3 using
VRTStackobject - Eigenvalue solver speedups of 3-9x
- Initial version of 3D unwrapping using
spurt
Removed
- the KL-divergence SHP estimator has been removed. GLRT is recommended instead.
Fixed
reproject_boundsuses therasterioversion, which densifies points along edges for a more accurate bounding box- The output SHP rasters now output 0 if there was no valid input data
- Logic for filling PS pixels, with and without setting the amplitudes to be the original SLC amplitudes
ReferencePointErrorduring the displacement workflow now will fall back look only at thecondition_file(i.e. choose the point with highest temporal coherence by default)
Changed
- The configuration options for unwrapping have been refactored. Options unique to each unwrapper are grouped into subclasses.
- Note that older
dolphin_config.yamlfiles will error after this refactor. - Unweighted time series inversion will make one batch call, providing a large speedup over the
vmapversion for weighted least squares
0.18.0 - 2024-05-07
Added
dolphin timeseriescommand line tool for inverting unwrapped interferogram network and estimating velocity
Fixed
- Parse the file names correctly to find compressed SLCs and read dates based on production file naming convention
0.17.0 - 2024-04-10
Added
- Added Goldstein filtering for unwrapping
- Added Interpolation for unwrapping
- Added the regrow connected components for the modified phase
- Added option to toggle off inversion
- Added similarity module
Fixed
- 3D readers would squeeze out a dimension for length one inputs (i.e. they would give an array with
.ndim=2) max_bandwidthconfig can now be 1 to specify only nearest neighbor interferograms.- Use the 'compressed' key term to find compressed slcs and regular slcs instead of number of dates in ionosphere
- Consider the compressed SLCs have different naming convention with capital letters
- Enforce consistency between jax and jaxlib
- Disable corrections part of pytest, add one for timeseries
0.16.0 - 2024-03-03
Added
- Added
dolphin.timeseriesmodule with basic functionality: - Invert a stack of unwrapped interferograms to a timeseries (using correlation weighting optionally)
- Estimate a (weighted) linear velocity from a timeseries
- Added inversion and velocity estimation as options to
DisplacementWorkflow - Create
DatasetStackWriterprotocol, withBackgroundStackWriterimplementation
Changed
- Rename
GdalWritertoBackgroundBlockWriter - Displacement workflow now also creates/returns a stitched, multi-looked version of the amplitude dispersion
Fixed
BackgroundRasterWriterwas not creating the files necessary before writing- Allow user to specify more than one type of interferogram in
Networkconfiguration
0.15.3 - 2024-02-27
Changed
- Return the output paths created by the ionosphere/troposphere modules to make it easier to use afterward
0.15.2 - 2024-02-27
Fixed
- Fixes to ionosphere/troposphere correction in for
DisplacementWorkflowandPsWorkflow - Correct the nodata value passed through to snaphu-py
0.15.1 - 2024-02-26
Fixed
- PHASS now uses the Tophu wrapper to avoid isce3 inconsistencies between argument order
0.15.0 - 2024-02-16
Changed
- Combine the nodata region with the
mask_fileto pass through to unwrappers - Update regions which are nodata in interferograms to be nodata in unwrapped phase
- Use
uint16data type for connected component labels
Fixed
- Intersection of nodata regions for SLC stack are now all set to
nanduring phase linking, avoiding 0 gaps between bursts
0.14.1 - 2024-02-15
Fixed
- Changed snaphu-py tile defaults to avoid max secondary arcs error in #233
- Fixed
linalg.norm`` to be pixelwise inprocess_coherence_matrices` in #234
0.14.0 - 2024-02-13
Fixed
- Temporal coherence and eigenvalue rasters were switched in their naming
- Output a better
estimatorraster to see where we switched to EVD - Cap the max number of threads to the CPU count to avoid
numbaconfig errors
Changed
- refactor temporal coherence calculation to use
vmap - Allows us to start making a weighted temporal coherence metric
- Turn off default
beta=0.01regularization now that CPL is in place - Removed
InterferogramNetworkTypefrom configuration. - You can add multiple types of network parameters and it includes all of them. Adding the name only decreased flexibility.
0.13.0 - 2024-02-09
Added
_overviewsmodule, and workflow configuration to create overviews of the output stitched rasters- Configuration to use the snaphu-py wrapper, and drop using
isce3.unwrap.snaphu
Fixed
- Apply bounds even if only one image is passed to
stitching(#210) - Allow
take_looksto work withMaskedArrayswithout converting tonp.ndarray
Dependencies
- Move back to
tqdminstead of usingrichfor progress bars.
0.12.0 - 2024-02-01
Added
- Added
DatasetWriterprotocol - Added
RasterWriterandBackgroundRasterWriterimplementations of this protocol - Refactored phase linking
- Covariance and EVD/MLE use
jax - This combines the implementation of CPU/GPU, and removes the need for using
pymp - Added
utils.disable_gputo stop the use ofr a GPU even if it's available
Changed
- Internal module organization, including grouping IO modules into
dolphin.iosubpackage - Renamed
io.Writertoio.GdalWriterto distinguish fromRasterWriter - Removed the
n_workersoption from the configuration. - There is no more need to have two levels of parallelism (
threads_per_workerandn_workers) - The name
threads_per_workeris kept for consistency; it is still an accurate name for the multi-burst processing case.
Added
jax>=0.4.19numpy=>1.23 (bump to minimum version that they're still supporting)scipy>=1.9 (same reason)numba>=0.54
Removed
pympcupyfrom optional GPU usage
0.11.0 - 2024-01-24
Added
- Added ionospheric correction in
dolphin.atmosphere.ionosphere - Included in
DisplacementWorkflowif TEC files are provided
0.10.0 - 2024-01-22
Added
- Create
dolphin.unwrapsubpackage to split out unwrapping calls, and post-processing modules.
Removed
- the
_datesmodule has been removed in favor of usingopera_utils._dates
Fixed
stitching.merge_imageswill now give consistent sizes for provided bounds whenstridesis given
0.9.0 - 2024-01-10
Added
DatasetReaderandStackReaderprotocols for reading in data from different sourcesDatasetReaderis for reading in a single dataset, like one raster image.StackReaderis for reading in a stack of datasets, like a stack of SLCs.- Implementations of these have been done for flat binary files (
BinaryReader), HDF5 files (HDF5Reader), and GDAL rasters (RasterReader).
Changed
- The
VRTStackno longer has an.iter_blocksmethod - This has been replaced with creating an
EagerLoaderdirectly and passing it to thereaderargument
Dependencies
- Added
rasterio>=1.3
0.8.0 - 2024-01-05
Added
- Ability to unwrap interferograms with the
snaphu-py(not a required dependency) - Added ability to make annual ifgs in
Network - Start of tropospheric correction support in
dolphin.atmosphereusing PyAPS and Raider packages - Expose the unwrap skipping with
dolphin config --no-unwrap
Changed
- The output directory for interferograms is now just "interferograms/" instead of "interferograms/stiched"
- Even when stitching, the burst-wise interferograms would be in the named phase-linking subfolders.
- Split apart the
dolphin.workflows.stitch_and_unwrapmodule intostitching_burstsandunwrapping - Switched output filename from
tcorrtotemporal_coherencefor the temporal coherence of phase linking. - Also added the date span to the
temporal_coherenceoutput name - The default extension for conncomps is now
.tif. Use geotiffs instead of ENVI format for connected components. - Using ruff instead of pydocstyle due to archived repo
0.7.0 - 2023-11-29
Added
MiniStackPlannerandMiniStackInfoclass which does the planning for how a large stack of SLCs will be processed in batches.- Previously this was done at run time in
sequential.py. We want to separate that out to view the plan in advance/allow us to dispatch the work to multiple machines. CompressedSlcInfoclass added to track the attributes of a compressed SLC file created during the workflow.- This has the
reference_dateas an attribute, which allows us to know what the base phase is even without starting from the first SLC in the stack (i.e. if we have limited the number of compressed SLCs) - Added better/more complete metadata to the compressed SLC Geotiff tags, including the phase reference date
- Before we were relying on the filename convention, which was not enough information
- config:
phase_linking.max_compressed_slcsto cap the number of compressed SLCs added during large-stack sequential workflows interferogram: Add ability to specify manual dates for aNetwork/VRTInterferogram, which lets us re-interfere the phase-linking results
Changed
- Date functions have been moved from
dolphin.utilstodolphin._dates. They are accessible atdolphin.get_dates, etc get_datesnow usesdatetime.datetimeinstead ofdatetime.date.- This is to allow for more flexibility in the date parsing, and to allow for the use of
datetime.dateordatetime.datetimein the output filenames. VRTStackhas been moved to_readers.py. The minstack planning functions have been removed to focus the class on just reading input GDAL rasters.
Fixed
- When starting with Compressed SLCs in the list of input SLCs, the workflows will now recognize them, find the correct reference date, and form all the correct interferograms
Removed
- Extra subsetting functions from
VRTStackhave been removed, as they are not used in the workflow and the reimplmenent simple GDAL calls. CPURecorderandGPURecorderhave been removed to simplify code. May be moved to separate repo.
0.6.1 - 2023-11-13
Removed
dolphin.opera_utilsnow lives in the separate package
Dependencies
- Added
opera_utils
0.6.0 - 2023-11-07
Added
opera_utils.get_missing_data_optionsto parse the full list of SLCs and return possible subsets which have the same dates used for all Burst IDsPsWorkflowclass for running just the PS estimation workflowasvbenchmark setup to measure runtime across versions@atomic_outputdecorator for long running write processes, to avoid partially-written output files
Changed
- removed
minimum_imagesas an argument fromopera_utils.group_by_burst. Checking for too-few images now must be done by the caller opera_utils.group_by_burstnow matches the official product name more robustly, but still returns the lowered version of the burst ID.- The
s1_dispworkflow has been renamed todisplacement, since it is not specific to Sentinel-1. - The configuration was refactored to enable smaller workflow
- The
Workflowconfig class has been renamed toDisplacementWorkflow. - A
PsWorkflowconfig class has been added for the PS estimation workflow. - A
WorkflowBaseencompasses some of the common configuration options.
Maintenance
ruffhas replacedisort/black/flake8in the pre-commit checks
0.5.1 - 2023-10-10
Added
stitch_and_unwrap.runreturns the stitch PS mask
0.5.0 - 2023-10-09
Added
CPURecorderclass for fine grained benchmarking of the CPU/memory usage for
Changed
- Docker
specfilenow builds with tophu
0.4.3 - 2023-10-06
Added
- Ability to unwrap using isce3's
PHASS CorrectionOptionsmodel for specifying the correction options in theWorkflowconfig- Currently a placeholder for the files which will be used for tropospheric/ionospheric corrections
- Ability to keep relative files in the
Workflowconfig - This is useful for keeping the relative paths to the SLCs in the config, and then running the workflow from a different directory
Changed
- Instead of specifying the unwrapping algorithm in
dolphin unwrapas--use-icu, the option is not--unwrap-method - This let's us add
--unwrap-method "phass", but also future unwrap methods without a--use-<name>for every one - Use
spawninstead offorkfor parallel burst multiprocessing - This leads to the error
Terminating: fork() called from a process already using GNU OpenMP, this is unsafe.in certain situations, and does not happen withspawn. See https://pythonspeed.com/articles/python-multiprocessing/ for more details.
0.4.2 - 2023-10-03
Added
use_evdoption to force the use of eigenvalue decomposition instead of the EMI phase linking algorithm- Walkthrough tutorial notebook
Changed
- Moved all
OPERA_variables to a new moduledolphin.opera_utils. - Other OPERA-specific quirks have been moved to the separate
disp-s1repo, but the functions remaining are the ones that seem most broadly useful tosweetsand other users working with burst SLCs. - Changed the burst regex to be able to match COMPASS and the official product name
- Removed
WorkflowNamefor separatingstackvssingle - The name didn't really provide benefit, as the real differences cam from other configuration options
- Internals for which functions are called in
sequential.py - Docker image now has
tophuinstalled
0.4.1 - 2023-09-08
Dependencies
- Added back isce3
0.4.0 - 2023-09-07
Changed
- Split apart OPERA-specific needs from more general library/workflow functionality
- Removed the final NetCDF product creation
- Many rasters in the
scratch/folder are of general interest after running the workflow - Changed folder structure so that there's not longer a top-level
scratch/andoutput/by default - Changed the required dependencies so the
isce3unwrapper is optional, as people may wish to implement their own custom parallel unwrapping
Dependencies
Dropped: - h5netcdf - pillow
Now optional: - isce3 (for unwrapping)
0.3.0 - 2023-08-23
Added
- Save a multilooked version of the PS mask for output inspection
Changed
- Pydantic models were upgraded to V2
- Refactored the blockwise IO into
_blocks.py. - The iteration now happens over the output grid for easier dilating/padding when using
strides - New classes with
BlockIndicesandBlockManagerfor easier management of the different slices
Dependencies
- pydantic >= 2.1
0.2.0 - 2023-07-25
Added
- For OPERA CSLC inputs, we now read the nodata polygon and skip loading regions of the SLC stack which are all nodata.
- This led to a reduction of 30-50% in wrapped phase estimation runtime for each burst stack.
- Sample test data for the
dolphinpackage loaded onto Zenodo. - Adds 3 methods of computing a variable statistically homogeneous pixel (SHP) window when estimating the covariance matrix:
- Kolmogorov-Smirnov test (KS-test)
- Generalized likelihood ratio test (GLRT)
- Kullback-Leibler divergence/distance test (KLD)
"rect"is also an option for skipping any statistical test and using the full rectangular multilook window- Also included a script to view the window in an interactive matplotlib figure (matplotlib must be installed separately)
- Added a simple method to check for adjacent-pixel unwrapping errors in
unwrap.compute_phase_diffs - Adds a method
utils.get_cpu_countwhich returns eitheros.cpu_count, or (if running in a Docker container) the number of CPUs allocated by Docker - If processing stacks from separate bursts, added option
n_parallel_burststoWorkflowto run in parallel processes. - Created a script to test the incremental/near-real-time version of phase linking
- Added a new CLI command
dolphin unwrapto unwrap a single interferogram/a directory of interferograms in parallel. - Added ability to specify a glob pattern for input CSLC files in the YAML config
- Saves a multilooked PS mask for the default workflow output
- Allows the user to specify a desired bounds for the final stitched result
Changes
- Default OPERA dataset is now within
/data, reflecting the new COMPASS product spec since CalVal - Passing an existing file to
VRTStackwill no longer error unlessfail_on_overwrite=True. The default just prints out the overwrite is happening. This prevents multiple runs in the same folder from errorings just for creating a reference to the SLC files. - The environment variable
NUMBA_NUM_THREADSis set using the passed in config to prevent numba from using all CPUs duringprangecalls - The
sequential.pymodule uses a different implementation of the sequential estimator to avoid the need for a datum adjustment. - The scratch directory holding unwrapped interferograms is named
unwrappedinstead ofunwrap - Stitching files now can accept downsampled versions and product the correct geo metadata
Fixed
- Calculating the nodata mask using the correct input geotransform
- Trims the overlapped region of the phase linking step when iterating in blocks
Dependencies
- shapely >= 1.8
- Numba now supports Python 3.11, so we can drop the Python<3.11 version restriction.
Added testing requirements: - pooch - pillow>=7.0
0.1.0 - 2023-03-31
- First version of the
_product.pymodule to output the combined NetCDF product file. _pge_runconfig.pymodule to handle the separate PGE-compatible configuration, which translates to-from theWorkflowobject.docker/build-docker-image.shscript to build the docker image.- Release scripts for generating documentation, script for validating output data by @gmgunter .
- Use of a spatial correlation estimate for unwrapping purposes, rather than temporal coherence.
- This is much more useful when the stack size is small (high temporal coherence), and
snaphuis used for unwrapping. masking.pymodule for masking the interferogram/combined multiple external masks of varying 1/0 conventions.- Ability to use existing amplitude mean/dispersion files for the PS portion of the workflow, skipping the step where we compute it using the SLC stack. Useful for small stack sizes
- Added a
create_onlyoption towrite_arrto create an empty file without writing data (e.g. to check the boundary results of stitching)
Changed
- The YAML output/input functions are moved to a
YamlModelclass, which is a subclass ofpydantic.BaseModel. - This allows us to use it in both
config.pyand_pge_runconfig.py. - Refactoring of the
Workflowlayout to more easily extract the input/output files for the PGE run.
Fixed
- Compressed SLC outputs were getting corrupted upon writing when using strides > 1.
- Single-update interferograms where the first SLC input is a compressed SLC was broken (using the wrong size raster).
- Now the result will simply copy over the phase-linking result, which is already referenced to the first raster.
Dependencies
Added requirements:
- h5netcdf>=1.1
- Avoid HDF5 version 1.12.1 until NetCDF loading issue is fixed
0.0.4 - 2023-03-17
Added
- Created first version of the single-update workflow, usable with
dolphin config --single _background.pymodule as the abstract classes for background input/output withEagerLoaderandWriter.from_vrt_filefor theVRTInterferogramclass.- Arbitrary interferogram index selection in
Networkclass. - Parallel CPU eigenvector finding using
scipy.linalg.eigh. - PS selection for strided outputs using the average PS phase within a window (that contains multiple PS).
- Comments in the YAML file output by the
dolphin configcommand.
Changed
- The main workflow has been renamed to
s1_disp.pyto better reflect the workflow, since it can handle both single and stack workflows.- The
sequential.pyandsingle.pyare where these differences are handled.
- The
- More uniform naming in
io.get_raster_<X>functions. - The SLC compression is now done in
_compress.pyto declutter themle.pymodule. - Replace
tqdmwithrichfor progress bars. -
The
unwrap.pymodule now uses isce3 to unwrap the interferogram. -
Docs are now using the mkdocs
materialtheme.
Removed
utils.parse_slc_stringsin favor of always usingutils.get_dates.io.get_stack_nodata_mask. This will be done using the nodata polygon, or not at all.
Dependencies
Added requirements:
- rich>=12.0
- threadpoolctl>=3.0
- isce3>=0.8.0
- pyproj>=3.3
- Dropped support for Python 3.7
For docs: - mkdocs-material - pymdown-extensions
Removed requirements:
- tqdm
0.0.3 - 2023-01-26
Added
- Ability for
VRTStackto handle HDF5 files with subdatasets.- The OPERA specific HDF5 files are now supported without extra configuration.
- First stitching of interferograms in
stitching.py.- Users can pass multiple SLC burst (like COMPASS bursts) per date, and the workflow will process per stack then stitch per date.
- More features for
load_gdalto load in blocks.
Changed
- A small amount of regularization on the coherence matrix is done before inversion during phase linking to avoid singular matrices.
- Renamed module to
_log.py workflows/wrapped_phase.pyabsorbed much logic formerly ins1_disp_stack.py.
0.0.2 - 2023-01-24
Added
- Created first version of the
s1_disp_stack.pyworkflow. - Created the modules necessary for first version of the sequential workflow, including
ps.pysequential.pyio.pyinterferogram.pyutils.pyunwrap.pystitching.pyvrt.py
- Created the
phase_linksubpackage for wrapped phase estimation.
Added requirements:
- pyproj>=3.2
- tqdm>=4.60
[0.0.1] - 2022-12-09
Added
- Created the
configmodule to handle the configuration of the workflows - Command line interface for running the workflows
- Outline of project structure and utilities
Dependencies
Added requirements:
- gdal>=3.3
- h5py>=3.6
- numba>=0.54
- numpy>=1.20
- pydantic>=1.10
- pymp-pypi>=0.4.5
- ruamel_yaml>=0.15
- scipy>=1.5
Currently, Python 3.7 is supported, but 3.11 is not due numba not yet supporting Python 3.11.