diff --git a/crates/uv-requirements/src/extras.rs b/crates/uv-requirements/src/extras.rs index a14c88f2baae9..eb66dc8c6f407 100644 --- a/crates/uv-requirements/src/extras.rs +++ b/crates/uv-requirements/src/extras.rs @@ -3,8 +3,7 @@ use std::sync::Arc; use futures::{TryStreamExt, stream::FuturesOrdered}; use uv_distribution::{DistributionDatabase, Reporter}; -use uv_distribution_types::DistributionMetadata; -use uv_distribution_types::Requirement; +use uv_distribution_types::{Identifier, Requirement}; use uv_resolver::{InMemoryIndex, MetadataResponse}; use uv_types::{BuildContext, HashStrategy}; @@ -78,7 +77,7 @@ impl<'a, Context: BuildContext> ExtrasResolver<'a, Context> { // Fetch the metadata for the distribution. let metadata = { - let id = dist.version_id(); + let id = dist.distribution_id(); if let Some(archive) = index .distributions() .get(&id) diff --git a/crates/uv-requirements/src/lookahead.rs b/crates/uv-requirements/src/lookahead.rs index 44136bdcdf369..6cb0414b9f32c 100644 --- a/crates/uv-requirements/src/lookahead.rs +++ b/crates/uv-requirements/src/lookahead.rs @@ -7,7 +7,7 @@ use tracing::trace; use uv_configuration::{Constraints, Overrides}; use uv_distribution::{DistributionDatabase, Reporter}; -use uv_distribution_types::{Dist, DistributionMetadata, Requirement, RequirementSource}; +use uv_distribution_types::{Dist, Identifier, Requirement, RequirementSource}; use uv_resolver::{InMemoryIndex, MetadataResponse, ResolverEnvironment}; use uv_types::{BuildContext, HashStrategy, RequestedRequirements}; @@ -146,7 +146,7 @@ impl<'a, Context: BuildContext> LookaheadResolver<'a, Context> { // Fetch the metadata for the distribution. let metadata = { - let id = dist.version_id(); + let id = dist.distribution_id(); if self.index.distributions().register(id.clone()) { // Run the PEP 517 build process to extract metadata from the source distribution. let archive = self diff --git a/crates/uv-requirements/src/source_tree.rs b/crates/uv-requirements/src/source_tree.rs index 51ada19a9ead5..4933f4254b514 100644 --- a/crates/uv-requirements/src/source_tree.rs +++ b/crates/uv-requirements/src/source_tree.rs @@ -10,7 +10,7 @@ use uv_configuration::ExtrasSpecification; use uv_distribution::{DistributionDatabase, FlatRequiresDist, Reporter, RequiresDist}; use uv_distribution_types::Requirement; use uv_distribution_types::{ - BuildableSource, DirectorySourceUrl, HashGeneration, HashPolicy, SourceUrl, VersionId, + BuildableSource, DirectorySourceUrl, HashGeneration, HashPolicy, Identifier, SourceUrl, }; use uv_fs::Simplified; use uv_normalize::{ExtraName, PackageName}; @@ -202,7 +202,7 @@ impl<'a, Context: BuildContext> SourceTreeResolver<'a, Context> { // Fetch the metadata for the distribution. let metadata = { - let id = VersionId::from_url(source.url()); + let id = source.distribution_id(); if self.index.distributions().register(id.clone()) { // Run the PEP 517 build process to extract metadata from the source distribution. let source = BuildableSource::Url(source); diff --git a/crates/uv-requirements/src/unnamed.rs b/crates/uv-requirements/src/unnamed.rs index 900b2d7295424..1bc03c8fe1ee5 100644 --- a/crates/uv-requirements/src/unnamed.rs +++ b/crates/uv-requirements/src/unnamed.rs @@ -11,8 +11,8 @@ use url::Host; use uv_distribution::{DistributionDatabase, Reporter}; use uv_distribution_filename::{DistExtension, SourceDistFilename, WheelFilename}; use uv_distribution_types::{ - BuildableSource, DirectSourceUrl, DirectorySourceUrl, GitSourceUrl, PathSourceUrl, - RemoteSource, Requirement, SourceUrl, VersionId, + BuildableSource, DirectSourceUrl, DirectorySourceUrl, GitSourceUrl, Identifier, PathSourceUrl, + RemoteSource, Requirement, SourceUrl, }; use uv_fs::Simplified; use uv_normalize::PackageName; @@ -276,7 +276,7 @@ impl<'a, Context: BuildContext> NamedRequirementsResolver<'a, Context> { // Fetch the metadata for the distribution. let name = { - let id = VersionId::from_url(source.url()); + let id = source.distribution_id(); if let Some(archive) = index .distributions() .get(&id) diff --git a/crates/uv-resolver/src/lock/mod.rs b/crates/uv-resolver/src/lock/mod.rs index 1349639e0d2c9..da6c7cc9afcc9 100644 --- a/crates/uv-resolver/src/lock/mod.rs +++ b/crates/uv-resolver/src/lock/mod.rs @@ -26,9 +26,9 @@ use uv_distribution_filename::{ }; use uv_distribution_types::{ BuiltDist, DependencyMetadata, DirectUrlBuiltDist, DirectUrlSourceDist, DirectorySourceDist, - Dist, DistributionMetadata, FileLocation, GitSourceDist, IndexLocations, IndexMetadata, - IndexUrl, Name, PathBuiltDist, PathSourceDist, RegistryBuiltDist, RegistryBuiltWheel, - RegistrySourceDist, RemoteSource, Requirement, RequirementSource, RequiresPython, ResolvedDist, + Dist, FileLocation, GitSourceDist, Identifier, IndexLocations, IndexMetadata, IndexUrl, Name, + PathBuiltDist, PathSourceDist, RegistryBuiltDist, RegistryBuiltWheel, RegistrySourceDist, + RemoteSource, Requirement, RequirementSource, RequiresPython, ResolvedDist, SimplifiedMarkerTree, StaticMetadata, ToUrlError, UrlString, }; use uv_fs::{PortablePath, PortablePathBuf, Simplified, relative_to}; @@ -1794,7 +1794,7 @@ impl Lock { )?; let metadata = { - let id = dist.version_id(); + let id = dist.distribution_id(); if let Some(archive) = index .distributions() @@ -1946,7 +1946,7 @@ impl Lock { )?; let metadata = { - let id = dist.version_id(); + let id = dist.distribution_id(); if let Some(archive) = index .distributions() diff --git a/crates/uv-resolver/src/pins.rs b/crates/uv-resolver/src/pins.rs index 6d0d88f655ca4..417364d38a3c8 100644 --- a/crates/uv-resolver/src/pins.rs +++ b/crates/uv-resolver/src/pins.rs @@ -1,26 +1,52 @@ +use std::collections::hash_map::Entry; + use rustc_hash::FxHashMap; -use uv_distribution_types::{CompatibleDist, ResolvedDist}; +use uv_distribution_types::{CompatibleDist, DistributionId, Identifier, ResolvedDist}; use uv_normalize::PackageName; use crate::candidate_selector::Candidate; +#[derive(Clone, Debug)] +struct FilePin { + /// The concrete distribution chosen for installation and locking. + dist: ResolvedDist, + /// The concrete distribution whose metadata was used during resolution. + metadata_id: DistributionId, +} + /// A set of package versions pinned to specific files. /// /// For example, given `Flask==3.0.0`, the [`FilePins`] would contain a mapping from `Flask` to -/// `3.0.0` to the specific wheel or source distribution archive that was pinned for that version. +/// `3.0.0` to the specific wheel or source distribution archive that was pinned for installation, +/// along with the concrete distribution whose metadata was used during resolution. #[derive(Clone, Debug, Default)] -pub(crate) struct FilePins(FxHashMap<(PackageName, uv_pep440::Version), ResolvedDist>); +pub(crate) struct FilePins(FxHashMap<(PackageName, uv_pep440::Version), FilePin>); // Inserts are common (every time we select a version) while reads are rare (converting the // final resolution). impl FilePins { /// Pin a candidate package. pub(crate) fn insert(&mut self, candidate: &Candidate, dist: &CompatibleDist) { - self.0 + let pin = FilePin { + dist: dist.for_installation().to_owned(), + metadata_id: dist.for_resolution().distribution_id(), + }; + match self + .0 .entry((candidate.name().clone(), candidate.version().clone())) - // Avoid the expensive clone when a version is selected again. - .or_insert_with(|| dist.for_installation().to_owned()); + { + Entry::Occupied(mut entry) => { + if entry.get().dist.distribution_id() != pin.dist.distribution_id() + || entry.get().metadata_id != pin.metadata_id + { + entry.insert(pin); + } + } + Entry::Vacant(entry) => { + entry.insert(pin); + } + } } /// Return the pinned file for the given package name and version, if it exists. @@ -29,6 +55,19 @@ impl FilePins { name: &PackageName, version: &uv_pep440::Version, ) -> Option<&ResolvedDist> { - self.0.get(&(name.clone(), version.clone())) + self.0 + .get(&(name.clone(), version.clone())) + .map(|pin| &pin.dist) + } + + /// Return the distribution id whose metadata was used during resolution. + pub(crate) fn metadata_id( + &self, + name: &PackageName, + version: &uv_pep440::Version, + ) -> Option<&DistributionId> { + self.0 + .get(&(name.clone(), version.clone())) + .map(|pin| &pin.metadata_id) } } diff --git a/crates/uv-resolver/src/pubgrub/distribution.rs b/crates/uv-resolver/src/pubgrub/distribution.rs deleted file mode 100644 index 125546a97f143..0000000000000 --- a/crates/uv-resolver/src/pubgrub/distribution.rs +++ /dev/null @@ -1,38 +0,0 @@ -use uv_distribution_types::{DistributionMetadata, Name, VersionOrUrlRef}; -use uv_normalize::PackageName; -use uv_pep440::Version; -use uv_pypi_types::VerbatimParsedUrl; - -#[derive(Debug)] -pub(crate) enum PubGrubDistribution<'a> { - Registry(&'a PackageName, &'a Version), - Url(&'a PackageName, &'a VerbatimParsedUrl), -} - -impl<'a> PubGrubDistribution<'a> { - pub(crate) fn from_registry(name: &'a PackageName, version: &'a Version) -> Self { - Self::Registry(name, version) - } - - pub(crate) fn from_url(name: &'a PackageName, url: &'a VerbatimParsedUrl) -> Self { - Self::Url(name, url) - } -} - -impl Name for PubGrubDistribution<'_> { - fn name(&self) -> &PackageName { - match self { - Self::Registry(name, _) => name, - Self::Url(name, _) => name, - } - } -} - -impl DistributionMetadata for PubGrubDistribution<'_> { - fn version_or_url(&self) -> VersionOrUrlRef<'_> { - match self { - Self::Registry(_, version) => VersionOrUrlRef::Version(version), - Self::Url(_, url) => VersionOrUrlRef::Url(&url.verbatim), - } - } -} diff --git a/crates/uv-resolver/src/pubgrub/mod.rs b/crates/uv-resolver/src/pubgrub/mod.rs index bd58fbc72abf4..a0c96b1509535 100644 --- a/crates/uv-resolver/src/pubgrub/mod.rs +++ b/crates/uv-resolver/src/pubgrub/mod.rs @@ -1,11 +1,9 @@ pub(crate) use crate::pubgrub::dependencies::PubGrubDependency; -pub(crate) use crate::pubgrub::distribution::PubGrubDistribution; pub use crate::pubgrub::package::{PubGrubPackage, PubGrubPackageInner, PubGrubPython}; pub(crate) use crate::pubgrub::priority::{PubGrubPriorities, PubGrubPriority, PubGrubTiebreaker}; pub(crate) use crate::pubgrub::report::PubGrubReportFormatter; mod dependencies; -mod distribution; mod package; mod priority; mod report; diff --git a/crates/uv-resolver/src/resolution/output.rs b/crates/uv-resolver/src/resolution/output.rs index f389a790b4bf5..36e0ec1e629ab 100644 --- a/crates/uv-resolver/src/resolution/output.rs +++ b/crates/uv-resolver/src/resolution/output.rs @@ -12,8 +12,8 @@ use rustc_hash::{FxBuildHasher, FxHashMap, FxHashSet}; use uv_configuration::{Constraints, Overrides}; use uv_distribution::Metadata; use uv_distribution_types::{ - Dist, DistributionMetadata, Edge, IndexUrl, Name, Node, Requirement, RequiresPython, - ResolutionDiagnostic, ResolvedDist, VersionId, VersionOrUrlRef, + Dist, DistributionId, Edge, Identifier, IndexUrl, Name, Node, Requirement, RequiresPython, + ResolutionDiagnostic, ResolvedDist, }; use uv_git::GitResolver; use uv_normalize::{ExtraName, GroupName, PackageName}; @@ -414,17 +414,18 @@ impl ResolverOutput { git: &GitResolver, ) -> Result<(ResolvedDist, HashDigests, Option), ResolveError> { Ok(if let Some(url) = url { - // Create the distribution. + // Create the locked distribution and recover the metadata using the original URL that + // was requested during resolution. let dist = Dist::from_url(name.clone(), url_to_precise(url.clone(), git))?; - - let version_id = VersionId::from_url(&url.verbatim); + let hashes_id = dist.distribution_id(); + let metadata_id = Dist::from_url(name.clone(), url.clone())?.distribution_id(); // Extract the hashes. let hashes = Self::get_hashes( name, index, Some(url), - &version_id, + &hashes_id, version, preferences, in_memory, @@ -434,13 +435,13 @@ impl ResolverOutput { let metadata = { let response = in_memory .distributions() - .get(&version_id) + .get(&metadata_id) .unwrap_or_else(|| { - panic!("Every URL distribution should have metadata: {version_id:?}") + panic!("Every URL distribution should have metadata: {metadata_id:?}") }); let MetadataResponse::Found(archive) = &*response else { - panic!("Every URL distribution should have metadata: {version_id:?}") + panic!("Every URL distribution should have metadata: {metadata_id:?}") }; archive.metadata.clone() @@ -459,8 +460,10 @@ impl ResolverOutput { .get(name, version) .expect("Every package should be pinned") .clone(); - - let version_id = dist.version_id(); + let hashes_id = dist.distribution_id(); + let metadata_id = pins + .metadata_id(name, version) + .expect("Every package should have pinned metadata"); // Track yanks for any registry distributions. match dist.yanked() { @@ -484,7 +487,7 @@ impl ResolverOutput { name, index, None, - &version_id, + &hashes_id, version, preferences, in_memory, @@ -494,7 +497,7 @@ impl ResolverOutput { let metadata = { in_memory .distributions() - .get(&version_id) + .get(metadata_id) .and_then(|response| { if let MetadataResponse::Found(archive) = &*response { Some(archive.metadata.clone()) @@ -508,13 +511,13 @@ impl ResolverOutput { }) } - /// Identify the hashes for the [`VersionId`], preserving any hashes that were provided by the - /// lockfile. + /// Identify the hashes for a concrete distribution, preserving any hashes that were provided + /// by the lockfile. fn get_hashes( name: &PackageName, index: Option<&IndexUrl>, url: Option<&VerbatimParsedUrl>, - version_id: &VersionId, + metadata_id: &DistributionId, version: &Version, preferences: &Preferences, in_memory: &InMemoryIndex, @@ -527,7 +530,7 @@ impl ResolverOutput { } // 2. Look for hashes for the distribution (i.e., the specific wheel or source distribution). - if let Some(metadata_response) = in_memory.distributions().get(version_id) { + if let Some(metadata_response) = in_memory.distributions().get(metadata_id) { if let MetadataResponse::Found(ref archive) = *metadata_response { let mut digests = archive.hashes.clone(); digests.sort_unstable(); @@ -711,21 +714,13 @@ impl ResolverOutput { let ResolutionGraphNode::Dist(dist) = &self.graph[i] else { continue; }; - let version_id = match dist.version_or_url() { - VersionOrUrlRef::Version(version) => { - VersionId::from_registry(dist.name().clone(), version.clone()) - } - VersionOrUrlRef::Url(verbatim_url) => VersionId::from_url(verbatim_url.raw()), - }; + let metadata_id = dist.dist.distribution_id(); let res = index .distributions() - .get(&version_id) + .get(&metadata_id) .expect("every package in resolution graph has metadata"); let MetadataResponse::Found(archive, ..) = &*res else { - panic!( - "Every package should have metadata: {:?}", - dist.version_id() - ) + panic!("Every package should have metadata: {metadata_id:?}") }; for req in self .constraints diff --git a/crates/uv-resolver/src/resolver/batch_prefetch.rs b/crates/uv-resolver/src/resolver/batch_prefetch.rs index 5a6253bf7c123..f8ae3b602b7e7 100644 --- a/crates/uv-resolver/src/resolver/batch_prefetch.rs +++ b/crates/uv-resolver/src/resolver/batch_prefetch.rs @@ -13,9 +13,7 @@ use crate::resolver::Request; use crate::{ InMemoryIndex, PythonRequirement, ResolveError, ResolverEnvironment, VersionsResponse, }; -use uv_distribution_types::{ - CompatibleDist, DistributionMetadata, IndexCapabilities, IndexMetadata, -}; +use uv_distribution_types::{CompatibleDist, Identifier, IndexCapabilities, IndexMetadata}; use uv_normalize::PackageName; use uv_pep440::Version; use uv_pep508::MarkerTree; @@ -315,7 +313,7 @@ impl BatchPrefetcherRunner { ); prefetch_count += 1; - if self.index.distributions().register(candidate.version_id()) { + if self.index.distributions().register(dist.distribution_id()) { let request = Request::from(dist); self.request_sink.blocking_send(request)?; } diff --git a/crates/uv-resolver/src/resolver/index.rs b/crates/uv-resolver/src/resolver/index.rs index 222a9370876fc..d70f61b136531 100644 --- a/crates/uv-resolver/src/resolver/index.rs +++ b/crates/uv-resolver/src/resolver/index.rs @@ -2,7 +2,7 @@ use std::hash::BuildHasherDefault; use std::sync::Arc; use rustc_hash::FxHasher; -use uv_distribution_types::{IndexUrl, VersionId}; +use uv_distribution_types::{DistributionId, IndexUrl}; use uv_normalize::PackageName; use uv_once_map::OnceMap; @@ -20,8 +20,8 @@ struct SharedInMemoryIndex { explicit: FxOnceMap<(PackageName, IndexUrl), Arc>, - /// A map from package ID to metadata for that distribution. - distributions: FxOnceMap>, + /// A map from a concrete distribution to its metadata. + distributions: FxOnceMap>, } pub(crate) type FxOnceMap = OnceMap>; @@ -38,7 +38,7 @@ impl InMemoryIndex { } /// Returns a reference to the distribution metadata map. - pub fn distributions(&self) -> &FxOnceMap> { + pub fn distributions(&self) -> &FxOnceMap> { &self.0.distributions } } diff --git a/crates/uv-resolver/src/resolver/mod.rs b/crates/uv-resolver/src/resolver/mod.rs index 557084e7cdb0e..bb4e5ac4e9795 100644 --- a/crates/uv-resolver/src/resolver/mod.rs +++ b/crates/uv-resolver/src/resolver/mod.rs @@ -23,10 +23,10 @@ use tracing::{Level, debug, info, instrument, trace, warn}; use uv_configuration::{Constraints, Excludes, Overrides}; use uv_distribution::{ArchiveMetadata, DistributionDatabase}; use uv_distribution_types::{ - BuiltDist, CompatibleDist, DerivationChain, Dist, DistErrorKind, DistributionMetadata, - IncompatibleDist, IncompatibleSource, IncompatibleWheel, IndexCapabilities, IndexLocations, - IndexMetadata, IndexUrl, InstalledDist, Name, PythonRequirementKind, RemoteSource, Requirement, - ResolvedDist, ResolvedDistRef, SourceDist, VersionOrUrlRef, implied_markers, + BuiltDist, CompatibleDist, DerivationChain, Dist, DistErrorKind, Identifier, IncompatibleDist, + IncompatibleSource, IncompatibleWheel, IndexCapabilities, IndexLocations, IndexMetadata, + IndexUrl, InstalledDist, Name, PythonRequirementKind, RemoteSource, Requirement, ResolvedDist, + ResolvedDistRef, SourceDist, VersionOrUrlRef, implied_markers, }; use uv_git::GitResolver; use uv_normalize::{ExtraName, GroupName, PackageName}; @@ -50,8 +50,7 @@ use crate::manifest::Manifest; use crate::pins::FilePins; use crate::preferences::{PreferenceSource, Preferences}; use crate::pubgrub::{ - PubGrubDependency, PubGrubDistribution, PubGrubPackage, PubGrubPackageInner, PubGrubPriorities, - PubGrubPython, + PubGrubDependency, PubGrubPackage, PubGrubPackageInner, PubGrubPriorities, PubGrubPython, }; use crate::python_requirement::PythonRequirement; use crate::resolution::ResolverOutput; @@ -1004,7 +1003,7 @@ impl ResolverState ResolverState ResolverState &dist.best_wheel().filename, BuiltDist::DirectUrl(dist) => &dist.filename, @@ -1668,7 +1667,8 @@ impl ResolverState ResolverState ResolverState, ) -> Result { - let url = package.name().and_then(|name| fork_urls.get(name)); let dependencies = match &**package { PubGrubPackageInner::Root(_) => { let no_dev_deps = BTreeMap::default(); @@ -1811,12 +1810,24 @@ impl ResolverState PubGrubDistribution::from_url(name, url), - None => PubGrubDistribution::from_registry(name, version), + let (distribution_id, task) = if let Some(distribution_id) = + pins.metadata_id(name, version) + { + ( + distribution_id.clone(), + pins.get(name, version) + .map_or_else(|| format!("{name}=={version}"), ToString::to_string), + ) + } else if let Some(url) = fork_urls.get(name) { + let dist = Dist::from_url(name.clone(), url.clone())?; + (dist.distribution_id(), dist.to_string()) + } else { + debug_assert!( + false, + "Dependencies were requested for a package without a pinned distribution" + ); + return Err(ResolveError::UnregisteredTask(format!("{name}=={version}"))); }; - let version_id = dist.version_id(); // If the package does not exist in the registry or locally, we cannot fetch its dependencies if self.dependency_mode.is_transitive() @@ -1834,8 +1845,8 @@ impl ResolverState &archive.metadata, @@ -2361,7 +2372,7 @@ impl ResolverState { let dist_kind = match dist { @@ -2380,7 +2391,7 @@ impl ResolverState {} } @@ -2630,8 +2641,9 @@ impl ResolverState Result<()> { Ok(()) } +/// Ref: +#[test] +fn conditional_sources_keep_default_platform_specific_transitive_dependencies() -> Result<()> { + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-02-06T00:00Z"); + + let pyproject_toml = context.temp_dir.child("pyproject.toml"); + pyproject_toml.write_str( + r#" + [project] + name = "test-torch" + version = "0.1.0" + requires-python = "==3.12.*" + dependencies = ["torch>=2.6.0,<2.7.0"] + + [project.optional-dependencies] + cpu = ["torch>=2.6.0,<2.7.0"] + cu124 = ["torch>=2.6.0,<2.7.0"] + + [tool.uv] + conflicts = [ + [{ extra = "cpu" }, { extra = "cu124" }], + ] + + [[tool.uv.index]] + name = "pytorch-cu124" + url = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" + default = true + + [[tool.uv.index]] + name = "pytorch-cpu" + url = "https://astral-sh.github.io/pytorch-mirror/whl/cpu" + explicit = true + + [tool.uv.sources] + torch = [ + { index = "pytorch-cpu", extra = "cpu" }, + ] + "#, + )?; + + uv_snapshot!(context.filters(), context.lock(), @" + success: true + exit_code: 0 + ----- stdout ----- + + ----- stderr ----- + Resolved 27 packages in [TIME] + "); + + let lock = context.read("uv.lock"); + insta::with_settings!({ + filters => context.filters(), + }, { + assert_snapshot!( + lock, + @r#" + version = 1 + revision = 3 + requires-python = "==3.12.*" + resolution-markers = [ + "extra != 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124'", + "sys_platform != 'darwin' and extra == 'extra-10-test-torch-cpu' and extra != 'extra-10-test-torch-cu124'", + "sys_platform == 'darwin' and extra == 'extra-10-test-torch-cpu' and extra != 'extra-10-test-torch-cu124'", + "extra != 'extra-10-test-torch-cpu' and extra != 'extra-10-test-torch-cu124'", + ] + conflicts = [[ + { package = "test-torch", extra = "cpu" }, + { package = "test-torch", extra = "cu124" }, + ]] + + [options] + exclude-newer = "2025-02-06T00:00:00Z" + + [[package]] + name = "filelock" + version = "3.13.1" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/filelock-3.13.1-py3-none-any.whl", upload-time = "2025-01-29T22:50:56.834Z" }, + ] + + [[package]] + name = "fsspec" + version = "2024.6.1" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/fsspec-2024.6.1-py3-none-any.whl", upload-time = "2025-01-29T22:50:56.915Z" }, + ] + + [[package]] + name = "jinja2" + version = "3.1.4" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + dependencies = [ + { name = "markupsafe" }, + ] + wheels = [ + { url = "https://download.pytorch.org/whl/Jinja2-3.1.4-py3-none-any.whl", upload-time = "2025-01-29T22:50:57.275Z" }, + ] + + [[package]] + name = "markupsafe" + version = "2.1.5" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + sdist = { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5.tar.gz", upload-time = "2025-01-29T22:50:57.539Z" } + wheels = [ + { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", upload-time = "2025-01-29T22:50:57.538Z" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", upload-time = "2025-01-29T22:50:57.539Z" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", upload-time = "2025-01-29T22:50:57.539Z" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", upload-time = "2025-01-29T22:50:57.539Z" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", upload-time = "2025-01-29T22:50:57.539Z" }, + { url = "https://download.pytorch.org/whl/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", upload-time = "2025-01-29T22:50:57.539Z" }, + ] + + [[package]] + name = "mpmath" + version = "1.3.0" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", upload-time = "2025-01-29T22:50:57.683Z" }, + ] + + [[package]] + name = "networkx" + version = "3.3" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/networkx-3.3-py3-none-any.whl", upload-time = "2025-01-29T22:50:57.843Z" }, + ] + + [[package]] + name = "nvidia-cublas-cu12" + version = "12.4.5.8" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3", upload-time = "2025-01-29T22:51:38.991Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b", upload-time = "2025-01-29T22:51:38.991Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cublas_cu12-12.4.5.8-py3-none-win_amd64.whl", hash = "sha256:5a796786da89203a0657eda402bcdcec6180254a8ac22d72213abc42069522dc", upload-time = "2025-01-29T22:51:38.992Z" }, + ] + + [[package]] + name = "nvidia-cuda-cupti-cu12" + version = "12.4.127" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a", upload-time = "2025-01-29T22:51:39.068Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb", upload-time = "2025-01-29T22:51:39.068Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cuda_cupti_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:5688d203301ab051449a2b1cb6690fbe90d2b372f411521c86018b950f3d7922", upload-time = "2025-01-29T22:51:39.069Z" }, + ] + + [[package]] + name = "nvidia-cuda-nvrtc-cu12" + version = "12.4.127" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198", upload-time = "2025-01-29T22:51:39.138Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338", upload-time = "2025-01-29T22:51:39.138Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:a961b2f1d5f17b14867c619ceb99ef6fcec12e46612711bcec78eb05068a60ec", upload-time = "2025-01-29T22:51:39.139Z" }, + ] + + [[package]] + name = "nvidia-cuda-runtime-cu12" + version = "12.4.127" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3", upload-time = "2025-01-29T22:51:39.232Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5", upload-time = "2025-01-29T22:51:39.232Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cuda_runtime_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:09c2e35f48359752dfa822c09918211844a3d93c100a715d79b59591130c5e1e", upload-time = "2025-01-29T22:51:39.232Z" }, + ] + + [[package]] + name = "nvidia-cudnn-cu12" + version = "9.1.0.70" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + dependencies = [ + { name = "nvidia-cublas-cu12" }, + ] + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", upload-time = "2025-01-29T22:51:39.303Z" }, + ] + + [[package]] + name = "nvidia-cufft-cu12" + version = "11.2.1.3" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + dependencies = [ + { name = "nvidia-nvjitlink-cu12" }, + ] + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399", upload-time = "2025-01-29T22:51:39.382Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9", upload-time = "2025-01-29T22:51:39.382Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cufft_cu12-11.2.1.3-py3-none-win_amd64.whl", hash = "sha256:d802f4954291101186078ccbe22fc285a902136f974d369540fd4a5333d1440b", upload-time = "2025-01-29T22:51:39.382Z" }, + ] + + [[package]] + name = "nvidia-curand-cu12" + version = "10.3.5.147" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9", upload-time = "2025-01-29T22:51:39.466Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b", upload-time = "2025-01-29T22:51:39.467Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_curand_cu12-10.3.5.147-py3-none-win_amd64.whl", hash = "sha256:f307cc191f96efe9e8f05a87096abc20d08845a841889ef78cb06924437f6771", upload-time = "2025-01-29T22:51:39.467Z" }, + ] + + [[package]] + name = "nvidia-cusolver-cu12" + version = "11.6.1.9" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + dependencies = [ + { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cusparse-cu12" }, + { name = "nvidia-nvjitlink-cu12" }, + ] + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e", upload-time = "2025-01-29T22:51:39.551Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260", upload-time = "2025-01-29T22:51:39.551Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cusolver_cu12-11.6.1.9-py3-none-win_amd64.whl", hash = "sha256:e77314c9d7b694fcebc84f58989f3aa4fb4cb442f12ca1a9bde50f5e8f6d1b9c", upload-time = "2025-01-29T22:51:39.551Z" }, + ] + + [[package]] + name = "nvidia-cusparse-cu12" + version = "12.3.1.170" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + dependencies = [ + { name = "nvidia-nvjitlink-cu12" }, + ] + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3", upload-time = "2025-01-29T22:51:39.648Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1", upload-time = "2025-01-29T22:51:39.648Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cusparse_cu12-12.3.1.170-py3-none-win_amd64.whl", hash = "sha256:9bc90fb087bc7b4c15641521f31c0371e9a612fc2ba12c338d3ae032e6b6797f", upload-time = "2025-01-29T22:51:39.648Z" }, + ] + + [[package]] + name = "nvidia-cusparselt-cu12" + version = "0.6.2" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", upload-time = "2025-01-29T22:51:39.74Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", upload-time = "2025-01-29T22:51:39.74Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_cusparselt_cu12-0.6.2-py3-none-win_amd64.whl", upload-time = "2025-01-29T22:51:39.74Z" }, + ] + + [[package]] + name = "nvidia-nccl-cu12" + version = "2.21.5" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0", upload-time = "2025-01-29T22:51:39.917Z" }, + { url = "https://download.pytorch.org/whl/nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0", upload-time = "2025-01-29T22:50:58.013Z" }, + ] + + [[package]] + name = "nvidia-nvjitlink-cu12" + version = "12.4.127" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83", upload-time = "2025-01-29T22:51:40.008Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57", upload-time = "2025-01-29T22:51:40.008Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1", upload-time = "2025-01-29T22:51:40.008Z" }, + ] + + [[package]] + name = "nvidia-nvtx-cu12" + version = "12.4.127" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3", upload-time = "2025-01-29T22:51:40.099Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a", upload-time = "2025-01-29T22:51:40.099Z" }, + { url = "https://download.pytorch.org/whl/cu124/nvidia_nvtx_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:641dccaaa1139f3ffb0d3164b4b84f9d253397e38246a4f2f36728b48566d485", upload-time = "2025-01-29T22:51:40.099Z" }, + ] + + [[package]] + name = "setuptools" + version = "70.2.0" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl", upload-time = "2025-01-29T22:50:58.769Z" }, + ] + + [[package]] + name = "sympy" + version = "1.13.1" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + dependencies = [ + { name = "mpmath" }, + ] + wheels = [ + { url = "https://download.pytorch.org/whl/sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8", upload-time = "2025-01-29T22:50:58.85Z" }, + ] + + [[package]] + name = "test-torch" + version = "0.1.0" + source = { virtual = "." } + dependencies = [ + { name = "torch", version = "2.6.0", source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cpu" }, marker = "(sys_platform == 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "torch", version = "2.6.0+cpu", source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cpu" }, marker = "(sys_platform != 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "torch", version = "2.6.0+cu124", source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" }, marker = "extra == 'extra-10-test-torch-cu124' or extra != 'extra-10-test-torch-cpu'" }, + ] + + [package.optional-dependencies] + cpu = [ + { name = "torch", version = "2.6.0", source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cpu" }, marker = "(sys_platform == 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "torch", version = "2.6.0+cpu", source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cpu" }, marker = "(sys_platform != 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + ] + cu124 = [ + { name = "torch", version = "2.6.0+cu124", source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } }, + ] + + [package.metadata] + requires-dist = [ + { name = "torch", specifier = ">=2.6.0,<2.7.0" }, + { name = "torch", marker = "extra == 'cpu'", specifier = ">=2.6.0,<2.7.0", index = "https://astral-sh.github.io/pytorch-mirror/whl/cpu", conflict = { package = "test-torch", extra = "cpu" } }, + { name = "torch", marker = "extra == 'cu124'", specifier = ">=2.6.0,<2.7.0" }, + ] + provides-extras = ["cpu", "cu124"] + + [[package]] + name = "torch" + version = "2.6.0" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cpu" } + resolution-markers = [ + "sys_platform == 'darwin'", + ] + dependencies = [ + { name = "filelock", marker = "(sys_platform == 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "fsspec", marker = "(sys_platform == 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "jinja2", marker = "(sys_platform == 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "networkx", marker = "(sys_platform == 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "setuptools", marker = "(sys_platform == 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "sympy", marker = "(sys_platform == 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "typing-extensions", marker = "(sys_platform == 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + ] + wheels = [ + { url = "https://download.pytorch.org/whl/cpu/torch-2.6.0-cp312-none-macosx_11_0_arm64.whl", upload-time = "2025-01-29T22:50:59.085Z" }, + ] + + [[package]] + name = "torch" + version = "2.6.0+cpu" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cpu" } + resolution-markers = [ + "sys_platform != 'darwin'", + ] + dependencies = [ + { name = "filelock", marker = "(sys_platform != 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "fsspec", marker = "(sys_platform != 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "jinja2", marker = "(sys_platform != 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "networkx", marker = "(sys_platform != 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "setuptools", marker = "(sys_platform != 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "sympy", marker = "(sys_platform != 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "typing-extensions", marker = "(sys_platform != 'darwin' and extra == 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + ] + wheels = [ + { url = "https://download.pytorch.org/whl/cpu/torch-2.6.0%2Bcpu-cp312-cp312-linux_x86_64.whl", upload-time = "2025-01-29T22:50:59.085Z" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.6.0%2Bcpu-cp312-cp312-manylinux_2_28_aarch64.whl", upload-time = "2025-01-29T22:50:59.085Z" }, + { url = "https://download.pytorch.org/whl/cpu/torch-2.6.0%2Bcpu-cp312-cp312-win_amd64.whl", upload-time = "2025-01-29T22:50:59.085Z" }, + ] + + [[package]] + name = "torch" + version = "2.6.0+cu124" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx" }, + { name = "nvidia-cublas-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-cuda-cupti-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-cuda-runtime-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-cudnn-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-cufft-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-curand-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-cusolver-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-cusparse-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-cusparselt-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-nccl-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "nvidia-nvtx-cu12", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "setuptools", marker = "extra == 'extra-10-test-torch-cu124' or extra != 'extra-10-test-torch-cpu'" }, + { name = "sympy", marker = "extra == 'extra-10-test-torch-cu124' or extra != 'extra-10-test-torch-cpu'" }, + { name = "triton", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-10-test-torch-cpu') or (extra == 'extra-10-test-torch-cpu' and extra == 'extra-10-test-torch-cu124')" }, + { name = "typing-extensions" }, + ] + wheels = [ + { url = "https://download.pytorch.org/whl/cu124/torch-2.6.0%2Bcu124-cp312-cp312-linux_x86_64.whl", upload-time = "2025-01-29T22:51:41.169Z" }, + { url = "https://download.pytorch.org/whl/cu124/torch-2.6.0%2Bcu124-cp312-cp312-win_amd64.whl", upload-time = "2025-01-29T22:51:41.169Z" }, + ] + + [[package]] + name = "triton" + version = "3.2.0" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/triton-3.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", upload-time = "2025-01-29T22:51:00.867Z" }, + { url = "https://download.pytorch.org/whl/triton-3.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", upload-time = "2025-01-29T22:51:00.867Z" }, + ] + + [[package]] + name = "typing-extensions" + version = "4.12.2" + source = { registry = "https://astral-sh.github.io/pytorch-mirror/whl/cu124" } + wheels = [ + { url = "https://download.pytorch.org/whl/typing_extensions-4.12.2-py3-none-any.whl", upload-time = "2025-01-29T22:51:00.933Z" }, + ] + "# + ); + }); + + uv_snapshot!( + context.filters(), + context + .sync() + .arg("--frozen") + .arg("--dry-run") + .arg("--python-platform") + .arg("x86_64-manylinux2014"), + @" + success: true + exit_code: 0 + ----- stdout ----- + + ----- stderr ----- + Would use project environment at: .venv + Would download 24 packages + Would install 24 packages + + filelock==3.13.1 + + fsspec==2024.6.1 + + jinja2==3.1.4 + + markupsafe==2.1.5 + + mpmath==1.3.0 + + networkx==3.3 + + nvidia-cublas-cu12==12.4.5.8 + + nvidia-cuda-cupti-cu12==12.4.127 + + nvidia-cuda-nvrtc-cu12==12.4.127 + + nvidia-cuda-runtime-cu12==12.4.127 + + nvidia-cudnn-cu12==9.1.0.70 + + nvidia-cufft-cu12==11.2.1.3 + + nvidia-curand-cu12==10.3.5.147 + + nvidia-cusolver-cu12==11.6.1.9 + + nvidia-cusparse-cu12==12.3.1.170 + + nvidia-cusparselt-cu12==0.6.2 + + nvidia-nccl-cu12==2.21.5 + + nvidia-nvjitlink-cu12==12.4.127 + + nvidia-nvtx-cu12==12.4.127 + + setuptools==70.2.0 + + sympy==1.13.1 + + torch==2.6.0+cu124 + + triton==3.2.0 + + typing-extensions==4.12.2 + "); + + Ok(()) +} + /// Ref: #[test] fn avoids_exponential_lock_file_growth() -> Result<()> {