Skip to content

Conversation

@KyleFromNVIDIA
Copy link
Member

@KyleFromNVIDIA KyleFromNVIDIA added the improvement Improves an existing functionality label Oct 24, 2025
@KyleFromNVIDIA KyleFromNVIDIA requested a review from a team as a code owner October 24, 2025 16:43
@KyleFromNVIDIA KyleFromNVIDIA added the non-breaking Introduces a non-breaking change label Oct 24, 2025
@KyleFromNVIDIA KyleFromNVIDIA requested review from a team as code owners October 24, 2025 16:43
Copy link
Contributor

@robertmaynard robertmaynard left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The following files didn't have the long copyright removed due to some typos:

python/pybind11/cache/cache_py.h
python/pybind11/profiler/profiler_py.h

Dual Licensed + Author:

python/cucim/src/cucim/core/operations/morphology/cuda/pba_kernels_2d.h  -> MIT, 2019 School of Computing, National University of Singapore

Copy link
Contributor

@grlee77 grlee77 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @KyleFromNVIDIA and @robertmaynard. I just have some question on invdividual licenses under specific folders where code was adapted from upstream projects (CuPy and scikit-image). Previously we just had top-level mention of these licenses here:
https://github.com/rapidsai/cucim/blob/main/LICENSE-3rdparty.md

but now do we need to reproduce that information on a per-file basis?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Files under this _vendored folders are slightly modified version of CuPy's cupyx.scipy.ndimage code under MIT license
https://github.com/cupy/cupy?tab=MIT-1-ov-file#readme

Do we need to include that in the header for the files in this folder?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With the exception of the _vendored folder which contains modified versions of CuPy code, most files under python/cucim/src/cucim/skimage are adapated from pre-existing scikit-image code under a few different permissive licenses (BSD 2-clause, BSD 3-clause and MIT). See details here:
https://github.com/scikit-image/scikit-image?tab=License-1-ov-file#readme

One exception to this are the files matching python/cucim/src/cucim/skimage/measure/_regionprops_gpu*.* which are original to cuCIM and have no counterpart upstream.

@KyleFromNVIDIA
Copy link
Member Author

KyleFromNVIDIA commented Oct 27, 2025

Every file that was taken from somewhere else should have per-file copyright and license notices. Please give me a list of files with their licenses here. I will extract the copyright holders from them. I don't see copyright holders in these files. Please include those as well.

@grlee77
Copy link
Contributor

grlee77 commented Oct 27, 2025

Please give me a list of files with their licenses here. I will extract the copyright holders from them. I don't see copyright holders in these files. Please include those as well.

Let me create some type of script and upload as a document with the result as there are > 100 files.

@grlee77
Copy link
Contributor

grlee77 commented Oct 27, 2025

The following files are adapted from CuPy and have license

Copyright (c) 2015 Preferred Infrastructure, Inc.
Copyright (c) 2015 Preferred Networks, Inc.
MIT License

python/cucim/src/cucim/skimage/_vendored/_internal.py
python/cucim/src/cucim/skimage/_vendored/_ndimage_filters_core.py
python/cucim/src/cucim/skimage/_vendored/_ndimage_filters.py
python/cucim/src/cucim/skimage/_vendored/_ndimage_interp_kernels.py
python/cucim/src/cucim/skimage/_vendored/_ndimage_interpolation.py
python/cucim/src/cucim/skimage/_vendored/_ndimage_measurements.py
python/cucim/src/cucim/skimage/_vendored/_ndimage_morphology.py
python/cucim/src/cucim/skimage/_vendored/_ndimage_spline_kernel_weights.py
python/cucim/src/cucim/skimage/_vendored/_ndimage_spline_prefilter_core.py
python/cucim/src/cucim/skimage/_vendored/_ndimage_util.py
python/cucim/src/cucim/skimage/_vendored/_pearsonr.py
python/cucim/src/cucim/skimage/_vendored/_signaltools_core.py
python/cucim/src/cucim/skimage/_vendored/_texture.py
python/cucim/src/cucim/skimage/_vendored/ndimage.py
python/cucim/src/cucim/skimage/_vendored/pad.py
python/cucim/src/cucim/skimage/_vendored/signaltools.py
python/cucim/src/cucim/skimage/_vendored/time.py

The following files are:

Copyright: 2003-2009 Massachusetts Institute of Technology
2009-2011 Broad Institute
2003 Lee Kamentsky
2003-2005 Peter J. Verveer
License: BSD-3-Clause

in addition to

Copyright: 2009-2022 the scikit-image team
License: BSD-3-Clause

python/cucim/src/cucim/skimage/feature/_canny.py
python/cucim/src/cucim/skimage/filters/_rank_order.py
python/cucim/src/cucim/skimage/filters/edges.py
python/cucim/src/cucim/skimage/morphology/_skeletonize.py

The following files is:

Copyright: 2009-2015 Board of Regents of the University of
Wisconsin-Madison, Broad Institute of MIT and Harvard,
and Max Planck Institute of Molecular Cell Biology and
Genetics
2009 Zachary Pincus
2009 Almar Klein
License: BSD-2-Clause

in addition to

Copyright: 2009-2022 the scikit-image team
License: BSD-3-Clause

python/cucim/src/cucim/skimage/filters/thresholding.py

The following files are:

Copyright: 2003-2009 Massachusetts Institute of Technology
2009-2011 Broad Institute
2003 Lee Kamentsky
License: BSD-3-Clause

in addition to

Copyright: 2009-2022 the scikit-image team
License: BSD-3-Clause

python/cucim/src/cucim/skimage/morphology/grayreconstruct.py
python/cucim/src/cucim/skimage/morphology/tests/test_reconstruction.py

The following file is:

Copyright: 2020 Broad Institute
2020 CellProfiler team
License: BSD-3-Clause

in addition to

Copyright: 2009-2022 the scikit-image team
License: BSD-3-Clause

python/cucim/src/cucim/skimage/segmentation/_expand_labels.py

The following file is:

Copyright: 1994 Karel Zuiderveld
License: BSD-3-Clause

in addition to

Copyright: 2009-2022 the scikit-image team
License: BSD-3-Clause

python/cucim/src/cucim/skimage/exposure/_adapthist.py

The following file is:

function _check_version:
Copyright: 2013 The IPython Development Team
License: BSD-3-Clause

function is_installed:
Copyright: 2009-2011 Pierre Raybaut
License: MIT

in addition to

Copyright: 2009-2022 the scikit-image team
License: BSD-3-Clause

python/cucim/src/cucim/skimage/_shared/version_requirements.py

And finally the following files are based on corresponding scikit-image files with license:

Copyright: 2009-2022 the scikit-image team
License: BSD-3-Clause

python/cucim/src/cucim/skimage/__init__.py
python/cucim/src/cucim/skimage/__init__.pyi
python/cucim/src/cucim/skimage/_shared/__init__.py
python/cucim/src/cucim/skimage/_shared/_dependency_checks.py
python/cucim/src/cucim/skimage/_shared/_gradient.py
python/cucim/src/cucim/skimage/_shared/_warnings.py
python/cucim/src/cucim/skimage/_shared/compat.py
python/cucim/src/cucim/skimage/_shared/coord.py
python/cucim/src/cucim/skimage/_shared/distance.py
python/cucim/src/cucim/skimage/_shared/fft.py
python/cucim/src/cucim/skimage/_shared/filters.py
python/cucim/src/cucim/skimage/_shared/testing.py
python/cucim/src/cucim/skimage/_shared/tests/test_coord.py
python/cucim/src/cucim/skimage/_shared/tests/test_utils.py
python/cucim/src/cucim/skimage/_shared/tests/test_warnings.py
python/cucim/src/cucim/skimage/_shared/utils.py
python/cucim/src/cucim/skimage/color/__init__.py
python/cucim/src/cucim/skimage/color/__init__.pyi
python/cucim/src/cucim/skimage/color/adapt_rgb.py
python/cucim/src/cucim/skimage/color/colorconv.py
python/cucim/src/cucim/skimage/color/colorlabel.py
python/cucim/src/cucim/skimage/color/delta_e.py
python/cucim/src/cucim/skimage/color/rgb_colors.py
python/cucim/src/cucim/skimage/color/tests/test_adapt_rgb.py
python/cucim/src/cucim/skimage/color/tests/test_colorconv.py
python/cucim/src/cucim/skimage/color/tests/test_colorlabel.py
python/cucim/src/cucim/skimage/color/tests/test_delta_e.py
python/cucim/src/cucim/skimage/data/__init__.py
python/cucim/src/cucim/skimage/data/__init__.pyi
python/cucim/src/cucim/skimage/data/_binary_blobs.py
python/cucim/src/cucim/skimage/data/tests/test_data.py
python/cucim/src/cucim/skimage/exposure/__init__.py
python/cucim/src/cucim/skimage/exposure/__init__.pyi
python/cucim/src/cucim/skimage/exposure/exposure.py
python/cucim/src/cucim/skimage/exposure/histogram_matching.py
python/cucim/src/cucim/skimage/exposure/tests/test_exposure.py
python/cucim/src/cucim/skimage/exposure/tests/test_histogram_matching.py
python/cucim/src/cucim/skimage/feature/__init__.py
python/cucim/src/cucim/skimage/feature/__init__.pyi
python/cucim/src/cucim/skimage/feature/_basic_features.py
python/cucim/src/cucim/skimage/feature/_daisy.py
python/cucim/src/cucim/skimage/feature/_hessian_det_appx.py
python/cucim/src/cucim/skimage/feature/blob.py
python/cucim/src/cucim/skimage/feature/corner.py
python/cucim/src/cucim/skimage/feature/cuda/_hessian_det_appx.cu
python/cucim/src/cucim/skimage/feature/cuda/blob.cu
python/cucim/src/cucim/skimage/feature/match.py
python/cucim/src/cucim/skimage/feature/peak.py
python/cucim/src/cucim/skimage/feature/template.py
python/cucim/src/cucim/skimage/feature/tests/test_basic_features.py
python/cucim/src/cucim/skimage/feature/tests/test_blob.py
python/cucim/src/cucim/skimage/feature/tests/test_canny.py
python/cucim/src/cucim/skimage/feature/tests/test_corner.py
python/cucim/src/cucim/skimage/feature/tests/test_daisy.py
python/cucim/src/cucim/skimage/feature/tests/test_match.py
python/cucim/src/cucim/skimage/feature/tests/test_peak.py
python/cucim/src/cucim/skimage/feature/tests/test_template.py
python/cucim/src/cucim/skimage/feature/util.py
python/cucim/src/cucim/skimage/filters/__init__.py
python/cucim/src/cucim/skimage/filters/__init__.pyi
python/cucim/src/cucim/skimage/filters/_fft_based.py
python/cucim/src/cucim/skimage/filters/_gabor.py
python/cucim/src/cucim/skimage/filters/_gaussian.py
python/cucim/src/cucim/skimage/filters/_median_hist.py
python/cucim/src/cucim/skimage/filters/_median.py
python/cucim/src/cucim/skimage/filters/_separable_filtering.py
python/cucim/src/cucim/skimage/filters/_sparse.py
python/cucim/src/cucim/skimage/filters/_unsharp_mask.py
python/cucim/src/cucim/skimage/filters/_window.py
python/cucim/src/cucim/skimage/filters/cuda/histogram_median.cu
python/cucim/src/cucim/skimage/filters/lpi_filter.py
python/cucim/src/cucim/skimage/filters/ridges.py
python/cucim/src/cucim/skimage/filters/tests/test_correlate.py
python/cucim/src/cucim/skimage/filters/tests/test_edges.py
python/cucim/src/cucim/skimage/filters/tests/test_fft_based.py
python/cucim/src/cucim/skimage/filters/tests/test_gabor.py
python/cucim/src/cucim/skimage/filters/tests/test_gaussian.py
python/cucim/src/cucim/skimage/filters/tests/test_lpi_filter.py
python/cucim/src/cucim/skimage/filters/tests/test_median.py
python/cucim/src/cucim/skimage/filters/tests/test_rank_order.py
python/cucim/src/cucim/skimage/filters/tests/test_ridges.py
python/cucim/src/cucim/skimage/filters/tests/test_separable_filtering.py
python/cucim/src/cucim/skimage/filters/tests/test_thresholding.py
python/cucim/src/cucim/skimage/filters/tests/test_unsharp_mask.py
python/cucim/src/cucim/skimage/filters/tests/test_window.py
python/cucim/src/cucim/skimage/measure/__init__.py
python/cucim/src/cucim/skimage/measure/__init__.pyi
python/cucim/src/cucim/skimage/measure/_blur_effect.py
python/cucim/src/cucim/skimage/measure/_colocalization.py
python/cucim/src/cucim/skimage/measure/_label_kernels.py
python/cucim/src/cucim/skimage/measure/_label.py
python/cucim/src/cucim/skimage/measure/_moments_analytical.py
python/cucim/src/cucim/skimage/measure/_moments.py
python/cucim/src/cucim/skimage/measure/_polygon.py
python/cucim/src/cucim/skimage/measure/_regionprops_utils.py
python/cucim/src/cucim/skimage/measure/_regionprops.py
python/cucim/src/cucim/skimage/measure/block.py
python/cucim/src/cucim/skimage/measure/entropy.py
python/cucim/src/cucim/skimage/measure/profile.py
python/cucim/src/cucim/skimage/measure/tests/test_block.py
python/cucim/src/cucim/skimage/measure/tests/test_blur_effect.py
python/cucim/src/cucim/skimage/measure/tests/test_ccomp.py
python/cucim/src/cucim/skimage/measure/tests/test_colocalization.py
python/cucim/src/cucim/skimage/measure/tests/test_entropy.py
python/cucim/src/cucim/skimage/measure/tests/test_moments.py
python/cucim/src/cucim/skimage/measure/tests/test_polygon.py
python/cucim/src/cucim/skimage/measure/tests/test_profile.py
python/cucim/src/cucim/skimage/measure/tests/test_regionprops_gpu_kernels.py
python/cucim/src/cucim/skimage/measure/tests/test_regionprops.py
python/cucim/src/cucim/skimage/metrics/__init__.py
python/cucim/src/cucim/skimage/metrics/__init__.pyi
python/cucim/src/cucim/skimage/metrics/_adapted_rand_error.py
python/cucim/src/cucim/skimage/metrics/_contingency_table.py
python/cucim/src/cucim/skimage/metrics/_structural_similarity.py
python/cucim/src/cucim/skimage/metrics/_variation_of_information.py
python/cucim/src/cucim/skimage/metrics/simple_metrics.py
python/cucim/src/cucim/skimage/metrics/tests/test_segmentation_metrics.py
python/cucim/src/cucim/skimage/metrics/tests/test_simple_metrics.py
python/cucim/src/cucim/skimage/metrics/tests/test_structural_similarity.py
python/cucim/src/cucim/skimage/morphology/__init__.py
python/cucim/src/cucim/skimage/morphology/_medial_axis_lookup.py
python/cucim/src/cucim/skimage/morphology/binary.py
python/cucim/src/cucim/skimage/morphology/convex_hull.py
python/cucim/src/cucim/skimage/morphology/footprints.py
python/cucim/src/cucim/skimage/morphology/gray.py
python/cucim/src/cucim/skimage/morphology/isotropic.py
python/cucim/src/cucim/skimage/morphology/misc.py
python/cucim/src/cucim/skimage/morphology/tests/test_binary.py
python/cucim/src/cucim/skimage/morphology/tests/test_convex_hull.py
python/cucim/src/cucim/skimage/morphology/tests/test_footprints.py
python/cucim/src/cucim/skimage/morphology/tests/test_gray.py
python/cucim/src/cucim/skimage/morphology/tests/test_isotropic.py
python/cucim/src/cucim/skimage/morphology/tests/test_misc.py
python/cucim/src/cucim/skimage/morphology/tests/test_skeletonize.py
python/cucim/src/cucim/skimage/registration/__init__.py
python/cucim/src/cucim/skimage/registration/__init__.pyi
python/cucim/src/cucim/skimage/registration/_masked_phase_cross_correlation.py
python/cucim/src/cucim/skimage/registration/_optical_flow_utils.py
python/cucim/src/cucim/skimage/registration/_optical_flow.py
python/cucim/src/cucim/skimage/registration/_phase_cross_correlation.py
python/cucim/src/cucim/skimage/registration/tests/test_ilk.py
python/cucim/src/cucim/skimage/registration/tests/test_masked_phase_cross_correlation.py
python/cucim/src/cucim/skimage/registration/tests/test_phase_cross_correlation.py
python/cucim/src/cucim/skimage/registration/tests/test_tvl1.py
python/cucim/src/cucim/skimage/restoration/__init__.py
python/cucim/src/cucim/skimage/restoration/__init__.pyi
python/cucim/src/cucim/skimage/restoration/_denoise.py
python/cucim/src/cucim/skimage/restoration/deconvolution.py
python/cucim/src/cucim/skimage/restoration/j_invariant.py
python/cucim/src/cucim/skimage/restoration/tests/test_denoise.py
python/cucim/src/cucim/skimage/restoration/tests/test_j_invariant.py
python/cucim/src/cucim/skimage/restoration/tests/test_restoration.py
python/cucim/src/cucim/skimage/restoration/uft.py
python/cucim/src/cucim/skimage/segmentation/__init__.py
python/cucim/src/cucim/skimage/segmentation/_chan_vese.py
python/cucim/src/cucim/skimage/segmentation/_clear_border.py
python/cucim/src/cucim/skimage/segmentation/_join.py
python/cucim/src/cucim/skimage/segmentation/_watershed.py
python/cucim/src/cucim/skimage/segmentation/boundaries.py
python/cucim/src/cucim/skimage/segmentation/morphsnakes.py
python/cucim/src/cucim/skimage/segmentation/random_walker_segmentation.py
python/cucim/src/cucim/skimage/segmentation/tests/test_boundaries.py
python/cucim/src/cucim/skimage/segmentation/tests/test_chan_vese.py
python/cucim/src/cucim/skimage/segmentation/tests/test_clear_border.py
python/cucim/src/cucim/skimage/segmentation/tests/test_expand_labels.py
python/cucim/src/cucim/skimage/segmentation/tests/test_join.py
python/cucim/src/cucim/skimage/segmentation/tests/test_morphsnakes.py
python/cucim/src/cucim/skimage/segmentation/tests/test_random_walker.py
python/cucim/src/cucim/skimage/segmentation/tests/test_watershed_skimage.py
python/cucim/src/cucim/skimage/segmentation/tests/test_watershed.py
python/cucim/src/cucim/skimage/transform/__init__.py
python/cucim/src/cucim/skimage/transform/__init__.pyi
python/cucim/src/cucim/skimage/transform/_geometric.py
python/cucim/src/cucim/skimage/transform/_warps.py
python/cucim/src/cucim/skimage/transform/integral.py
python/cucim/src/cucim/skimage/transform/pyramids.py
python/cucim/src/cucim/skimage/transform/tests/test_geometric.py
python/cucim/src/cucim/skimage/transform/tests/test_integral.py
python/cucim/src/cucim/skimage/transform/tests/test_pyramids.py
python/cucim/src/cucim/skimage/transform/tests/test_warps.py
python/cucim/src/cucim/skimage/util/__init__.py
python/cucim/src/cucim/skimage/util/_invert.py
python/cucim/src/cucim/skimage/util/_map_array.py
python/cucim/src/cucim/skimage/util/_montage.py
python/cucim/src/cucim/skimage/util/arraycrop.py
python/cucim/src/cucim/skimage/util/compare.py
python/cucim/src/cucim/skimage/util/dtype.py
python/cucim/src/cucim/skimage/util/noise.py
python/cucim/src/cucim/skimage/util/shape.py
python/cucim/src/cucim/skimage/util/tests/test_arraycrop.py
python/cucim/src/cucim/skimage/util/tests/test_compare.py
python/cucim/src/cucim/skimage/util/tests/test_dtype.py
python/cucim/src/cucim/skimage/util/tests/test_invert.py
python/cucim/src/cucim/skimage/util/tests/test_map_array.py
python/cucim/src/cucim/skimage/util/tests/test_montage.py
python/cucim/src/cucim/skimage/util/tests/test_random_noise.py
python/cucim/src/cucim/skimage/util/tests/test_shape.py

@grlee77
Copy link
Contributor

grlee77 commented Oct 30, 2025

Thanks for making all those updates @KyleFromNVIDIA! I left comments on two individual files where there was an oversight in my prior list.

Copy link
Contributor

@grlee77 grlee77 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Everything looks good to me under the skimage folder now. I think most or all code under the cpp folder is original to NVIDIA, but @gigony could confirm if there is anything that should be dual licensed there.

@KyleFromNVIDIA KyleFromNVIDIA requested a review from gigony October 30, 2025 20:34
Copy link
Contributor

@gigony gigony left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you so much @KyleFromNVIDIA for updating these!
I have a few suggestions that might have been missed.

Otherwise, everything looks good to me!

@KyleFromNVIDIA
Copy link
Member Author

@gigony Please see my updates. I added the copyright notices and modified the SPDX-License-Identifier headers to be compound license expressions rather than adding separate headers as you suggested.

@KyleFromNVIDIA KyleFromNVIDIA requested a review from gigony November 3, 2025 14:20
@gigony
Copy link
Contributor

gigony commented Nov 3, 2025

@gigony Please see my updates. I added the copyright notices and modified the SPDX-License-Identifier headers to be compound license expressions rather than adding separate headers as you suggested.

Thanks @KyleFromNVIDIA ! The change looks great!

@KyleFromNVIDIA
Copy link
Member Author

/merge

@rapids-bot rapids-bot bot merged commit 41a40d3 into rapidsai:main Nov 4, 2025
59 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

improvement Improves an existing functionality non-breaking Introduces a non-breaking change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants