Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

constrain all numpy-dependent packages to numpy <2 #712

Closed
wants to merge 3 commits into from

Conversation

h-vetinari
Copy link
Member

@h-vetinari h-vetinari commented Apr 20, 2024

This addresses #516. It creates a huge diff (~200k ~100k1 artefacts affected 😱), which can be viewed in this gist.

AFAICT, this is mainly due to various feedstocks open-coding a pure run-dependency like - numpy >=1.16, which unsurprisingly doesn't get affected by the run-export we've had for 2 years (conda-forge/numpy-feedstock@bca0916) when building against numpy.

Footnotes

  1. after restricting to py>39 & noarch

@h-vetinari h-vetinari requested a review from a team as a code owner April 20, 2024 00:57
@conda-forge-webservices
Copy link
Contributor

Hi! This is the friendly automated conda-forge-linting service.

I just wanted to let you know that I linted all conda-recipes in your PR (recipe) and found it was in an excellent condition.

@h-vetinari
Copy link
Member Author

Not sure how well we can express that in the new yaml format, but we could restrict the patching to python >=3.9 builds, because anything below will never get a numpy 2.0 release.

@h-vetinari
Copy link
Member Author

we could restrict the patching to python >=3.9 builds, because anything below will never get a numpy 2.0 release.

OK, I did that now, gist is updated; now "only" 100k artefacts are affected, rather than 200k.

@jakirkham
Copy link
Member

Thanks Axel! 🙏

Interesting observation. Yeah we could limit to Python 3.9+. Timestamp might be a good proxy as we can look at when Python 3.9.0 was packaged. How many would that affect?

If we limit to Python 3.9 or newer, we might want to handle noarch: python as well

Am guessing most of these are packages that simply depend on NumPy at runtime. Is that true?

Would think the ones with NumPy as a build dependency are already constrained, but it would be interesting to know if there are any exceptions

@h-vetinari
Copy link
Member Author

I've sorted the various sections in the output of show_diff.py; should be a bit easier to read now. Link to the gist in OP.

@h-vetinari
Copy link
Member Author

Interesting observation. Yeah we could limit to Python 3.9+. Timestamp might be a good proxy as we can look at when Python 3.9.0 was packaged. How many would that affect?

If we limit to Python 3.9 or newer, we might want to handle noarch: python as well

This is all already solved in 9305679

Am guessing most of these are packages that simply depend on NumPy at runtime. Is that true?

Would think the ones with NumPy as a build dependency are already constrained, but it would be interesting to know if there are any exceptions

Anything built before the numpy builds using the run-export (which was actually backported until 1.19; conda-forge/numpy-feedstock@b84c9f4) would just be relying on pin_compatible, or whatever the recipe at the time specified. So realistically, every package compiled against numpy in the last 2 years has correct run exports. Anything older than that might be affected. The rest is from run-requirements.

Comment on lines +42 to +49
if:
has_depends: numpy?( *)
subdir_in: noarch
timestamp_lt: 1713569710960
then:
- tighten_depends:
name: numpy
upper_bound: "2.0"
Copy link
Member

Choose a reason for hiding this comment

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

This patch doesn't make any sense to me. A noarch python package that just calls np.sum on some arrays doesn't need this constraint.

Copy link
Member Author

Choose a reason for hiding this comment

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

That's fair, though I intentionally included noarch packages here, because it's easier IMO to draw a clear boundary between 1.x & 2.x, rather than hope that these packages are not affected in any way, shape or form by the many changes in 2.0 (which aren't just restricted to ABI-changes).

Copy link
Member

Choose a reason for hiding this comment

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

The same comment applies to any non-noarch package too.

Copy link
Member

Choose a reason for hiding this comment

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

We cannot make the 1.x vs 2.x decision for maintainers. This is too intrusive. They can add their own patches later if they feel they need it.

Copy link
Member Author

Choose a reason for hiding this comment

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

We cannot make the 1.x vs 2.x decision for maintainers.

I disagree. Perhaps @rgommers can weigh in here.

@h-vetinari
Copy link
Member Author

FWIW, here are all the 43571 packages where at least one artefact gets patched:

21cmfast
aalto-boss
abacusutils
abipy
ablang
abtem
abydos
accelerate
access
acgc
acorns
acpype
acquifer
acsconv
acstools
act-atmos
activity-browser
activitysim
acwater
ada-py
adam-robotics
adaptive-scheduler
adcc
adios2
adios_db
adjusttext
adtk
adversarial-robustness-toolbox
aedat
aehmc
aemcmc
aeolus
aeppl
aeppl-base
aestream
affinder
aflow
afwizard
agemo
aggregate
aghast
agilent-format
agnpy
agriculture-vlab
ahlive
ai2-olmo
ai2thor
aicsimageio
aicssegmentation
aif360
aiida-nwchem
aiida-optimize
aiida-quantumespresso
aim
aimsgb
aimsim
airflow
airtrafficsim
aisim
aixd
albumentations
alchemical-analysis
alchemlyb
ale
ale-py
algopy
algotom
allantools
allennlp
alpenglow
alpha-shapes
alphalens
alphalens-reloaded
alphashape
alphatwirl
altair
altair-transform
altdphi
amazon-braket-default-simulator
amazon-braket-sdk
ambertools
ambiance
amep
amptools
anaflow
analisi
analphipy
anchor-annotator
anchor-droplet-chip
anchor-exp
andes
angelcommunity
anndata
ansitable
antarctic-plots
antmocdata
antropy
aospy
ap_features
apache-flink
apav
api-inference-community
aplpy
apoc-backend
apollinaire
appmar
approxposterior
apricot-select
apsg
apstools
aptools
aqme
arby
arc3o
arch-py
archapp
architector
arcos-gui
arcos4py
arcticdb
argopandas
argos
arize-phoenix
arlpy
arm-mango
arm_pyart
arosics
array-api-strict
array-to-latex
array2gif
arraykit
arsenic
arviz
arvpyf
arxiv-miner
asammdf
asapdiscovery
asaplib
asdf
asdf-astropy
ase
ase-notebook
asf_search
asf_search-base
asf_tools
asimov
assembly_stats
assist
astartes
asteval
astroalign
astroedu
astroml
astromodels
astronomia
astroplan
astropy
astroquery
astrowidgets
atari_py
atef
atlite
atmosphere-virtual-lab
atom-ml
atomap
atomate
atomate2
atomistics
atomium
atomman
atomneb
atomrdf
atsas-pipelines
attune
audio-separator
augment-nd
augmentor
aurora
auto-sklearn
auto3d
autoboost
autode
autoeft
autograd
autoray
autoreject
autots
autoviz
av
av2
avalanche-lib
avidaq
awherepy
awkward
awkward-cpp
awkward0
awkward1
awswrangler
axelrod
axiprop
axopy
azure-quantum
baal
badapted
badger-opt
baikal
baked-brie
balance
bambi
bar_chart_race
barnaba
barrier3d
barril
basictools-devenv
batanalysis
batman
batoid-rubin
batoms
baycomp
bayesian-optimization
bayespy
bayeswaveutils
bbii-decon
bctpy
bdsim
beakerx
beamf
beamngpy
bed-reader
beetlesafari
bempp-cl
bentoml
bert_score
bertopic
betse
bewegung
bfee2
bfio
bg-atlasapi
bg-space
bgcargo
bgcargodmqc
bgen-reader
bias_correction
bibmanager
bicycleparameters
big-fish
bigdft-suite
biggus
bilby
bilby_pipe
bilby_tgr
billingegroup
bindsnet
binlets
binpacking
bio-embeddings
bio-embeddings-cpcprot
bio-embeddings-deepblast
bio-pyvol
biofilm
bioimageio.core
bioimageio.spec
bionc
biopandas
bioptim
biopython
biosiglive
biosphere
bipedal-locomotion-framework-python
birdsong-recognition-dataset
bitshuffle
blackboxauditing
blake3
blend_modes
bletchley
blik
blimpy
blitz-bayesian-pytorch
blocked-matrix-utils
bloptools
bloscpack
blueqat
bluesky
bluesky-adaptive
bluesky-base
bluesky-darkframes
bluesky-live
bluesky-widgets
bmi-geotiff
bmi-tester
bmi-topography
bmi_dbseabed
bmi_era5
bmi_nwis
bmi_roms
bmipy
bmorph
boa-framework
bokeh
bolt-python
boltzmannclean
bonsu
boost-histogram
bootstrap_contrast
boruta_py
boule
boutdata
boututils
bpack
bpemb
bqplot
bqscales
braggedgemodeling
brainglobe-atlasapi
brainglobe-napari-io
brainglobe-segmentation
brainglobe-space
brainglobe-utils
brainreg
brainreg-segment
brainrender-napari
brax
brent-search
brighteyes-ism
brightway2
broadbean
bruco
brukerapi
bsplines2d
bth5
btrack
bubbledet
bulwark
bumps
burau
burst2safe
bw2analyzer
bw2calc
bw2data
bw2io
bw2parameters
bw_processing
bxa
bycycle
cadcad
caelus
caerus
caf.space
caf.toolkit
caiman
calamari_ocr
calibrated-explanations
calkulate
calliope
calphy
camb
camelot-py
campo
caped-ai-augmentations
caper
caproto
captum
cardiac-mps
carterbox-torch-radon
cartes
cartotools
cartwright
cascade
cashocs
cassandra
cassandra-driver
castepinput
castoredc_api
catalystcoop.pudl
catboost
categorical-distance
category_encoders
catlearn
causal-learn
causalimpact
causalml
causalpy
caustics
cbgen
cbsyst
ccdproc
cclib
cctk
cdcs
cdflib
cdlib
cdsodatacli
cdsutils
cdt
cell_tree2d
cellfinder-core
cellfinder-napari
cellhint
cellpose
cellpy
cellrank
cenpy
centerline
cf-python
cf_xarray
cfchecker
cfdm
cfflib
cfgrib
cfunits
cgen
cgsn_parsers
cgsn_processing
chafer
chainer
chainladder
champ
changeforest
chaospy
chebfun
checklist
chemcat
chemcoord
chemdyg
chemex
chemfiles-python
chemics
chemiscope
chemml
chemnlp
chemper
chemplot
chemprop
chempy
chemsolve
chex
chgnet
chiantipy
chiscore
choclo
choicemodels
choix
chopin2
chromadb
chxtools
ci-sdr
cifti
cinnabar
circle-fit
circuitq
cirq-core
citrination-client
ckmeans
classixclustering
clawpack
cleanlab
clearml
clease-gui
cleopatra
cleverhans
clifford
climix
climlab
climpred
clisops
closely
clouddrift
cluster-lensing
clustergram
clusterx
cma
cmaes
cmap
cmaps
cmapy
cmasher
cmcrameri
cmdstanpy
cmeutils
cmip6_preprocessing
cmlgenerator
cmlib
cmocean
cmomy
cmpitool
cmweather
cmyt
cnmaps
cnmfsns
coastal-cascade
coastsat-package
cobra
cobyqa
cocopye
coda
codecarbon-test
codem
codepy
coexist
coffea
cofi
cogdl
colicoords
colmena
coloc_sat
colormaps
colormath
colorspacious
colourmap
combo
compaction
compas
compas_libigl
compas_slicer
compass
composeml
compositionspace
conbench
concurrentbuffer
condastats
conflowgen
connectorx
conservedwatersearch
constrainmol
contact_map
contourpy
control
cool_maps
coolprop
coordinatesconverter
copc-lib
copulae
coreforecast
corner
correctionlib
corsikaio
cortecs
cosapp
cosmix
cosmopharm
cosmopy
cosmosis
cosmosis-standalone
cosmotransitions
cotede
countest
courtana
covdrugsim
covseisnet
coxeter
cp2kdata
cplot
cptec-model
cptec-subsaz
credible
creme
crepe
crepes
crispy
cross_cal_resourcesat
crowdsourcephoto
crowsetta
cryohub
cryotypes
crystalmapping
crystals
csbdeep
cset
csr
ctapipe
ctapipe-io-magic
ctapipe_io_lst
ctd
cubed
cubedsphere
cubo
cupy
cuquantum-python
curifactory
curviriver
cvxportfolio
cvxpygen
cw2
cweqgen
cwinpy
cxroots
cyavro
cyeva
cyfi
cymetric
czifile
czmodel
d3rlpy
dabl
dace
daetools
daft
dalex
daltools
daml
danish
dantro
daops
dapclient
daqp
darr
darth-d
darts
darwin-py
dascore
dash-bootstrap-templates
dask
dask-cuda
dask-distance
dask-geomodeling
dask-glm
dask-image
dask-imread
dask-ml
dask-ms
dask-ndfilters
dask-ndmorph
dask-searchcv
dask_traj
data-morph-ai
databricks-sql-connector
databroker
datacompy
datacube
datafusion
datajoint
datamapplot
datamol
dataprofiler
datarobot
datascience
datasets
datashader
datashape
datasketch
datasketches
dataspyre
datastock
dave
db-dtypes
dbsp_drp
dbstep
dcor
dctmd
ddd_subplots
ddeint
deap
decasu
decaylanguage
declarative
decorrelation
decoupler-py
dedupe
deduplipy
deep-labelprop
deepchecks
deepchem
deepdish
deepface
deepinv
deeplabcut
deepmd-kit
deeppurpose
deeprobust
deepspeech
deepspeed
deepxde
deicode
delta-sharing-python
delta2
dem_stitcher
demcmc
demesdraw
demquery
densmap-learn
derivative
des-desimage
des-desmeds
des-despyfits
des-eastlake
des-easyaccess
des-fitvd
des-montara
des-pixcorrect
des-pizza-cutter
des-pizza-cutter-metadetect
des-sxdes
des-y6utils
descarteslabs
desdeo
detectree
devbio-napari
dewret
dexp
dexplot
dexpy
dfo-ls
dftbplus-python
dftbplus-tools
dftd3-python
dftd4-python
dfvue
dgl
dgllife
dgpsi
dials
dice-ml
dicom2nifti
dicomifier
dicomweb-client
diffmah
diffpriv
diffprivlib
diffpy.pdfmorph
diffpy.structure
diffpy.utils
diffsims
diffsky
diffstar
diffusers
digdem
digen
digitalearth
dingo-gw
dioptas
dirac-grid
dirty_cat
discorpy
discretisedfield
distfit
distgen
distinctipy
distrax
distromax
dit
divebomb
dkist
dlatk
dlhub-sdk
dlpoly-py
dm-acme
dm-control
dm-env
dm-haiku
dm-sonnet
dm_control
dmff
dmri-amico
dnabot
dnest4
do-mpc
docarray
dolang
dolfinx_mpc
dolfyn
dolo
dolphin
domb
doped
doppyo
doubleml
dowhy
dpcmaps
dpdata
dpgen
dphtools
dpu-utils
drawsvg
drfp
drms
ds-lime
dsc
dscribe
dsm2dtm
dsps
dtaidistance
dtool_ibeis
dtreeviz
dttxml
dtumathtools
dtw
ducc0
dufte
dupin
dust_extinction
dustmaps
dwave-hybrid
dwave-inspector
dwave-networkx
dwave-system
dxchange
dye-score
dymos
dymoval
dynamicisttoolkit
dynasor
dynesty
dynetx
dynophores
dyntapy
dython
e13tools
e3fp
e3nn-jax
e3sm_diags
e3sm_to_cmip
e3x
eagerpy
earth2observe
earthnet
earthpy
easygdf
easyocr
easyquery
eatpy
ebg
ecape
ecape-parcel
ecco_v4_py
echo
echopy
echopype
echoregions
ecole
econ-ark
econci
econml
econtools
eden-kernel
edffile
edfio
edflib-python
ee_extra
eeglabio
eeharvest
eemont
eeyore
effectsize
eiger-io
eikon
einops
einsteinpy
ejplugins
elapid
elastic
elektronn2
element-recognition
elfi
eli5
ellc
elphmod
elpigraph-python
embiggen
emcee
emd
emdfile
emfile
emg3d
emmental
emmet-core
empanada-dl
emperor
empiricaldist
empymod
empyre
empyrical
empyrical-dist
empyrical-reloaded
emsarray-core
enaml-extensions
engarde
enlopy
ennemi
enpt
enso_metrics
enstat
enterprise-pulsar
enterprise_extensions
enterprise_outliers
entropy
eo-harvest
eo-learn
eo-learn-core
eo-learn-features
eodatasets3
eodie
eofs
eomaps
ephyviewer
epic2cf
epicscorelibs
epispot
epitools
eppy-core
epsie
epysurv
equilibrator-cache
erlab
erroranalysis
esbmtk
esda
esi-extern-openquake
esi-utils-cartopy
esi-utils-colors
esi-utils-geo
esi-utils-io
esi-utils-rupture
esi-utils-time
esi-utils-vectors
esmpy
esmtools
esmvalcore
esmvaltool-python
espaloma
espei
espnet_model_zoo
espsim
estimagic
esys-escript
ete3
eulerangles
eva-lcd
evalml-core
evals
evaluate
evaml-core
event-model
eventio
eventkit
evfuncs
evidently
evolutionary_keras
evotorch
evv4esm
exchange-calendars
excitingtools
exmol
exoplanet
expelliarmus
explainerdashboard
exspy
extensisq
extract_model
ezgooey
ezyrb
f90wrap
fa2
face-recognition
face_recognition
facetorch
facexlib
facilyst-core
facit
factor-analyzer
faerun
fair
fair-esm
fancy-collections
fars_cleaner
fast-bss-eval
fast-pt
fast_hdbscan
fastf1
fastfilters2
fastjet
fastparquet
fastreg
fastsrm
fasttext
fatpack
fbpca
fbpic
fcd
fcd_torch
fcmaes
fcswrite
fdtd
featherhelper
feature_engine
featuretools
featuretools_sql
feets
femto
fenics-basix
fenics-dijitso
fenics-dolfin
fenics-dolfinx
fenics-ffc
fenics-ffcx
fenics-fiat
fenics-ufl
fenics-ufl-legacy
fenicsprecice
fermipy
ffn
fft-conv-pytorch
fgivenx
fides
figuregenerator
file-tree
filequery
filterpy
finam
findiff
fine
finlogic
finta
fipy
firecrown
fish2eod
fishersapi
fisspy
fisx
fitsnap3
flaml
flammkuchen
flatstar
flax
floatcsep
flopy
floris
floweaver
flowermd
flox
fluiddyn
fluidfoam
fluids
fluidsim
flwr
flytekit
fmpy
fmpy-base
fmrib-unpack
foam_ct_phantom
fofx
folium
fonduer
foolbox
fooof
forest_lite
forestci
forestplot
formulae
formulaic
formulas
fortecubeview
fortio
fortran-binary
fortran-magic
foundry_ml
foxes
foxplainer
foyer
fractopo
fragmenstein
freecad
freediscovery
freeqdsk
fretraj
freva
fsl-pyfeeds
fsleyes
fsleyes-props
fsleyes-widgets
fslpy
fsspec-reference-maker
fst-pso
functime
funsor
fury
fuzzy-rough-learn
fuzzytm
fvcore
fvgp
g2aero
g2p-en
galpy
galsim_extra
gandlf
garnett
gatspy
gauche
gb-code
gbquality
gcr
gdptools
gdsfactory
gdspy
gecos
geedim
geeet
geemap
gekko
gempy
gemspa-spt
general_robotics_toolbox
genpy
geo-parameters
geo-skeletons
geoana
geoarray
geocat-comp
geocat-f2py
geocat-viz
geocube
geodata-harvester
geodemora
geofileops
geoglows
geograph
geograpy3
geohexviz
geokit
geomalgo
geomatics
geomcompare
geomesher
geometric_features
geomstats
geonum
geoparse
geoplotlib
georaster
georasters
geostatista
geotile
geoutils
geoviews
geoviews-core
geovista
geowombat
gepetto-viewer-corba
getdist
gettsim
gftool
gglasso
ggplot
gguf
ghetool
ghostpii
gimble
gimli.units
ginga
girder
gis-utils
gistim
github-activity
gj2ascii
glacier_lengths
glaes
glasbey
glasflow
glimix-core
glmnet_py
glow
glue-core
glue-geospatial
glue-medical
glue-qt
glue-samp
glue-vispy-viewers
glue-wwt
gluoncv
glymur
gmailsorter
gmprocess
gms_preprocessing
gmshmodel
gmso
gnumpy
gnuradio-core
gnuradio-iridium
gnuradio-satellites
goatools
gocart
goes2go
goftests
goodvibes
goofit
goosebib
goosehdf5
goosempl
gooseslurm
gordias
gotran
gpcam
gpflow
gplately
gptcache
gputools
gpyopt
gpyreg
gpytorch
grad-cam
gradio
grakel
grand
grapharray
graphframes
graphistry
graphium
graphtools
graspologic
graspy
grave
gravelamps
grblogtools
great-expectations
great_tables
greenlearning
grheat
grid-strategy
griddataformats
gridded
gridmet_bmi
gridspec
griottes
grits
groclient
gromacswrapper
groundingdino-py
grove
grplot
grunnur
gruut
gruut-ipa
gryds
gslides
gsshapyorm
gstlal-calibration
gstlal-ugly
gtsam
guacamol
guanine-crystal-analysis
guardian
gudhi
gufe
guidance
guidata
gulpio
gunpowder
gurobi-logtools
gw-sklearn-xarray
gw_eccentricity
gwcelery
gwcs
gwdetchar
gwemopt
gwinc
gwmemory
gwpopulation
gwpopulation-pipe
gwpy
gwsumm
gwtools
gwvet
gwyfile
gym
gymnasium
gyptis
h2o-py
h3-py
h3pandas
h5coro
h5grove
h5io
h5pulsar
h5pyd
hagerstrand
halide-python
hangar
hankel
hapi
hapiclient
hapsira
harissa
harmonica
harp
hasasia
haystack-bm25
hcipy
hcrystalball
hdf5storage
hdijupyterutils
hdlib
hdmf
hdmf_zarr
hdxrate
healsparse
heat
heavyai
hecss
heligeo
heliopy
hendrics
hep_ml
hepstats
herbie-data
hesperos
hexalattice
hextools
hexwatershed
hgdl
hickle
hiclass
hicsv-python
hidefix
hierarchicalforecast
highered
highlight_text
hillmaker
hiphive
hippynn
hiproc
hips
hist
hist-base
histogrammar
histoprint
hiveplot
hkl
hklpy
hloc
hls4ml
hmmlearn
hnswlib
hockey_rink
hofstadtertools
hoggorm
hoggormplot
hole-filling-liepa
holidays-ext
holospy
holoviews
homonim
hoomd
horton
hover
hpbandster
hpc
hpp-corbaserver
hpp-gepetto-viewer
hpp-manipulation-corba
hrds
hspf_reader
hspf_utils
ht
htpolynet
httpstan
humanleague
hummingbird-ml
hveto
hvplot
hws
hxntools
hydroerr
hydrofunctions
hydromt
hydromt_delwaq
hydromt_sfincs
hydromt_wflow
hydrosar
hydrosignatures
hydrostats
hydrotoolbox
hyp3lib
hyperbox-brain
hypercoast
hypergbm
hyperlib
hypernets
hyperopt
hypersolver
hyperspy-base
hypertab
hyperts
hypnotoad
hypothesis-rdkit
hyppo
hypso
hypsoreader
hyram
i-pi
iacs-ipac-reader
iadpython
ibex
ibis-framework
ibis-framework-core
ibmpairs
icartt
icclim
icepap
icepaposc
icepyx
icet
icfree
idq
ifermi
ifes-apt-tc-data-modeling
ifitpy
igor
igor2
ijroi
ilamb
ilastik-napari
image-composer
image-meta-tag
image-part-selecter
image-quality
imageai
imagedataextractor
imagehash
imageio
imaginairy
imagingreso
imantics
imaris-ims-file-reader
imaxt-image
imaxt-multiscale-plugin
imbalanced-learn
imexam
imgaug
imglyb
imgroi
imgviz
iminuit
imio
imod
imodels
impactutils
impactx
implicit
importrosbag
improver
imreg_dft
imutils
in-silico-fate-mapping
incognita
indexedconv
inequality
inference-tools
inline-model-metrics
inn-interface
inspiral-range
instructorembedding
intake
intake-erddap
intensity-normalization
interactivefitting
intermat
intermol
intern
interpolation
interpret
interpret-community
interpret-core
invert4geom
iohexperimenter
ioos-tools
ioos_qartod
ioos_qc
ioos_tools
iosacal
iota
ipart
ipcoal
ipfn
iprpy
ipycanvas
ipydatawidgets
ipygany
ipyleaflet-gl-vector-layer-plugin
ipympl
ipypivot
ipyregulartable
ipyslides
ipytone
ipyvolume
ipywe
ipywebrtc
iris
iris-esmf-regrid
ironflow
irrep
irreptables
is2view
isicarchive
isitgr
ismip6-antarctic-ocean-forcing
ismrmrd-python
isofit
isosurfaces
isstools
itables
itermplot
itk
itkwidgets
iwopy
ixmp
jacobi
jacqq
jamotools
jarvis-leaderboard
jarvis-tools
javabridge
jaws
jax
jax-cfd
jax-jumpy
jax-md
jax-unirep
jaxlib
jaxlie
jaxonnxruntime
jaxopt
jaxtyping
jazz-hands
jenkspy
jenn
jftools
jigsawpy
jina
jina-core
jina-perf
jmp
joommfutil
joseki
joypy
jplephem
jraph
jsbsim
json2parquet
json_tricks
jupyros
jupyter-rfb
jupyter-starters-reinforcement-learning-dennybritz
jupyter_innotater
jupyter_to_medium
k3d
kaggle-environments
kaldi_io
kaldiio
kalepy
kalpy
kanapy
kanga
kangas
karateclub
karawun
kartograf
kats
kennard-stone
kepderiv
kepmodel
keras
keras-applications
keras-core
keras-preprocessing
keras-radam
keras-spiking
keras-tuner
keras-unet
keras2onnx
keras_mixed_sequence
kernax
kerrgeopy
keybert
kfac-jax
kgen
kickscore
kikuchipy
kim-convergence
kimpy
kinbot
kineticpredictormodel
kinisi
kissim
kkcalc
klib
km3pipe
kmodes
kneed
knnimpute
knoten
koalas
kombine
koolstof
koopa-viz
kosh
kronprod
kuti
kwantspectrum
kydlib
la_forge
labbench
label-creator
label-maker
label-maker-dask
labelme
labmaze
lakepy
lal
lalapps
lammps-interface
lammpsio
laplace-torch
lapy
large-image
large-image-viewer
larray
larray-editor
larrayenv
laserbeamsize
laspy
lasy
lava
lava-dl
lava-dnf
lava-optimization
laxpy
layer-data-replace
lazytransform
lbapcommon
lbcharmdb
lbl-repack
lbmpy
lcensemble
ldcpy
ldrb
leafmap
legacy-suitcase
legendgram
lenskit
lenstest
lenstool
lenstronomy
less-learn
lfpykit
lhorizon
libadjoint
libcomcat
libconeangle
libdlf
libdlfind
libensemble
libertem
libertem-blobfinder
libertem-live
libneuroml
libopenvino-python
libpysal
librosa
libsharp
libstempo
libsvmdata
lidar
liecasadi
lifelines
lifetimes
lightgbm
lightkurve
lightly
lightly-utils
lightning-bolts
lightning-flash
lightpath
ligo-asimov
ligo-followup-advocate
ligo-lvalert
ligo-raven
ligo-scald
ligo.skymap
liknorm-py
lilio
lime
limix
limix-core
limix-plot
linearmodels
linetools
lingua-language-detector
linmarg
linopy
lintegrate
lintel
lipyphilic
lisc
litdata
littlemcmc
littletable
livvkit
lixtools
llama-cpp-python
llama-index
llama-index-core
llama-index-legacy
llckbdm
lleaves
llmlingua
llspy-slm
lmfit
lmoments3
loadmydata
loadskernel
lobsterpy
lofo-importance
loggertools
logomaker
lomap2
loompy
loopdesigner
loopy
loprop
lotterycn
lovely-numpy
lovely-tensors
lpdr
lpips
lpsolvers
lscsoft-glue
lsds
lsdtopytools
lspopt
lsst-efd-client
lsst_dashboard
lsstdesc-diffsky
lsstdesc-env
lsstdesc-galsampler
lsstdesc-gcr-catalogs
lsstdesc.coord
lsstdesc.weaklensingdeblending
lstchain
lstmcpipe
ltbams
lttl
lume-astra
lume-base
lume-epics
lume-genesis
lume-gpt
lume-impact
lume-model
lumispy
lux-api
lvis
lxmlh
m2cgen
machinevision-toolbox-python
madminer
mafredo
mag2exp
mage-ai
magentropy
maggma
magic-class
magics-python
magpylib
maml
mamonca
mandrake
manifpy
mapbox_earcut
mapchete
mapclassify
mapgenerator
mapie
marching_cubes
marimo-labs
marinvaders
markov-clustering
marslab
masci-tools
mask-to-polygons
mat73
materials-learning-algorithms
mathics3
matid
matminer
matplotcheck
matplotlib-base
matplotlib-label-lines
matplotlib-venn
matplotlib2tikz
matplotlibhelper
matplotview
matrix_utils
matscholar
matscipy
matspy
mattspy
maxrect
mbuild
mc-goods
mc3
mcalf
mcerp
mchammer
mcpl
mdahole2-base
mdbenchmark
mdfreader
mdolab-baseclasses
mdp
mdrestraintsgenerator
mdsplus
mdsrv
meautility
medaprep
medcam
medchem
mediapy
medigan
medpy
meeko
meg
megaradrp
meggie
megnet
meld
membrane-curvature
mendeleev
merge-stardist-masks
mesa
mesa-geo
meshcat-python
meshcut
mesher
meshio
meshplex
meshplot
meshpy
meshzoo
mesmer
mesmerize-core
message-ix
metadata-inspector
metadetect
metaimageio
metaknowledge
metgem
metocean-api
metocean-stats
metpy
metric-learn
metrolopy
metsim
metview-python
mf2
mffpy
mfpymake
mgwr
mhfp
miceforest
microfilm
microgen
microscope
miepython
mikeio
min-dalle
minepy
miniful
miningpy
minisom
minorminer
mintpy
mir-flare
mir_eval
misic-napari
missingno
miutil
mixsea
mizani
ml-insights
ml-research
ml-wrappers
ml_tooling
mlconjug
mlconjug3
mleap
mlens
mlflow
mlforecast
mlgb
mlinsights
mljar-supervised
mlprodict
mlx-lm
mlxtend
mmdet
mmengine
mmsegmentation
mne
mne-ari
mne-base
mne-bids
mne-bids-pipeline
mne-connectivity
mne-faster
mne-features
mne-icalabel
mne-kit-gui
mne-lsl
mne-microstates
mne-qt-browser
mne-realtime
mne-rsa
mnelab
mnist
moab
mockmpi
modal
model_catalogs
modelbase
modelparameters
modelx-cython
modepy
modestimage
modflow-export
modflow-setup
modflow2netcdf
modflowapi
modin-core
mof
mofdscribe
molbox
molearn
molecule-generation
moleculeace
moleculetda
molfeat
mols2grid
molsets
molsimplify
molsystem
moltemplate
momlevel
monai
monet
monetio
montreal-forced-aligner
moola
moorpy
mord
mordred
mordredcommunity
morfeus-ml
morphman
morphodynamics
morphometrics
morphometrics-engine
morphops
morphosamplers
morphospaces
mosaic-clustering
mosaicmpi
mosartwmpy
moscot
mosdef_cassandra
motifcluster
motmetrics
moviepy
movingpandas
movis
mp_pytorch
mpas-analysis
mpas_tools
mpi4jax
mpipartition
mpiplus
mpl-multitab
mpl-point-clicker
mpl-probscale
mpl-scatter-density
mpl_animators
mpl_plotter
mpl_qt_viz
mpldatacursor
mplhep
mplsoccer
mplstereonet
mplt
mpltoolbox
mplview
mprod-package
mps-motion
mrc
mrcfile
mrcz
mrs_denoising_tools
msdnet
msgpack-numpy
msmhelper
msnoise
msumastro
mt-metadata
mtcnn
mtenn
mth5
mtpy
mubody
mudata
muler
multi_rake
multiscale-spatial-image
multispaeti
multitaper
multiviewica
muon
mup
museotoolbox
music21
muspinsim
mvgavg
mvlearn
mygeopackage
mystic
n2v
naaf
naima
namaster
nannos
nap-plot-tools
napari
napari-accelerated-pixel-and-object-classification
napari-affinities
napari-aideveloper
napari-allencell-annotator
napari-allencell-segmenter
napari-animated-gif-io
napari-animation
napari-annotate
napari-annotation-project
napari-annotator
napari-annotatorj
napari-aphid
napari-arboretum
napari-bbox
napari-bfio
napari-bigfish
napari-bigwarp
napari-bio-sample-data
napari-bioformats
napari-bleach-correct
napari-blender-bridge
napari-blob-detection
napari-blossom
napari-boardgame-maker
napari-boids
napari-boxmanager
napari-brainbow-diagnose
napari-brightness-contrast
napari-brushsettings
napari-bud-cell-segmenter
napari-buds
napari-caphid
napari-ccp4map
napari-cell-centroid-annotator
napari-cellseg3d
napari-clipboard
napari-clusters-plotter
napari-compressed-labels-io
napari-conidie
napari-convpaint
napari-correct-drift
napari-crop
napari-cryofibsem-monitor
napari-cupy-image-processing
napari-cursor-tracker
napari-curtain
napari-czann-segment
napari-czifile2
napari-deeplabcut
napari-deepmeta
napari-deepspot
napari-dexp
napari-dvid
napari-dzi-zarr
napari-elementary-numpy-operations
napari-em-reader
napari-emd
napari-feature-classifier
napari-features
napari-features-selector
napari-filament-annotator
napari-filaments
napari-folder-browser
napari-gemspa
napari-generic-simulator
napari-geojson
napari-geoscience-viewer
napari-graph
napari-griottes
napari-h5
napari-hdf5-labels-io
napari-hdf5-netcdf-viewer
napari-hough-circle-detector
napari-image-stacker
napari-imagej
napari-imaris-loader
napari-imc
napari-imsmicrolink
napari-indices
napari-ip-workflow
napari-ism
napari-itk-io
napari-j
napari-kics
napari-labelimg4classification
napari-labeling
napari-labelling-assistant
napari-labelprop
napari-laptrack
napari-large-image-importer
napari-layer-details-display
napari-layer-table
napari-lazy-openslide
napari-lf
napari-live-recording
napari-locan
napari-locpix
napari-macrokit
napari-manual-transforms
napari-mat-file-reader
napari-mat-images
napari-math
napari-matplotlib
napari-mclabel
napari-medical-image-formats
napari-medical-image-formats-read-write
napari-melt-pool-tracker
napari-merge-stardist-masks
napari-meshio
napari-metroid
napari-micromanager
napari-microtubule-analyzer
napari-molecule-reader
napari-mouse-controls
napari-mrcfile-handler
napari-mrcfile-reader
napari-mri
napari-mzarr
napari-n2v
napari-napari
napari-nasa-samples
napari-nd-annotator
napari-nd-cropper
napari-nd2-folder-viewer
napari-ndev
napari-ndtiffs
napari-nibabel
napari-nifti
napari-nikon-nd2
napari-obj
napari-omaas
napari-ome-zarr
napari-organoid-counter
napari-owncloud
napari-parallel
napari-patchcreator
napari-pdf-reader
napari-pdr-reader
napari-philow
napari-picasso
napari-pims-bioformats
napari-plot
napari-plot-profile
napari-plugin-search
napari-pointslayer-projection
napari-power-spectrum
napari-power-widgets
napari-pram
napari-process-points-and-surfaces
napari-proofread-brainbow
napari-properties-plotter
napari-properties-viewer
napari-psf-analysis
napari-psf-simulator
napari-pssr
napari-pystackreg
napari-qrcode
napari-rembg
napari-result-stack
napari-rioxarray
napari-roi
napari-roi-registration
napari-sam
napari-sam4is
napari-sc3d-viewer
napari-script-editor
napari-sdeconv
napari-seedseg
napari-segment
napari-segment-anything
napari-segment-blobs-and-things-with-membranes
napari-serialcellpose
napari-sif-reader
napari-sift-registration
napari-signal-selector
napari-sim-processor
napari-simpleannotate
napari-simpleitk-image-processing
napari-skimage-regionprops
napari-spacetx-explorer
napari-spatial-omics
napari-spatialdata
napari-splinedist
napari-splineit
napari-spreadsheet
napari-stable-diffusion
napari-steinpose
napari-stl-exporter
napari-stracking
napari-subboxer
napari-superres
napari-svg
napari-tabu
napari-text-layer
napari-threedee
napari-tiler
napari-time-series-plotter
napari-time-slicer
napari-timeseries-opener-plugin
napari-tissuumaps
napari-tomocube-data-viewer
napari-tomoslice
napari-tomotwin
napari-tools-menu
napari-toothfairy-annotator
napari-trackpy
napari-tracks-reader
napari-trait2d
napari-turing
napari-tyssue
napari-ufish
napari-unicell
napari-validate-random-label-predictions
napari-vedo-bridge
napari-vesicles-segmentation
napari-vodex
napari-workflow-inspector
napari-workflow-optimizer
napari-workflows
napari-workshop-browser
napari-yapic-prediction
napari-yolov5
napari-zelda
napari-zulip
napari_video
napatrackmater
nardini
nasdaq-data-link
nashpy
natari
natcap.invest
natpy
nautilus-sampler
navec
nb2plots
nbclean
nc-time-axis
nc2zarr
ncagg
ncas-amof-netcdf-template
ncdata
ncempy
ncephes
ncflag
ncpol2sdpa
ncrystal
ncvue
nd2
nd2-dask
nd2reader
ndarray-listener
ndcsv
ndd
ndf
ndindex
ndpyramid
ndscope
ndtiff
nearpy
neighpy
nelson-siegel-svensson
nengo
nengo-dl
nengo-extras
nengo-loihi
nengo-spa
neptune-prophet
nequip
nerval
nessai
nestcheck
nestle
netcdf-scm
netgraph
netket
netpbmfile
networkit
networkx
neunorm
neuralforecast
neurodsp
neurokit2
neuron
neurosynchro
neurotic
neutralocean
nevergrad
neworder
nexpy
nexusformat
nf1
nfinder
nfoursid
ngboost
nglview
ngmix
ngmix-core
nibabel
nichord
nidaqmx-python
nifti-mrs
nigsp
nilearn
nimfa
niondata
nionswift
nionswift-io
nionui
nipype
nir
nllgrid
nlp
nlp-feature-extractors
nlp-primitives
nlpaug
nlptest
nltk
nmma
noaa-coops
node2vec
nomad-camels
normi
norse
np_utils
npctypes
npstreams
nptdms
nptyping
npx
npy-append-array
nqlib
nrel-rex
nrtk
nsbm
nsls2-detector-handlers
nslsii
nspyre
nuflux
numba-mpi
numba-progress
numba-stats
numba_celltree
numbagg
numbalsoda
numcodecs
numcosmo
numdifftools
numkit
numpngw
numpoly
numpy-financial
numpy-indexed
numpy-sugar
numpy_groupies
numpy_ringbuffer
numpyro
nvidia-apex
nwchemcmlutils
nxviz
oasis
oast
obcanonicalradicals
objectlist
obsplus
obspy
obspyck
ocean-model-skill-assessor
ocean_data_gateway
ocean_model_skill_assessor
oceancolor
oceans
oceansdb
oceanum
ocetrac
ocgis
ocha-anticipy
ocsmesh
oct-to-tiff
oct2py
ocw
oda-api
odachi
odc-algo
odc-geo
odc-stac
odc-stats
odo
odvc
offset-subtraction
ofiber
ogb
ogs5py
oiffile
oifits
okapi-em
omas
ome-zarr
omero-py
omf
omnixai
ondamonitor
onnx
onnx2torch
onnxconverter-common
onnxmltools
oommfodt
opacus
open3d
open3spn2
openai
openamundsen
openap
openawsem
opencadd
opendap-protocol
opendp-smartnoise
opendp-smartnoise-core
opendrift
openeo
openfe
openfermion
openff-bespokefit
openff-evaluator
openff-evaluator-base
openff-fragmenter
openff-fragmenter-base
openff-interchange
openff-interchange-base
openff-models
openff-qcsubmit
openff-recharge
openff-toolkit
openff-toolkit-base
openff-units
openglider
openhsi
openmatrix
openmc-plotter
openmdao
openmichrom
openml
openmm
openmm-atmmetaforce-plugin
openmm-ml
openmmtools
openmoltools
openorb
openorb-eph-builder
openpatchminer
openpathsampling
openpiv
openpmd-api
openpmd-beamphysics
openpmd-viewer
openpnm
openqcm
openquake.engine
openraft
opensarlab_lib
openscienceplot_matplotlib
opensimplex
opensmog
opentrons
opera-utils
ophyd
opt-einsum
opt_einsum
optax
opticalglass
optics_functions
optima
optimask
optimix
optimum
optking
optodetools
optuna
opty
opyrator
oqpy
orange-canvas-core
orange-spectroscopy
orange3
orange3-associate
orange3-bioinformatics
orange3-educational
orange3-explain
orange3-fairness
orange3-imageanalytics
orange3-prototypes
orange3-singlecell
orange3-text
orange3-timeseries
orbax-checkpoint
orbit-ml
orca_test
orix
orographic_precipitation
orthopy
oscars
osm-flex
osmnet
osmnx
osmpythontools
ostaphep
osyris
ott-jax
otwrapy
outlier-utils
outlines
oxasl
oxasl_enable
oxasl_ve
p-winds
p_astro
pacmap
pactools
paddy
pado
paegan
palmari
panda3d_viewer
pandablocks
pandana
pandapower
pandas-dq
pandas-gbq
pandas-plink
pandas-profiling
pandas-streaming
pandas-stubs
pandas-summary
pandas_schema
pandasql
pandavro
pandera
pandera-base
pandera-core
pandoctools
pandora-geno
panel-chemistry
panelaero
pangaeapy
paprika
parabem
parallel-bilby
parallel-numpy-rng
parallel_statistics
parallelproj
paramspace
paramtools
paramz
paraprobe
paraview
parcels
pardiso4py
parmed
parmoo
parse-fmt
parsevasp
parsim
partial-aligner
partialwrap
particle-tracking-manager
particula
partseg
partseg-smfish
patchnetvlad
patchworklib
pathsimanalysis
patsy
pattern
pawflim
pcdscalc
pcdsdevices
pcmdi_metrics
pcrunch
pdata
pdb2pqr
pdb2sql
pdb_manip_py
pdbfixer
pdbinf
pdcifplotter
pdfcombine
pdfo
pdielec
pdpbox
pdr
pds4_tools
pdtable
peakutils
pecos
peft
penaltymodel
pennylane
pennylane-core
pennylane-lightning
pennylane-lightning-core
pepredicates
perfplot
periodic-table-plotter
periodicgw
periodictable
permamodel
perses
persim
pescador
pesummary
pesviewer
petulant-bear
pfapack
pfsspy
pgeocode
pgmpy
pgraph-python
pgvector-python
pgzero
phasecalculator
phasepy
phasexmlcreator
phasexmlparser
phconvert
phidl
phik
phonolammps
photutils
physical_validation
phytreeviz
picharsso
picmistandard
picosdk
picwriter
pidcalib2
pidgen2
pidibble
pidly
piecewise-regression
piff
pigeonxt-jupyter
pims
pineappl
pingouin
pink
pint-pal
pint-pulsar
pint-xarray
pisces-db
pitot
pixiedust
pixmappy
pixstem
pkbar
plaid
plams
planetmapper
plantcv
plasmaboundaries
plasmapy
platelet-unet-watershed
plateletanalysis
platetectonictools
platymatch
platypus-opt
plio
plip
plonk
plot_map
plotext
plotly-resampler
plotly_express
plotnine
plottable
plottoolbox
plottr
plum-dispatch
plyfile
pmgr
pnab
pocean-core
poincare
point-annotator
pointpats
polaris
polars
polartoolkit
poliastro
polygonation
polyround
polyscope
polytope
pomegranate
pop-tools
popfinder
poppy
porespy
posebusters
pot
potentials
power-grid-model
power-grid-model-io
powerfit
powerlaw
powerplantmatching
pp-sketchlib
ppmac
practicalsparql
precession
predictr
premise
presamples
pretty_midi
prettypyplot
primod
prince-factor-analysis
priori
prism-ds
privacy-meter
professor
prolif
properscoring
properties
prophet
prospect
protected-classification
protex
protlearn
proto-parser
protozfits
provenance
proxsuite
ps2ff
pseudo_dojo
pseudonetcdf
psf
psfmodels
pshmem
psi4
psiflow
psiresp-base
psmpy
psrchive
psrqpy
psy-strat
psychopy
psyplot-gui
ptemcee
ptgnn
ptitprince
ptmcmcsampler
ptvpy
pubmed-parser
pudu
pulse
punx
puresolventinformation
pvcaptest
pvlib
pvlib-python
pvwebmonitor
pwkit
pwlf
pwtools
px4tools
py-channelmodel
py-cordex
py-droplets
py-find
py-modelrunner
py-openalpr
py-pde
py-tools-ds
py-triangle
py-wake
py-xgboost
py3dep
py4d-browser
py4dstem
py4vasp
py4xs
py6s
pyadi-iio
pyaedt
pyaerocom
pyaez
pyagrum
pyale
pyam
pyannote.core
pyaps3
pyaudi
pyaxiom
pybacktrack
pybader
pybads
pybamm
pybaobabdt
pybaselines
pybboxes
pybids
pybinding
pyboat
pybob
pybobyqa
pybullet
pybv
pycamhd
pycaret
pycbf
pycentroids
pychemia
pychx
pycifrw
pycirclize
pycircos
pycircstat
pyclustering
pyco2sys
pycoal
pycoalescence
pycoare
pycoast
pycollada
pycollo
pycolmap
pycolorbar
pycolt
pycomlink
pycompare
pycontour
pycorruptor
pycovjson
pycoxmunk
pycp2k
pycraf-gui
pycromanager
pycroscopy
pycrostates
pycsep
pycudadecon
pycudasirecon
pycustomfocus
pycwt
pycytominer
pydaily
pydap
pydarm
pydatamail
pydatamail_google
pydatamail_ml
pydaymet
pydda
pyddx
pydecorate
pydeequ
pydefect
pydicth5
pydiverse-transform
pydlm
pydm
pydoas
pydoe
pydoe2
pydoe3
pydorado
pydsd
pydstool
pydtmc
pydv
pydy
pyearth
pyebsdindex-base
pyecospold
pyedr
pyeee
pyefd
pyeit
pyemcee
pyemir
pyemu
pyepics
pyepr-quantum
pyequib
pyerfa
pyerrors
pyet
pyeviews
pyevtk
pyexodus
pyexplainer
pyextremes
pyfab
pyfabm
pyfao56
pyfastspm
pyfda
pyferret
pyfesom2
pyfinance
pyfit-sne
pyfive
pyfizi
pyflann
pyflowline
pyflwdir
pyfoamalgo
pyfolio
pyfolio-reloaded
pyfoomb
pyfor
pyformlang
pyfstat
pyfume
pyg4ometry
pygad
pygam
pygaps
pygc
pygeogrids
pygeohydro
pygeoutils
pygfunction
pygfx
pygix
pyglmnet
pyglotaran
pyglotaran-extras
pygmailsorter
pygmo
pygmo_plugins_nonfree
pygmt
pygmtools
pygod
pygoss
pygpcca
pygraft
pygram11
pygrib
pygridmet
pygridtools
pygrin
pygrinder
pygsl_lite
pygsp
pygtc
pyhdfe
pyhdx
pyheavydb
pyhf
pyhull
pyibs
pyiem
pyigrf
pyilluminate
pyimagej
pyina
pyinterpolate
pyirf
pyiron
pyiron_atomistics
pyiron_base
pyiron_continuum
pyiron_contrib
pyiron_gpl
pyiron_gui
pyiron_lammps
pyiron_ontology
pyiron_potentialfit
pyiron_workflow
pyjamalib
pyjams
pyjanitor
pykalman
pykep
pykerr
pykriging
pylablib
pylammpsmpi
pylance
pylandstats
pylbl
pylbm
pyldavis
pylhc_submitter
pylibjpeg
pylibtiff
pylibxc
pylinalg
pyloadprofilegenerator
pylogit
pylook
pylops
pylustrator
pymablock
pymace
pymagej
pymagewell
pymannkendall
pymap3d
pymapvbvd
pymatbridge
pymatgen
pymatgen-analysis-defects
pymatnest
pymatreader
pymatsolver
pymatsolver-base
pymatting
pymatviz
pymbolic
pymc
pymc-base
pymc-marketing
pymc3
pymc3-hmm
pymca
pymcdm
pymcma
pymcr
pymeasure
pymedio
pymedphys
pymedphys_analysis
pymedphys_base
pymedphys_coordsandscales
pymedphys_databases
pymedphys_dicom
pymedphys_electronfactors
pymedphys_fileformats
pymedphys_gamma
pymedphys_labs
pymedphys_logfiles
pymedphys_mudensity
pymedphys_pinnacle
pymedphys_utilities
pymedphys_xlwings
pymem3dg
pymiescatt
pyminhash
pymirc
pymkl
pymks
pymmaster
pymmcore-plus
pymodes
pymodulon
pymol-open-source
pymolpro
pymoo
pymove
pymovements
pymrio
pymt
pymt_gridmet
pymt_roms
pymumps
pymuonsuite
pymyami
pynamical
pyncml
pynco
pyne
pynhd
pynimate
pynldas2
pynndescent
pynomaly
pynrrd
pynsid
pyntcloud
pynufft
pynumpress
pynwb
pyoccad
pyod
pyodesys
pyomeca
pyomicron
pyoos
pyopenbt
pyopenrivercam
pyoptsparse
pyorbital
pyosp
pyotf
pypar
pypardiso
pypdb
pypeit
pypher
pyphysim
pypif
pyplif-hippos
pyplis
pypolar
pyposeidon-base
pypots
pyprecice
pyprep
pyprism
pyprismatic
pyprocar
pypromice
pyproprop
pyproximal
pypsa
pypulse
pypythia
pyqalloy
pyqtgraph
pyquaternion
pyquickbench
pyquickhelper
pyquil
pyquokka
pyramids
pyrams
pyranha
pyratbay
pyratlib
pyrayt
pyremap
pyremo
pyrender
pyresample
pyribbit
pyribs
pyribs-base
pyriemann
pyro-ppl
pyrobex
pyrolite
pyrosar
pyrr
pyrserve
pyrsm
pyrsr
pyscal-rdf
pyscenarios
pyscf
pyscreener
pysd
pyseidon
pyseobnr
pysgrid
pysheds
pyshepseg
pyshqg
pyshtools
pysindy
pysipfenn
pysis
pysjef
pyslice
pyslim
pysm3
pysolar
pysolid
pysoundfile
pysp2
pyspark
pyspeckit
pyspeckle
pyspectral
pyspice
pysr
pystardb
pystencils
pystencils-autodiff
pystencils-reco
pystoi
pystore
pysubgroup
pysumma
pysurfer
pysw4
pyswarms
pyswashes
pysyncrosim
pytalises
pytao
pytcs
pytdc
pytef
pytemlib
pytest-arraydiff
pytest-doctest-ufunc
pytest-doctestplus
pytest_parallel_mpi
pytfa
pythae
python-ace
python-awg
python-awips
python-cufflinks
python-embree
python-flair
python-foton
python-geotiff
python-gmatelastoplasticqpot
python-gmsh
python-graphblas
python-icc
python-javabridge
python-lalsimulation
python-ligo-lw
python-louvain
python-mint
python-neo
python-pdal
python-picard
python-relion
python-sounddevice
pythonqwt
pythonvirgotools
pythreejs
pythresh
pytmd
pytools
pytorch-dp
pytorch-lightning
pytorch-metric-learning
pytorch-minimize
pytorch-model-summary
pytorch-pretrained-bert
pytorch-spiking
pytorch-wpe
pytorch_geometric
pytorch_revgrad
pytorch_tabular
pytorchcv
pytrack
pytrackmate
pytransform3d
pyttoresque
pyturbo
pyturbojpeg
pyugrid
pyulog
pyunfold
pyunlocbox
pyusid
pyvbmc
pyvipr
pyvisfile
pyvista
pyvkfft
pyvo
pywapor
pywaterflood
pywaterml
pywatershed
pywebp
pywim
pyworkout-toolkit
pyworld3
pywwa
pywwt
pyxdf
pyxdsm
pyxel-sim
pyxem
pyxrf
pyzxing
qcelemental
qcfractal
qcfractal-core
qcodes
qcportal
qdax
qdoas2harp
qdrant-client
qe-tools
qetpy
qforce
qibo
qibocal
qimage2ndarray
qiskit-aer
qiskit-algorithms
qiskit-dynamics
qiskit-experiments
qiskit-finance
qiskit-ibm-experiment
qiskit-ibm-provider
qiskit-ibm-runtime
qiskit-ibmq-provider
qiskit-ignis
qiskit-machine-learning
qiskit-metal
qiskit-optimization
qiskit-terra
qmpy
qmsolve
qnm
qnorm
qp
qp-prob
qpsolvers
qsymm
quadprog
quadpy
quandl
quantecon
quantiphyse
quantiphyse-cest
quantiphyse-dsc
quantiphyse-fabber
quantiphyse-perfsim
quantiphyse-qbold
quantities
quantizer
quantstats
quantum-blackbird
quantum-grove
quantumflow
quaternionarray
quaternionic
qubekit
qudida
quera-ahs-utils
quest
questplus
quickff
quickpotato
quimb
qupy
r-downscaler
r5py
rabpro
radical.analytics
radio-beam
radioactivedecay
radiospectra
radiosphere
radtraq
rafem
raimitigations
raitracker
raiutils
ramscube
rapid-pe
rapidfuzz
rapidpe-rift-pipe
rapidpy
rasterstats
rastervision-core
rat
rateslib
raven-wps
ravenpy
ray-core
ray-data
rayoptics
rbc
rdata
rdfpy
rdkit_utilities
rdp
readimc
reaktoro
realalg
rechunker
reciprocalspaceship
recorder-napari
recordlinkage
recursive_diff
recursivenodes
redlionfish
redpil
reducer
refet
refinenet
regain
regi0
region
regional-mom6
regionmask
regions
regolith
regressio
reikna
rembg
remotior-sensus
remove_dagmc_tags
renishaw_wire
repytah
rerun-sdk
resample
resampy
resdk
researchpy
resonance
resonate
resp
respondo
responsibleai-text
resultsanalysis
retina-face
retriever
retworkx
reverse-geocode
reverse_geocoder
rexmex
rfpimp
rhos
ribasim
riccati
rift
rigolwfm
ringspy
rio-mucho
rio-tiler
rios
rioxarray
riskfolio-lib
river
rixs
rkstiff
rl_games
rlr
rmm
rmsd
robocrys
roboticstoolbox-python
robotraconteur_companion_python
robustness
rocketpy
rockpool
rod
rodeometric
roifile
romspline
roocs-utils
root_pandas
ros-rospy
rosbags
rosco
roseau-load-flow
rosettasciio
rosettasciio-base
rotamerconvolvemd
rouge-score
rowan
rptools
rsatoolbox
rsgislib
rt-eqcorrscan
rtxpy
rubin-scheduler
rubin-sim
rubrix
runnerase
ruptura
ruptures
rustworkx
rvc3python
rvlib
rwa-python
s100py
s1etad
s1reader
s2cloudless
sacc
sacrebleu
safe-mol
sage
sagemaker
sagemaker-chainer-container
sagemaker-inference
sagemaker-inference-toolkit
sagemaker-python-sdk
sagemaker-pytorch-container
sagemaker-pytorch-serving-container
sagemaker-tensorflow-container
sagemaker_containers
salabim-animation
salem
salesforce-merlion
salib
samsam
sankee
sardem
sarpy
sarsen
sasktran2
sasmodels
satgen
satmad
satpy
sbpy
sbtab
sc
scanning_drift_corr
scanpy
scarplet
scattertext
scenepic
schedview
scheil
schist
schnetpack
scico
scifireaders
scikit-base-all-extras
scikit-criteria
scikit-data
scikit-datasets
scikit-dsp-comm
scikit-explain
scikit-fda
scikit-fem
scikit-fuzzy
scikit-gstat
scikit-hep
scikit-lego
scikit-mdr
scikit-misc
scikit-mobility
scikit-multilearn
scikit-optimize
scikit-posthocs
scikit-procrustes
scikit-rf
scikit-ued
scikits-bootstrap
scine-chemoton
scine-puffin
scine-utilities-python
scipy-sugar
sciris
scisoftpy
scisweeper
scitoolsscianalysis
scmdata
scorecardpy
scraps
scri
scriptengine-tasks-ecearth
sctour
scvelo
scvi-tools
sdds
sdf
sdt-python
sdtfile
sdv
seabird
seaborn
seaborn-base
seabreeze
seaduck
seamm
seamm-ff-util
seapipy
searvey
seawater
secimport
secml
seedbank
seekpath
segregation
segyio
seiqrdp-model
seir
seismon
seispy
sekve
selectio
semi-ate-spyder
semi-ate-test-app
seml
semvecpy
sen2nbar
sense2vec
sensormapgeo
sensorml2iso
sentence-transformers
sentinelhub
seqeval
seqlike
sequence-model
serapis
set-calibration
setsimilaritysearch
sf-hamilton
sfepy
sfopenboson
sfrmaker
sgdpy
sgkit
shadow3
shakenbreak
shap
shapicant
sharppy
sharrow
shed
shed-streaming
shedsidewinder
shelephant
sherlockml-boltzmannclean
sherlockml-dataclean
shimmy
shredder
shredx
sicor
sid-dev
sidpy
sif-parser
sigpy
sim-tools
simdna
simhash
similaritymeasures
simmate
simmer
simpeg
simpful
simple-build-system
simple_benchmark
simple_h5py
simplecosine
sinabs
single-sample-gsea
siphon
sirepo-bluesky
sisppeo
siuba
sixtools
sk-dist
sk-video
skan
skater
skbase-all-extras
skfolio
skglm
skijumpdesign
skipatom
skl2onnx
sklearn-genetic
sklearn-genetic-opt
sklearn-pandas
skll
skmatter
sknw
skope-rules
skorch
skprogs-python
skrebate
skrub
sktime
sktools
skutil
skweak
skyarea
skyfield
skyproj
skypy
skytag
slabdip
slcl1butils
sleapyfaces
slearn
slicedimage
sliderule
slidingwindow
slim-trees
slovnet
smac
smact
small-text
smee
smi-analysis
smif
smipoly
smirnoff-plugins
smo
smopy
smqtk-dataprovider
smqtk-descriptors
smqtk-image-io
snaphu
snax
snirf
snkit
snntorch
snorkel
snouty-viewer
snowline
snuggs
soaplite
soilgrids
solarforecastarbiter
solaris
solarmach
solo-epd-loader
solvation_analysis
solventmapcreator
somata
sompy
songdkl
soprano
sorcha
sorcha-addons
sos-matlab
sos-r
sott
sound_field_analysis
sounderpy
source
sourmash-minimal
soxspipe
spaghetti
spam
spampy
sparc-x-api
sparkmagic
sparse
sparse_dot_mkl
sparsecca
sparseconverter
sparselt
sparsestack
spatial-image
spatialdata
spatialist
spatialmath-python
spatialpandas
spec2nexus
spec2nii
specclassify
spechomo
speclite
spectrafit
spectral
spectral-cube
spectrapepper
spectrum
spectrumdevice
specutils
spefile
spgl1
spglm
spherical
spherical_functions
spheroidal
sphinx-fortran
spice_hsi
spiceypy
spikingjelly
spindry
spint
spire-pipeline
spleaf
splipy
splito
splot
spm1d
spopt
sporco
spotpy
spots-in-yeasts
spox
spreg
springcraft
spvcm
spyboat
spymicmac
spyndex
spyrmsd
sqcircuit
squidpy
squirrel-datasets-core
src-endpoints
srwpy
sscws
ssp_detector
stable-baselines3
stac-vrt
stackview
stactools
stanio
stanza
starfile
startables
statannot
statannotations
static-frame
statista
statmorph
stats_arrays
statsforecast
stdpopsim
steinbock
stemflow
stempeg
stginga
stglib
stimuli
stingray
stitchm
stk
stochatreat
stonesoup
stormevents
stracking
strawberryfields
streamad
streamlit
strec
string2string
stripnet
struct-lmm
structdbrest
structuretoolkit
stsynphot
stumpy
sumo
sunkit-instruments
sunode
sunraster
supermercado
supermorecado
superset
supersmoother
supervision
surfinbh
surfinpy
susi
suspect
svgpath2mpl
svgpathtools
svmbir
svmtk
sweets
sweetviz
swiftbat
swifttools
swisslandstats-geopy
swmmtoolbox
swmr-tools
swot_simulator
sxs
sym
symfem
symfit
symopt
sympy_plot_backends
synbiochem-py
synopticpy
synphot
syntheseus
synthetic-data
synthpop
ta
table-evaluator
tableone
tables-io
tabpy
tabula-py
tabulous
tacco
tad-mctc
tafra
tagmaps
tamkin
tams
tango-fairscale
tango-torch
tango-transformers
tappy
tastymap
tatc
taurus-core
taxbrain
taxcalc
tb3py
tbats
tblite-python
tcmarkers
tcplotter
teachopencadd
temmeta
tempeh
tempest-helper
tensor-sensor
tensorboard
tensorboardx
tensordict
tensorflow-base
tensorflow-datasets
tensorflow-estimator
tensorflow-hub
tensorflow-lattice
tensorflow-probability
tensorly
tensorly-quantum
tensorly-torch
tensorpac
tensorpack
tensortrade
tensorwaves
tephi
ternary-diagram
terracotta
terrainbento
texplain
text_extensions_for_pandas
textacy
textattack
texthero
tf-keras
tf2-gnn
tf2onnx
tf_object_detection
tfs-pandas
tfv
thalassa
thatool
the-segmentation-game
theano
theano-pymc
theanolm
thechopper
thepipe
thermoextrap
thermostate
theseus-ai
threedigrid
threeml
thresholdclustering
thucyd
thunder-python
thunder-registration
tianshou
tiatoolbox
tidy_headers
tidynamics
tidypandas
ties_md
tifffile
tifffolder
tigernet
tike
tikzplotlib
tile_mate
tiled-array
tiled-base
tiler
timemory
timescale
timescoring
timezonefinder
timple
tintx
titiler-core
titrate
tjpcov
tl2cgen
tmm
tmmc-lnpy
toast
tobac
tobler
tofu
tonic
toolbox_utils
tootapari
top2vec
tophu
topojson
topometry
torch-complex
torch-fidelity
torch-hd
torch-nl
torchani
torchbiggraph
torchcam
torchfile
torchgeo
torchio
torchquad
torchsde
torchtnt
torchtuples
towhee
toyplot
toytree
tplot
tpot
tpot2
trackintel
trackpy
tracktable
tracywidom
trading-calendars
traffic
traffix
trainstation
traja
trajan
tranquilo
transbigdata
transfocate
transformato
transformers
transforms3d
transonic
trata
treecorr
treegp
treeinterpreter
treelite
triad
tributary
trimesh
tritonclient
trl
trodi
trollimage
tropycal
trouve
trustllm
trx-python
tsam
tsase
tscv
tsdb
tsdownsample
tsfresh
tsml
tsnecuda
tsod
tstoolbox
tstrait
ttim
ttopt
tune-sklearn
turbo-seti
turfpy
turn_by_turn
turtlefsi
tvb-framework
tvb-library
tvb-storage
txrm2tiff
txtai
typedframe
typhos
tyssue
u8darts
ubergauss
ubermagtable
ubermagutil
uf3
ufish
uhi
ukbparse
ukcensusapi
ukpopulation
ulmo
ultralytics
ultranest
umachine-pyio
umami
umap-learn
umetrix
unbaffeld
uncertainpy
uncertainties
uncertainty-toolbox
unfold
unicloud
unifhy
unifunc
unionml
uniplot
unstructured
unyt
up42-py
upkie
upolygon
uproot-base
uproot-browser
uproot-methods
uproot3
uproot3-methods
uproot4
uqpy
uranography
uravu
urbanaccess
urbansim
urbansim_defaults
urbansim_templates
urchin
urdfpy
useq-schema
userinput
usgs-libcomcat
usgs-strec
ussa1976
utide
utilsforecast
uwsift
uxarray
va_am
vak
vapeplot
vapory
variable_generators
vasppy
vecstack
vector
vectormath
vedo
vegasflow
venn-abers
verde
vermouth
versioned-hdf5
verticapy
vessel-express-napari
videogrep
vina
viridis
virocon
virushostinteractionpredictor
visan
viscm
visdom
vision-explanation-methods
visions
visualpic
visvis
vizdet
vizent
vizlo
vizro
vmtk
vocalpy
vodex
vollseg-napari
vollseg-napari-mtrack
vounwarp
vprtempo
vpython
vtk
vtk-base
vtkplotter
vtkwriters
wake-t
wannier90io
wannierberri
wapordl
warpx
waterdynamics
waterfallcharts
waternetworkanalysis
watex
waveorder
waver
waves
wavespectra
wbplot
webdataset
weblogo
websockify
wecopttool
weldx
welltestpy
wetterdienst
wfdb
wflow
wholeslidedata
whyqd
wield.bunch
wield.declarative
wilds
window-ops
window_ops
windpowerlib
windrose
windspharm
wiutils
wolframclient
woodwork
word-image
wordcloud
workshop-demo
world2data
wquantiles
wradlib
wrfcube
wrighttools
wsinfer
wulffpack
wurst
wxmpl
wxmplot
wxpython
xagg
xaitk-saliency
xanadu-cloud-client
xarray
xarray-ceos-alos2
xarray-einstats
xarray-extras
xarray-safe-rcm
xarray-safe-s1
xarray-schema
xarray-simlab
xarray-spatial
xarray-topo
xarray_mongodb
xarraymannkendall
xarrayutils
xas
xbatcher
xbbg
xcdat
xcfun
xclim
xcube
xcube-cci
xcube-cds
xcube-cmems
xcube-sh
xcube-smos
xdem
xdesign
xdmfwrite_h5py
xeofs
xesmf
xesn
xfab
xformers
xgboost_ray
xgcm
xgrads
xhistogram
xibs
xinvert
xitorch
xlandsat
xmidas
xmip
xmipy
xmitgcm
xmovie
xnumpy
xoak
xopt
xpdacq
xpdan
xpdtools
xpdview
xplique
xpublish
xpublish-intake-provider
xradar
xradarsat2
xray-vision
xraydb
xraylarch
xraylarch-base
xrayutilities
xrd_simulator
xrf-tomo
xrft
xrftomo
xroms
xrt
xrtpy
xsar
xsarsea
xsarslc
xscen
xskillscore
xsocs-base
xstac
xsum
xtal2png
xtb-python
xtiff
xugrid
xymol
xyz2mol
xyzpy
yabadaba
yake
yank
yapic
yapic-io
yaqc-qtpy
yaqd-gage
yaqd-ni
yaqd-rgb
yaqd-seabreeze
yaqd-wright
yarp-python
yasa
yeadon
yellowbrick
yews
yfinance
yggdrasil
yourdfpy
yt
yt-napari
ytree
zappend
zappy
zarpaint
zarr
zbar-py
zcollection
zernike
zeus-mcmc
zfel
zfit
zfit-physics
zfit_interface
zoofs
zospy
zuko

Footnotes

  1. no guarantee of perfection in my post-processing

@beckermr
Copy link
Member

The patches here need to test if the artifact has an existing constraint with an upper bound, and if it does, it should tighten them

@h-vetinari
Copy link
Member Author

The patches here need to test if the artifact has an existing constraint with an upper bound, and if it does, it should tighten them

The issue is exactly unbounded requirements. No-one has prepared for a numpy 2.0 world (except the last couple of months) - a few years ago this was considered a creature of mythology only. I disagree that we should just publish numpy 2.0 and let existing packages with unbounded numpy requirements crash and burn. Every package needs to validate that it's 2.0-ready.

@jakirkham
Copy link
Member

Sorry Axel was posting on my phone with poor network. So I didn't see your comment. Thanks for following up!

IIUC Matt is just saying that if a package already has a constraint (or perhaps a tighter constraint) that already excludes NumPy 2, then we can skip those. Matt do you have a suggestion on syntax?

@beckermr
Copy link
Member

The issue is exactly unbounded requirements. No-one has prepared for a numpy 2.0 world (except the last couple of months) - a few years ago this was considered a creature of mythology only.

The historical approach of conda-forge has been to take a minimal approach to these issues. We manage and run ABI migrations primarily out of necessity. In the vast majority of cases, we leave API breaks to maintainers except for a few special cases (e.g., noarch python 2x to 3x).

I disagree that we should just publish numpy 2.0 and let existing packages with unbounded numpy requirements crash and burn.

We're not letting packages crash and burn. We're giving people choices about how they want to handle a partial API break. There are a lot of APIs in numpy that will stay the same.

Every package needs to validate that it's 2.0-ready.

This is potentially a ton of work we are foisting on maintainers and only one approach. My personal approach is to wait and see for feedstocks I maintain. If things break, I'll fix them.

@beckermr
Copy link
Member

beckermr commented Apr 20, 2024

IIUC Matt is just saying that if a package already has a constraint (or perhaps a tighter constraint) that already excludes NumPy 2, then we can skip those. Matt do you have a suggestion on syntax?

No, this is not what I am saying. The repodata patching code already knows how to do this.

What I am saying is that we should only be patching packages that used numpy at build time, as opposed to a pure runtime requirement.

@jakirkham
Copy link
Member

Except NumPy has made breaking changes in the pure Python layer

@beckermr
Copy link
Member

beckermr commented Apr 20, 2024

Except NumPy has made breaking changes in the pure Python layer

Yes, but as I have said above, we have always left the vast majority of API breaks to maintainers to handle.

@jakirkham
Copy link
Member

Ok well I disagree and would agree with Axel here

The issue is insufficiently constraining packages will negatively impact users installing the packages (maybe with no idea what is going on) and ourselves as we will have to scramble to do what we are already proposing to do now

In terms of maintainers we can extend the NumPy migration to pure Python packages. That would build confidence that packages are working properly by testing them. Though ultimately it is a core package making a major version bump, it will be a lot of work no matter what

@beckermr
Copy link
Member

Yeah I disagree. Sorry for being late to the party here. I had to miss the meeting this week.

FWIW, I 100% agree we should be doing the ABI-related ones. IIUIC, the ABI related ones are already handled if people have been using pin_compatible properly and not putting numpy versions in host.

We should take a look at similar situations in the past. As far as I know, we did not make any global effort on patching when pandas had major version bumps. For sure pandas isn't as core to the ecosystem as numpy, but it is big. We did see quite a few breaks and they were fixed.

The issue is insufficiently constraining packages will negatively impact users installing the packages (maybe with no idea what is going on) and ourselves as we will have to scramble to do what we are already proposing to do now

We can leave this PR open and merge it later if the sky falls down or w/e. No scramble is needed.

In terms of maintainers we can extend the NumPy migration to pure Python packages. That would build confidence that packages are working properly by testing them.

That sounds nice but I think the marginal value is small. We don't typically do a ton of detailed testing in a build feedstock. OFC the build itself will test build issues very well!

Though ultimately it is a core package making a major version bump, it will be a lot of work no matter what

Agreed it will be a lot of work. I am advocating that we let people choose how they want to do that work instead of forcing them to come through with a new release of their package and new build of the associated feedstock. If this PR is merged, and I want to remove the patch from a feedstock I maintain, it is going to be a pain and also very confusing.

Why not make an opt-in system for the API-related patches here and let folks submit PRs to add their packages if they feel they need to?

@h-vetinari
Copy link
Member Author

Numpy has too big a blast radius IMO to just leave this to shake out "naturally". It's IMO a substantial risk that regular environments start breaking when they get upgraded to numpy 2.0 due to the packages not having foreseen numpy 2.0 and lacking that constraint - that's IMO not worth the hassle of breaking users, lots of confused bug reports, stressed feedstock maintainers, and ultimately reputational damage. I'd much prefer to take our time to roll out 2.0 more judiciously than just lobbing it into the room and seeing if things go boom.

@beckermr
Copy link
Member

I'd much prefer to take our time to roll out 2.0 more judiciously than just lobbing it into the room and seeing if things go boom.

Agreed! Let's do that in a way that gives people choices instead of patching 100k artifacts at once.

@h-vetinari
Copy link
Member Author

Sorry, our answers crossed wires.

Why not make an opt-in system for the API-related patches here and let folks submit PRs to add their packages if they feel they need to?

I don't see how we could reasonably distinguish that (unless you mean leaving out noarch). IMO the much easier way to opt in would be: if a feedstock wants 2.0 support, just rebuild it after numpy 2.0 is available (which is as simple as asking the bot to rerender).

@h-vetinari
Copy link
Member Author

Let's do that in a way that gives people choices instead of patching 100k artifacts at once.

The lack of constraints in the metadata forces our hand. Publishing numpy 2.0 to main will instantly make it installable with all those packages lacking a <2 cap, so I don't see how we'd be giving people any choice in the matter.

@beckermr
Copy link
Member

I don't see how we could reasonably distinguish that

Assuming folks have been following our docs (which is all we are responsible for anyways), then their packages that build against numpy use pin_compatible in run and so have a <2 constraint already. See an example here for a package I help maintain

Screenshot 2024-04-19 at 11 33 56 PM

So all of the ABI-related breakages have already been handled.

Thus we can reasonably assume that anything left without a <2 constraint is API-related only.

@beckermr
Copy link
Member

I don't see how we'd be giving people any choice in the matter.

We could imagine lots of procedures to help folks. Here are some ideas:

  • Publish numpy 2.0 but weigh it down with several track features for a period of six months. This will prevent most installs but give people room to opt-in and see what happens. After that time, we remove the extra track features under the assumption that most of the ecosystem has moved ahead.
  • As I mentioned above, give people a few months to opt-in to a patch excluding numpy 2.0 by adding their package to a text list in this repo. We could add a linter hint for feedstocks urging them to do so, make announcements, open an issue on feedstocks warning them to do something with instructions, etc.
  • We could add a specific numpy2 mutex that would let people have complete control over using numpy2 and then bump the default value for the mutex at a later date. This is a more formal version of my first item in this list.

@jakirkham
Copy link
Member

Not to derail this important discussion, but would it be possible to look at whether there are any packages using NumPy at build, but missing an appropriate constraint at runtime?

@beckermr
Copy link
Member

Not to derail this important discussion, but would it be possible to look at whether there are any packages using NumPy at build, but missing an appropriate constraint at runtime?

Yes, this is a good question. Two ideas:

  • We can look at the recipes now and just check the meta.yaml. This will catch a lot of things.
  • For any artifact with the rendered recipes in it, we can check directly. I think the artifacts always have their recipes? This would be slow, but more complete.

We can look but ultimately folks who don't follow our docs are own their own at some level.

@h-vetinari
Copy link
Member Author

then their packages that build against numpy use pin_compatible in run and so have a <2 constraint already.

Even without pin_compatible, they'd already be getting the run-export for ~2 years if they host-depend on numpy. :)

Though there are still builds from before that time that the resolver would then take into account, e.g.

osx-arm64::tensorflow-base-2.4.1-py39h8c0364c_0.tar.bz2
osx-arm64::tensorflow-base-2.4.3-py39h34a2d98_0.tar.bz2
osx-arm64::tensorflow-estimator-2.6.0-py39h4ec10df_0.tar.bz2
-    "numpy >=1.19",
+    "numpy >=1.19,<2.0a0",

That is another side of the major risks IMO - the fact that we could be pushing the solver into a corner that hasn't been closed off, because it finds old package versions that are "compatible" while looking for ways to install numpy 2.0.

Thus we can reasonably assume that anything left without a <2 constraint is API-related only.

The various API incompatibilities are what I meant by not just releasing and waiting to see if things go boom.

We could imagine lots of procedures to help folks. Here are some ideas:

Agreed that with big hammers like track_features or mutexes we could avoid surprises, though at this point, the discussion should probably be moved to conda-forge/conda-forge.github.io#1997. :)

@beckermr
Copy link
Member

Ah sorry @h-vetinari. I was responding to the comment you said about how we would know if the runtime dep was API or ABI. Agreed that the run export helps too.

I am all for preemptively patching selected packages (e.g., tensorflow, packages we can figure out build with numpy but are not pinned correctly, other common cases) which we know will have issues.

What I do not like is patching 100k artifacts at once. We can and should be using a more delicate approach.

Also, just to be clear, as usual since I am speaking up, I am more than happy to help out with the extra work I am creating here.

@h-vetinari
Copy link
Member Author

h-vetinari commented May 10, 2024

Also, just to be clear, as usual since I am speaking up, I am more than happy to help out with the extra work I am creating here.

Kind reminder @beckermr that we need to do something here. Otherwise a lot of stuff will break (upon the release of 2.0 GA).

@beckermr
Copy link
Member

beckermr commented May 10, 2024

Thanks for the reminder. I think we should go ahead and formulate a list of big packages we know about with issues. IDK precisely which ones, but here is a possible start:

non-compiled packages from the gist above:

  • cupy
  • matplotlib-base
  • astropy
  • cuquantum
  • py-xgboost
  • lightgbm

What other packages do you think we should proactively include? I am happy with this list.

Once this PR has been restricted to those packages, we can make an announcement telling folks to add their package to the patch via a PR if they want. Then we should be good to go.

@h-vetinari
Copy link
Member Author

All packages compiled against numpy must get an upper bound. The only real discussion (to my understanding) was whether to also cap <2 for packages that are just runtime users.

@beckermr
Copy link
Member

beckermr commented May 10, 2024

All packages compiled against numpy must get an upper bound. The only real discussion (to my understanding) was whether to also cap <2 for packages that are just runtime users.

Yep and those packages already have an upper bound. So anything in the list I made above that is not compiled against numpy can be removed. Thanks for catching that!

Are there any big ones that are not compiled that you think we should patch? All of the ones above are compiled I think?

Edit: I went through the gist and added a few non-compiled ones.

@beckermr
Copy link
Member

@jakirkham what about fastparquet? Should we go ahead and patch that to numpy < 2 ahead of time?

@h-vetinari
Copy link
Member Author

Yep and those packages already have an upper bound.

Not all of them. If someone relies on numpy being present as a transitive host-dependence, it won't get the run-export (yes, you can argue that the recipe is wrong, but we don't know how many could be affected).

Skimming the list of changes from this PR, I also found cases that are curious.

For example py39 builds of astropy 4.1, which correctly did:

  host:
    - python
    - numpy
  run:
    - python
    - {{ pin_compatible("numpy") }}

(though with a superfluous - numpy >=1.16 run-req...), ends up having only a numpy >=1.19 requirement. Since we still support python 3.9 for 1.5 years, I do not want to open up such kinds of holes for the solver to fall into.

@h-vetinari
Copy link
Member Author

I think we should go ahead and formulate a list of big packages we know about with issues.

Perhaps @rgommers can provide some perspective here.

Personally, I still think patching broadly to add numpy <2 is likely the best choice overall. Realistically, nothing is ready for it, and we won't break anything by adding the cap. All the efforts to reduce the number of packages we patch will IMO surface more issues than is worth our time.

@beckermr
Copy link
Member

Patching 100k artifacts is really not going to work. It also worries me from a technical perspective of the CDN and the workflow on the anaconda backend.

I flagged astropy already above in the list. Any others that you feel are needed?

As I said before, we cannot be responsible for incorrect recipes. We can provide tools and information for folks to help themselves.

@beckermr
Copy link
Member

The streamlit app is wrong here. cc @jaimergp

I looked directly on anaconda.org and see the upper bound for numpy.

@h-vetinari
Copy link
Member Author

As I said before, we cannot be responsible for incorrect recipes. We can provide tools and information for folks to help themselves.

I'm not saying to assume responsibility for incorrect recipes. But it is our responsibility if we do something that breaks existing packages/workflows, incorrect or not. Before it was working (even if partly by accident), then it suddenly breaks. Whether we like it or not, this IMO falls under our responsibility as stewards of "keeping the show on the road", and doubly so if we foresee the possibility of a problem beforehand.

If this is even moderately widespread, it'll create a lot of negative sentiment on conda & conda-forge. I worry that (through cumulative effects) we'd end up breaking a lot of current deployments/environments, and insisting that the recipes were wrong isn't gonna buy us any favours IMO.

It also worries me from a technical perspective of the CDN and the workflow on the anaconda backend.

Can we get input on that from the anaconda folks?

@h-vetinari
Copy link
Member Author

I also assume that Anaconda will have to deal with very similar issues once they introduce numpy 2.0. Perhaps its worth having the discussion how to tackle that in a wider circle?

@beckermr
Copy link
Member

Note also that widespread patching also causes issues, especially when the local repodata differs from upstream. Not all of our solvers correctly handle that case. Last I checked they use the local repodata instead of the downloaded repodata for already installed packages.

@h-vetinari
Copy link
Member Author

Note also that widespread patching also causes issues

Yeah, there's no free lunch... I'd like to understand better what the costs are though. Prioritizing local repodata is always going to be an issue in repodata patching efforts, so it's not especially related to how many packages we patch?

Out of curiosity, I removed the noarch-packages from the packages to patch here, which would save ~30k artefacts, leaving ~70k to be patched.

@h-vetinari
Copy link
Member Author

h-vetinari commented May 10, 2024

As I said before, we cannot be responsible for incorrect recipes. We can provide tools and information for folks to help themselves.

One reason I think we cannot really make that argument in the case of numpy, is that our own tooling creates false positive warnings like:

WARNING: run-exports library package conda-forge/linux-64::numpy==1.26.4=py312heda63a1_0 in requirements/run but it is not used (i.e. it is overdepending or perhaps statically linked? If that is what you want then add it to `build/ignore_run_exports`)

That's because numpy's symbols are never linked into the binary and only loaded at runtime (therefore not detected by lief; as an aside, conda-build really should special-case numpy IMO). But if someone takes our own warning and adds it to ignore_run_exports, we'll have broken packages, and it gets much harder to say "the recipe was wrong" then.

@beckermr
Copy link
Member

Yeah we're in the weeds here on what we are and are not responsible for. Regardless of that issue or even if ananconda.org can handle the patches, I'm still not in favor because it is very intrusive. Repodata patching is fundamentally an ugly hack and while I am a big proponent of it as necessary evil, I'd like to minimize it.

@rgommers
Copy link

Realistically, nothing is ready for it,

When there's usage of the C API, then yes - but I believe that case was in good shape already? Modulo the "transitive host-dependence" corner case that is.

For regular usage of NumPy's Python API, this may be overstating the problem. The fixes in many downstream packages were fairly small. So I expect most packages to fail some of their tests, but import fine and have most of their functionality work.

I think we should go ahead and formulate a list of big packages we know about with issues.

I would add everything from numpy/numpy#26191 - it contains the exact versions that are compatible; older versions should get the constraint for Python >=3.9. That list is broad enough that I expect it to catch a lot of issues (most Python environments that use numpy are going to have one of those packages in them).

@h-vetinari
Copy link
Member Author

Thanks @rgommers. I took that list to come up with a more tightly-scoped alternative in #728

@h-vetinari
Copy link
Member Author

Superseded by #728.

@h-vetinari h-vetinari closed this May 13, 2024
@h-vetinari h-vetinari deleted the numpy2 branch May 13, 2024 13:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants