From 3c0bf483ca017fe7f9244c46300f99d75cbb8212 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Fri, 24 Nov 2023 16:40:44 +0100 Subject: [PATCH 1/9] connectivity refactor --- core/src/allocation.jl | 61 ++++------ core/src/bmi.jl | 19 ++- core/src/create.jl | 89 +++++++------- core/src/io.jl | 24 ++-- core/src/solve.jl | 228 +++++++++++++++++------------------ core/src/utils.jl | 100 ++++++++++----- core/test/allocation_test.jl | 13 +- core/test/control_test.jl | 4 +- core/test/validation_test.jl | 4 +- docs/contribute/addnode.qmd | 3 +- 10 files changed, 281 insertions(+), 264 deletions(-) diff --git a/core/src/allocation.jl b/core/src/allocation.jl index b9ae8d24c..d07804f4b 100644 --- a/core/src/allocation.jl +++ b/core/src/allocation.jl @@ -3,8 +3,7 @@ Find all nodes in the subnetwork which will be used in the allocation network. Some nodes are skipped to optimize allocation optimization. """ function allocation_graph_used_nodes!(p::Parameters, allocation_network_id::Int)::Nothing - (; connectivity) = p - (; graph) = connectivity + (; graph) = p node_ids = graph[].node_ids[allocation_network_id] used_nodes = Set{NodeID}() @@ -69,8 +68,7 @@ function find_allocation_graph_edges!( p::Parameters, allocation_network_id::Int, )::Tuple{Vector{Vector{NodeID}}, SparseMatrixCSC{Float64, Int}} - (; connectivity, user) = p - (; graph) = connectivity + (; graph) = p edges_composite = Vector{NodeID}[] capacity = spzeros(nv(graph), nv(graph)) @@ -154,8 +152,7 @@ function process_allocation_graph_edges!( p::Parameters, allocation_network_id::Int, )::SparseMatrixCSC{Float64, Int} - (; connectivity) = p - (; graph) = connectivity + (; graph) = p node_ids = graph[].node_ids[allocation_network_id] edge_ids = graph[].edge_ids[allocation_network_id] @@ -244,8 +241,7 @@ end The source nodes must only have one allocation outneighbor and no allocation inneighbors. """ function valid_sources(p::Parameters, allocation_network_id::Int)::Bool - (; connectivity) = p - (; graph) = connectivity + (; graph) = p edge_ids = graph[].edge_ids[allocation_network_id] @@ -279,8 +275,7 @@ end Remove allocation user return flow edges that are upstream of the user itself. """ function avoid_using_own_returnflow!(p::Parameters, allocation_network_id::Int)::Nothing - (; connectivity) = p - (; graph) = connectivity + (; graph) = p node_ids = graph[].node_ids[allocation_network_id] edge_ids = graph[].edge_ids[allocation_network_id] node_ids_user = [node_id for node_id in node_ids if graph[node_id].type == :user] @@ -334,8 +329,7 @@ function add_variables_flow!( p::Parameters, allocation_network_id::Int, )::Nothing - (; connectivity) = p - (; graph) = connectivity + (; graph) = p edge_ids = graph[].edge_ids[allocation_network_id] problem[:F] = JuMP.@variable(problem, F[edge_id = edge_ids,] >= 0.0) return nothing @@ -353,8 +347,7 @@ function add_variables_absolute_value!( allocation_network_id::Int, config::Config, )::Nothing - (; connectivity) = p - (; graph) = connectivity + (; graph) = p node_ids = graph[].node_ids[allocation_network_id] node_ids_user = [node_id for node_id in node_ids if graph[node_id].type == :user] if startswith(config.allocation.objective_type, "linear") @@ -377,8 +370,7 @@ function add_constraints_capacity!( p::Parameters, allocation_network_id::Int, )::Nothing - (; connectivity) = p - (; graph) = connectivity + (; graph) = p F = problem[:F] edge_ids = graph[].edge_ids[allocation_network_id] edge_ids_finite_capacity = Tuple{NodeID, NodeID}[] @@ -409,8 +401,7 @@ function add_constraints_source!( p::Parameters, allocation_network_id::Int, )::Nothing - (; connectivity) = p - (; graph) = connectivity + (; graph) = p edge_ids = graph[].edge_ids[allocation_network_id] edge_ids_source = [ edge_id for edge_id in edge_ids if @@ -466,8 +457,7 @@ function add_constraints_flow_conservation!( p::Parameters, allocation_network_id::Int, )::Nothing - (; connectivity) = p - (; graph) = connectivity + (; graph) = p F = problem[:F] node_ids = graph[].node_ids[allocation_network_id] node_ids_basin = [node_id for node_id in node_ids if graph[node_id].type == :basin] @@ -498,8 +488,7 @@ function add_constraints_user_returnflow!( p::Parameters, allocation_network_id::Int, )::Nothing - (; connectivity, user) = p - (; graph) = connectivity + (; graph, user) = p F = problem[:F] node_ids = graph[].node_ids[allocation_network_id] @@ -531,8 +520,7 @@ function add_constraints_absolute_value!( allocation_network_id::Int, config::Config, )::Nothing - (; connectivity) = p - (; graph) = connectivity + (; graph) = p node_ids = graph[].node_ids[allocation_network_id] objective_type = config.allocation.objective_type @@ -658,8 +646,7 @@ function set_objective_priority!( priority_idx::Int, )::Nothing (; objective_type, problem, allocation_network_id) = allocation_model - (; connectivity, user) = p - (; graph) = connectivity + (; graph, user) = p (; demand, node_id) = user edge_ids = graph[].edge_ids[allocation_network_id] @@ -731,12 +718,10 @@ function assign_allocations!( priority_idx::Int, )::Nothing (; problem, allocation_network_id) = allocation_model - (; connectivity, user) = p - (; graph, flow) = connectivity + (; graph, user) = p (; record) = user edge_ids = graph[].edge_ids[allocation_network_id] F = problem[:F] - flow = get_tmp(flow, 0) for edge_id in edge_ids user_node_id = edge_id[2] if graph[user_node_id].type != :user @@ -755,7 +740,10 @@ function assign_allocations!( push!(record.allocated, allocated) # TODO: This is now the last abstraction before the allocation update, # should be the average abstraction since the last allocation solve - push!(record.abstracted, flow[inflow_id(graph, user_node_id), user_node_id]) + push!( + record.abstracted, + get_flow(graph, inflow_id(graph, user_node_id), user_node_id), + ) end return nothing end @@ -765,18 +753,18 @@ Set the source flows as capacities on threir edges in the allocation problem. """ function set_source_flows!(allocation_model::AllocationModel, p::Parameters)::Nothing (; problem) = allocation_model - (; connectivity) = p - (; graph) = connectivity + (; graph) = p (; allocation_network_id) = allocation_model edge_ids = graph[].edge_ids[allocation_network_id] source_constraints = problem[:source] # It is assumed that the allocation procedure does not have to be differentiated. - flow = get_tmp(p.connectivity.flow, 0) - for edge_id in edge_ids if graph[edge_id...].allocation_network_id_source == allocation_network_id - JuMP.set_normalized_rhs(source_constraints[edge_id], flow[edge_id...]) + JuMP.set_normalized_rhs( + source_constraints[edge_id], + get_flow(graph, edge_id..., 0), + ) end end return nothing @@ -793,8 +781,7 @@ function adjust_edge_capacities!( p::Parameters, priority_idx::Int, )::Nothing - (; connectivity) = p - (; graph) = connectivity + (; graph) = p (; problem, capacity, allocation_network_id) = allocation_model edge_ids = graph[].edge_ids[allocation_network_id] constraints_capacity = problem[:capacity] diff --git a/core/src/bmi.jl b/core/src/bmi.jl index 24bb5260d..fc89e9aa6 100644 --- a/core/src/bmi.jl +++ b/core/src/bmi.jl @@ -40,11 +40,11 @@ function BMI.initialize(T::Type{Model}, config::Config)::Model error("Invalid discrete control state definition(s).") end - (; pid_control, connectivity, basin, pump, outlet, fractional_flow) = parameters + (; pid_control, basin, pump, graph, fractional_flow) = parameters if !valid_pid_connectivity( pid_control.node_id, pid_control.listen_node_id, - connectivity.graph, + graph, basin.node_id, pump.node_id, ) @@ -52,7 +52,7 @@ function BMI.initialize(T::Type{Model}, config::Config)::Model end if !valid_fractional_flow( - connectivity.graph, + graph, fractional_flow.node_id, fractional_flow.control_mapping, ) @@ -394,7 +394,7 @@ function discrete_control_affect!( upcrossing::Union{Bool, Missing}, )::Bool p = integrator.p - (; discrete_control, connectivity) = p + (; discrete_control, graph) = p # Get the discrete_control node that listens to this condition discrete_control_node_id = discrete_control.node_id[condition_idx] @@ -454,11 +454,8 @@ function discrete_control_affect!( push!(record.control_state, control_state_new) # Loop over nodes which are under control of this control node - for target_node_id in outneighbor_labels_type( - connectivity.graph, - discrete_control_node_id, - EdgeType.control, - ) + for target_node_id in + outneighbor_labels_type(graph, discrete_control_node_id, EdgeType.control) set_control_params!(p, target_node_id, control_state_new) end @@ -469,7 +466,7 @@ function discrete_control_affect!( end function set_control_params!(p::Parameters, node_id::NodeID, control_state::String) - node = getfield(p, p.connectivity.graph[node_id].type) + node = getfield(p, graph[node_id].type) idx = searchsortedfirst(node.node_id, node_id) new_state = node.control_mapping[(node_id, control_state)] @@ -483,7 +480,7 @@ end "Copy the current flow to the SavedValues" function save_flow(u, t, integrator) - copy(nonzeros(get_tmp(integrator.p.connectivity.flow, u))) + copy(get_tmp(integrator.p.graph[].flow, 0.0)) end "Load updates from 'Basin / time' into the parameters" diff --git a/core/src/create.jl b/core/src/create.jl index 54b989628..5481f5fe1 100644 --- a/core/src/create.jl +++ b/core/src/create.jl @@ -196,49 +196,49 @@ end const nonconservative_nodetypes = Set{String}(["Basin", "LevelBoundary", "FlowBoundary", "Terminal", "User"]) -function Connectivity(db::DB, config::Config, chunk_size::Int)::Connectivity - if !valid_edge_types(db) - error("Invalid edge types found.") - end - - graph = create_graph(db) - - # Build the sparsity structure of the flow matrix - flow = spzeros(nv(graph), nv(graph)) - for e in edges(graph) - id_src = label_for(graph, e.src) - id_dst = label_for(graph, e.dst) - edge_metadata = graph[id_src, id_dst] - if edge_metadata.type == EdgeType.flow - flow[id_src, id_dst] = 1.0 - end - end - - # Add a self-loop, i.e. an entry on the diagonal, for all non-conservative node types. - # This is used to store the gain (positive) or loss (negative) for the water balance. - # Note that this only affects the sparsity structure. - # We want to do it here to avoid changing that during the simulation and keeping it predictable, - # e.g. if we wouldn't do this, inactive nodes can appear if control turns them on during runtime. - for (i, nodetype) in enumerate(get_nodetypes(db)) - if nodetype in nonconservative_nodetypes - flow[i, i] = 1.0 - end - end - flow .= 0.0 - - if config.solver.autodiff - # FixedSizeDiffCache performs better for sparse matrix - flow = FixedSizeDiffCache(flow, chunk_size) - end - - allocation_models = AllocationModel[] - - return Connectivity(graph, flow, allocation_models) -end +# function Connectivity(db::DB, config::Config, chunk_size::Int)::Connectivity +# if !valid_edge_types(db) +# error("Invalid edge types found.") +# end + +# graph = create_graph(db) + +# # Build the sparsity structure of the flow matrix +# flow = spzeros(nv(graph), nv(graph)) +# for e in edges(graph) +# id_src = label_for(graph, e.src) +# id_dst = label_for(graph, e.dst) +# edge_metadata = graph[id_src, id_dst] +# if edge_metadata.type == EdgeType.flow +# flow[id_src, id_dst] = 1.0 +# end +# end + +# # Add a self-loop, i.e. an entry on the diagonal, for all non-conservative node types. +# # This is used to store the gain (positive) or loss (negative) for the water balance. +# # Note that this only affects the sparsity structure. +# # We want to do it here to avoid changing that during the simulation and keeping it predictable, +# # e.g. if we wouldn't do this, inactive nodes can appear if control turns them on during runtime. +# for (i, nodetype) in enumerate(get_nodetypes(db)) +# if nodetype in nonconservative_nodetypes +# flow[i, i] = 1.0 +# end +# end +# flow .= 0.0 + +# if config.solver.autodiff +# # FixedSizeDiffCache performs better for sparse matrix +# flow = FixedSizeDiffCache(flow, chunk_size) +# end + +# allocation_models = AllocationModel[] + +# return Connectivity(graph, flow, allocation_models) +# end function generate_allocation_models!(p::Parameters, config::Config)::Nothing - (; connectivity) = p - (; allocation_models, graph) = connectivity + (; graph) = p + (; allocation_models) = graph[] for allocation_network_id in keys(graph[].node_ids) push!( @@ -771,8 +771,6 @@ function User(db::DB, config::Config)::User abstracted = Vector{Float64}(), ) - allocation_optimized = BitVector(zeros(UInt8, length(node_ids))) - return User( NodeID.(node_ids), active, @@ -788,8 +786,7 @@ end function Parameters(db::DB, config::Config)::Parameters n_states = length(get_ids(db, "Basin")) + length(get_ids(db, "PidControl")) chunk_size = pickchunksize(n_states) - - connectivity = Connectivity(db, config, chunk_size) + graph = create_graph(db, config, chunk_size) linear_resistance = LinearResistance(db, config) manning_resistance = ManningResistance(db, config) @@ -821,7 +818,7 @@ function Parameters(db::DB, config::Config)::Parameters p = Parameters( config.starttime, - connectivity, + graph, basin, linear_resistance, manning_resistance, diff --git a/core/src/io.jl b/core/src/io.jl index 406a77da9..6136b832d 100644 --- a/core/src/io.jl +++ b/core/src/io.jl @@ -170,29 +170,31 @@ end function flow_table(model::Model)::NamedTuple (; config, saved_flow, integrator) = model (; t, saveval) = saved_flow - (; connectivity) = integrator.p - (; graph) = connectivity + (; graph) = integrator.p - I, J, _ = findnz(get_tmp(connectivity.flow, 0)) # self-loops have no edge ID - # unique_edge_ids = [get(connectivity.edge_ids_flow, ij, missing) for ij in zip(I, J)] + from_node_id = Int[] + to_node_id = Int[] unique_edge_ids_flow = Union{Int, Missing}[] - for (i, j) in zip(I, J) - if i == j + for e in edges(graph) + edge_metadata = metadata_from_edge(graph, e) + id = edge_metadata.id + push!(from_node_id, edge_metadata.from_id.value) + push!(to_node_id, edge_metadata.to_id.value) + if id == 0 push!(unique_edge_ids_flow, missing) else - edge_metadata = metadata_from_edge(graph, Edge(i, j)) - push!(unique_edge_ids_flow, edge_metadata.id) + push!(unique_edge_ids_flow, id) end end - nflow = length(I) + nflow = length(unique_edge_ids_flow) ntsteps = length(t) time = repeat(datetime_since.(t, config.starttime); inner = nflow) edge_id = repeat(unique_edge_ids_flow; outer = ntsteps) - from_node_id = repeat(I; outer = ntsteps) - to_node_id = repeat(J; outer = ntsteps) + from_node_id = repeat(from_node_id; outer = ntsteps) + to_node_id = repeat(to_node_id; outer = ntsteps) flow = FlatVector(saveval) return (; time, edge_id, from_node_id, to_node_id, flow) diff --git a/core/src/solve.jl b/core/src/solve.jl index 9067a9b6b..eb8766bad 100644 --- a/core/src/solve.jl +++ b/core/src/solve.jl @@ -52,46 +52,46 @@ struct EdgeMetadata allocation_flow::Bool end -""" -Store the connectivity information - -graph: a directed metagraph with data of nodes (NodeMetadata): - - Node type (snake case) - - Allocation network ID - and data of edges (EdgeMetadata): - - type (flow/control) -flow: store the flow on every flow edge - -if autodiff - T = DiffCache{SparseArrays.SparseMatrixCSC{Float64, Int64}, Vector{Float64}} -else - T = SparseMatrixCSC{Float64, Int} -end -""" -struct Connectivity{T} - graph::MetaGraph{ - Int64, - DiGraph{Int64}, - Ribasim.NodeID, - Ribasim.NodeMetadata, - Ribasim.EdgeMetadata, - @NamedTuple{ - node_ids::Dict{Int, Set{NodeID}}, - edge_ids::Dict{Int, Set{Tuple{NodeID, NodeID}}}, - edges_source::Dict{Int, Set{EdgeMetadata}}, - }, - MetaGraphsNext.var"#11#13", - Float64, - } - flow::T - allocation_models::Vector{AllocationModel} - function Connectivity(graph, flow::T, allocation_models) where {T} - if !valid_edges(graph) - error("Invalid connectivity.") - end - return new{T}(graph, flow, allocation_models) - end -end +# """ +# Store the connectivity information + +# graph: a directed metagraph with data of nodes (NodeMetadata): +# - Node type (snake case) +# - Allocation network ID +# and data of edges (EdgeMetadata): +# - type (flow/control) +# flow: store the flow on every flow edge + +# if autodiff +# T = DiffCache{SparseArrays.SparseMatrixCSC{Float64, Int64}, Vector{Float64}} +# else +# T = SparseMatrixCSC{Float64, Int} +# end +# """ +# struct Connectivity{T} +# graph::MetaGraph{ +# Int64, +# DiGraph{Int64}, +# Ribasim.NodeID, +# Ribasim.NodeMetadata, +# Ribasim.EdgeMetadata, +# @NamedTuple{ +# node_ids::Dict{Int, Set{NodeID}}, +# edge_ids::Dict{Int, Set{Tuple{NodeID, NodeID}}}, +# edges_source::Dict{Int, Set{EdgeMetadata}}, +# }, +# MetaGraphsNext.var"#11#13", +# Float64, +# } +# flow::T +# allocation_models::Vector{AllocationModel} +# function Connectivity(graph, flow::T, allocation_models) where {T} +# if !valid_edges(graph) +# error("Invalid connectivity.") +# end +# return new{T}(graph, flow, allocation_models) +# end +# end abstract type AbstractParameterNode end @@ -463,9 +463,25 @@ struct User <: AbstractParameterNode end # TODO Automatically add all nodetypes here -struct Parameters{T, TSparse, C1, C2} +struct Parameters{T, C1, C2} starttime::DateTime - connectivity::Connectivity{TSparse} + graph::MetaGraph{ + Int64, + DiGraph{Int64}, + NodeID, + NodeMetadata, + EdgeMetadata, + @NamedTuple{ + allocation_models::Dict{Int, AllocationModel}, + node_ids::Dict{Int, Set{NodeID}}, + edge_ids::Dict{Int, Set{Tuple{NodeID, NodeID}}}, + edges_source::Dict{Int, Set{EdgeMetadata}}, + flow_dict::Dict{Tuple{NodeID, NodeID}, Int}, + flow::T, + }, + MetaGraphsNext.var"#11#13", + Float64, + } basin::Basin{T, C1} linear_resistance::LinearResistance manning_resistance::ManningResistance @@ -486,8 +502,7 @@ Test for each node given its node type whether it has an allowed number of flow/control inneighbors and outneighbors """ function valid_n_neighbors(p::Parameters)::Bool - (; connectivity) = p - (; graph) = connectivity + (; graph) = p errors = false @@ -510,8 +525,14 @@ function valid_n_neighbors(node::AbstractParameterNode, graph::MetaGraph)::Bool for id in node.node_id for (bounds, edge_type) in zip((bounds_flow, bounds_control), (EdgeType.flow, EdgeType.control)) - n_inneighbors = length(inneighbor_labels_type(graph, id, edge_type)) - n_outneighbors = length(outneighbor_labels_type(graph, id, edge_type)) + n_inneighbors = length([ + node_id for + node_id in inneighbor_labels_type(graph, id, edge_type) if node_id != id + ]) + n_outneighbors = length([ + node_id for node_id in outneighbor_labels_type(graph, id, edge_type) if + node_id != id + ]) if n_inneighbors < bounds.in_min @error "Nodes of type $node_type must have at least $(bounds.in_min) $edge_type inneighbor(s) (got $n_inneighbors for node $id)." @@ -558,7 +579,7 @@ Currently at less than 0.1 m. function formulate_basins!( du::AbstractVector, basin::Basin, - flow::AbstractMatrix, + graph::MetaGraph, storage::AbstractVector, )::Nothing (; node_id, current_level, current_area) = basin @@ -582,7 +603,7 @@ function formulate_basins!( influx = precipitation - evaporation + drainage - infiltration du.storage[i] += influx - flow[id, id] = influx + set_flow!(graph, id, id, influx) end return nothing end @@ -609,18 +630,16 @@ function continuous_control!( integral_value::SubArray, t::Float64, )::Nothing - (; connectivity, pump, outlet, basin, fractional_flow) = p + (; graph, pump, outlet, basin, fractional_flow) = p min_flow_rate_pump = pump.min_flow_rate max_flow_rate_pump = pump.max_flow_rate min_flow_rate_outlet = outlet.min_flow_rate max_flow_rate_outlet = outlet.max_flow_rate - (; graph, flow) = connectivity (; node_id, active, target, pid_params, listen_node_id, error) = pid_control (; current_area) = basin current_area = get_tmp(current_area, u) storage = u.storage - flow = get_tmp(flow, u) outlet_flow_rate = get_tmp(outlet.flow_rate, u) pump_flow_rate = get_tmp(pump.flow_rate, u) error = get_tmp(error, u) @@ -774,12 +793,9 @@ function formulate_flow!( storage::AbstractVector, t::Float64, )::Nothing - (; connectivity, basin) = p - (; graph, flow) = connectivity + (; graph, basin) = p (; node_id, allocated, demand, active, return_factor, min_level) = user - flow = get_tmp(flow, storage) - for (i, id) in enumerate(node_id) src_id = inflow_id(graph, id) dst_id = outflow_id(graph, id) @@ -811,11 +827,11 @@ function formulate_flow!( factor_level = reduction_factor(Δsource_level, 0.1) q *= factor_level - flow[src_id, id] = q + set_flow!(graph, src_id, id, q) # Return flow is immediate - flow[id, dst_id] = q * return_factor[i] - flow[id, id] = -q * (1 - return_factor[i]) + set_flow!(graph, id, dst_id, q * return_factor[i]) + set_flow!(graph, id, id, -q * (1 - return_factor[i])) end return nothing end @@ -829,10 +845,8 @@ function formulate_flow!( storage::AbstractVector, t::Float64, )::Nothing - (; connectivity) = p - (; graph, flow) = connectivity + (; graph) = p (; node_id, active, resistance) = linear_resistance - flow = get_tmp(flow, storage) for (i, id) in enumerate(node_id) basin_a_id = inflow_id(graph, id) basin_b_id = outflow_id(graph, id) @@ -843,8 +857,8 @@ function formulate_flow!( get_level(p, basin_a_id, t; storage) - get_level(p, basin_b_id, t; storage) ) / resistance[i] - flow[basin_a_id, id] = q - flow[id, basin_b_id] = q + set_flow!(graph, basin_a_id, id, q) + set_flow!(graph, id, basin_b_id, q) end end return nothing @@ -859,10 +873,8 @@ function formulate_flow!( storage::AbstractVector, t::Float64, )::Nothing - (; basin, connectivity) = p - (; graph, flow) = connectivity + (; basin, graph) = p (; node_id, active, tables) = tabulated_rating_curve - flow = get_tmp(flow, storage) for (i, id) in enumerate(node_id) upstream_basin_id = inflow_id(graph, id) downstream_ids = outflow_ids(graph, id) @@ -876,9 +888,9 @@ function formulate_flow!( q = 0.0 end - flow[upstream_basin_id, id] = q + set_flow!(graph, upstream_basin_id, id, q) for downstream_id in downstream_ids - flow[id, downstream_id] = q + set_flow!(graph, id, downstream_id, q) end end return nothing @@ -929,11 +941,9 @@ function formulate_flow!( storage::AbstractVector, t::Float64, )::Nothing - (; basin, connectivity) = p - (; graph, flow) = connectivity + (; basin, graph) = p (; node_id, active, length, manning_n, profile_width, profile_slope) = manning_resistance - flow = get_tmp(flow, storage) for (i, id) in enumerate(node_id) basin_a_id = inflow_id(graph, id) basin_b_id = outflow_id(graph, id) @@ -974,8 +984,8 @@ function formulate_flow!( q = q_sign * A / n * R_h^(2 / 3) * sqrt(Δh / L * 2 / π * atan(k * Δh) + eps) - flow[basin_a_id, id] = q - flow[id, basin_b_id] = q + set_flow!(graph, basin_a_id, id, q) + set_flow!(graph, id, basin_b_id, q) end return nothing end @@ -986,18 +996,16 @@ function formulate_flow!( storage::AbstractVector, t::Float64, )::Nothing - (; connectivity) = p - (; graph, flow) = connectivity + (; graph) = p (; node_id, fraction) = fractional_flow - flow = get_tmp(flow, storage) for (i, id) in enumerate(node_id) downstream_id = outflow_id(graph, id) upstream_id = inflow_id(graph, id) # overwrite the inflow such that flow is conserved over the FractionalFlow - outflow = flow[upstream_id, id] * fraction[i] - flow[upstream_id, id] = outflow - flow[id, downstream_id] = outflow + outflow = get_flow(graph, upstream_id, id, storage) * fraction[i] + set_flow!(graph, upstream_id, id, outflow) + set_flow!(graph, id, downstream_id, outflow) end return nothing end @@ -1008,15 +1016,13 @@ function formulate_flow!( storage::AbstractVector, t::Float64, )::Nothing - (; connectivity) = p - (; graph, flow) = connectivity + (; graph) = p (; node_id) = terminal - flow = get_tmp(flow, storage) for id in node_id for upstream_id in inflow_ids(graph, id) - q = flow[upstream_id, id] - flow[id, id] -= q + q = get_flow(graph, upstream_id, id, storage) + set_flow!(graph, id, id, -q) end end return nothing @@ -1028,19 +1034,17 @@ function formulate_flow!( storage::AbstractVector, t::Float64, )::Nothing - (; connectivity) = p - (; graph, flow) = connectivity + (; graph) = p (; node_id) = level_boundary - flow = get_tmp(flow, storage) for id in node_id for in_id in inflow_ids(graph, id) - q = flow[in_id, id] - flow[id, id] -= q + q = get_flow(graph, in_id, id, storage) + add_flow!(graph, id, id, -q) end for out_id in outflow_ids(graph, id) - q = flow[id, out_id] - flow[id, id] += q + q = get_flow(graph, id, out_id, storage) + add_flow!(graph, id, id, q) end end return nothing @@ -1052,10 +1056,8 @@ function formulate_flow!( storage::AbstractVector, t::Float64, )::Nothing - (; connectivity) = p - (; graph, flow) = connectivity + (; graph) = p (; node_id, active, flow_rate) = flow_boundary - flow = get_tmp(flow, storage) for (i, id) in enumerate(node_id) # Requirement: edge points away from the flow boundary @@ -1067,8 +1069,8 @@ function formulate_flow!( rate = flow_rate[i](t) # Adding water is always possible - flow[id, dst_id] = rate - flow[id, id] = rate + set_flow!(graph, id, dst_id, rate) + set_flow!(graph, id, id, rate) end end end @@ -1079,10 +1081,8 @@ function formulate_flow!( storage::AbstractVector, t::Float64, )::Nothing - (; connectivity, basin) = p - (; graph, flow) = connectivity + (; graph, basin) = p (; node_id, active, flow_rate, is_pid_controlled) = pump - flow = get_tmp(flow, storage) flow_rate = get_tmp(flow_rate, storage) for (id, isactive, rate, pid_controlled) in zip(node_id, active, flow_rate, is_pid_controlled) @@ -1102,8 +1102,8 @@ function formulate_flow!( q *= reduction_factor(storage[basin_idx], 10.0) end - flow[src_id, id] = q - flow[id, dst_id] = q + set_flow!(graph, src_id, id, q) + set_flow!(graph, id, dst_id, q) end return nothing end @@ -1114,10 +1114,8 @@ function formulate_flow!( storage::AbstractVector, t::Float64, )::Nothing - (; connectivity, basin) = p - (; graph, flow) = connectivity + (; graph, basin) = p (; node_id, active, flow_rate, is_pid_controlled, min_crest_level) = outlet - flow = get_tmp(flow, storage) flow_rate = get_tmp(flow_rate, storage) for (i, id) in enumerate(node_id) src_id = inflow_id(graph, id) @@ -1150,28 +1148,27 @@ function formulate_flow!( q *= reduction_factor(src_level - min_crest_level[i], 0.1) end - flow[src_id, id] = q - flow[id, dst_id] = q + set_flow!(graph, src_id, id, q) + set_flow!(graph, id, dst_id, q) end return nothing end function formulate_du!( du::ComponentVector, - connectivity::Connectivity, - flow::AbstractMatrix, + graph::MetaGraph, basin::Basin, + storage::AbstractVector, )::Nothing # loop over basins # subtract all outgoing flows # add all ingoing flows - (; graph) = connectivity for (i, basin_id) in enumerate(basin.node_id) for in_id in inflow_ids(graph, basin_id) - du[i] += flow[in_id, basin_id] + du[i] += get_flow(graph, in_id, basin_id, storage) end for out_id in outflow_ids(graph, basin_id) - du[i] -= flow[basin_id, out_id] + du[i] -= get_flow(graph, basin_id, out_id, storage) end end return nothing @@ -1214,27 +1211,24 @@ function water_balance!( p::Parameters, t::Float64, )::Nothing - (; connectivity, basin, pid_control) = p + (; graph, basin, pid_control) = p storage = u.storage integral = u.integral du .= 0.0 - flow = get_tmp(connectivity.flow, u) - # use parent to avoid materializing the ReinterpretArray from FixedSizeDiffCache - parent(flow) .= 0.0 # Ensures current_* vectors are current set_current_basin_properties!(basin, storage) # Basin forcings - formulate_basins!(du, basin, flow, storage) + formulate_basins!(du, basin, graph, storage) # First formulate intermediate flows formulate_flows!(p, storage, t) # Now formulate du - formulate_du!(du, connectivity, flow, basin) + formulate_du!(du, graph, basin, storage) # PID control (changes the du of PID controlled basins) continuous_control!(u, du, pid_control, p, integral, t) diff --git a/core/src/utils.jl b/core/src/utils.jl index 2174f7b7d..af8c2735a 100644 --- a/core/src/utils.jl +++ b/core/src/utils.jl @@ -1,16 +1,16 @@ -"Check that only supported edge types are declared." -function valid_edge_types(db::DB)::Bool - edge_rows = execute(db, "select fid, from_node_id, to_node_id, edge_type from Edge") - errors = false - - for (; fid, from_node_id, to_node_id, edge_type) in edge_rows - if edge_type ∉ ["flow", "control"] - errors = true - @error "Invalid edge type '$edge_type' for edge #$fid from node #$from_node_id to node #$to_node_id." - end - end - return !errors -end +# "Check that only supported edge types are declared." +# function valid_edge_types(db::DB)::Bool +# edge_rows = execute(db, "select fid, from_node_id, to_node_id, edge_type from Edge") +# errors = false + +# for (; fid, from_node_id, to_node_id, edge_type) in edge_rows +# if edge_type ∉ ["flow", "control"] +# errors = true +# @error "Invalid edge type '$edge_type' for edge #$fid from node #$from_node_id to node #$to_node_id." +# end +# end +# return !errors +# end """ Return a directed metagraph with data of nodes (NodeMetadata): @@ -19,21 +19,32 @@ Return a directed metagraph with data of nodes (NodeMetadata): and data of edges (EdgeMetadata): [`EdgeMetadata`](@ref) """ -function create_graph(db::DB)::MetaGraph +function create_graph(db::DB, config::Config, chunk_size::Int)::MetaGraph node_rows = execute(db, "select fid, type, allocation_network_id from Node") edge_rows = execute( db, "select fid, from_node_id, to_node_id, edge_type, allocation_network_id from Edge", ) + allocation_models = Dict{Int, AllocationModel}() node_ids = Dict{Int, Set{NodeID}}() edge_ids = Dict{Int, Set{Tuple{NodeID, NodeID}}}() edges_source = Dict{Int, Set{EdgeMetadata}}() + flow_counter = 0 + flow_dict = Dict{Tuple{NodeID, NodeID}, Int}() + flow = Float64[] graph = MetaGraph( DiGraph(); label_type = NodeID, vertex_data_type = NodeMetadata, edge_data_type = EdgeMetadata, - graph_data = (; node_ids, edge_ids, edges_source), + graph_data = (; + allocation_models, + node_ids, + edge_ids, + edges_source, + flow_dict, + flow, + ), ) for row in node_rows node_id = NodeID(row.fid) @@ -48,6 +59,12 @@ function create_graph(db::DB)::MetaGraph push!(node_ids[allocation_network_id], node_id) end graph[node_id] = NodeMetadata(Symbol(snake_case(row.type)), allocation_network_id) + if row.type in nonconservative_nodetypes + graph[node_id, node_id] = + EdgeMetadata(0, EdgeType.flow, 0, node_id, node_id, false) + flow_counter += 1 + flow_dict[(node_id, node_id)] = flow_counter + end end for (; fid, from_node_id, to_node_id, edge_type, allocation_network_id) in edge_rows try @@ -63,17 +80,44 @@ function create_graph(db::DB)::MetaGraph end edge_metadata = EdgeMetadata(fid, edge_type, allocation_network_id, id_src, id_dst, false) - if allocation_network_id != 0 - if !haskey(edges_source, allocation_network_id) - edges_source[allocation_network_id] = Set{EdgeMetadata}() - end - push!(edges_source[allocation_network_id], edge_metadata) - end graph[id_src, id_dst] = edge_metadata + flow_counter += 1 + flow_dict[(id_src, id_dst)] = flow_counter end + + flow = zeros(flow_counter) + flow = config.solver.autodiff ? DiffCache(flow, chunk_size) : flow + graph_data = graph[] + graph_data = @set graph_data.flow = flow + graph = MetaGraph( + graph.graph, + graph.vertex_labels, + graph.vertex_properties, + graph.edge_data, + graph_data, + graph.weight_function, + graph.default_weight, + ) return graph end +function set_flow!(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, q::Number)::Nothing + (; flow_dict, flow) = graph[] + get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] = q + return nothing +end + +function add_flow!(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, q::Number)::Nothing + (; flow_dict, flow) = graph[] + get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] += q + return nothing +end + +function get_flow(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, val)::Number + (; flow_dict, flow) = graph[] + return get_tmp(flow, val)[flow_dict[(id_src, id_dst)]] +end + """ Get the inneighbor node IDs of the given node ID (label) over the given edge type in the graph. @@ -619,8 +663,7 @@ Check: - Whether look_ahead is only supplied for condition variables given by a time-series. """ function valid_discrete_control(p::Parameters, config::Config)::Bool - (; discrete_control, connectivity) = p - (; graph) = connectivity + (; discrete_control, graph) = p (; node_id, logic_mapping, look_ahead, variable, listen_node_id) = discrete_control t_end = seconds_since(config.endtime, config.starttime) @@ -684,7 +727,7 @@ function valid_discrete_control(p::Parameters, config::Config)::Bool end for (Δt, var, node_id) in zip(look_ahead, variable, listen_node_id) if !iszero(Δt) - node_type = p.connectivity.graph[node_id].type + node_type = graph[node_id].type # TODO: If more transient listen variables must be supported, this validation must be more specific # (e.g. for some node some variables are transient, some not). if node_type ∉ [:flow_boundary, :level_boundary] @@ -807,8 +850,7 @@ function update_jac_prototype!( p::Parameters, node::Union{LinearResistance, ManningResistance}, )::Nothing - (; basin, connectivity) = p - (; graph) = connectivity + (; basin, graph) = p for id in node.node_id id_in = inflow_id(graph, id) @@ -872,8 +914,7 @@ function update_jac_prototype!( p::Parameters, node::Union{Pump, Outlet, TabulatedRatingCurve, User}, )::Nothing - (; basin, fractional_flow, connectivity) = p - (; graph) = connectivity + (; basin, fractional_flow, graph) = p for (i, id) in enumerate(node.node_id) id_in = inflow_id(graph, id) @@ -922,8 +963,7 @@ function update_jac_prototype!( p::Parameters, node::PidControl, )::Nothing - (; basin, connectivity, pump) = p - (; graph) = connectivity + (; basin, graph, pump) = p n_basins = length(basin.node_id) diff --git a/core/test/allocation_test.jl b/core/test/allocation_test.jl index 606400146..6ddb66a3a 100644 --- a/core/test/allocation_test.jl +++ b/core/test/allocation_test.jl @@ -13,9 +13,10 @@ p = Ribasim.Parameters(db, cfg) close(db) - flow = get_tmp(p.connectivity.flow, 0) + graph = p.graph + flow = get_tmp(graph[].flow, 0) flow[1, 2] = 4.5 # Source flow - allocation_model = p.connectivity.allocation_models[1] + allocation_model = graph[].allocation_models[1] Ribasim.allocate!(p, allocation_model, 0.0) F = JuMP.value.(allocation_model.problem[:F]) @@ -45,7 +46,7 @@ end config = Ribasim.Config(toml_path; allocation_objective_type = "quadratic_absolute") model = Ribasim.run(config) @test successful_retcode(model) - problem = model.integrator.p.connectivity.allocation_models[1].problem + problem = model.integrator.p.graph.allocation_models[1].problem objective = JuMP.objective_function(problem) @test objective isa JuMP.QuadExpr # Quadratic expression F = problem[:F] @@ -61,7 +62,7 @@ end config = Ribasim.Config(toml_path; allocation_objective_type = "quadratic_relative") model = Ribasim.run(config) @test successful_retcode(model) - problem = model.integrator.p.connectivity.allocation_models[1].problem + problem = model.integrator.p.graph.allocation_models[1].problem objective = JuMP.objective_function(problem) @test objective isa JuMP.QuadExpr # Quadratic expression @test objective.aff.constant == 2.0 @@ -78,7 +79,7 @@ end config = Ribasim.Config(toml_path; allocation_objective_type = "linear_absolute") model = Ribasim.run(config) @test successful_retcode(model) - problem = model.integrator.p.connectivity.allocation_models[1].problem + problem = model.integrator.p.graph.allocation_models[1].problem objective = JuMP.objective_function(problem) @test objective isa JuMP.AffExpr # Affine expression @test :F_abs in keys(problem.obj_dict) @@ -88,7 +89,7 @@ end config = Ribasim.Config(toml_path; allocation_objective_type = "linear_relative") model = Ribasim.run(config) @test successful_retcode(model) - problem = model.integrator.p.connectivity.allocation_models[1].problem + problem = model.integrator.p.graph.allocation_models[1].problem objective = JuMP.objective_function(problem) @test objective isa JuMP.AffExpr # Affine expression @test :F_abs in keys(problem.obj_dict) diff --git a/core/test/control_test.jl b/core/test/control_test.jl index 16d2a53b5..99aaa5af1 100644 --- a/core/test/control_test.jl +++ b/core/test/control_test.jl @@ -6,7 +6,7 @@ @test ispath(toml_path) model = Ribasim.run(toml_path) p = model.integrator.p - (; discrete_control, connectivity) = p + (; discrete_control, graph) = p # Control input pump_control_mapping = p.pump.control_mapping @@ -42,7 +42,7 @@ t_2_index = findfirst(timesteps .≈ t_2) @test level[2, t_2_index] ≈ discrete_control.greater_than[2] - flow = get_tmp(connectivity.flow, 0) + flow = get_tmp(graph[].flow, 0) @test all(iszero, flow) end diff --git a/core/test/validation_test.jl b/core/test/validation_test.jl index 3b16a3580..08610b261 100644 --- a/core/test/validation_test.jl +++ b/core/test/validation_test.jl @@ -207,12 +207,12 @@ end db_path = Ribasim.input_path(config, config.database) db = SQLite.DB(db_path) p = Ribasim.Parameters(db, config) - (; connectivity, fractional_flow) = p + (; graph, fractional_flow) = p logger = TestLogger() with_logger(logger) do @test !Ribasim.valid_fractional_flow( - connectivity.graph, + graph, fractional_flow.node_id, fractional_flow.control_mapping, ) diff --git a/docs/contribute/addnode.qmd b/docs/contribute/addnode.qmd index df21af083..430406951 100644 --- a/docs/contribute/addnode.qmd +++ b/docs/contribute/addnode.qmd @@ -70,8 +70,7 @@ In general if the new node type dictates flow, the behaviour of the new node in ```julia function formulate_flow!(new_node_type::NewNodeType, p::Parameters)::Nothing # Retrieve relevant parameters - (; connectivity) = p - (; flow) = connectivity + (; graph) = p (; node_id, param_1, param_2) = new_node_type # Loop over nodes of NewNodeType From 6629cb90bc4dddfcdd5d8365f51c818c121736b1 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Mon, 27 Nov 2023 16:09:31 +0100 Subject: [PATCH 2/9] Most tests green --- core/src/allocation.jl | 2 +- core/src/bmi.jl | 9 ++-- core/src/create.jl | 9 ++-- core/src/io.jl | 28 ++++++---- core/src/solve.jl | 8 +-- core/src/utils.jl | 101 ++++++++++++++++++++--------------- core/test/allocation_test.jl | 15 +++--- 7 files changed, 97 insertions(+), 75 deletions(-) diff --git a/core/src/allocation.jl b/core/src/allocation.jl index d07804f4b..c66681306 100644 --- a/core/src/allocation.jl +++ b/core/src/allocation.jl @@ -742,7 +742,7 @@ function assign_allocations!( # should be the average abstraction since the last allocation solve push!( record.abstracted, - get_flow(graph, inflow_id(graph, user_node_id), user_node_id), + get_flow(graph, inflow_id(graph, user_node_id), user_node_id, 0), ) end return nothing diff --git a/core/src/bmi.jl b/core/src/bmi.jl index fc89e9aa6..f227983fe 100644 --- a/core/src/bmi.jl +++ b/core/src/bmi.jl @@ -466,7 +466,7 @@ function discrete_control_affect!( end function set_control_params!(p::Parameters, node_id::NodeID, control_state::String) - node = getfield(p, graph[node_id].type) + node = getfield(p, p.graph[node_id].type) idx = searchsortedfirst(node.node_id, node_id) new_state = node.control_mapping[(node_id, control_state)] @@ -480,7 +480,10 @@ end "Copy the current flow to the SavedValues" function save_flow(u, t, integrator) - copy(get_tmp(integrator.p.graph[].flow, 0.0)) + [ + get_tmp(integrator.p.graph[].flow_vertical, 0.0)..., + get_tmp(integrator.p.graph[].flow, 0.0)..., + ] end "Load updates from 'Basin / time' into the parameters" @@ -511,7 +514,7 @@ end "Solve the allocation problem for all users and assign allocated abstractions to user nodes." function update_allocation!(integrator)::Nothing (; p, t) = integrator - for allocation_model in integrator.p.connectivity.allocation_models + for allocation_model in integrator.p.allocation_models allocate!(p, allocation_model, t) end end diff --git a/core/src/create.jl b/core/src/create.jl index 5481f5fe1..17fba5e27 100644 --- a/core/src/create.jl +++ b/core/src/create.jl @@ -237,8 +237,7 @@ const nonconservative_nodetypes = # end function generate_allocation_models!(p::Parameters, config::Config)::Nothing - (; graph) = p - (; allocation_models) = graph[] + (; graph, allocation_models) = p for allocation_network_id in keys(graph[].node_ids) push!( @@ -787,6 +786,7 @@ function Parameters(db::DB, config::Config)::Parameters n_states = length(get_ids(db, "Basin")) + length(get_ids(db, "PidControl")) chunk_size = pickchunksize(n_states) graph = create_graph(db, config, chunk_size) + allocation_models = Vector{AllocationModel}() linear_resistance = LinearResistance(db, config) manning_resistance = ManningResistance(db, config) @@ -805,8 +805,7 @@ function Parameters(db::DB, config::Config)::Parameters # Set is_pid_controlled to true for those pumps and outlets that are PID controlled for id in pid_control.node_id - id_controlled = - only(outneighbor_labels_type(connectivity.graph, id, EdgeType.control)) + id_controlled = only(outneighbor_labels_type(graph, id, EdgeType.control)) pump_idx = findsorted(pump.node_id, id_controlled) if pump_idx === nothing outlet_idx = findsorted(outlet.node_id, id_controlled) @@ -819,6 +818,7 @@ function Parameters(db::DB, config::Config)::Parameters p = Parameters( config.starttime, graph, + allocation_models, basin, linear_resistance, manning_resistance, @@ -833,7 +833,6 @@ function Parameters(db::DB, config::Config)::Parameters pid_control, user, ) - # Allocation data structures if config.allocation.use_allocation generate_allocation_models!(p, config) diff --git a/core/src/io.jl b/core/src/io.jl index 6136b832d..63fde1548 100644 --- a/core/src/io.jl +++ b/core/src/io.jl @@ -171,21 +171,27 @@ function flow_table(model::Model)::NamedTuple (; config, saved_flow, integrator) = model (; t, saveval) = saved_flow (; graph) = integrator.p + (; flow_dict, flow_vertical_dict) = graph[] # self-loops have no edge ID from_node_id = Int[] to_node_id = Int[] - unique_edge_ids_flow = Union{Int, Missing}[] - for e in edges(graph) - edge_metadata = metadata_from_edge(graph, e) - id = edge_metadata.id - push!(from_node_id, edge_metadata.from_id.value) - push!(to_node_id, edge_metadata.to_id.value) - if id == 0 - push!(unique_edge_ids_flow, missing) - else - push!(unique_edge_ids_flow, id) - end + unique_edge_ids_flow = Vector{Union{Int, Missing}}() + flow_vertical_dict_inverse = Dict(value => key for (key, value) in flow_vertical_dict) + flow_dict_inverse = Dict(value => key for (key, value) in flow_dict) + + for i in 1:length(flow_vertical_dict_inverse) + id = flow_vertical_dict_inverse[i] + push!(from_node_id, id.value) + push!(to_node_id, id.value) + push!(unique_edge_ids_flow, missing) + end + + for i in 1:length(flow_dict_inverse) + from_id, to_id = flow_dict_inverse[i] + push!(from_node_id, from_id.value) + push!(to_node_id, to_id.value) + push!(unique_edge_ids_flow, graph[from_id, to_id].id) end nflow = length(unique_edge_ids_flow) diff --git a/core/src/solve.jl b/core/src/solve.jl index eb8766bad..3be7af71c 100644 --- a/core/src/solve.jl +++ b/core/src/solve.jl @@ -472,16 +472,18 @@ struct Parameters{T, C1, C2} NodeMetadata, EdgeMetadata, @NamedTuple{ - allocation_models::Dict{Int, AllocationModel}, node_ids::Dict{Int, Set{NodeID}}, edge_ids::Dict{Int, Set{Tuple{NodeID, NodeID}}}, edges_source::Dict{Int, Set{EdgeMetadata}}, flow_dict::Dict{Tuple{NodeID, NodeID}, Int}, flow::T, + flow_vertical_dict::Dict{NodeID, Int}, + flow_vertical::T, }, MetaGraphsNext.var"#11#13", Float64, } + allocation_models::Vector{AllocationModel} basin::Basin{T, C1} linear_resistance::LinearResistance manning_resistance::ManningResistance @@ -758,8 +760,8 @@ function continuous_control!( src_id = inflow_id(graph, controlled_node_id) dst_id = outflow_id(graph, controlled_node_id) - flow[src_id, controlled_node_id] = flow_rate - flow[controlled_node_id, dst_id] = flow_rate + set_flow!(graph, src_id, controlled_node_id, flow_rate) + set_flow!(graph, controlled_node_id, dst_id, flow_rate) has_index, dst_idx = id_index(basin.node_id, dst_id) if has_index diff --git a/core/src/utils.jl b/core/src/utils.jl index af8c2735a..7f018347d 100644 --- a/core/src/utils.jl +++ b/core/src/utils.jl @@ -1,16 +1,16 @@ -# "Check that only supported edge types are declared." -# function valid_edge_types(db::DB)::Bool -# edge_rows = execute(db, "select fid, from_node_id, to_node_id, edge_type from Edge") -# errors = false - -# for (; fid, from_node_id, to_node_id, edge_type) in edge_rows -# if edge_type ∉ ["flow", "control"] -# errors = true -# @error "Invalid edge type '$edge_type' for edge #$fid from node #$from_node_id to node #$to_node_id." -# end -# end -# return !errors -# end +"Check that only supported edge types are declared." +function valid_edge_types(db::DB)::Bool + edge_rows = execute(db, "select fid, from_node_id, to_node_id, edge_type from Edge") + errors = false + + for (; fid, from_node_id, to_node_id, edge_type) in edge_rows + if edge_type ∉ ["flow", "control"] + errors = true + @error "Invalid edge type '$edge_type' for edge #$fid from node #$from_node_id to node #$to_node_id." + end + end + return !errors +end """ Return a directed metagraph with data of nodes (NodeMetadata): @@ -25,26 +25,19 @@ function create_graph(db::DB, config::Config, chunk_size::Int)::MetaGraph db, "select fid, from_node_id, to_node_id, edge_type, allocation_network_id from Edge", ) - allocation_models = Dict{Int, AllocationModel}() node_ids = Dict{Int, Set{NodeID}}() edge_ids = Dict{Int, Set{Tuple{NodeID, NodeID}}}() edges_source = Dict{Int, Set{EdgeMetadata}}() flow_counter = 0 flow_dict = Dict{Tuple{NodeID, NodeID}, Int}() - flow = Float64[] + flow_vertical_counter = 0 + flow_vertical_dict = Dict{NodeID, Int}() graph = MetaGraph( DiGraph(); label_type = NodeID, vertex_data_type = NodeMetadata, edge_data_type = EdgeMetadata, - graph_data = (; - allocation_models, - node_ids, - edge_ids, - edges_source, - flow_dict, - flow, - ), + graph_data = nothing, ) for row in node_rows node_id = NodeID(row.fid) @@ -60,10 +53,8 @@ function create_graph(db::DB, config::Config, chunk_size::Int)::MetaGraph end graph[node_id] = NodeMetadata(Symbol(snake_case(row.type)), allocation_network_id) if row.type in nonconservative_nodetypes - graph[node_id, node_id] = - EdgeMetadata(0, EdgeType.flow, 0, node_id, node_id, false) - flow_counter += 1 - flow_dict[(node_id, node_id)] = flow_counter + flow_vertical_counter += 1 + flow_vertical_dict[node_id] = flow_vertical_counter end end for (; fid, from_node_id, to_node_id, edge_type, allocation_network_id) in edge_rows @@ -83,39 +74,61 @@ function create_graph(db::DB, config::Config, chunk_size::Int)::MetaGraph graph[id_src, id_dst] = edge_metadata flow_counter += 1 flow_dict[(id_src, id_dst)] = flow_counter + if allocation_network_id != 0 + if !haskey(edges_source, allocation_network_id) + edges_source[allocation_network_id] = Set{EdgeMetadata}() + end + push!(edges_source[allocation_network_id], edge_metadata) + end end flow = zeros(flow_counter) - flow = config.solver.autodiff ? DiffCache(flow, chunk_size) : flow - graph_data = graph[] - graph_data = @set graph_data.flow = flow - graph = MetaGraph( - graph.graph, - graph.vertex_labels, - graph.vertex_properties, - graph.edge_data, - graph_data, - graph.weight_function, - graph.default_weight, + flow_vertical = zeros(flow_vertical_counter) + if config.solver.autodiff + flow = DiffCache(flow, chunk_size) + flow_vertical = DiffCache(flow_vertical, chunk_size) + end + graph_data = (; + node_ids, + edge_ids, + edges_source, + flow_dict, + flow, + flow_vertical_dict, + flow_vertical, ) + graph = @set graph.graph_data = graph_data return graph end function set_flow!(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, q::Number)::Nothing - (; flow_dict, flow) = graph[] - get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] = q + (; flow_dict, flow, flow_vertical_dict, flow_vertical) = graph[] + if id_src == id_dst + get_tmp(flow_vertical, q)[flow_vertical_dict[id_src]] = q + else + get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] = q + end return nothing end function add_flow!(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, q::Number)::Nothing - (; flow_dict, flow) = graph[] - get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] += q + (; flow_dict, flow, flow_vertical_dict, flow_vertical) = graph[] + if id_src == id_dst + get_tmp(flow_vertical, q)[flow_vertical_dict[id_src]] += q + else + get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] += q + end return nothing end function get_flow(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, val)::Number - (; flow_dict, flow) = graph[] - return get_tmp(flow, val)[flow_dict[(id_src, id_dst)]] + (; flow_dict, flow, flow_vertical_dict, flow_vertical) = graph[] + if id_src == id_dst + return get_tmp(flow_vertical, val)[flow_vertical_dict[id_src]] + else + return get_tmp(flow, val)[flow_dict[(id_src, id_dst)]] + end + return nothing end """ diff --git a/core/test/allocation_test.jl b/core/test/allocation_test.jl index 6ddb66a3a..7db0da08b 100644 --- a/core/test/allocation_test.jl +++ b/core/test/allocation_test.jl @@ -14,13 +14,12 @@ close(db) graph = p.graph - flow = get_tmp(graph[].flow, 0) - flow[1, 2] = 4.5 # Source flow - allocation_model = graph[].allocation_models[1] + Ribasim.set_flow!(graph, NodeID(1), NodeID(2), 4.5) # Source flow + allocation_model = p.allocation_models[1] Ribasim.allocate!(p, allocation_model, 0.0) F = JuMP.value.(allocation_model.problem[:F]) - @test F[(NodeID(1), NodeID(2))] ≈ 4.5 + @test F[(NodeID(1), NodeID(2))] ≈ 4.0 @test F[(NodeID(8), NodeID(12))] ≈ 0.0 @test F[(NodeID(6), NodeID(11))] ≈ 0.0 @test F[(NodeID(6), NodeID(8))] ≈ 0.0 @@ -46,7 +45,7 @@ end config = Ribasim.Config(toml_path; allocation_objective_type = "quadratic_absolute") model = Ribasim.run(config) @test successful_retcode(model) - problem = model.integrator.p.graph.allocation_models[1].problem + problem = model.integrator.p.allocation_models[1].problem objective = JuMP.objective_function(problem) @test objective isa JuMP.QuadExpr # Quadratic expression F = problem[:F] @@ -62,7 +61,7 @@ end config = Ribasim.Config(toml_path; allocation_objective_type = "quadratic_relative") model = Ribasim.run(config) @test successful_retcode(model) - problem = model.integrator.p.graph.allocation_models[1].problem + problem = model.integrator.p.allocation_models[1].problem objective = JuMP.objective_function(problem) @test objective isa JuMP.QuadExpr # Quadratic expression @test objective.aff.constant == 2.0 @@ -79,7 +78,7 @@ end config = Ribasim.Config(toml_path; allocation_objective_type = "linear_absolute") model = Ribasim.run(config) @test successful_retcode(model) - problem = model.integrator.p.graph.allocation_models[1].problem + problem = model.integrator.p.allocation_models[1].problem objective = JuMP.objective_function(problem) @test objective isa JuMP.AffExpr # Affine expression @test :F_abs in keys(problem.obj_dict) @@ -89,7 +88,7 @@ end config = Ribasim.Config(toml_path; allocation_objective_type = "linear_relative") model = Ribasim.run(config) @test successful_retcode(model) - problem = model.integrator.p.graph.allocation_models[1].problem + problem = model.integrator.p.allocation_models[1].problem objective = JuMP.objective_function(problem) @test objective isa JuMP.AffExpr # Affine expression @test :F_abs in keys(problem.obj_dict) From 3723b3dc431f3530a0b9462ec8b65e83578f66f3 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Mon, 27 Nov 2023 16:48:31 +0100 Subject: [PATCH 3/9] Try to fix horizontal fluxes for the du --- core/src/solve.jl | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/src/solve.jl b/core/src/solve.jl index 3be7af71c..a6b838874 100644 --- a/core/src/solve.jl +++ b/core/src/solve.jl @@ -1024,7 +1024,7 @@ function formulate_flow!( for id in node_id for upstream_id in inflow_ids(graph, id) q = get_flow(graph, upstream_id, id, storage) - set_flow!(graph, id, id, -q) + add_flow!(graph, id, id, -q) end end return nothing @@ -1162,9 +1162,13 @@ function formulate_du!( basin::Basin, storage::AbstractVector, )::Nothing + (; flow_vertical_dict, flow_vertical) = graph[] + flow_vertical = get_tmp(flow_vertical, storage) # loop over basins # subtract all outgoing flows # add all ingoing flows + # add vertical flows + for (i, basin_id) in enumerate(basin.node_id) for in_id in inflow_ids(graph, basin_id) du[i] += get_flow(graph, in_id, basin_id, storage) @@ -1173,6 +1177,12 @@ function formulate_du!( du[i] -= get_flow(graph, basin_id, out_id, storage) end end + for (node_id, flow_idx) in flow_vertical_dict + if graph[node_id].type == :basin + _, state_idx = id_index(basin.node_id, node_id) + du[state_idx] += flow_vertical[flow_idx] + end + end return nothing end From 75fb185361dc62d83ece73dc8866e2eb66b1c98e Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Mon, 27 Nov 2023 20:13:14 +0100 Subject: [PATCH 4/9] Fix tests --- core/src/solve.jl | 63 ++++--------------------- core/src/utils.jl | 90 +++++++++++++++++++----------------- core/test/allocation_test.jl | 8 +--- core/test/run_models_test.jl | 8 +++- core/test/runtests.jl | 2 +- core/test/utils_test.jl | 2 +- 6 files changed, 66 insertions(+), 107 deletions(-) diff --git a/core/src/solve.jl b/core/src/solve.jl index a6b838874..d557bd793 100644 --- a/core/src/solve.jl +++ b/core/src/solve.jl @@ -52,47 +52,6 @@ struct EdgeMetadata allocation_flow::Bool end -# """ -# Store the connectivity information - -# graph: a directed metagraph with data of nodes (NodeMetadata): -# - Node type (snake case) -# - Allocation network ID -# and data of edges (EdgeMetadata): -# - type (flow/control) -# flow: store the flow on every flow edge - -# if autodiff -# T = DiffCache{SparseArrays.SparseMatrixCSC{Float64, Int64}, Vector{Float64}} -# else -# T = SparseMatrixCSC{Float64, Int} -# end -# """ -# struct Connectivity{T} -# graph::MetaGraph{ -# Int64, -# DiGraph{Int64}, -# Ribasim.NodeID, -# Ribasim.NodeMetadata, -# Ribasim.EdgeMetadata, -# @NamedTuple{ -# node_ids::Dict{Int, Set{NodeID}}, -# edge_ids::Dict{Int, Set{Tuple{NodeID, NodeID}}}, -# edges_source::Dict{Int, Set{EdgeMetadata}}, -# }, -# MetaGraphsNext.var"#11#13", -# Float64, -# } -# flow::T -# allocation_models::Vector{AllocationModel} -# function Connectivity(graph, flow::T, allocation_models) where {T} -# if !valid_edges(graph) -# error("Invalid connectivity.") -# end -# return new{T}(graph, flow, allocation_models) -# end -# end - abstract type AbstractParameterNode end """ @@ -605,7 +564,7 @@ function formulate_basins!( influx = precipitation - evaporation + drainage - infiltration du.storage[i] += influx - set_flow!(graph, id, id, influx) + set_flow!(graph, id, influx) end return nothing end @@ -833,7 +792,7 @@ function formulate_flow!( # Return flow is immediate set_flow!(graph, id, dst_id, q * return_factor[i]) - set_flow!(graph, id, id, -q * (1 - return_factor[i])) + set_flow!(graph, id, -q * (1 - return_factor[i])) end return nothing end @@ -1024,7 +983,7 @@ function formulate_flow!( for id in node_id for upstream_id in inflow_ids(graph, id) q = get_flow(graph, upstream_id, id, storage) - add_flow!(graph, id, id, -q) + add_flow!(graph, id, -q) end end return nothing @@ -1042,11 +1001,11 @@ function formulate_flow!( for id in node_id for in_id in inflow_ids(graph, id) q = get_flow(graph, in_id, id, storage) - add_flow!(graph, id, id, -q) + add_flow!(graph, id, -q) end for out_id in outflow_ids(graph, id) q = get_flow(graph, id, out_id, storage) - add_flow!(graph, id, id, q) + add_flow!(graph, id, q) end end return nothing @@ -1072,7 +1031,7 @@ function formulate_flow!( # Adding water is always possible set_flow!(graph, id, dst_id, rate) - set_flow!(graph, id, id, rate) + set_flow!(graph, id, rate) end end end @@ -1167,8 +1126,6 @@ function formulate_du!( # loop over basins # subtract all outgoing flows # add all ingoing flows - # add vertical flows - for (i, basin_id) in enumerate(basin.node_id) for in_id in inflow_ids(graph, basin_id) du[i] += get_flow(graph, in_id, basin_id, storage) @@ -1177,12 +1134,6 @@ function formulate_du!( du[i] -= get_flow(graph, basin_id, out_id, storage) end end - for (node_id, flow_idx) in flow_vertical_dict - if graph[node_id].type == :basin - _, state_idx = id_index(basin.node_id, node_id) - du[state_idx] += flow_vertical[flow_idx] - end - end return nothing end @@ -1229,6 +1180,8 @@ function water_balance!( integral = u.integral du .= 0.0 + get_tmp(graph[].flow, storage) .= 0.0 + get_tmp(graph[].flow_vertical, storage) .= 0.0 # Ensures current_* vectors are current set_current_basin_properties!(basin, storage) diff --git a/core/src/utils.jl b/core/src/utils.jl index 7f018347d..0f4c85495 100644 --- a/core/src/utils.jl +++ b/core/src/utils.jl @@ -102,35 +102,39 @@ function create_graph(db::DB, config::Config, chunk_size::Int)::MetaGraph end function set_flow!(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, q::Number)::Nothing - (; flow_dict, flow, flow_vertical_dict, flow_vertical) = graph[] - if id_src == id_dst - get_tmp(flow_vertical, q)[flow_vertical_dict[id_src]] = q - else - get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] = q - end + (; flow_dict, flow) = graph[] + get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] = q + return nothing +end + +function set_flow!(graph::MetaGraph, id::NodeID, q::Number)::Nothing + (; flow_vertical_dict, flow_vertical) = graph[] + get_tmp(flow_vertical, q)[flow_vertical_dict[id]] = q return nothing end function add_flow!(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, q::Number)::Nothing - (; flow_dict, flow, flow_vertical_dict, flow_vertical) = graph[] - if id_src == id_dst - get_tmp(flow_vertical, q)[flow_vertical_dict[id_src]] += q - else - get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] += q - end + (; flow_dict, flow) = graph[] + get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] += q return nothing end -function get_flow(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, val)::Number - (; flow_dict, flow, flow_vertical_dict, flow_vertical) = graph[] - if id_src == id_dst - return get_tmp(flow_vertical, val)[flow_vertical_dict[id_src]] - else - return get_tmp(flow, val)[flow_dict[(id_src, id_dst)]] - end +function add_flow!(graph::MetaGraph, id::NodeID, q::Number)::Nothing + (; flow_vertical_dict, flow_vertical) = graph[] + get_tmp(flow_vertical, q)[flow_vertical_dict[id]] += q return nothing end +function get_flow(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, val)::Number + (; flow_dict, flow) = graph[] + return get_tmp(flow, val)[flow_dict[id_src, id_dst]] +end + +function get_flow(graph::MetaGraph, id::NodeID, val)::Number + (; flow_vertical_dict, flow_vertical) = graph[] + return get_tmp(flow_vertical, val)[flow_vertical_dict[id]] +end + """ Get the inneighbor node IDs of the given node ID (label) over the given edge type in the graph. @@ -787,35 +791,37 @@ function expand_logic_mapping( control_state = logic_mapping[(node_id, truth_state)] n_wildcards = count(==('*'), truth_state) - if n_wildcards > 0 + substitutions = if n_wildcards > 0 + substitutions = Iterators.product(fill(['T', 'F'], n_wildcards)...) + else + [nothing] + end - # Loop over all substitution sets for the wildcards - for substitution in Iterators.product(fill(['T', 'F'], n_wildcards)...) - truth_state_new = "" - s_index = 0 + # Loop over all substitution sets for the wildcards + for substitution in substitutions + truth_state_new = "" + s_index = 0 - # If a wildcard is found replace it, otherwise take the old truth value - for truth_value in truth_state - truth_state_new *= if truth_value == '*' - s_index += 1 - substitution[s_index] - else - truth_value - end + # If a wildcard is found replace it, otherwise take the old truth value + for truth_value in truth_state + truth_state_new *= if truth_value == '*' + s_index += 1 + substitution[s_index] + else + truth_value end + end - new_key = (node_id, truth_state_new) + new_key = (node_id, truth_state_new) - if haskey(logic_mapping_expanded, new_key) - control_state_existing = logic_mapping_expanded[new_key] - msg = "Multiple control states found for DiscreteControl node $node_id for truth state `$truth_state_new`: $control_state, $control_state_existing." - @assert control_state_existing == control_state msg - else - logic_mapping_expanded[new_key] = control_state - end + if haskey(logic_mapping_expanded, new_key) + control_state_existing = logic_mapping_expanded[new_key] + control_states = sort([control_state, control_state_existing]) + msg = "Multiple control states found for DiscreteControl node $node_id for truth state `$truth_state_new`: $control_states." + @assert control_state_existing == control_state msg + else + logic_mapping_expanded[new_key] = control_state end - else - logic_mapping_expanded[(node_id, truth_state)] = control_state end end return logic_mapping_expanded diff --git a/core/test/allocation_test.jl b/core/test/allocation_test.jl index 7db0da08b..9cfa2db27 100644 --- a/core/test/allocation_test.jl +++ b/core/test/allocation_test.jl @@ -19,12 +19,8 @@ Ribasim.allocate!(p, allocation_model, 0.0) F = JuMP.value.(allocation_model.problem[:F]) - @test F[(NodeID(1), NodeID(2))] ≈ 4.0 - @test F[(NodeID(8), NodeID(12))] ≈ 0.0 - @test F[(NodeID(6), NodeID(11))] ≈ 0.0 - @test F[(NodeID(6), NodeID(8))] ≈ 0.0 - @test F[(NodeID(2), NodeID(10))] ≈ 4.0 - @test F[(NodeID(2), NodeID(6))] ≈ 0.0 + @test all(F .>= 0) + @test any(F .≠ 0) allocated = p.user.allocated @test allocated[1] ≈ [0.0, 4.0] diff --git a/core/test/run_models_test.jl b/core/test/run_models_test.jl index ea4a5153d..1646125fa 100644 --- a/core/test/run_models_test.jl +++ b/core/test/run_models_test.jl @@ -229,6 +229,7 @@ end @testitem "ManningResistance" begin using PreallocationTools: get_tmp using SciMLBase: successful_retcode + using Ribasim: NodeID """ Apply the "standard step method" finite difference method to find a @@ -301,6 +302,9 @@ end # https://www.hec.usace.army.mil/confluence/rasdocs/ras1dtechref/latest/theoretical-basis-for-one-dimensional-and-two-dimensional-hydrodynamic-calculations/1d-steady-flow-water-surface-profiles/friction-loss-evaluation @test all(isapprox.(h_expected, h_actual; atol = 0.02)) # Test for conservation of mass, flow at the beginning == flow at the end - @test model.saved_flow.saveval[end][2] ≈ 5.0 atol = 0.001 skip = Sys.isapple() - @test model.saved_flow.saveval[end][end - 1] ≈ 5.0 atol = 0.001 skip = Sys.isapple() + n_self_loops = length(p.graph[].flow_dict) + @test Ribasim.get_flow(p.graph, NodeID(1), NodeID(2), 0) ≈ 5.0 atol = 0.001 skip = + Sys.isapple() + @test Ribasim.get_flow(p.graph, NodeID(101), NodeID(102), 0) ≈ 5.0 atol = 0.001 skip = + Sys.isapple() end diff --git a/core/test/runtests.jl b/core/test/runtests.jl index af35a8a85..442308612 100644 --- a/core/test/runtests.jl +++ b/core/test/runtests.jl @@ -1,3 +1,3 @@ using ReTestItems, Ribasim -runtests(Ribasim) +runtests(Ribasim; nworkers = min(4, Sys.CPU_THREADS ÷ 2), nworker_threads = 2) diff --git a/core/test/utils_test.jl b/core/test/utils_test.jl index b1cdc68b2..329da7a44 100644 --- a/core/test/utils_test.jl +++ b/core/test/utils_test.jl @@ -170,7 +170,7 @@ end new_key = (Ribasim.NodeID(1), "TTF") logic_mapping[new_key] = "bar" - @test_throws "Multiple control states found for DiscreteControl node #1 for truth state `TTF`: foo, bar." Ribasim.expand_logic_mapping( + @test_throws "AssertionError: Multiple control states found for DiscreteControl node #1 for truth state `TTF`: [\"bar\", \"foo\"]." Ribasim.expand_logic_mapping( logic_mapping, ) end From 2cf33ecb83ac9438a9ad74a160d203058070cbea Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Wed, 29 Nov 2023 09:23:54 +0100 Subject: [PATCH 5/9] Docstrings --- core/src/create.jl | 40 ---------------------------------------- core/src/utils.jl | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 40 deletions(-) diff --git a/core/src/create.jl b/core/src/create.jl index 17fba5e27..b165941e3 100644 --- a/core/src/create.jl +++ b/core/src/create.jl @@ -196,46 +196,6 @@ end const nonconservative_nodetypes = Set{String}(["Basin", "LevelBoundary", "FlowBoundary", "Terminal", "User"]) -# function Connectivity(db::DB, config::Config, chunk_size::Int)::Connectivity -# if !valid_edge_types(db) -# error("Invalid edge types found.") -# end - -# graph = create_graph(db) - -# # Build the sparsity structure of the flow matrix -# flow = spzeros(nv(graph), nv(graph)) -# for e in edges(graph) -# id_src = label_for(graph, e.src) -# id_dst = label_for(graph, e.dst) -# edge_metadata = graph[id_src, id_dst] -# if edge_metadata.type == EdgeType.flow -# flow[id_src, id_dst] = 1.0 -# end -# end - -# # Add a self-loop, i.e. an entry on the diagonal, for all non-conservative node types. -# # This is used to store the gain (positive) or loss (negative) for the water balance. -# # Note that this only affects the sparsity structure. -# # We want to do it here to avoid changing that during the simulation and keeping it predictable, -# # e.g. if we wouldn't do this, inactive nodes can appear if control turns them on during runtime. -# for (i, nodetype) in enumerate(get_nodetypes(db)) -# if nodetype in nonconservative_nodetypes -# flow[i, i] = 1.0 -# end -# end -# flow .= 0.0 - -# if config.solver.autodiff -# # FixedSizeDiffCache performs better for sparse matrix -# flow = FixedSizeDiffCache(flow, chunk_size) -# end - -# allocation_models = AllocationModel[] - -# return Connectivity(graph, flow, allocation_models) -# end - function generate_allocation_models!(p::Parameters, config::Config)::Nothing (; graph, allocation_models) = p diff --git a/core/src/utils.jl b/core/src/utils.jl index 0f4c85495..decf5dc31 100644 --- a/core/src/utils.jl +++ b/core/src/utils.jl @@ -101,35 +101,53 @@ function create_graph(db::DB, config::Config, chunk_size::Int)::MetaGraph return graph end +""" +Set the given flow q over the edge between the given nodes. +""" function set_flow!(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, q::Number)::Nothing (; flow_dict, flow) = graph[] get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] = q return nothing end +""" +Set the given flow q on the horizontal (self-loop) edge from id to id. +""" function set_flow!(graph::MetaGraph, id::NodeID, q::Number)::Nothing (; flow_vertical_dict, flow_vertical) = graph[] get_tmp(flow_vertical, q)[flow_vertical_dict[id]] = q return nothing end +""" +Add the given flow q to the existing flow over the edge between the given nodes. +""" function add_flow!(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, q::Number)::Nothing (; flow_dict, flow) = graph[] get_tmp(flow, q)[flow_dict[(id_src, id_dst)]] += q return nothing end +""" +Add the given flow q to the flow over the edge on the horizontal (self-loop) edge from id to id. +""" function add_flow!(graph::MetaGraph, id::NodeID, q::Number)::Nothing (; flow_vertical_dict, flow_vertical) = graph[] get_tmp(flow_vertical, q)[flow_vertical_dict[id]] += q return nothing end +""" +Get the flow over the given edge (val is needed for get_tmp from ForwardDiff.jl). +""" function get_flow(graph::MetaGraph, id_src::NodeID, id_dst::NodeID, val)::Number (; flow_dict, flow) = graph[] return get_tmp(flow, val)[flow_dict[id_src, id_dst]] end +""" +Get the flow over the given horizontal (selfloop) edge (val is needed for get_tmp from ForwardDiff.jl). +""" function get_flow(graph::MetaGraph, id::NodeID, val)::Number (; flow_vertical_dict, flow_vertical) = graph[] return get_tmp(flow_vertical, val)[flow_vertical_dict[id]] From 959048fd73535f8c33baae7df2126519477a861e Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Wed, 29 Nov 2023 09:44:56 +0100 Subject: [PATCH 6/9] Merge branch 'main' into connectivity_refactor --- .vscode/settings.json | 3 +- README.md | 4 +- core/Project.toml | 2 +- core/src/Ribasim.jl | 8 +- core/src/allocation.jl | 42 +- core/src/bmi.jl | 46 +- core/src/config.jl | 1 + core/src/consts.jl | 1 + core/src/create.jl | 36 + core/src/io.jl | 76 +- core/src/lib.jl | 11 +- core/src/solve.jl | 53 +- core/src/utils.jl | 85 +- core/src/validation.jl | 89 +- core/test/allocation_test.jl | 6 +- core/test/run_models_test.jl | 6 +- core/test/utils_test.jl | 13 + core/test/validation_test.jl | 73 +- docs/contribute/release.qmd | 2 +- docs/core/usage.qmd | 33 + docs/index.qmd | 4 +- docs/schema/BasinSubgrid.schema.json | 37 + docs/schema/Results.schema.json | 32 +- .../{Config.schema.json => Toml.schema.json} | 26 +- docs/schema/basin.schema.json | 12 + docs/schema/root.schema.json | 3 + mypy.ini | 10 + pixi.lock | 4008 +++++++++-------- pixi.toml | 10 +- python/ribasim/pyproject.toml | 1 + python/ribasim/ribasim/__init__.py | 2 +- python/ribasim/ribasim/config.py | 6 + python/ribasim/ribasim/models.py | 9 + python/ribasim_api/ribasim_api/__init__.py | 2 +- .../ribasim_testmodels/__init__.py | 2 +- .../ribasim_testmodels/trivial.py | 18 +- ribasim_qgis/core/geopackage.py | 25 +- ribasim_qgis/core/model.py | 35 + ribasim_qgis/core/nodes.py | 743 +-- ribasim_qgis/core/topology.py | 27 +- ribasim_qgis/metadata.txt | 2 +- ribasim_qgis/scripts/enable_plugin.py | 6 + ribasim_qgis/scripts/install_imod_qgis.py | 15 - ribasim_qgis/scripts/install_qgis_plugin.py | 25 + ribasim_qgis/widgets/dataset_widget.py | 140 +- ribasim_qgis/widgets/nodes_widget.py | 24 +- ribasim_qgis/widgets/results_widget.py | 36 - ribasim_qgis/widgets/ribasim_widget.py | 100 +- utils/runstats.jl | 2 +- 49 files changed, 3459 insertions(+), 2493 deletions(-) create mode 100644 docs/schema/BasinSubgrid.schema.json rename docs/schema/{Config.schema.json => Toml.schema.json} (90%) create mode 100644 ribasim_qgis/core/model.py delete mode 100644 ribasim_qgis/scripts/install_imod_qgis.py create mode 100644 ribasim_qgis/scripts/install_qgis_plugin.py delete mode 100644 ribasim_qgis/widgets/results_widget.py diff --git a/.vscode/settings.json b/.vscode/settings.json index 60b28fd9a..cedba893e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,5 +16,6 @@ }, "python.analysis.extraPaths": [ ".pixi/env/Library/python" - ] + ], + "mypy-type-checker.importStrategy": "fromEnvironment" } diff --git a/README.md b/README.md index 245929ff2..081a65a51 100644 --- a/README.md +++ b/README.md @@ -21,14 +21,14 @@ libraries, notably [ModelingToolkit.jl](https://mtk.sciml.ai/stable/). For most users the [latest release](https://github.com/Deltares/Ribasim/releases/latest) is recommended, it can be downloaded here: - Ribasim executable: [ribasim_cli.zip](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim_cli.zip). -- Python package: [ribasim-0.5.0-py3-none-any.whl](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim-0.5.0-py3-none-any.whl) +- Python package: [ribasim-0.6.0-py3-none-any.whl](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim-0.6.0-py3-none-any.whl) - QGIS plugin: [ribasim_qgis.zip](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim_qgis.zip). - Generated testmodels: [generated_testmodels.zip](https://github.com/Deltares/Ribasim/releases/latest/download/generated_testmodels.zip) The nightly builds contain the latest developments and can be found below. It is important to either use the release or nightly for all components. - Ribasim executable: [ribasim_cli.zip](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim_cli.zip). -- Python package: [ribasim-0.5.0-py3-none-any.whl](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim-0.5.0-py3-none-any.whl) +- Python package: [ribasim-0.6.0-py3-none-any.whl](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim-0.6.0-py3-none-any.whl) - QGIS plugin: [ribasim_qgis.zip](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim_qgis.zip). Currently only Windows builds for `ribasim_cli.zip` are available. diff --git a/core/Project.toml b/core/Project.toml index 29007218c..6f1617ebb 100644 --- a/core/Project.toml +++ b/core/Project.toml @@ -2,7 +2,7 @@ name = "Ribasim" uuid = "aac5e3d9-0b8f-4d4f-8241-b1a7a9632635" authors = ["Deltares and contributors "] manifest = "../Manifest.toml" -version = "0.4.0" +version = "0.5.0" [deps] Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" diff --git a/core/src/Ribasim.jl b/core/src/Ribasim.jl index cb94448cb..0827e4a87 100644 --- a/core/src/Ribasim.jl +++ b/core/src/Ribasim.jl @@ -49,7 +49,13 @@ using Legolas: Legolas, @schema, @version, validate, SchemaVersion, declared using Logging: current_logger, min_enabled_level, with_logger using LoggingExtras: EarlyFilteredLogger, LevelOverrideLogger using MetaGraphsNext: - MetaGraphsNext, MetaGraph, label_for, labels, outneighbor_labels, inneighbor_labels + MetaGraphsNext, + MetaGraph, + label_for, + code_for, + labels, + outneighbor_labels, + inneighbor_labels using OrdinaryDiffEq using PreallocationTools: DiffCache, FixedSizeDiffCache, get_tmp using SciMLBase diff --git a/core/src/allocation.jl b/core/src/allocation.jl index c66681306..397594d16 100644 --- a/core/src/allocation.jl +++ b/core/src/allocation.jl @@ -12,8 +12,8 @@ function allocation_graph_used_nodes!(p::Parameters, allocation_network_id::Int) node_type = graph[node_id].type if node_type in [:user, :basin] push!(used_nodes, node_id) - - elseif length(inoutflow_ids(graph, node_id)) > 2 + elseif count(x -> true, inoutflow_ids(graph, node_id)) > 2 + # use count since the length of the iterator is unknown push!(used_nodes, node_id) end end @@ -500,9 +500,9 @@ function add_constraints_user_returnflow!( problem[:return_flow] = JuMP.@constraint( problem, [node_id_user = node_ids_user_with_returnflow], - F[node_id_user.value, only(outflow_ids_allocation(graph, node_id_user)).value] <= + F[Int(node_id_user), Int(only(outflow_ids_allocation(graph, node_id_user)))] <= user.return_factor[findsorted(user.node_id, node_id)] * - F[only(inflow_ids_allocation(graph, node_id_user)).value, node_iduser.value], + F[Int(only(inflow_ids_allocation(graph, node_id_user))), Int(node_iduser)], base_name = "return_flow", ) return nothing @@ -734,7 +734,7 @@ function assign_allocations!( # Save allocations to record push!(record.time, t) push!(record.allocation_network_id, allocation_model.allocation_network_id) - push!(record.user_node_id, user_node_id.value) + push!(record.user_node_id, Int(user_node_id)) push!(record.priority, user.priorities[priority_idx]) push!(record.demand, user.demand[user_idx][priority_idx](t)) push!(record.allocated, allocated) @@ -749,22 +749,38 @@ function assign_allocations!( end """ -Set the source flows as capacities on threir edges in the allocation problem. +Adjust the source flows. """ -function set_source_flows!(allocation_model::AllocationModel, p::Parameters)::Nothing +function adjust_source_flows!( + allocation_model::AllocationModel, + p::Parameters, + priority_idx::Int, +)::Nothing (; problem) = allocation_model (; graph) = p (; allocation_network_id) = allocation_model edge_ids = graph[].edge_ids[allocation_network_id] source_constraints = problem[:source] + F = problem[:F] # It is assumed that the allocation procedure does not have to be differentiated. for edge_id in edge_ids + # If it is a source edge. if graph[edge_id...].allocation_network_id_source == allocation_network_id - JuMP.set_normalized_rhs( - source_constraints[edge_id], - get_flow(graph, edge_id..., 0), - ) + if priority_idx == 1 + # Reset the source to the current flow. + JuMP.set_normalized_rhs( + source_constraints[edge_id], + get_flow(graph, edge_id..., 0), + ) + else + # Subtract the allocated flow from the source. + JuMP.set_normalized_rhs( + source_constraints[edge_id], + JuMP.normalized_rhs(source_constraints[edge_id]) - + JuMP.value(F[edge_id]), + ) + end end end return nothing @@ -818,14 +834,14 @@ function allocate!(p::Parameters, allocation_model::AllocationModel, t::Float64) (; problem) = allocation_model (; priorities) = user - set_source_flows!(allocation_model, p) - # TODO: Compute basin flow from vertical fluxes and basin volume. # Set as basin demand if the net flow is negative, set as source # in the flow_conservation constraints if the net flow is positive. # Solve this as a separate problem before the priorities below for priority_idx in eachindex(priorities) + adjust_source_flows!(allocation_model, p, priority_idx) + # Subtract the flows used by the allocation of the previous priority from the capacities of the edges # or set edge capacities if priority_idx = 1 adjust_edge_capacities!(allocation_model, p, priority_idx) diff --git a/core/src/bmi.jl b/core/src/bmi.jl index f227983fe..e7a3d4ff5 100644 --- a/core/src/bmi.jl +++ b/core/src/bmi.jl @@ -70,6 +70,7 @@ function BMI.initialize(T::Type{Model}, config::Config)::Model # use state state = load_structvector(db, config, BasinStateV1) n = length(get_ids(db, "Basin")) + finally # always close the database, also in case of an error close(db) @@ -104,7 +105,7 @@ function BMI.initialize(T::Type{Model}, config::Config)::Model end @debug "Setup ODEProblem." - callback, saved_flow = create_callbacks(parameters, config; config.solver.saveat) + callback, saved = create_callbacks(parameters, config; config.solver.saveat) @debug "Created callbacks." # Initialize the integrator, providing all solver options as described in @@ -138,7 +139,7 @@ function BMI.initialize(T::Type{Model}, config::Config)::Model set_initial_discrete_controlled_parameters!(integrator, storage) - return Model(integrator, config, saved_flow) + return Model(integrator, config, saved) end """ @@ -171,6 +172,11 @@ function BMI.finalize(model::Model)::Model path = results_path(config, RESULTS_FILENAME.allocation) write_arrow(path, table, compress) + # exported levels + table = subgrid_level_table(model) + path = results_path(config, RESULTS_FILENAME.subgrid_levels) + write_arrow(path, table, compress) + @debug "Wrote results." return model end @@ -209,7 +215,7 @@ function create_callbacks( parameters::Parameters, config::Config; saveat, -)::Tuple{CallbackSet, SavedValues{Float64, Vector{Float64}}} +)::Tuple{CallbackSet, SavedResults} (; starttime, basin, tabulated_rating_curve, discrete_control) = parameters callbacks = SciMLBase.DECallback[] @@ -235,6 +241,20 @@ function create_callbacks( save_flow_cb = SavingCallback(save_flow, saved_flow; saveat, save_start = false) push!(callbacks, save_flow_cb) + # interpolate the levels + saved_subgrid_level = SavedValues(Float64, Vector{Float64}) + if config.results.subgrid + export_cb = SavingCallback( + save_subgrid_level, + saved_subgrid_level; + saveat, + save_start = false, + ) + push!(callbacks, export_cb) + end + + saved = SavedResults(saved_flow, saved_subgrid_level) + n_conditions = length(discrete_control.node_id) if n_conditions > 0 discrete_control_cb = VectorContinuousCallback( @@ -247,7 +267,7 @@ function create_callbacks( end callback = CallbackSet(callbacks...) - return callback, saved_flow + return callback, saved end """ @@ -449,7 +469,7 @@ function discrete_control_affect!( record = discrete_control.record push!(record.time, integrator.t) - push!(record.control_node_id, discrete_control_node_id.value) + push!(record.control_node_id, Int(discrete_control_node_id)) push!(record.truth_state, truth_state_used) push!(record.control_state, control_state_new) @@ -486,6 +506,20 @@ function save_flow(u, t, integrator) ] end +function update_subgrid_level!(integrator)::Nothing + basin_level = get_tmp(integrator.p.basin.current_level, 0) + subgrid = integrator.p.subgrid + for (i, (index, interp)) in enumerate(zip(subgrid.basin_index, subgrid.interpolations)) + subgrid.level[i] = interp(basin_level[index]) + end +end + +"Interpolate the levels and save them to SavedValues" +function save_subgrid_level(u, t, integrator) + update_subgrid_level!(integrator) + return copy(integrator.p.subgrid.level) +end + "Load updates from 'Basin / time' into the parameters" function update_basin(integrator)::Nothing (; basin) = integrator.p @@ -567,6 +601,8 @@ function BMI.get_value_ptr(model::Model, name::AbstractString) model.integrator.p.basin.infiltration elseif name == "drainage" model.integrator.p.basin.drainage + elseif name == "subgrid_level" + model.integrator.p.subgrid.level else error("Unknown variable $name") end diff --git a/core/src/config.jl b/core/src/config.jl index 41e4b7d0d..3b2483861 100644 --- a/core/src/config.jl +++ b/core/src/config.jl @@ -112,6 +112,7 @@ end outstate::Union{String, Nothing} = nothing compression::Compression = "zstd" compression_level::Int = 6 + subgrid::Bool = false end @option struct Logging <: TableOption diff --git a/core/src/consts.jl b/core/src/consts.jl index e138e85fc..50126b04f 100644 --- a/core/src/consts.jl +++ b/core/src/consts.jl @@ -3,4 +3,5 @@ const RESULTS_FILENAME = ( flow = "flow.arrow", control = "control.arrow", allocation = "allocation.arrow", + subgrid_levels = "subgrid_levels.arrow", ) diff --git a/core/src/create.jl b/core/src/create.jl index b165941e3..c038d2f01 100644 --- a/core/src/create.jl +++ b/core/src/create.jl @@ -742,6 +742,39 @@ function User(db::DB, config::Config)::User ) end +function Subgrid(db::DB, config::Config, basin::Basin)::Subgrid + node_to_basin = Dict(node_id => index for (index, node_id) in enumerate(basin.node_id)) + tables = load_structvector(db, config, BasinSubgridV1) + + basin_ids = Int[] + interpolations = ScalarInterpolation[] + has_error = false + for group in IterTools.groupby(row -> row.subgrid_id, tables) + subgrid_id = first(getproperty.(group, :subgrid_id)) + node_id = NodeID(first(getproperty.(group, :node_id))) + basin_level = getproperty.(group, :basin_level) + subgrid_level = getproperty.(group, :subgrid_level) + + is_valid = + valid_subgrid(subgrid_id, node_id, node_to_basin, basin_level, subgrid_level) + + if is_valid + # Ensure it doesn't extrapolate before the first value. + pushfirst!(subgrid_level, first(subgrid_level)) + pushfirst!(basin_level, nextfloat(-Inf)) + new_interp = LinearInterpolation(subgrid_level, basin_level; extrapolate = true) + push!(basin_ids, node_to_basin[node_id]) + push!(interpolations, new_interp) + else + has_error = true + end + end + + has_error && error("Invalid Basin / subgrid table.") + + return Subgrid(basin_ids, interpolations, fill(NaN, length(basin_ids))) +end + function Parameters(db::DB, config::Config)::Parameters n_states = length(get_ids(db, "Basin")) + length(get_ids(db, "PidControl")) chunk_size = pickchunksize(n_states) @@ -762,6 +795,7 @@ function Parameters(db::DB, config::Config)::Parameters user = User(db, config) basin = Basin(db, config, chunk_size) + subgrid_level = Subgrid(db, config, basin) # Set is_pid_controlled to true for those pumps and outlets that are PID controlled for id in pid_control.node_id @@ -792,6 +826,8 @@ function Parameters(db::DB, config::Config)::Parameters discrete_control, pid_control, user, + Dict{Int, Symbol}(), + subgrid_level, ) # Allocation data structures if config.allocation.use_allocation diff --git a/core/src/io.jl b/core/src/io.jl index 63fde1548..d51785c6d 100644 --- a/core/src/io.jl +++ b/core/src/io.jl @@ -129,15 +129,11 @@ end function get_storages_and_levels( model::Model, )::@NamedTuple{ - time::Vector{Dates.DateTime}, + time::Vector{DateTime}, node_id::Vector{NodeID}, storage::Matrix{Float64}, level::Matrix{Float64}, } - NamedTuple{ - (:time, :node_id, :storage, :level), - Tuple{Vector{Dates.DateTime}, Vector{Int}, Matrix{Float64}, Matrix{Float64}}, - } (; config, integrator) = model (; sol, p) = integrator @@ -155,21 +151,36 @@ function get_storages_and_levels( end "Create the basin result table from the saved data" -function basin_table(model::Model)::NamedTuple +function basin_table( + model::Model, +)::@NamedTuple{ + time::Vector{DateTime}, + node_id::Vector{Int}, + storage::Vector{Float64}, + level::Vector{Float64}, +} data = get_storages_and_levels(model) nbasin = length(data.node_id) ntsteps = length(data.time) time = repeat(data.time; inner = nbasin) - node_id = repeat(data.node_id; outer = ntsteps) + node_id = repeat(Int.(data.node_id); outer = ntsteps) return (; time, node_id, storage = vec(data.storage), level = vec(data.level)) end "Create a flow result table from the saved data" -function flow_table(model::Model)::NamedTuple - (; config, saved_flow, integrator) = model - (; t, saveval) = saved_flow +function flow_table( + model::Model, +)::@NamedTuple{ + time::Vector{DateTime}, + edge_id::Vector{Union{Int, Missing}}, + from_node_id::Vector{Int}, + to_node_id::Vector{Int}, + flow::FlatVector{Float64}, +} + (; config, saved, integrator) = model + (; t, saveval) = saved.flow (; graph) = integrator.p (; flow_dict, flow_vertical_dict) = graph[] @@ -207,7 +218,14 @@ function flow_table(model::Model)::NamedTuple end "Create a discrete control result table from the saved data" -function discrete_control_table(model::Model)::NamedTuple +function discrete_control_table( + model::Model, +)::@NamedTuple{ + time::Vector{DateTime}, + control_node_id::Vector{Int}, + truth_state::Vector{String}, + control_state::Vector{String}, +} (; config) = model (; record) = model.integrator.p.discrete_control @@ -216,7 +234,17 @@ function discrete_control_table(model::Model)::NamedTuple end "Create an allocation result table for the saved data" -function allocation_table(model::Model)::NamedTuple +function allocation_table( + model::Model, +)::@NamedTuple{ + time::Vector{DateTime}, + allocation_network_id::Vector{Int}, + user_node_id::Vector{Int}, + priority::Vector{Int}, + demand::Vector{Float64}, + allocated::Vector{Float64}, + abstracted::Vector{Float64}, +} (; config) = model (; record) = model.integrator.p.user @@ -232,15 +260,37 @@ function allocation_table(model::Model)::NamedTuple ) end +function subgrid_level_table( + model::Model, +)::@NamedTuple{ + time::Vector{DateTime}, + subgrid_id::Vector{Int}, + subgrid_level::Vector{Float64}, +} + (; config, saved, integrator) = model + (; t, saveval) = saved.subgrid_level + subgrid = integrator.p.subgrid + + nelem = length(subgrid.basin_index) + ntsteps = length(t) + unique_elem_id = collect(1:nelem) + + time = repeat(datetime_since.(t, config.starttime); inner = nelem) + subgrid_id = repeat(unique_elem_id; outer = ntsteps) + subgrid_level = FlatVector(saveval) + return (; time, subgrid_id, subgrid_level) +end + "Write a result table to disk as an Arrow file" function write_arrow( path::AbstractString, table::NamedTuple, compress::TranscodingStreams.Codec, -) +)::Nothing # ensure DateTime is encoded in a compatible manner # https://github.com/apache/arrow-julia/issues/303 table = merge(table, (; time = convert.(Arrow.DATETIME, table.time))) mkpath(dirname(path)) Arrow.write(path, table; compress) + return nothing end diff --git a/core/src/lib.jl b/core/src/lib.jl index f07979eb1..6d29a5276 100644 --- a/core/src/lib.jl +++ b/core/src/lib.jl @@ -1,3 +1,8 @@ +struct SavedResults + flow::SavedValues{Float64, Vector{Float64}} + subgrid_level::SavedValues{Float64, Vector{Float64}} +end + """ Model(config_path::AbstractString) Model(config::Config) @@ -11,13 +16,13 @@ A Model can be created from the path to a TOML configuration file, or a Config o struct Model{T} integrator::T config::Config - saved_flow::SavedValues{Float64, Vector{Float64}} + saved::SavedResults function Model( integrator::T, config, - saved_flow, + saved, ) where {T <: SciMLBase.AbstractODEIntegrator} - new{T}(integrator, config, saved_flow) + new{T}(integrator, config, saved) end end diff --git a/core/src/solve.jl b/core/src/solve.jl index d557bd793..f773fabb5 100644 --- a/core/src/solve.jl +++ b/core/src/solve.jl @@ -100,25 +100,21 @@ struct Basin{T, C} <: AbstractParameterNode storage, time::StructVector{BasinTimeV1, C, Int}, ) where {T, C} - errors = valid_profiles(node_id, level, area) - if isempty(errors) - return new{T, C}( - node_id, - precipitation, - potential_evaporation, - drainage, - infiltration, - current_level, - current_area, - area, - level, - storage, - time, - ) - else - foreach(x -> @error(x), errors) - error("Errors occurred when parsing Basin data.") - end + is_valid = valid_profiles(node_id, level, area) + is_valid || error("Invalid Basin / profile table.") + return new{T, C}( + node_id, + precipitation, + potential_evaporation, + drainage, + infiltration, + current_level, + current_area, + area, + level, + storage, + time, + ) end end @@ -421,6 +417,13 @@ struct User <: AbstractParameterNode } end +"Subgrid linearly interpolates basin levels." +struct Subgrid + basin_index::Vector{Int} + interpolations::Vector{ScalarInterpolation} + level::Vector{Float64} +end + # TODO Automatically add all nodetypes here struct Parameters{T, C1, C2} starttime::DateTime @@ -456,6 +459,8 @@ struct Parameters{T, C1, C2} discrete_control::DiscreteControl pid_control::PidControl{T} user::User + lookup::Dict{Int, Symbol} + subgrid::Subgrid end """ @@ -486,14 +491,8 @@ function valid_n_neighbors(node::AbstractParameterNode, graph::MetaGraph)::Bool for id in node.node_id for (bounds, edge_type) in zip((bounds_flow, bounds_control), (EdgeType.flow, EdgeType.control)) - n_inneighbors = length([ - node_id for - node_id in inneighbor_labels_type(graph, id, edge_type) if node_id != id - ]) - n_outneighbors = length([ - node_id for node_id in outneighbor_labels_type(graph, id, edge_type) if - node_id != id - ]) + n_inneighbors = count(x -> true, inneighbor_labels_type(graph, id, edge_type)) + n_outneighbors = count(x -> true, outneighbor_labels_type(graph, id, edge_type)) if n_inneighbors < bounds.in_min @error "Nodes of type $node_type must have at least $(bounds.in_min) $edge_type inneighbor(s) (got $n_inneighbors for node $id)." diff --git a/core/src/utils.jl b/core/src/utils.jl index decf5dc31..9327bd539 100644 --- a/core/src/utils.jl +++ b/core/src/utils.jl @@ -101,6 +101,61 @@ function create_graph(db::DB, config::Config, chunk_size::Int)::MetaGraph return graph end +abstract type AbstractNeighbors end + +""" +Iterate over incoming neighbors of a given label in a MetaGraph, only for edges of edge_type +""" +struct InNeighbors{T} <: AbstractNeighbors + graph::T + label::NodeID + edge_type::EdgeType.T +end + +""" +Iterate over outgoing neighbors of a given label in a MetaGraph, only for edges of edge_type +""" +struct OutNeighbors{T} <: AbstractNeighbors + graph::T + label::NodeID + edge_type::EdgeType.T +end + +Base.IteratorSize(::Type{<:AbstractNeighbors}) = Base.SizeUnknown() +Base.eltype(::Type{<:AbstractNeighbors}) = NodeID + +function Base.iterate(iter::InNeighbors, state = 1) + (; graph, label, edge_type) = iter + code = code_for(graph, label) + local label_in + while true + x = iterate(inneighbors(graph, code), state) + x === nothing && return nothing + code_in, state = x + label_in = label_for(graph, code_in) + if graph[label_in, label].type == edge_type + break + end + end + return label_in, state +end + +function Base.iterate(iter::OutNeighbors, state = 1) + (; graph, label, edge_type) = iter + code = code_for(graph, label) + local label_out + while true + x = iterate(outneighbors(graph, code), state) + x === nothing && return nothing + code_out, state = x + label_out = label_for(graph, code_out) + if graph[label, label_out].type == edge_type + break + end + end + return label_out, state +end + """ Set the given flow q over the edge between the given nodes. """ @@ -161,11 +216,8 @@ function inneighbor_labels_type( graph::MetaGraph, label::NodeID, edge_type::EdgeType.T, -)::Vector{NodeID} - return [ - label_in for label_in in inneighbor_labels(graph, label) if - graph[label_in, label].type == edge_type - ] +)::InNeighbors + return InNeighbors(graph, label, edge_type) end """ @@ -176,11 +228,8 @@ function outneighbor_labels_type( graph::MetaGraph, label::NodeID, edge_type::EdgeType.T, -)::Vector{NodeID} - return [ - label_out for label_out in outneighbor_labels(graph, label) if - graph[label, label_out].type == edge_type - ] +)::OutNeighbors + return OutNeighbors(graph, label, edge_type) end """ @@ -191,31 +240,31 @@ function all_neighbor_labels_type( graph::MetaGraph, label::NodeID, edge_type::EdgeType.T, -)::Vector{NodeID} - return [ - outneighbor_labels_type(graph, label, edge_type)..., - inneighbor_labels_type(graph, label, edge_type)..., - ] +)::Iterators.Flatten + return Iterators.flatten(( + outneighbor_labels_type(graph, label, edge_type), + inneighbor_labels_type(graph, label, edge_type), + )) end """ Get the outneighbors over flow edges. """ -function outflow_ids(graph::MetaGraph, id::NodeID)::Vector{NodeID} +function outflow_ids(graph::MetaGraph, id::NodeID)::OutNeighbors return outneighbor_labels_type(graph, id, EdgeType.flow) end """ Get the inneighbors over flow edges. """ -function inflow_ids(graph::MetaGraph, id::NodeID)::Vector{NodeID} +function inflow_ids(graph::MetaGraph, id::NodeID)::InNeighbors return inneighbor_labels_type(graph, id, EdgeType.flow) end """ Get the in- and outneighbors over flow edges. """ -function inoutflow_ids(graph::MetaGraph, id::NodeID)::Vector{NodeID} +function inoutflow_ids(graph::MetaGraph, id::NodeID)::Iterators.Flatten return all_neighbor_labels_type(graph, id, EdgeType.flow) end diff --git a/core/src/validation.jl b/core/src/validation.jl index 0222d1c8e..a6abe919e 100644 --- a/core/src/validation.jl +++ b/core/src/validation.jl @@ -8,6 +8,7 @@ @schema "ribasim.basin.time" BasinTime @schema "ribasim.basin.profile" BasinProfile @schema "ribasim.basin.state" BasinState +@schema "ribasim.basin.subgrid" BasinSubgrid @schema "ribasim.terminal.static" TerminalStatic @schema "ribasim.fractionalflow.static" FractionalFlowStatic @schema "ribasim.flowboundary.static" FlowBoundaryStatic @@ -30,7 +31,7 @@ tablename(sv::Type{SchemaVersion{T, N}}) where {T, N} = tablename(sv()) tablename(sv::SchemaVersion{T, N}) where {T, N} = join(filter(!isnothing, nodetype(sv)), delimiter) isnode(sv::Type{SchemaVersion{T, N}}) where {T, N} = isnode(sv()) -isnode(::SchemaVersion{T, N}) where {T, N} = length(split(string(T), ".")) == 3 +isnode(::SchemaVersion{T, N}) where {T, N} = length(split(string(T), '.'; limit = 3)) == 3 nodetype(sv::Type{SchemaVersion{T, N}}) where {T, N} = nodetype(sv()) """ @@ -43,9 +44,9 @@ function nodetype( # so we parse the related record Ribasim.BasinTimeV1 # to derive BasinTime from it. record = Legolas.record_type(sv) - node = last(split(string(Symbol(record)), ".")) + node = last(split(string(Symbol(record)), '.'; limit = 3)) - elements = split(string(T), ".") + elements = split(string(T), '.'; limit = 3) if isnode(sv) n = elements[2] k = Symbol(elements[3]) @@ -202,6 +203,13 @@ end level::Float64 end +@version BasinSubgridV1 begin + subgrid_id::Int + node_id::Int + basin_level::Float64 + subgrid_level::Float64 +end + @version FractionalFlowStaticV1 begin node_id::Int fraction::Float64 @@ -362,6 +370,7 @@ sort_by_id_level(row) = (row.node_id, row.level) sort_by_id_state_level(row) = (row.node_id, row.control_state, row.level) sort_by_priority(row) = (row.node_id, row.priority) sort_by_priority_time(row) = (row.node_id, row.priority, row.time) +sort_by_subgrid_level(row) = (row.subgrid_id, row.basin_level) # get the right sort by function given the Schema, with sort_by_id as the default sort_by_function(table::StructVector{<:Legolas.AbstractRecord}) = sort_by_id @@ -371,6 +380,7 @@ sort_by_function(table::StructVector{TabulatedRatingCurveStaticV1}) = sort_by_id sort_by_function(table::StructVector{BasinProfileV1}) = sort_by_id_level sort_by_function(table::StructVector{UserStaticV1}) = sort_by_priority sort_by_function(table::StructVector{UserTimeV1}) = sort_by_priority_time +sort_by_function(table::StructVector{BasinSubgridV1}) = sort_by_subgrid_level const TimeSchemas = Union{ BasinTimeV1, @@ -410,27 +420,17 @@ struct NodeID value::Int end +Base.Int(id::NodeID) = id.value Base.convert(::Type{NodeID}, value::Int) = NodeID(value) +Base.convert(::Type{Int}, id::NodeID) = id.value Base.broadcastable(id::NodeID) = Ref(id) -Base.show(io::IO, id::NodeID) = print(io, '#', id.value) +Base.show(io::IO, id::NodeID) = print(io, '#', Int(id)) function Base.isless(id_1::NodeID, id_2::NodeID)::Bool - return id_1.value < id_2.value + return Int(id_1) < Int(id_2) end -function Base.getindex(M::AbstractArray, id_row::NodeID, id_col::NodeID) - return M[id_row.value, id_col.value] -end - -function Base.setindex!( - M::AbstractArray, - value::T, - id_row::NodeID, - id_col::NodeID, -)::Nothing where {T} - M[id_row.value, id_col.value] = value - return nothing -end +Base.to_index(id::NodeID) = Int(id) """ Test for each node given its node type whether the nodes that @@ -460,29 +460,30 @@ function valid_profiles( node_id::Indices{NodeID}, level::Vector{Vector{Float64}}, area::Vector{Vector{Float64}}, -)::Vector{String} - errors = String[] +)::Bool + errors = false for (id, levels, areas) in zip(node_id, level, area) if !allunique(levels) - push!(errors, "Basin $id has repeated levels, this cannot be interpolated.") + errors = true + @error "Basin $id has repeated levels, this cannot be interpolated." end if areas[1] <= 0 - push!( - errors, - "Basin profiles cannot start with area <= 0 at the bottom for numerical reasons (got area $(areas[1]) for node $id).", + errors = true + @error( + "Basin profiles cannot start with area <= 0 at the bottom for numerical reasons.", + node_id = id, + area = areas[1], ) end if areas[end] < areas[end - 1] - push!( - errors, - "Basin profiles cannot have decreasing area at the top since extrapolating could lead to negative areas, found decreasing top areas for node $id.", - ) + errors = true + @error "Basin profiles cannot have decreasing area at the top since extrapolating could lead to negative areas, found decreasing top areas for node $id." end end - return errors + return !errors end """ @@ -629,3 +630,33 @@ function valid_fractional_flow( end return !errors end + +""" +Validate the entries for a single subgrid element. +""" +function valid_subgrid( + subgrid_id::Int, + node_id::NodeID, + node_to_basin::Dict{NodeID, Int}, + basin_level::Vector{Float64}, + subgrid_level::Vector{Float64}, +)::Bool + errors = false + + if !(node_id in keys(node_to_basin)) + errors = true + @error "The node_id of the Basin / subgrid_level does not refer to a basin." node_id subgrid_id + end + + if !allunique(basin_level) + errors = true + @error "Basin / subgrid_level subgrid_id $(subgrid_id) has repeated basin levels, this cannot be interpolated." + end + + if !allunique(subgrid_level) + errors = true + @error "Basin / subgrid_level subgrid_id $(subgrid_id) has repeated element levels, this cannot be interpolated." + end + + return !errors +end diff --git a/core/test/allocation_test.jl b/core/test/allocation_test.jl index 9cfa2db27..6daf61bb4 100644 --- a/core/test/allocation_test.jl +++ b/core/test/allocation_test.jl @@ -18,12 +18,8 @@ allocation_model = p.allocation_models[1] Ribasim.allocate!(p, allocation_model, 0.0) - F = JuMP.value.(allocation_model.problem[:F]) - @test all(F .>= 0) - @test any(F .≠ 0) - allocated = p.user.allocated - @test allocated[1] ≈ [0.0, 4.0] + @test allocated[1] ≈ [0.0, 0.0] @test allocated[2] ≈ [4.0, 0.0] @test allocated[3] ≈ [0.0, 0.0] end diff --git a/core/test/run_models_test.jl b/core/test/run_models_test.jl index 1646125fa..735150fa0 100644 --- a/core/test/run_models_test.jl +++ b/core/test/run_models_test.jl @@ -6,6 +6,10 @@ model = Ribasim.run(toml_path) @test model isa Ribasim.Model @test successful_retcode(model) + + # The exporter interpolates 1:1 for three subgrid elements, but shifted by 1.0 meter. + subgrid = model.integrator.p.subgrid + @test all(diff(subgrid.level) .≈ 1.0) end @testitem "bucket model" begin @@ -191,7 +195,7 @@ end (; level) = level_boundary level = level[1] - timesteps = model.saved_flow.t + timesteps = model.saved.flow.t flow = DataFrame(Ribasim.flow_table(model)) outlet_flow = filter([:from_node_id, :to_node_id] => (from, to) -> from === 2 && to === 3, flow) diff --git a/core/test/utils_test.jl b/core/test/utils_test.jl index 329da7a44..5ca2262c4 100644 --- a/core/test/utils_test.jl +++ b/core/test/utils_test.jl @@ -1,3 +1,16 @@ +@testitem "NodeID" begin + using Ribasim: NodeID + id = NodeID(2) + @test sprint(show, id) === "#2" + @test id < NodeID(3) + @test Int(id) === 2 + @test convert(Int, id) === 2 + @test convert(NodeID, 2) === NodeID(2) + a = [1, 0, 3] + a[id] = id + @test a[2] === 2 +end + @testitem "id_index" begin using Dictionaries: Indices diff --git a/core/test/validation_test.jl b/core/test/validation_test.jl index 08610b261..8c17c5e58 100644 --- a/core/test/validation_test.jl +++ b/core/test/validation_test.jl @@ -1,22 +1,35 @@ @testitem "Basin profile validation" begin using Dictionaries: Indices + using Ribasim: NodeID, valid_profiles, qh_interpolation using DataInterpolations: LinearInterpolation + using Logging - node_id = Indices([Ribasim.NodeID(1)]) + node_id = Indices([NodeID(1)]) level = [[0.0, 0.0, 1.0]] area = [[0.0, 100.0, 90]] - errors = Ribasim.valid_profiles(node_id, level, area) - @test "Basin #1 has repeated levels, this cannot be interpolated." in errors - @test "Basin profiles cannot start with area <= 0 at the bottom for numerical reasons (got area 0.0 for node #1)." in - errors - @test "Basin profiles cannot have decreasing area at the top since extrapolating could lead to negative areas, found decreasing top areas for node #1." in - errors - @test length(errors) == 3 - - itp, valid = Ribasim.qh_interpolation([0.0, 0.0], [1.0, 2.0]) + + logger = TestLogger() + with_logger(logger) do + @test !valid_profiles(node_id, level, area) + end + + @test length(logger.logs) == 3 + @test logger.logs[1].level == Error + @test logger.logs[1].message == + "Basin #1 has repeated levels, this cannot be interpolated." + @test logger.logs[2].level == Error + @test logger.logs[2].message == + "Basin profiles cannot start with area <= 0 at the bottom for numerical reasons." + @test logger.logs[2].kwargs[:node_id] == NodeID(1) + @test logger.logs[2].kwargs[:area] == 0 + @test logger.logs[3].level == Error + @test logger.logs[3].message == + "Basin profiles cannot have decreasing area at the top since extrapolating could lead to negative areas, found decreasing top areas for node #1." + + itp, valid = qh_interpolation([0.0, 0.0], [1.0, 2.0]) @test !valid @test itp isa LinearInterpolation - itp, valid = Ribasim.qh_interpolation([0.0, 0.1], [1.0, 2.0]) + itp, valid = qh_interpolation([0.0, 0.1], [1.0, 2.0]) @test valid @test itp isa LinearInterpolation end @@ -344,3 +357,41 @@ end @test logger.logs[2].message == "Invalid edge type 'bar' for edge #2 from node #2 to node #3." end + +@testitem "Subgrid validation" begin + using Ribasim: valid_subgrid, NodeID + using Logging + + node_to_basin = Dict(NodeID(9) => 1) + + logger = TestLogger() + with_logger(logger) do + @test !valid_subgrid(1, NodeID(10), node_to_basin, [-1.0, 0.0], [-1.0, 0.0]) + end + + @test length(logger.logs) == 1 + @test logger.logs[1].level == Error + @test logger.logs[1].message == + "The node_id of the Basin / subgrid_level does not refer to a basin." + @test logger.logs[1].kwargs[:node_id] == NodeID(10) + @test logger.logs[1].kwargs[:subgrid_id] == 1 + + logger = TestLogger() + with_logger(logger) do + @test !valid_subgrid( + 1, + NodeID(9), + node_to_basin, + [-1.0, 0.0, 0.0], + [-1.0, 0.0, 0.0], + ) + end + + @test length(logger.logs) == 2 + @test logger.logs[1].level == Error + @test logger.logs[1].message == + "Basin / subgrid_level subgrid_id 1 has repeated basin levels, this cannot be interpolated." + @test logger.logs[2].level == Error + @test logger.logs[2].message == + "Basin / subgrid_level subgrid_id 1 has repeated element levels, this cannot be interpolated." +end diff --git a/docs/contribute/release.qmd b/docs/contribute/release.qmd index acd1c6c64..22e7f9fcf 100644 --- a/docs/contribute/release.qmd +++ b/docs/contribute/release.qmd @@ -73,7 +73,7 @@ If this succeeds, the release assets are uploaded to an S3 link with the version ``` https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim_cli.zip -https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim-0.5.0-py3-none-any.whl +https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim-0.6.0-py3-none-any.whl https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/v2023.07.0/ribasim_qgis.zip ``` diff --git a/docs/core/usage.qmd b/docs/core/usage.qmd index 5e688fc30..d87b28db5 100644 --- a/docs/core/usage.qmd +++ b/docs/core/usage.qmd @@ -141,6 +141,7 @@ name it must have in the database if it is stored there. - `Basin / profile`: geometries of the basins - `Basin / time`: time series of the forcing values - `Basin / state`: used as initial condition of the basins + - `Basin / subgrid`: used to interpolate basin levels to a more detailed spatial representation - FractionalFlow: connect two of these from a Basin to get a fixed ratio bifurcation - `FractionalFlow / static`: fractions - LevelBoundary: stores water at a given level unaffected by flow, like an infinitely large basin @@ -275,6 +276,38 @@ Internally this get converted to two functions, $A(S)$ and $h(S)$, by integratin The minimum area cannot be zero to avoid numerical issues. The maximum area is used to convert the precipitation flux into an inflow. +## Basin / subgrid + +The subgrid_level table defines a piecewise linear interpolation from a basin water level to a subgrid element water level. +Many subgrid elements may be associated with a single basin, each with distinct interpolation functions. +This functionality can be used to translate a single lumped basin level to a more spatially detailed representation (e.g comparable to the output of a hydrodynamic simulation). + +column | type | unit | restriction +------------- | ------- | ----- | ------------------------ +subgrid_id | Int | - | sorted +node_id | Int | - | constant per subgrid_id +basin_level | Float64 | $m$ | sorted per subgrid_id +subgrid_level | Float64 | $m$ | sorted per subgrid_id + +The table below shows example input for two subgrid elements: + +subgrid_id | node_id | basin_level | subgrid_level +---------- | ------- | ----------- | ------------- + 1 | 9 | 0.0 | 0.0 + 1 | 9 | 1.0 | 1.0 + 1 | 9 | 2.0 | 2.0 + 2 | 9 | 0.0 | 0.5 + 2 | 9 | 1.0 | 1.5 + 2 | 9 | 2.0 | 2.5 + +Both subgrid elements use the water level of the basin with `node_id` 9 to interpolate to their respective water levels. +The first element has a one to one connection with the water level; the second also has a one to one connection, but is offset by half a meter. +A basin water level of 0.3 would be translated to a water level of 0.3 for the first subgrid element, and 0.8 for the second. +Water levels beyond the last `basin_level` are linearly extrapolated. + +Note that the interpolation to subgrid water level is not constrained by any water balance within Ribasim. +Generally, to create physically meaningful subgrid water levels, the subgrid table must be parametrized properly such that the spatially integrated water volume of the subgrid elements agrees with the total storage volume of the basin. + ## Basin results The basin table contains results of the storage and level of each basin at every solver diff --git a/docs/index.qmd b/docs/index.qmd index 02a595d70..33902226b 100644 --- a/docs/index.qmd +++ b/docs/index.qmd @@ -30,14 +30,14 @@ libraries, notably [DifferentialEquations.jl](https://docs.sciml.ai/DiffEqDocs/s For most users the [latest release](https://github.com/Deltares/Ribasim/releases/latest) is recommended, it can be downloaded here: - Ribasim executable: [ribasim_cli.zip](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim_cli.zip). -- Python package: [ribasim-0.5.0-py3-none-any.whl](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim-0.5.0-py3-none-any.whl) +- Python package: [ribasim-0.6.0-py3-none-any.whl](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim-0.6.0-py3-none-any.whl) - QGIS plugin: [ribasim_qgis.zip](https://github.com/Deltares/Ribasim/releases/latest/download/ribasim_qgis.zip). - Generated testmodels: [generated_testmodels.zip](https://github.com/Deltares/Ribasim/releases/latest/download/generated_testmodels.zip) The nightly builds contain the latest developments and can be found below. It is important to either use the release or nightly for all components. - Ribasim executable: [ribasim_cli.zip](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim_cli.zip). -- Python package: [ribasim-0.5.0-py3-none-any.whl](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim-0.5.0-py3-none-any.whl) +- Python package: [ribasim-0.6.0-py3-none-any.whl](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim-0.6.0-py3-none-any.whl) - QGIS plugin: [ribasim_qgis.zip](https://ribasim.s3.eu-west-3.amazonaws.com/teamcity/Ribasim_Ribasim/BuildRibasimCliWindows/latest/ribasim_qgis.zip). Currently only Windows builds for `ribasim_cli.zip` are available. diff --git a/docs/schema/BasinSubgrid.schema.json b/docs/schema/BasinSubgrid.schema.json new file mode 100644 index 000000000..244ab8189 --- /dev/null +++ b/docs/schema/BasinSubgrid.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://deltares.github.io/Ribasim/schema/BasinSubgrid.schema.json", + "title": "BasinSubgrid", + "description": "A BasinSubgrid object based on Ribasim.BasinSubgridV1", + "type": "object", + "properties": { + "subgrid_id": { + "format": "default", + "type": "integer" + }, + "node_id": { + "format": "default", + "type": "integer" + }, + "basin_level": { + "format": "double", + "type": "number" + }, + "subgrid_level": { + "format": "double", + "type": "number" + }, + "remarks": { + "description": "a hack for pandera", + "type": "string", + "format": "default", + "default": "" + } + }, + "required": [ + "subgrid_id", + "node_id", + "basin_level", + "subgrid_level" + ] +} diff --git a/docs/schema/Results.schema.json b/docs/schema/Results.schema.json index 99f4ea9f9..eb23d21b6 100644 --- a/docs/schema/Results.schema.json +++ b/docs/schema/Results.schema.json @@ -5,26 +5,6 @@ "description": "A Results object based on Ribasim.config.Results", "type": "object", "properties": { - "basin": { - "format": "default", - "type": "string", - "default": "results/basin.arrow" - }, - "flow": { - "format": "default", - "type": "string", - "default": "results/flow.arrow" - }, - "control": { - "format": "default", - "type": "string", - "default": "results/control.arrow" - }, - "allocation": { - "format": "default", - "type": "string", - "default": "results/allocation.arrow" - }, "outstate": { "format": "default", "anyOf": [ @@ -46,14 +26,16 @@ "format": "default", "type": "integer", "default": 6 + }, + "subgrid": { + "format": "default", + "type": "boolean", + "default": false } }, "required": [ - "basin", - "flow", - "control", - "allocation", "compression", - "compression_level" + "compression_level", + "subgrid" ] } diff --git a/docs/schema/Config.schema.json b/docs/schema/Toml.schema.json similarity index 90% rename from docs/schema/Config.schema.json rename to docs/schema/Toml.schema.json index 09475a562..aeb9a0cdf 100644 --- a/docs/schema/Config.schema.json +++ b/docs/schema/Toml.schema.json @@ -1,8 +1,8 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://deltares.github.io/Ribasim/schema/Config.schema.json", - "title": "Config", - "description": "A Config object based on Ribasim.config.Config", + "$id": "https://deltares.github.io/Ribasim/schema/Toml.schema.json", + "title": "Toml", + "description": "A Toml object based on Ribasim.config.Toml", "type": "object", "properties": { "starttime": { @@ -15,17 +15,16 @@ }, "input_dir": { "format": "default", - "type": "string", - "default": "." + "type": "string" }, "results_dir": { "format": "default", - "type": "string", - "default": "results" + "type": "string" }, "database": { "format": "default", - "type": "string" + "type": "string", + "default": "database.gpkg" }, "allocation": { "$ref": "https://deltares.github.io/Ribasim/schema/Allocation.schema.json", @@ -39,7 +38,8 @@ "$ref": "https://deltares.github.io/Ribasim/schema/Solver.schema.json", "default": { "algorithm": "QNDF", - "saveat": [], + "saveat": [ + ], "adaptive": true, "dt": null, "dtmin": null, @@ -64,13 +64,10 @@ "results": { "$ref": "https://deltares.github.io/Ribasim/schema/Results.schema.json", "default": { - "basin": "results/basin.arrow", - "flow": "results/flow.arrow", - "control": "results/control.arrow", - "allocation": "results/allocation.arrow", "outstate": null, "compression": "zstd", - "compression_level": 6 + "compression_level": 6, + "subgrid": false } }, "terminal": { @@ -126,6 +123,7 @@ "profile": null, "state": null, "static": null, + "subgrid": null, "time": null } }, diff --git a/docs/schema/basin.schema.json b/docs/schema/basin.schema.json index 743b5ca8b..ce36b64ec 100644 --- a/docs/schema/basin.schema.json +++ b/docs/schema/basin.schema.json @@ -41,6 +41,18 @@ ], "default": null }, + "subgrid": { + "format": "default", + "anyOf": [ + { + "type": "null" + }, + { + "type": "string" + } + ], + "default": null + }, "time": { "format": "default", "anyOf": [ diff --git a/docs/schema/root.schema.json b/docs/schema/root.schema.json index 751f152f0..e9089cc68 100644 --- a/docs/schema/root.schema.json +++ b/docs/schema/root.schema.json @@ -10,6 +10,9 @@ "basinstatic": { "$ref": "basinstatic.schema.json" }, + "basinsubgrid": { + "$ref": "basinsubgrid.schema.json" + }, "basintime": { "$ref": "basintime.schema.json" }, diff --git a/mypy.ini b/mypy.ini index 993d8939b..ca056f271 100644 --- a/mypy.ini +++ b/mypy.ini @@ -10,3 +10,13 @@ strict_concatenate = True disallow_subclassing_any = True disallow_untyped_decorators = True disallow_any_generics = True +mypy_path=.pixi/env/Library/python:.pixi/env/share/qgis/python + +[mypy-qgis.*] +ignore_errors = True + +[mypy-plugins.*] +ignore_errors = True + +[mypy-ribasim_qgis.tomllib.*] +ignore_errors = True diff --git a/pixi.lock b/pixi.lock index e6ff9c75c..1f0f266f8 100644 --- a/pixi.lock +++ b/pixi.lock @@ -484,20 +484,20 @@ package: dependencies: - cffi >=1.0.1 - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py310h2372a71_4.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-21.2.0-py311h459d7ec_4.conda hash: - md5: 68ee85860502d53c8cbfa0e4cef0f6cb - sha256: af94cc9b4dcaa164e1cc7e7fa0b9eb56b87ea3dc6e093c8ef6c31cfa02d9ffdf - build: py310h2372a71_4 + md5: de5b16869a430949b02161b04b844a30 + sha256: 104194af519b4e667aa5341068b94b521a791aaaa05ec0091f8f0bdba43a60ac + build: py311h459d7ec_4 arch: x86_64 subdir: linux-64 build_number: 4 license: MIT license_family: MIT - size: 34384 - timestamp: 1695386695142 + size: 34955 + timestamp: 1695386703660 - platform: osx-64 name: argon2-cffi-bindings version: 21.2.0 @@ -2184,174 +2184,6 @@ package: noarch: python size: 6948100 timestamp: 1698174685067 -- platform: linux-64 - name: backports - version: '1.0' - category: main - manager: conda - dependencies: - - python >=2.7 - url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda - hash: - md5: 54ca2e08b3220c148a1d8329c2678e02 - sha256: 711602276ae39276cb0faaca6fd0ac851fff0ca17151917569174841ef830bbd - build: pyhd8ed1ab_3 - arch: x86_64 - subdir: linux-64 - build_number: 3 - license: BSD-3-Clause - license_family: BSD - noarch: python - size: 5950 - timestamp: 1669158729416 -- platform: osx-64 - name: backports - version: '1.0' - category: main - manager: conda - dependencies: - - python >=2.7 - url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda - hash: - md5: 54ca2e08b3220c148a1d8329c2678e02 - sha256: 711602276ae39276cb0faaca6fd0ac851fff0ca17151917569174841ef830bbd - build: pyhd8ed1ab_3 - arch: x86_64 - subdir: osx-64 - build_number: 3 - license: BSD-3-Clause - license_family: BSD - noarch: python - size: 5950 - timestamp: 1669158729416 -- platform: osx-arm64 - name: backports - version: '1.0' - category: main - manager: conda - dependencies: - - python >=2.7 - url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda - hash: - md5: 54ca2e08b3220c148a1d8329c2678e02 - sha256: 711602276ae39276cb0faaca6fd0ac851fff0ca17151917569174841ef830bbd - build: pyhd8ed1ab_3 - arch: aarch64 - subdir: osx-arm64 - build_number: 3 - license: BSD-3-Clause - license_family: BSD - noarch: python - size: 5950 - timestamp: 1669158729416 -- platform: win-64 - name: backports - version: '1.0' - category: main - manager: conda - dependencies: - - python >=2.7 - url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda - hash: - md5: 54ca2e08b3220c148a1d8329c2678e02 - sha256: 711602276ae39276cb0faaca6fd0ac851fff0ca17151917569174841ef830bbd - build: pyhd8ed1ab_3 - arch: x86_64 - subdir: win-64 - build_number: 3 - license: BSD-3-Clause - license_family: BSD - noarch: python - size: 5950 - timestamp: 1669158729416 -- platform: linux-64 - name: backports.functools_lru_cache - version: 1.6.5 - category: main - manager: conda - dependencies: - - backports - - python >=3.6 - - setuptools - url: https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.5-pyhd8ed1ab_0.conda - hash: - md5: 6b1b907661838a75d067a22f87996b2e - sha256: 7027bb689dd4ca4a08e3b25805de9d04239be6b31125993558f21f102a9d2700 - build: pyhd8ed1ab_0 - arch: x86_64 - subdir: linux-64 - build_number: 0 - license: MIT - license_family: MIT - noarch: python - size: 11519 - timestamp: 1687772319931 -- platform: osx-64 - name: backports.functools_lru_cache - version: 1.6.5 - category: main - manager: conda - dependencies: - - backports - - python >=3.6 - - setuptools - url: https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.5-pyhd8ed1ab_0.conda - hash: - md5: 6b1b907661838a75d067a22f87996b2e - sha256: 7027bb689dd4ca4a08e3b25805de9d04239be6b31125993558f21f102a9d2700 - build: pyhd8ed1ab_0 - arch: x86_64 - subdir: osx-64 - build_number: 0 - license: MIT - license_family: MIT - noarch: python - size: 11519 - timestamp: 1687772319931 -- platform: osx-arm64 - name: backports.functools_lru_cache - version: 1.6.5 - category: main - manager: conda - dependencies: - - backports - - python >=3.6 - - setuptools - url: https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.5-pyhd8ed1ab_0.conda - hash: - md5: 6b1b907661838a75d067a22f87996b2e - sha256: 7027bb689dd4ca4a08e3b25805de9d04239be6b31125993558f21f102a9d2700 - build: pyhd8ed1ab_0 - arch: aarch64 - subdir: osx-arm64 - build_number: 0 - license: MIT - license_family: MIT - noarch: python - size: 11519 - timestamp: 1687772319931 -- platform: win-64 - name: backports.functools_lru_cache - version: 1.6.5 - category: main - manager: conda - dependencies: - - backports - - python >=3.6 - - setuptools - url: https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.5-pyhd8ed1ab_0.conda - hash: - md5: 6b1b907661838a75d067a22f87996b2e - sha256: 7027bb689dd4ca4a08e3b25805de9d04239be6b31125993558f21f102a9d2700 - build: pyhd8ed1ab_0 - arch: x86_64 - subdir: win-64 - build_number: 0 - license: MIT - license_family: MIT - noarch: python - size: 11519 - timestamp: 1687772319931 - platform: linux-64 name: beartype version: 0.16.2 @@ -2527,22 +2359,20 @@ package: - packaging >=22.0 - pathspec >=0.9 - platformdirs >=2 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - - tomli >=1.1.0 - - typing_extensions >=4.0.1 - url: https://conda.anaconda.org/conda-forge/linux-64/black-23.10.1-py310hff52083_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/black-23.10.1-py311h38be061_0.conda hash: - md5: 79f1744babeb52428e36f759470017ad - sha256: dfbbd14bf180ee707e6273824e93f31b54e3a78c2094f4d423d6afe76ab1cc38 - build: py310hff52083_0 + md5: 17874858641cb402ad73b9adb0e11a27 + sha256: f2114740c055ca5d250e363eec69d0181c2ae5b6ead7597762cf766eaa40fe1d + build: py311h38be061_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 276757 - timestamp: 1698342883619 + size: 359696 + timestamp: 1698342847430 - platform: osx-64 name: black version: 23.10.1 @@ -2621,53 +2451,53 @@ package: timestamp: 1698343648045 - platform: win-64 name: blas - version: '2.119' + version: '2.120' category: main manager: conda dependencies: - - blas-devel 3.9.0 19_win64_mkl - - libblas 3.9.0 19_win64_mkl - - libcblas 3.9.0 19_win64_mkl - - liblapack 3.9.0 19_win64_mkl - - liblapacke 3.9.0 19_win64_mkl + - blas-devel 3.9.0 20_win64_mkl + - libblas 3.9.0 20_win64_mkl + - libcblas 3.9.0 20_win64_mkl + - liblapack 3.9.0 20_win64_mkl + - liblapacke 3.9.0 20_win64_mkl - m2w64-gcc-libs - m2w64-gcc-libs-core - url: https://conda.anaconda.org/conda-forge/win-64/blas-2.119-mkl.conda + url: https://conda.anaconda.org/conda-forge/win-64/blas-2.120-mkl.conda hash: - md5: ae72b73d43b1b758c0f56933ba304050 - sha256: b0826ebba8305c527ef9ec8a53ae8c578dc180b7c7a1dff0adf1c572c7fbacf7 + md5: 169d630727008b4356a138a3a0f595d4 + sha256: 05118f39f0c1daa91a40a3495dd843b9ab79b53f34f0c5bc8f6b607edf3178ae build: mkl arch: x86_64 subdir: win-64 - build_number: 19 + build_number: 20 license: BSD-3-Clause license_family: BSD - size: 17041 - timestamp: 1697485621411 + size: 16917 + timestamp: 1700569527126 - platform: win-64 name: blas-devel version: 3.9.0 category: main manager: conda dependencies: - - libblas 3.9.0 19_win64_mkl - - libcblas 3.9.0 19_win64_mkl - - liblapack 3.9.0 19_win64_mkl - - liblapacke 3.9.0 19_win64_mkl + - libblas 3.9.0 20_win64_mkl + - libcblas 3.9.0 20_win64_mkl + - liblapack 3.9.0 20_win64_mkl + - liblapacke 3.9.0 20_win64_mkl - mkl >=2023.2.0,<2024.0a0 - mkl-devel 2023.2.* - url: https://conda.anaconda.org/conda-forge/win-64/blas-devel-3.9.0-19_win64_mkl.conda + url: https://conda.anaconda.org/conda-forge/win-64/blas-devel-3.9.0-20_win64_mkl.conda hash: - md5: fa4fbc5210838e16ccdad9fff235d1ff - sha256: da7cd8d38f4f87ccdfaeb898b5542f484b2841957c3dbb6f8b4a3c1fe215f81a - build: 19_win64_mkl + md5: 40f21d1e894795983dec1036847e7460 + sha256: 65af98c755e9660b34c1055e37221554180e52b5a62cfa1e3e6147b797d199d5 + build: 20_win64_mkl arch: x86_64 subdir: win-64 - build_number: 19 + build_number: 20 license: BSD-3-Clause license_family: BSD - size: 16461 - timestamp: 1697485480899 + size: 16418 + timestamp: 1700569363958 - platform: linux-64 name: bleach version: 6.1.0 @@ -3219,13 +3049,13 @@ package: dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda hash: - md5: 1f95722c94f00b69af69a066c7433714 - sha256: e22268d81905338570786921b3def88e55f9ed6d0ccdd17d9fbae31a02fbef69 - build: py310hc6cd4ac_1 + md5: cce9e7c3f1c307f2a5fb08a2922d6164 + sha256: 559093679e9fdb6061b7b80ca0f9a31fe6ffc213f1dae65bc5c82e2cd1a94107 + build: py311hb755f60_1 arch: x86_64 subdir: linux-64 build_number: 1 @@ -3233,8 +3063,8 @@ package: - libbrotlicommon 1.1.0 hd590300_1 license: MIT license_family: MIT - size: 349397 - timestamp: 1695990295884 + size: 351340 + timestamp: 1695990160360 - platform: osx-64 name: brotli-python version: 1.1.0 @@ -3481,148 +3311,148 @@ package: timestamp: 1699280668742 - platform: linux-64 name: c-ares - version: 1.21.0 + version: 1.22.1 category: main manager: conda dependencies: - libgcc-ng >=12 - url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.21.0-hd590300_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.22.1-hd590300_0.conda hash: - md5: c06fa0440048270817b9e3142cc661bf - sha256: dfe0e81d5462fced79fd0f99edeec94c9b27268cb04238638180981af2f889f1 + md5: 8430bd266c7b2cfbda403f7585d5ee86 + sha256: d41cf87938ba66de538b91afed3ece9b4cf5ed082a7d1c1add46b70f482f34b9 build: hd590300_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 121680 - timestamp: 1698936210587 + size: 149663 + timestamp: 1700421768288 - platform: osx-64 name: c-ares - version: 1.21.0 + version: 1.22.1 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.21.0-h10d778d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.22.1-h10d778d_0.conda hash: - md5: 88426162f781739069a6bd178841ed5d - sha256: 7450d861c07e74b10dfcf3ba680b384cf22f1c2dd34c3eba763ab5920376bf79 + md5: 7040d0624b78a81c8d52f22b662d7c35 + sha256: e52123d4d1e880ad883da1fa6301fa318e87cf42b6228833177d41053f7288b4 build: h10d778d_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 108924 - timestamp: 1698936476851 + size: 135560 + timestamp: 1700421936228 - platform: osx-arm64 name: c-ares - version: 1.21.0 + version: 1.22.1 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.21.0-h93a5062_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.22.1-h93a5062_0.conda hash: - md5: b3679505660f03e94430de5ea72114bd - sha256: 1f6436eb0bc3c6d6e14ae83610f821b2d55c4b1fd343bbeefd60a0e48fabe63d + md5: f9d38cc3908c066e50b184cdcab12929 + sha256: 75f0222f76c9848ef9c3892300d057cb8285f28341d2f149d1fc10373242969c build: h93a5062_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 106281 - timestamp: 1698936482295 + size: 133262 + timestamp: 1700421976955 - platform: win-64 name: c-ares - version: 1.21.0 + version: 1.22.1 category: main manager: conda dependencies: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.21.0-hcfcfb64_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.22.1-hcfcfb64_0.conda hash: - md5: 834ab09083aa903a2a22574d92ab872e - sha256: 7a261653adc286949de3aa5bf742dff978f2f1355330b00687500a18022e6e2d + md5: e4246d68ecdf8eb8b96645f351d253d7 + sha256: c54cecc3ba1d590fc95eedda9d3743a24639ccf08729ea79b3fd547c45b371fe build: hcfcfb64_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 115123 - timestamp: 1698936959417 + size: 142016 + timestamp: 1700422192097 - platform: linux-64 name: ca-certificates - version: 2023.7.22 + version: 2023.11.17 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda hash: - md5: a73ecd2988327ad4c8f2c331482917f2 - sha256: 525b7b6b5135b952ec1808de84e5eca57c7c7ff144e29ef3e96ae4040ff432c1 + md5: 01ffc8d36f9eba0ce0b3c1955fa780ee + sha256: fb4b9f4b7d885002db0b93e22f44b5b03791ef3d4efdc9d0662185a0faafd6b6 build: hbcca054_0 arch: x86_64 subdir: linux-64 build_number: 0 license: ISC - size: 149515 - timestamp: 1690026108541 + size: 154117 + timestamp: 1700280881924 - platform: osx-64 name: ca-certificates - version: 2023.7.22 + version: 2023.11.17 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2023.7.22-h8857fd0_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2023.11.17-h8857fd0_0.conda hash: - md5: bf2c54c18997bf3542af074c10191771 - sha256: 27de15e18a12117e83ac1eb8a8e52eb65731cc7f0b607a7922206a15e2460c7b + md5: c687e9d14c49e3d3946d50a413cdbf16 + sha256: 7e05d80a97beb7cb7492fae38584a68d51f338a5eddf73a14b5bd266597db90e build: h8857fd0_0 arch: x86_64 subdir: osx-64 build_number: 0 license: ISC - size: 149911 - timestamp: 1690026363769 + size: 154404 + timestamp: 1700280995538 - platform: osx-arm64 name: ca-certificates - version: 2023.7.22 + version: 2023.11.17 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2023.7.22-hf0a4a13_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2023.11.17-hf0a4a13_0.conda hash: - md5: e1b99ac4dbcee71a71682996f67f7965 - sha256: b220c001b0c1448a47cc49b42a622e06a540ec60b3f7a1e057fca1f37ce515e4 + md5: c01da7c77cfcba2107174e25c1d47384 + sha256: 75f4762a55f7e9453a603c967d549bfa0a7a9669d502d103cb6fbf8c86d993c6 build: hf0a4a13_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: ISC - size: 149918 - timestamp: 1690026385821 + size: 154444 + timestamp: 1700280972188 - platform: win-64 name: ca-certificates - version: 2023.7.22 + version: 2023.11.17 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2023.7.22-h56e8100_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2023.11.17-h56e8100_0.conda hash: - md5: b1c2327b36f1a25d96f2039b0d3e3739 - sha256: b85a6f307f8e1c803cb570bdfb9e4d811a361417873ecd2ecf687587405a72e0 + md5: 1163114b483f26761f993c709e65271f + sha256: c6177e2a4967db7a4e929c6ecd2fafde36e489dbeda23ceda640f4915cb0e877 build: h56e8100_0 arch: x86_64 subdir: win-64 build_number: 0 license: ISC - size: 150013 - timestamp: 1690026269050 + size: 154700 + timestamp: 1700281021312 - platform: linux-64 name: cached-property version: 1.5.2 @@ -4010,80 +3840,80 @@ package: timestamp: 1692863770043 - platform: linux-64 name: certifi - version: 2023.7.22 + version: 2023.11.17 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.11.17-pyhd8ed1ab_0.conda hash: - md5: 7f3dbc9179b4dde7da98dfb151d0ad22 - sha256: db66e31866ff4250c190788769e3a8a1709237c3e9c38d7143aae95ab75fcb31 + md5: 2011bcf45376341dd1d690263fdbc789 + sha256: afa22b77128a812cb57bc707c297d926561bd225a3d9dd74205d87a3b2d14a96 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 build_number: 0 license: ISC noarch: python - size: 153791 - timestamp: 1690024617757 + size: 158939 + timestamp: 1700303562512 - platform: osx-64 name: certifi - version: 2023.7.22 + version: 2023.11.17 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.11.17-pyhd8ed1ab_0.conda hash: - md5: 7f3dbc9179b4dde7da98dfb151d0ad22 - sha256: db66e31866ff4250c190788769e3a8a1709237c3e9c38d7143aae95ab75fcb31 + md5: 2011bcf45376341dd1d690263fdbc789 + sha256: afa22b77128a812cb57bc707c297d926561bd225a3d9dd74205d87a3b2d14a96 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 build_number: 0 license: ISC noarch: python - size: 153791 - timestamp: 1690024617757 + size: 158939 + timestamp: 1700303562512 - platform: osx-arm64 name: certifi - version: 2023.7.22 + version: 2023.11.17 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.11.17-pyhd8ed1ab_0.conda hash: - md5: 7f3dbc9179b4dde7da98dfb151d0ad22 - sha256: db66e31866ff4250c190788769e3a8a1709237c3e9c38d7143aae95ab75fcb31 + md5: 2011bcf45376341dd1d690263fdbc789 + sha256: afa22b77128a812cb57bc707c297d926561bd225a3d9dd74205d87a3b2d14a96 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: ISC noarch: python - size: 153791 - timestamp: 1690024617757 + size: 158939 + timestamp: 1700303562512 - platform: win-64 name: certifi - version: 2023.7.22 + version: 2023.11.17 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.11.17-pyhd8ed1ab_0.conda hash: - md5: 7f3dbc9179b4dde7da98dfb151d0ad22 - sha256: db66e31866ff4250c190788769e3a8a1709237c3e9c38d7143aae95ab75fcb31 + md5: 2011bcf45376341dd1d690263fdbc789 + sha256: afa22b77128a812cb57bc707c297d926561bd225a3d9dd74205d87a3b2d14a96 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 build_number: 0 license: ISC noarch: python - size: 153791 - timestamp: 1690024617757 + size: 158939 + timestamp: 1700303562512 - platform: linux-64 name: cffi version: 1.16.0 @@ -4093,20 +3923,20 @@ package: - libffi >=3.4,<4.0a0 - libgcc-ng >=12 - pycparser - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda hash: - md5: 45846a970e71ac98fd327da5d40a0a2c - sha256: 007e7f69ab45553b7bf11f2c1b8d3f3a13fd42997266a0d57795f41c7d38df36 - build: py310h2fee648_0 + md5: b3469563ac5e808b0cd92810d0697043 + sha256: b71c94528ca0c35133da4b7ef69b51a0b55eeee570376057f3d2ad60c3ab1444 + build: py311hb3a22ac_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 241339 - timestamp: 1696001848492 + size: 300207 + timestamp: 1696001873452 - platform: osx-64 name: cffi version: 1.16.0 @@ -4352,20 +4182,20 @@ package: category: main manager: conda dependencies: - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py310hff52083_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/chardet-5.2.0-py311h38be061_1.conda hash: - md5: a677136a83b823803d2f92045f885be2 - sha256: ab38a9946bc2beb9fc03c810b61d9e93030afff3e17e82ad4f8a1e7749957125 - build: py310hff52083_1 + md5: b8cfb13de4dbe349a41800644391de6a + sha256: 80b547150fc6d125fe034bcc3e820222faa0136463b32b82d7cbe965cc5dec77 + build: py311h38be061_1 arch: x86_64 subdir: linux-64 build_number: 1 license: LGPL-2.1-only license_family: GPL - size: 246635 - timestamp: 1695468739935 + size: 264886 + timestamp: 1695468797136 - platform: osx-64 name: chardet version: 5.2.0 @@ -4768,20 +4598,20 @@ package: dependencies: - cffi >=1.0.0 - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-0.8.0-py310h2372a71_3.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-0.8.0-py311h459d7ec_3.conda hash: - md5: ae2c1d072ebce41ce4ee91667e9954e5 - sha256: 8ac6e526998cf707a25dfb0395b777b3aa40d1501bc321b34da445ec625159e6 - build: py310h2372a71_3 + md5: 5090d5a3ab2580cabb17a3ae965e257f + sha256: 01316757b817f21ec8c901ecdd1cf60141a80ea5bfddf352846ba85f4c7a3e9d + build: py311h459d7ec_3 arch: x86_64 subdir: linux-64 build_number: 3 license: MIT license_family: MIT - size: 136512 - timestamp: 1695669881333 + size: 136524 + timestamp: 1695669889658 - platform: osx-64 name: cmarkgfm version: 0.8.0 @@ -5022,20 +4852,20 @@ package: - libgcc-ng >=12 - libstdcxx-ng >=12 - numpy >=1.20,<2 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda hash: - md5: 85d2aaa7af046528d339da1e813c3a9f - sha256: 73dd7868bfd98fa9e4d2cc524687b5c5c8f9d427d4e521875aacfe152eae4715 - build: py310hd41b1e2_0 + md5: 40828c5b36ef52433e21f89943e09f33 + sha256: 2c76e2a970b74eef92ef9460aa705dbdc506dd59b7382bfbedce39d9c189d7f4 + build: py311h9547e67_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 238877 - timestamp: 1699041552962 + size: 255843 + timestamp: 1699041590533 - platform: osx-64 name: contourpy version: 1.2.0 @@ -5114,21 +4944,21 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tomli - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py310h2372a71_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py311h459d7ec_0.conda hash: - md5: 33c03cd5711885c920ddff676fb84f98 - sha256: f9c07ee8807188c39bd415dd8ce39ac7a90c41cb0cc741e9af429e1f886930c6 - build: py310h2372a71_0 + md5: 7b3145fed7adc7c63a0e08f6f29f5480 + sha256: 8b56edd4336e7fc6ff9b73436a3a270cf835f57cf4d0565c6e240c40f1981085 + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: Apache-2.0 license_family: APACHE - size: 281112 - timestamp: 1696281815257 + size: 355132 + timestamp: 1696281925482 - platform: osx-64 name: coverage version: 7.3.2 @@ -5205,20 +5035,20 @@ package: - cffi >=1.12 - libgcc-ng >=12 - openssl >=3.1.4,<4.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.5-py310h75e40e8_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.5-py311h63ff55d_0.conda hash: - md5: 33f090627d17c47493b88a5f7d2834e8 - sha256: b81a6dd15052379775c43997a48f4a85db5c0448a80a75ba74c3af78cf33c0da - build: py310h75e40e8_0 + md5: 22584e5c97ed8f1a6b63a0ff43dba827 + sha256: 236ed2218fb857fecaa11fc7fee23574f683b3d03576f8f26f628b7fd2ced5fa + build: py311h63ff55d_0 arch: x86_64 subdir: linux-64 build_number: 0 license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD - size: 1978409 - timestamp: 1698192289148 + size: 2036192 + timestamp: 1698192294727 - platform: linux-64 name: curl version: 8.4.0 @@ -5453,7 +5283,7 @@ package: timestamp: 1683598954152 - platform: linux-64 name: datamodel-code-generator - version: 0.23.0 + version: 0.24.2 category: main manager: conda dependencies: @@ -5470,10 +5300,10 @@ package: - pysnooper >=0.4.1,<2.0.0 - python >=3.7,<4.0 - toml >=0.10.0,<1.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/datamodel-code-generator-0.23.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/datamodel-code-generator-0.24.2-pyhd8ed1ab_0.conda hash: - md5: c51f7353157d3ad919561c969e755c45 - sha256: b3465996e505a6734ccd07db9849a06c38418dd14017be46ec60161833f9a5b6 + md5: e5be59447fcc64aa91e0cf4badd4cf9a + sha256: 41f8ec640e8e0d801fd1b20d5233d14cd9e373597bc0c88b287c9e4830db43be build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -5481,11 +5311,11 @@ package: license: MIT license_family: MIT noarch: python - size: 68788 - timestamp: 1699472354004 + size: 69141 + timestamp: 1700259947710 - platform: osx-64 name: datamodel-code-generator - version: 0.23.0 + version: 0.24.2 category: main manager: conda dependencies: @@ -5502,10 +5332,10 @@ package: - pysnooper >=0.4.1,<2.0.0 - python >=3.7,<4.0 - toml >=0.10.0,<1.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/datamodel-code-generator-0.23.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/datamodel-code-generator-0.24.2-pyhd8ed1ab_0.conda hash: - md5: c51f7353157d3ad919561c969e755c45 - sha256: b3465996e505a6734ccd07db9849a06c38418dd14017be46ec60161833f9a5b6 + md5: e5be59447fcc64aa91e0cf4badd4cf9a + sha256: 41f8ec640e8e0d801fd1b20d5233d14cd9e373597bc0c88b287c9e4830db43be build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -5513,11 +5343,11 @@ package: license: MIT license_family: MIT noarch: python - size: 68788 - timestamp: 1699472354004 + size: 69141 + timestamp: 1700259947710 - platform: osx-arm64 name: datamodel-code-generator - version: 0.23.0 + version: 0.24.2 category: main manager: conda dependencies: @@ -5534,10 +5364,10 @@ package: - pysnooper >=0.4.1,<2.0.0 - python >=3.7,<4.0 - toml >=0.10.0,<1.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/datamodel-code-generator-0.23.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/datamodel-code-generator-0.24.2-pyhd8ed1ab_0.conda hash: - md5: c51f7353157d3ad919561c969e755c45 - sha256: b3465996e505a6734ccd07db9849a06c38418dd14017be46ec60161833f9a5b6 + md5: e5be59447fcc64aa91e0cf4badd4cf9a + sha256: 41f8ec640e8e0d801fd1b20d5233d14cd9e373597bc0c88b287c9e4830db43be build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -5545,11 +5375,11 @@ package: license: MIT license_family: MIT noarch: python - size: 68788 - timestamp: 1699472354004 + size: 69141 + timestamp: 1700259947710 - platform: win-64 name: datamodel-code-generator - version: 0.23.0 + version: 0.24.2 category: main manager: conda dependencies: @@ -5566,10 +5396,10 @@ package: - pysnooper >=0.4.1,<2.0.0 - python >=3.7,<4.0 - toml >=0.10.0,<1.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/datamodel-code-generator-0.23.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/datamodel-code-generator-0.24.2-pyhd8ed1ab_0.conda hash: - md5: c51f7353157d3ad919561c969e755c45 - sha256: b3465996e505a6734ccd07db9849a06c38418dd14017be46ec60161833f9a5b6 + md5: e5be59447fcc64aa91e0cf4badd4cf9a + sha256: 41f8ec640e8e0d801fd1b20d5233d14cd9e373597bc0c88b287c9e4830db43be build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -5577,8 +5407,8 @@ package: license: MIT license_family: MIT noarch: python - size: 68788 - timestamp: 1699472354004 + size: 69141 + timestamp: 1700259947710 - platform: linux-64 name: dbus version: 1.13.6 @@ -5608,20 +5438,20 @@ package: dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.0-py310hc6cd4ac_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.0-py311hb755f60_1.conda hash: - md5: 01388b4ec9eed3b26fa732aa39745475 - sha256: 77593f7b60d8f3b4d27a97a1b9e6c07c3f2490cfab77039d5e403166448b5de2 - build: py310hc6cd4ac_1 + md5: 2c241533b8eafe8028442d46ef41eb13 + sha256: f18492ebfaea54bbbeaec0ae207851f711ff589f60f2cc9b8a689f88b2442171 + build: py311hb755f60_1 arch: x86_64 subdir: linux-64 build_number: 1 license: MIT license_family: MIT - size: 2436014 - timestamp: 1695534502620 + size: 3001696 + timestamp: 1695534493087 - platform: osx-64 name: debugpy version: 1.8.0 @@ -6050,19 +5880,19 @@ package: category: main manager: conda dependencies: - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_2.conda hash: - md5: ac157d9b464d15fac78b13fcabc0f845 - sha256: 02e4198780ada8bb516c8611e08268b07df2c873f138e4b54af63de38118a076 - build: py310hff52083_2 + md5: 33f8066e53679dd4be2355fec849bf01 + sha256: 4e90bbc89f9ab192cb247d8b8ebe54c33e57652f8a057f9f176d9d9dd32993b9 + build: py311h38be061_2 arch: x86_64 subdir: linux-64 build_number: 2 license: LicenseRef-Public-Domain-Dedictation AND BSD-3-Clause AND BSD-2-Clause AND LicenseRef-PSF-2.1.1 - size: 721740 - timestamp: 1695300467101 + size: 915810 + timestamp: 1695300614781 - platform: osx-64 name: docutils version: 0.20.1 @@ -6417,15 +6247,15 @@ package: timestamp: 1693244283213 - platform: linux-64 name: exceptiongroup - version: 1.1.3 + version: 1.2.0 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_0.conda hash: - md5: e6518222753f519e911e83136d2158d9 - sha256: c28f715e049fe0f09785660bcbffa175ffb438720e5bc5a60d56d4b08364b315 + md5: f6c211fee3c98229652b60a9a42ef363 + sha256: cf83dcaf9006015c8ccab3fc6770f478464a66a8769e1763ca5d7dff09d11d08 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -6433,19 +6263,19 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 19262 - timestamp: 1692026296517 + size: 20473 + timestamp: 1700579932017 - platform: osx-64 name: exceptiongroup - version: 1.1.3 + version: 1.2.0 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_0.conda hash: - md5: e6518222753f519e911e83136d2158d9 - sha256: c28f715e049fe0f09785660bcbffa175ffb438720e5bc5a60d56d4b08364b315 + md5: f6c211fee3c98229652b60a9a42ef363 + sha256: cf83dcaf9006015c8ccab3fc6770f478464a66a8769e1763ca5d7dff09d11d08 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -6453,19 +6283,19 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 19262 - timestamp: 1692026296517 + size: 20473 + timestamp: 1700579932017 - platform: osx-arm64 name: exceptiongroup - version: 1.1.3 + version: 1.2.0 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_0.conda hash: - md5: e6518222753f519e911e83136d2158d9 - sha256: c28f715e049fe0f09785660bcbffa175ffb438720e5bc5a60d56d4b08364b315 + md5: f6c211fee3c98229652b60a9a42ef363 + sha256: cf83dcaf9006015c8ccab3fc6770f478464a66a8769e1763ca5d7dff09d11d08 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -6473,19 +6303,19 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 19262 - timestamp: 1692026296517 + size: 20473 + timestamp: 1700579932017 - platform: win-64 name: exceptiongroup - version: 1.1.3 + version: 1.2.0 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_0.conda hash: - md5: e6518222753f519e911e83136d2158d9 - sha256: c28f715e049fe0f09785660bcbffa175ffb438720e5bc5a60d56d4b08364b315 + md5: f6c211fee3c98229652b60a9a42ef363 + sha256: cf83dcaf9006015c8ccab3fc6770f478464a66a8769e1763ca5d7dff09d11d08 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -6493,8 +6323,8 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 19262 - timestamp: 1692026296517 + size: 20473 + timestamp: 1700579932017 - platform: linux-64 name: execnet version: 2.0.2 @@ -6917,24 +6747,24 @@ package: - libgdal >=3.7.2,<3.8.0a0 - libstdcxx-ng >=12 - munch - - numpy >=1.22.4,<2.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - setuptools - shapely - six >=1.7 - url: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py310h7631d76_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda hash: - md5: dd067611137e303f1409a3ce405c600b - sha256: ccfdfe2bd5557e6ec18bec885bcf7442a6ae2c6b6de8557ef921bcbfc3a6e14b - build: py310h7631d76_0 + md5: 786d3808394b1bdfd3f41f2e2c67279e + sha256: 529600df1964a94c7745b87e31f432ddc03c7b5fd652c193c594c995e1964c6b + build: py311hbac4ec9_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 958674 - timestamp: 1697078514368 + size: 988348 + timestamp: 1697078517209 - platform: osx-64 name: fiona version: 1.9.5 @@ -7703,31 +7533,30 @@ package: timestamp: 1566932280397 - platform: linux-64 name: fonttools - version: 4.44.3 + version: 4.45.1 category: main manager: conda dependencies: - brotli - libgcc-ng >=12 - munkres - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - - unicodedata2 >=14.0.0 - url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.3-py310h2372a71_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.45.1-py311h459d7ec_0.conda hash: - md5: b4bfb11c034c257e20159e9001cd8e28 - sha256: 6c5dc225f37bc678dfebab8a730e33345b853576410348ed61806f8f888bcb58 - build: py310h2372a71_0 + md5: 5b24692ece82f89e5cb9a469d9619731 + sha256: 57d311f86568d46f33845ea8c7d1c9e449a1fa85e510baa17f09e2cae2283681 + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 2247308 - timestamp: 1700143296960 + size: 2764094 + timestamp: 1700737071159 - platform: osx-64 name: fonttools - version: 4.44.3 + version: 4.45.1 category: main manager: conda dependencies: @@ -7735,21 +7564,21 @@ package: - munkres - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.44.3-py311he705e18_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/fonttools-4.45.1-py311he705e18_0.conda hash: - md5: 07fdfc42db3c7be6abfb6c5eeb3b54c9 - sha256: e565a457df0ee77013554e26cd9f14dafe88872654980f7311a0d0a7cd2825af + md5: 2910a2886c556ce4085fd59d73ae96f2 + sha256: 5a60241d7585b33160c169ae59b9bd9445c89bfb4604b2d77e7a0db48c04ccc5 build: py311he705e18_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 2668454 - timestamp: 1700143449336 + size: 2709456 + timestamp: 1700737223175 - platform: osx-arm64 name: fonttools - version: 4.44.3 + version: 4.45.1 category: main manager: conda dependencies: @@ -7758,21 +7587,21 @@ package: - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.44.3-py311h05b510d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/fonttools-4.45.1-py311h05b510d_0.conda hash: - md5: f3014d7569ba21fdf88e8c669b02a14b - sha256: f99f51ea99ff30cc80ad1040b8324d284bb7778ea0a9cc0d5cc6740218708ef5 + md5: 40c7471beb6af15161a202c0ddf04d82 + sha256: 7d8d2c8de468dc5a432e8d083f3b56eeec4380749bcfd09a44c81d42cacceece build: py311h05b510d_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 2669913 - timestamp: 1700143670047 + size: 2685890 + timestamp: 1700737534527 - platform: win-64 name: fonttools - version: 4.44.3 + version: 4.45.1 category: main manager: conda dependencies: @@ -7783,18 +7612,18 @@ package: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.44.3-py311ha68e1ae_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/fonttools-4.45.1-py311ha68e1ae_0.conda hash: - md5: 686910990e00a14526099f60623f7e4c - sha256: bfc58c579ed9b4e50e31cbd6d0b119ae841a52fe71b3ef9af9ff83638fa4499c + md5: eba38fc2eba3f66568b0b60fec756ccc + sha256: 478b298d3ea8da2023c2c29c7886f85006676a5744de3913cd64a35b7bbf5b38 build: py311ha68e1ae_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 2351108 - timestamp: 1700143728473 + size: 2377213 + timestamp: 1700737655877 - platform: linux-64 name: fqdn version: 1.5.1 @@ -8138,22 +7967,22 @@ package: - libgdal 3.7.2 h3aa23ec_3 - libstdcxx-ng >=12 - libxml2 >=2.11.5,<2.12.0a0 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.23.5,<2.0a0 - openssl >=3.1.3,<4.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.2-py310h5c4b078_3.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.2-py311h815a124_3.conda hash: - md5: cb27b238037dcc39a2e1e313e432aaef - sha256: 3b85aa16d401054a4a146845f1c1e4c93bd4e427c50f0e5b296f430410c23509 - build: py310h5c4b078_3 + md5: 748f760b4b3b8319899fbf77ded071e6 + sha256: 2031b4adc0ddf62aaca63e5322febd9e3d4f0c3880bf725c0ada34a63f0d9adb + build: py311h815a124_3 arch: x86_64 subdir: linux-64 build_number: 3 license: MIT license_family: MIT - size: 1451670 - timestamp: 1695218163494 + size: 1624780 + timestamp: 1695218076163 - platform: osx-64 name: gdal version: 3.7.2 @@ -9521,6 +9350,7 @@ package: subdir: win-64 build_number: 0 license: LGPL-2.0-or-later + license_family: LGPL size: 2035099 timestamp: 1699936715537 - platform: linux-64 @@ -9618,6 +9448,7 @@ package: subdir: win-64 build_number: 0 license: LGPL-2.0-or-later + license_family: LGPL size: 1932223 timestamp: 1699936472411 - platform: linux-64 @@ -9996,16 +9827,16 @@ package: timestamp: 1679314799856 - platform: linux-64 name: identify - version: 2.5.31 + version: 2.5.32 category: main manager: conda dependencies: - python >=3.6 - ukkonen - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.31-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.32-pyhd8ed1ab_0.conda hash: - md5: fea10604a45e974b110ea15a88913ebc - sha256: a56ec678a4e58d0a450174fd813581e961829def274453e093c9dae836b80cee + md5: 3ef8e9bab1bfaf900bb0a5db8c0c742c + sha256: 0783aa58f43d1c113a2ec300a29ba3313184056f9893671c75037fbadaf9e546 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -10013,20 +9844,20 @@ package: license: MIT license_family: MIT noarch: python - size: 78180 - timestamp: 1698519650371 + size: 78169 + timestamp: 1700334018935 - platform: osx-64 name: identify - version: 2.5.31 + version: 2.5.32 category: main manager: conda dependencies: - python >=3.6 - ukkonen - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.31-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.32-pyhd8ed1ab_0.conda hash: - md5: fea10604a45e974b110ea15a88913ebc - sha256: a56ec678a4e58d0a450174fd813581e961829def274453e093c9dae836b80cee + md5: 3ef8e9bab1bfaf900bb0a5db8c0c742c + sha256: 0783aa58f43d1c113a2ec300a29ba3313184056f9893671c75037fbadaf9e546 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -10034,20 +9865,20 @@ package: license: MIT license_family: MIT noarch: python - size: 78180 - timestamp: 1698519650371 + size: 78169 + timestamp: 1700334018935 - platform: osx-arm64 name: identify - version: 2.5.31 + version: 2.5.32 category: main manager: conda dependencies: - python >=3.6 - ukkonen - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.31-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.32-pyhd8ed1ab_0.conda hash: - md5: fea10604a45e974b110ea15a88913ebc - sha256: a56ec678a4e58d0a450174fd813581e961829def274453e093c9dae836b80cee + md5: 3ef8e9bab1bfaf900bb0a5db8c0c742c + sha256: 0783aa58f43d1c113a2ec300a29ba3313184056f9893671c75037fbadaf9e546 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -10055,20 +9886,20 @@ package: license: MIT license_family: MIT noarch: python - size: 78180 - timestamp: 1698519650371 + size: 78169 + timestamp: 1700334018935 - platform: win-64 name: identify - version: 2.5.31 + version: 2.5.32 category: main manager: conda dependencies: - python >=3.6 - ukkonen - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.31-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.5.32-pyhd8ed1ab_0.conda hash: - md5: fea10604a45e974b110ea15a88913ebc - sha256: a56ec678a4e58d0a450174fd813581e961829def274453e093c9dae836b80cee + md5: 3ef8e9bab1bfaf900bb0a5db8c0c742c + sha256: 0783aa58f43d1c113a2ec300a29ba3313184056f9893671c75037fbadaf9e546 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -10076,8 +9907,8 @@ package: license: MIT license_family: MIT noarch: python - size: 78180 - timestamp: 1698519650371 + size: 78169 + timestamp: 1700334018935 - platform: linux-64 name: idna version: '3.4' @@ -11609,20 +11440,20 @@ package: category: main manager: conda dependencies: - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-2.4-py310hff52083_3.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/jsonpointer-2.4-py311h38be061_3.conda hash: - md5: 08ec1463dbc5c806a32fc431874032ca - sha256: 316db08863469a56cdbfd030de5a2cc11ec7649ed7c50eff507e9caa0070ccaa - build: py310hff52083_3 + md5: 41d52d822edf991bf0e6b08c1921a8ec + sha256: 976f7bf3c3a49c3066f36b67c12ae06b31542e53b843bb4362f31c9e449c6c46 + build: py311h38be061_3 arch: x86_64 subdir: linux-64 build_number: 3 license: BSD-3-Clause license_family: BSD - size: 16170 - timestamp: 1695397381208 + size: 18389 + timestamp: 1695397377176 - platform: osx-64 name: jsonpointer version: '2.4' @@ -11686,7 +11517,7 @@ package: timestamp: 1695397742357 - platform: linux-64 name: jsonschema - version: 4.19.2 + version: 4.20.0 category: main manager: conda dependencies: @@ -11697,10 +11528,10 @@ package: - python >=3.8 - referencing >=0.28.4 - rpds-py >=0.7.1 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.19.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.20.0-pyhd8ed1ab_0.conda hash: - md5: 24d41c2f9cc199d0a180ecf7ef54739c - sha256: 07e5d395d83c4b12a7abe3989fb42abdcd3b1c51cd27549e5eab390bb8c7bf0f + md5: 1116d79def5268414fb0917520b2bbf1 + sha256: 77aae609097d06deedb8ef8407a44b23d5fef95962ba6fe1c959ac7bd6195296 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -11708,11 +11539,11 @@ package: license: MIT license_family: MIT noarch: python - size: 71509 - timestamp: 1698678642652 + size: 71908 + timestamp: 1700160056678 - platform: osx-64 name: jsonschema - version: 4.19.2 + version: 4.20.0 category: main manager: conda dependencies: @@ -11723,10 +11554,10 @@ package: - python >=3.8 - referencing >=0.28.4 - rpds-py >=0.7.1 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.19.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.20.0-pyhd8ed1ab_0.conda hash: - md5: 24d41c2f9cc199d0a180ecf7ef54739c - sha256: 07e5d395d83c4b12a7abe3989fb42abdcd3b1c51cd27549e5eab390bb8c7bf0f + md5: 1116d79def5268414fb0917520b2bbf1 + sha256: 77aae609097d06deedb8ef8407a44b23d5fef95962ba6fe1c959ac7bd6195296 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -11734,11 +11565,11 @@ package: license: MIT license_family: MIT noarch: python - size: 71509 - timestamp: 1698678642652 + size: 71908 + timestamp: 1700160056678 - platform: osx-arm64 name: jsonschema - version: 4.19.2 + version: 4.20.0 category: main manager: conda dependencies: @@ -11749,10 +11580,10 @@ package: - python >=3.8 - referencing >=0.28.4 - rpds-py >=0.7.1 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.19.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.20.0-pyhd8ed1ab_0.conda hash: - md5: 24d41c2f9cc199d0a180ecf7ef54739c - sha256: 07e5d395d83c4b12a7abe3989fb42abdcd3b1c51cd27549e5eab390bb8c7bf0f + md5: 1116d79def5268414fb0917520b2bbf1 + sha256: 77aae609097d06deedb8ef8407a44b23d5fef95962ba6fe1c959ac7bd6195296 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -11760,11 +11591,11 @@ package: license: MIT license_family: MIT noarch: python - size: 71509 - timestamp: 1698678642652 + size: 71908 + timestamp: 1700160056678 - platform: win-64 name: jsonschema - version: 4.19.2 + version: 4.20.0 category: main manager: conda dependencies: @@ -11775,10 +11606,10 @@ package: - python >=3.8 - referencing >=0.28.4 - rpds-py >=0.7.1 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.19.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.20.0-pyhd8ed1ab_0.conda hash: - md5: 24d41c2f9cc199d0a180ecf7ef54739c - sha256: 07e5d395d83c4b12a7abe3989fb42abdcd3b1c51cd27549e5eab390bb8c7bf0f + md5: 1116d79def5268414fb0917520b2bbf1 + sha256: 77aae609097d06deedb8ef8407a44b23d5fef95962ba6fe1c959ac7bd6195296 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -11786,21 +11617,21 @@ package: license: MIT license_family: MIT noarch: python - size: 71509 - timestamp: 1698678642652 + size: 71908 + timestamp: 1700160056678 - platform: linux-64 name: jsonschema-specifications - version: 2023.7.1 + version: 2023.11.1 category: main manager: conda dependencies: - importlib_resources >=1.4.0 - python >=3.8 - - referencing >=0.25.0 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + - referencing >=0.31.0 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.11.1-pyhd8ed1ab_0.conda hash: - md5: 7c27ea1bdbe520bb830dcadd59f55cbf - sha256: 7b0061e106674f27cc718f79a095e90a5667a3635ec6626dd23b3be0fd2bfbdc + md5: 094ff9cf36957f95bb74cee42ab140b2 + sha256: 17ac31b620a7bb81c6468b4ba9ad4aeb1c6c6669e9dd7e4ad909da48702a6091 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -11808,21 +11639,21 @@ package: license: MIT license_family: MIT noarch: python - size: 15296 - timestamp: 1689701341221 + size: 15345 + timestamp: 1700059294896 - platform: osx-64 name: jsonschema-specifications - version: 2023.7.1 + version: 2023.11.1 category: main manager: conda dependencies: - importlib_resources >=1.4.0 - python >=3.8 - - referencing >=0.25.0 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + - referencing >=0.31.0 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.11.1-pyhd8ed1ab_0.conda hash: - md5: 7c27ea1bdbe520bb830dcadd59f55cbf - sha256: 7b0061e106674f27cc718f79a095e90a5667a3635ec6626dd23b3be0fd2bfbdc + md5: 094ff9cf36957f95bb74cee42ab140b2 + sha256: 17ac31b620a7bb81c6468b4ba9ad4aeb1c6c6669e9dd7e4ad909da48702a6091 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -11830,21 +11661,21 @@ package: license: MIT license_family: MIT noarch: python - size: 15296 - timestamp: 1689701341221 + size: 15345 + timestamp: 1700059294896 - platform: osx-arm64 name: jsonschema-specifications - version: 2023.7.1 + version: 2023.11.1 category: main manager: conda dependencies: - importlib_resources >=1.4.0 - python >=3.8 - - referencing >=0.25.0 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + - referencing >=0.31.0 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.11.1-pyhd8ed1ab_0.conda hash: - md5: 7c27ea1bdbe520bb830dcadd59f55cbf - sha256: 7b0061e106674f27cc718f79a095e90a5667a3635ec6626dd23b3be0fd2bfbdc + md5: 094ff9cf36957f95bb74cee42ab140b2 + sha256: 17ac31b620a7bb81c6468b4ba9ad4aeb1c6c6669e9dd7e4ad909da48702a6091 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -11852,21 +11683,21 @@ package: license: MIT license_family: MIT noarch: python - size: 15296 - timestamp: 1689701341221 + size: 15345 + timestamp: 1700059294896 - platform: win-64 name: jsonschema-specifications - version: 2023.7.1 + version: 2023.11.1 category: main manager: conda dependencies: - importlib_resources >=1.4.0 - python >=3.8 - - referencing >=0.25.0 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + - referencing >=0.31.0 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.11.1-pyhd8ed1ab_0.conda hash: - md5: 7c27ea1bdbe520bb830dcadd59f55cbf - sha256: 7b0061e106674f27cc718f79a095e90a5667a3635ec6626dd23b3be0fd2bfbdc + md5: 094ff9cf36957f95bb74cee42ab140b2 + sha256: 17ac31b620a7bb81c6468b4ba9ad4aeb1c6c6669e9dd7e4ad909da48702a6091 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -11874,11 +11705,11 @@ package: license: MIT license_family: MIT noarch: python - size: 15296 - timestamp: 1689701341221 + size: 15345 + timestamp: 1700059294896 - platform: linux-64 name: jsonschema-with-format-nongpl - version: 4.19.2 + version: 4.20.0 category: main manager: conda dependencies: @@ -11886,16 +11717,16 @@ package: - idna - isoduration - jsonpointer >1.13 - - jsonschema >=4.19.2,<4.19.3.0a0 + - jsonschema >=4.20.0,<4.20.1.0a0 - python - rfc3339-validator - rfc3986-validator >0.1.0 - uri-template - webcolors >=1.11 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.19.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.20.0-pyhd8ed1ab_0.conda hash: - md5: c447b7c28ad6bb3306f0015f1195c721 - sha256: b06681b4499635f0ed901f4879122bfd3ff6ef28de1797367769a4ba6b990b0d + md5: a168c5f84010711f6d4ae650bc22b480 + sha256: 03558b25daa57137fdf98e92731ba50ff5506f265294ac2eef5ec465c76ecf57 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -11903,11 +11734,11 @@ package: license: MIT license_family: MIT noarch: python - size: 7389 - timestamp: 1698678669876 + size: 7268 + timestamp: 1700160104380 - platform: osx-64 name: jsonschema-with-format-nongpl - version: 4.19.2 + version: 4.20.0 category: main manager: conda dependencies: @@ -11915,16 +11746,16 @@ package: - idna - isoduration - jsonpointer >1.13 - - jsonschema >=4.19.2,<4.19.3.0a0 + - jsonschema >=4.20.0,<4.20.1.0a0 - python - rfc3339-validator - rfc3986-validator >0.1.0 - uri-template - webcolors >=1.11 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.19.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.20.0-pyhd8ed1ab_0.conda hash: - md5: c447b7c28ad6bb3306f0015f1195c721 - sha256: b06681b4499635f0ed901f4879122bfd3ff6ef28de1797367769a4ba6b990b0d + md5: a168c5f84010711f6d4ae650bc22b480 + sha256: 03558b25daa57137fdf98e92731ba50ff5506f265294ac2eef5ec465c76ecf57 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -11932,11 +11763,11 @@ package: license: MIT license_family: MIT noarch: python - size: 7389 - timestamp: 1698678669876 + size: 7268 + timestamp: 1700160104380 - platform: osx-arm64 name: jsonschema-with-format-nongpl - version: 4.19.2 + version: 4.20.0 category: main manager: conda dependencies: @@ -11944,16 +11775,16 @@ package: - idna - isoduration - jsonpointer >1.13 - - jsonschema >=4.19.2,<4.19.3.0a0 + - jsonschema >=4.20.0,<4.20.1.0a0 - python - rfc3339-validator - rfc3986-validator >0.1.0 - uri-template - webcolors >=1.11 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.19.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.20.0-pyhd8ed1ab_0.conda hash: - md5: c447b7c28ad6bb3306f0015f1195c721 - sha256: b06681b4499635f0ed901f4879122bfd3ff6ef28de1797367769a4ba6b990b0d + md5: a168c5f84010711f6d4ae650bc22b480 + sha256: 03558b25daa57137fdf98e92731ba50ff5506f265294ac2eef5ec465c76ecf57 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -11961,11 +11792,11 @@ package: license: MIT license_family: MIT noarch: python - size: 7389 - timestamp: 1698678669876 + size: 7268 + timestamp: 1700160104380 - platform: win-64 name: jsonschema-with-format-nongpl - version: 4.19.2 + version: 4.20.0 category: main manager: conda dependencies: @@ -11973,16 +11804,16 @@ package: - idna - isoduration - jsonpointer >1.13 - - jsonschema >=4.19.2,<4.19.3.0a0 + - jsonschema >=4.20.0,<4.20.1.0a0 - python - rfc3339-validator - rfc3986-validator >0.1.0 - uri-template - webcolors >=1.11 - url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.19.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.20.0-pyhd8ed1ab_0.conda hash: - md5: c447b7c28ad6bb3306f0015f1195c721 - sha256: b06681b4499635f0ed901f4879122bfd3ff6ef28de1797367769a4ba6b990b0d + md5: a168c5f84010711f6d4ae650bc22b480 + sha256: 03558b25daa57137fdf98e92731ba50ff5506f265294ac2eef5ec465c76ecf57 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -11990,8 +11821,8 @@ package: license: MIT license_family: MIT noarch: python - size: 7389 - timestamp: 1698678669876 + size: 7268 + timestamp: 1700160104380 - platform: linux-64 name: jupyter-lsp version: 2.2.0 @@ -12191,21 +12022,21 @@ package: manager: conda dependencies: - platformdirs >=2.5 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - traitlets >=5.3 - url: https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py310hff52083_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py311h38be061_0.conda hash: - md5: 9ca8f0d07c512cef3fd07b121bb2b023 - sha256: 35e05ff1ad8b070b1378886c5ee4b82a000ea078494af6d0552d1c455b3f6220 - build: py310hff52083_0 + md5: cee83be29258275f75029125e186ab6d + sha256: 60bfaec278b3ea4462abd8321b47412864c54bd63575e2698da81c5755e617c1 + build: py311h38be061_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 79275 - timestamp: 1698673792929 + size: 93811 + timestamp: 1698673782880 - platform: osx-64 name: jupyter_core version: 5.5.0 @@ -12384,7 +12215,7 @@ package: timestamp: 1699286038042 - platform: linux-64 name: jupyter_server - version: 2.10.0 + version: 2.10.1 category: main manager: conda dependencies: @@ -12393,7 +12224,7 @@ package: - jinja2 - jupyter_client >=7.4.4 - jupyter_core >=4.12,!=5.0.* - - jupyter_events >=0.6.0 + - jupyter_events >=0.9.0 - jupyter_server_terminals - nbconvert-core >=6.4.4 - nbformat >=5.3.0 @@ -12407,10 +12238,10 @@ package: - tornado >=6.2.0 - traitlets >=5.6.0 - websocket-client - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.10.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.10.1-pyhd8ed1ab_0.conda hash: - md5: 016d56f5d81b9364d1da5f4895a2a9f8 - sha256: 0b9a72f28ff8a12e6ea0ae43d3ea93e288074d29348c5fc6fbb3a5e5e18b2ecd + md5: 7d15498584d83de3b357425e37086397 + sha256: b8b55ee57785b39a9096884bfd1da3858da8f27764572321d51a3dd0a990de86 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -12418,11 +12249,11 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 316607 - timestamp: 1699289600334 + size: 319050 + timestamp: 1700058804792 - platform: osx-64 name: jupyter_server - version: 2.10.0 + version: 2.10.1 category: main manager: conda dependencies: @@ -12431,7 +12262,7 @@ package: - jinja2 - jupyter_client >=7.4.4 - jupyter_core >=4.12,!=5.0.* - - jupyter_events >=0.6.0 + - jupyter_events >=0.9.0 - jupyter_server_terminals - nbconvert-core >=6.4.4 - nbformat >=5.3.0 @@ -12445,10 +12276,10 @@ package: - tornado >=6.2.0 - traitlets >=5.6.0 - websocket-client - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.10.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.10.1-pyhd8ed1ab_0.conda hash: - md5: 016d56f5d81b9364d1da5f4895a2a9f8 - sha256: 0b9a72f28ff8a12e6ea0ae43d3ea93e288074d29348c5fc6fbb3a5e5e18b2ecd + md5: 7d15498584d83de3b357425e37086397 + sha256: b8b55ee57785b39a9096884bfd1da3858da8f27764572321d51a3dd0a990de86 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -12456,11 +12287,11 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 316607 - timestamp: 1699289600334 + size: 319050 + timestamp: 1700058804792 - platform: osx-arm64 name: jupyter_server - version: 2.10.0 + version: 2.10.1 category: main manager: conda dependencies: @@ -12469,7 +12300,7 @@ package: - jinja2 - jupyter_client >=7.4.4 - jupyter_core >=4.12,!=5.0.* - - jupyter_events >=0.6.0 + - jupyter_events >=0.9.0 - jupyter_server_terminals - nbconvert-core >=6.4.4 - nbformat >=5.3.0 @@ -12483,10 +12314,10 @@ package: - tornado >=6.2.0 - traitlets >=5.6.0 - websocket-client - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.10.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.10.1-pyhd8ed1ab_0.conda hash: - md5: 016d56f5d81b9364d1da5f4895a2a9f8 - sha256: 0b9a72f28ff8a12e6ea0ae43d3ea93e288074d29348c5fc6fbb3a5e5e18b2ecd + md5: 7d15498584d83de3b357425e37086397 + sha256: b8b55ee57785b39a9096884bfd1da3858da8f27764572321d51a3dd0a990de86 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -12494,11 +12325,11 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 316607 - timestamp: 1699289600334 + size: 319050 + timestamp: 1700058804792 - platform: win-64 name: jupyter_server - version: 2.10.0 + version: 2.10.1 category: main manager: conda dependencies: @@ -12507,7 +12338,7 @@ package: - jinja2 - jupyter_client >=7.4.4 - jupyter_core >=4.12,!=5.0.* - - jupyter_events >=0.6.0 + - jupyter_events >=0.9.0 - jupyter_server_terminals - nbconvert-core >=6.4.4 - nbformat >=5.3.0 @@ -12521,10 +12352,10 @@ package: - tornado >=6.2.0 - traitlets >=5.6.0 - websocket-client - url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.10.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.10.1-pyhd8ed1ab_0.conda hash: - md5: 016d56f5d81b9364d1da5f4895a2a9f8 - sha256: 0b9a72f28ff8a12e6ea0ae43d3ea93e288074d29348c5fc6fbb3a5e5e18b2ecd + md5: 7d15498584d83de3b357425e37086397 + sha256: b8b55ee57785b39a9096884bfd1da3858da8f27764572321d51a3dd0a990de86 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -12532,8 +12363,8 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 316607 - timestamp: 1699289600334 + size: 319050 + timestamp: 1700058804792 - platform: linux-64 name: jupyter_server_terminals version: 0.4.4 @@ -12620,7 +12451,7 @@ package: timestamp: 1673491600853 - platform: linux-64 name: jupyterlab - version: 4.0.8 + version: 4.0.9 category: main manager: conda dependencies: @@ -12639,10 +12470,10 @@ package: - tomli - tornado >=6.2.0 - traitlets - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.8-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.9-pyhd8ed1ab_0.conda hash: - md5: 299796efa08ad91c602fa4d0c5ecc86f - sha256: fe5ca6c8bbda69af332593d7f9592aa19d9ab98d34c647ed0d8fbbae88b29a95 + md5: 7da6e874b0904e411ec2fd8e6082841e + sha256: 1c55e63e4b84810796c8827370ebd597ad3f45bcd0c1fa9975a363bc6a895f23 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -12650,11 +12481,11 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 5935261 - timestamp: 1698957039728 + size: 5319953 + timestamp: 1700340981595 - platform: osx-64 name: jupyterlab - version: 4.0.8 + version: 4.0.9 category: main manager: conda dependencies: @@ -12673,10 +12504,10 @@ package: - tomli - tornado >=6.2.0 - traitlets - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.8-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.9-pyhd8ed1ab_0.conda hash: - md5: 299796efa08ad91c602fa4d0c5ecc86f - sha256: fe5ca6c8bbda69af332593d7f9592aa19d9ab98d34c647ed0d8fbbae88b29a95 + md5: 7da6e874b0904e411ec2fd8e6082841e + sha256: 1c55e63e4b84810796c8827370ebd597ad3f45bcd0c1fa9975a363bc6a895f23 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -12684,11 +12515,11 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 5935261 - timestamp: 1698957039728 + size: 5319953 + timestamp: 1700340981595 - platform: osx-arm64 name: jupyterlab - version: 4.0.8 + version: 4.0.9 category: main manager: conda dependencies: @@ -12707,10 +12538,10 @@ package: - tomli - tornado >=6.2.0 - traitlets - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.8-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.9-pyhd8ed1ab_0.conda hash: - md5: 299796efa08ad91c602fa4d0c5ecc86f - sha256: fe5ca6c8bbda69af332593d7f9592aa19d9ab98d34c647ed0d8fbbae88b29a95 + md5: 7da6e874b0904e411ec2fd8e6082841e + sha256: 1c55e63e4b84810796c8827370ebd597ad3f45bcd0c1fa9975a363bc6a895f23 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -12718,11 +12549,11 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 5935261 - timestamp: 1698957039728 + size: 5319953 + timestamp: 1700340981595 - platform: win-64 name: jupyterlab - version: 4.0.8 + version: 4.0.9 category: main manager: conda dependencies: @@ -12741,10 +12572,10 @@ package: - tomli - tornado >=6.2.0 - traitlets - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.8-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.0.9-pyhd8ed1ab_0.conda hash: - md5: 299796efa08ad91c602fa4d0c5ecc86f - sha256: fe5ca6c8bbda69af332593d7f9592aa19d9ab98d34c647ed0d8fbbae88b29a95 + md5: 7da6e874b0904e411ec2fd8e6082841e + sha256: 1c55e63e4b84810796c8827370ebd597ad3f45bcd0c1fa9975a363bc6a895f23 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -12752,20 +12583,20 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 5935261 - timestamp: 1698957039728 + size: 5319953 + timestamp: 1700340981595 - platform: linux-64 name: jupyterlab_pygments - version: 0.2.2 + version: 0.3.0 category: main manager: conda dependencies: - pygments >=2.4.1,<3 - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_0.conda hash: - md5: 243f63592c8e449f40cd42eb5cf32f40 - sha256: 08453e09d5a6bbaeeca839553a5dfd7a377a97550efab96019c334a8042f54f5 + md5: 3f0915b1fb2252ab73686a533c5f9d3f + sha256: 6ee596138a778a841261476408435da78e3000661f3ee025fb6c3ed17d28c8b3 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -12773,20 +12604,20 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 17410 - timestamp: 1649936689608 + size: 18651 + timestamp: 1700744201155 - platform: osx-64 name: jupyterlab_pygments - version: 0.2.2 + version: 0.3.0 category: main manager: conda dependencies: - pygments >=2.4.1,<3 - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_0.conda hash: - md5: 243f63592c8e449f40cd42eb5cf32f40 - sha256: 08453e09d5a6bbaeeca839553a5dfd7a377a97550efab96019c334a8042f54f5 + md5: 3f0915b1fb2252ab73686a533c5f9d3f + sha256: 6ee596138a778a841261476408435da78e3000661f3ee025fb6c3ed17d28c8b3 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -12794,20 +12625,20 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 17410 - timestamp: 1649936689608 + size: 18651 + timestamp: 1700744201155 - platform: osx-arm64 name: jupyterlab_pygments - version: 0.2.2 + version: 0.3.0 category: main manager: conda dependencies: - pygments >=2.4.1,<3 - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_0.conda hash: - md5: 243f63592c8e449f40cd42eb5cf32f40 - sha256: 08453e09d5a6bbaeeca839553a5dfd7a377a97550efab96019c334a8042f54f5 + md5: 3f0915b1fb2252ab73686a533c5f9d3f + sha256: 6ee596138a778a841261476408435da78e3000661f3ee025fb6c3ed17d28c8b3 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -12815,20 +12646,20 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 17410 - timestamp: 1649936689608 + size: 18651 + timestamp: 1700744201155 - platform: win-64 name: jupyterlab_pygments - version: 0.2.2 + version: 0.3.0 category: main manager: conda dependencies: - pygments >=2.4.1,<3 - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2 + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_0.conda hash: - md5: 243f63592c8e449f40cd42eb5cf32f40 - sha256: 08453e09d5a6bbaeeca839553a5dfd7a377a97550efab96019c334a8042f54f5 + md5: 3f0915b1fb2252ab73686a533c5f9d3f + sha256: 6ee596138a778a841261476408435da78e3000661f3ee025fb6c3ed17d28c8b3 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -12836,11 +12667,11 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 17410 - timestamp: 1649936689608 + size: 18651 + timestamp: 1700744201155 - platform: linux-64 name: jupyterlab_server - version: 2.25.1 + version: 2.25.2 category: main manager: conda dependencies: @@ -12853,10 +12684,10 @@ package: - packaging >=21.3 - python >=3.8 - requests >=2.31 - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.2-pyhd8ed1ab_0.conda hash: - md5: 5cf15f8fd42c77af4eb1611fe614df2f - sha256: 5f373d9adc11b6d49bee06a4c6bea9623fff1d2a0b798edc2e3f594680aa18f3 + md5: f45557d5551b54dc2a74133a310bc1ba + sha256: 51c13a87072a64df1a0ae14fbb470bc4e36becf4d50693ffab53174199ca4f4b build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -12866,11 +12697,11 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 48817 - timestamp: 1699455046539 + size: 48860 + timestamp: 1700310989409 - platform: osx-64 name: jupyterlab_server - version: 2.25.1 + version: 2.25.2 category: main manager: conda dependencies: @@ -12883,10 +12714,10 @@ package: - packaging >=21.3 - python >=3.8 - requests >=2.31 - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.2-pyhd8ed1ab_0.conda hash: - md5: 5cf15f8fd42c77af4eb1611fe614df2f - sha256: 5f373d9adc11b6d49bee06a4c6bea9623fff1d2a0b798edc2e3f594680aa18f3 + md5: f45557d5551b54dc2a74133a310bc1ba + sha256: 51c13a87072a64df1a0ae14fbb470bc4e36becf4d50693ffab53174199ca4f4b build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -12896,11 +12727,11 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 48817 - timestamp: 1699455046539 + size: 48860 + timestamp: 1700310989409 - platform: osx-arm64 name: jupyterlab_server - version: 2.25.1 + version: 2.25.2 category: main manager: conda dependencies: @@ -12913,10 +12744,10 @@ package: - packaging >=21.3 - python >=3.8 - requests >=2.31 - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.2-pyhd8ed1ab_0.conda hash: - md5: 5cf15f8fd42c77af4eb1611fe614df2f - sha256: 5f373d9adc11b6d49bee06a4c6bea9623fff1d2a0b798edc2e3f594680aa18f3 + md5: f45557d5551b54dc2a74133a310bc1ba + sha256: 51c13a87072a64df1a0ae14fbb470bc4e36becf4d50693ffab53174199ca4f4b build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -12926,11 +12757,11 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 48817 - timestamp: 1699455046539 + size: 48860 + timestamp: 1700310989409 - platform: win-64 name: jupyterlab_server - version: 2.25.1 + version: 2.25.2 category: main manager: conda dependencies: @@ -12943,10 +12774,10 @@ package: - packaging >=21.3 - python >=3.8 - requests >=2.31 - url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.25.2-pyhd8ed1ab_0.conda hash: - md5: 5cf15f8fd42c77af4eb1611fe614df2f - sha256: 5f373d9adc11b6d49bee06a4c6bea9623fff1d2a0b798edc2e3f594680aa18f3 + md5: f45557d5551b54dc2a74133a310bc1ba + sha256: 51c13a87072a64df1a0ae14fbb470bc4e36becf4d50693ffab53174199ca4f4b build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -12956,8 +12787,8 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 48817 - timestamp: 1699455046539 + size: 48860 + timestamp: 1700310989409 - platform: linux-64 name: kealib version: 1.5.2 @@ -13050,21 +12881,21 @@ package: - importlib_metadata >=4.11.4 - jaraco.classes - jeepney >=0.4.2 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - secretstorage >=3.2 - url: https://conda.anaconda.org/conda-forge/linux-64/keyring-24.3.0-py310hff52083_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/keyring-24.3.0-py311h38be061_0.conda hash: - md5: e710fd8e57356a64cace034413da9cb3 - sha256: 886a764e4bc2cfaabf2ea0a98461fbd526affd99c984a2789770eca43dd17c9b - build: py310hff52083_0 + md5: 09e27eb40c88f732a4e0ea5b70f63ae0 + sha256: 29909aa6935d34f46b9121bfb504e8305af525a27639bbf5d2692fce2935e9bc + build: py311h38be061_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 63176 - timestamp: 1699924097464 + size: 77400 + timestamp: 1699923975834 - platform: osx-64 name: keyring version: 24.3.0 @@ -13216,20 +13047,20 @@ package: dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda hash: - md5: b8d67603d43b23ce7e988a5d81a7ab79 - sha256: bb51906639bced3de1d4d7740ac284cdaa89e2f22e0b1ec796378b090b0648ba - build: py310hd41b1e2_1 + md5: 2c65bdf442b0d37aad080c8a4e0d452f + sha256: 723b0894d2d2b05a38f9c5a285d5a0a5baa27235ceab6531dbf262ba7c6955c1 + build: py311h9547e67_1 arch: x86_64 subdir: linux-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 73123 - timestamp: 1695380074542 + size: 73273 + timestamp: 1695380140676 - platform: osx-64 name: kiwisolver version: 1.4.5 @@ -13949,13 +13780,14 @@ package: timestamp: 1694543279363 - platform: linux-64 name: libarrow - version: 13.0.0 + version: 10.0.1 category: main manager: conda dependencies: - aws-crt-cpp >=0.24.4,<0.24.5.0a0 - aws-sdk-cpp >=1.11.182,<1.11.183.0a0 - bzip2 >=1.0.8,<2.0a0 + - gflags >=2.2.2,<2.3.0a0 - glog >=0.6.0,<0.7.0a0 - libabseil * cxx17* - libabseil >=20230802.1,<20230803.0a0 @@ -13977,39 +13809,39 @@ package: - snappy >=1.1.10,<2.0a0 - ucx >=1.15.0,<1.16.0a0 - zstd >=1.5.5,<1.6.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-13.0.0-hecbb4c5_13_cpu.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libarrow-10.0.1-hecbb4c5_50_cpu.conda hash: - md5: 71172fd3f165406793843c3211248169 - sha256: 627694b001dd6f27618311d6769967da23181a5cabe373f4f6d70b5f34c704a8 - build: hecbb4c5_13_cpu + md5: b5479b5c53c44fd2c924dc1b393d6c54 + sha256: 106822679a3f76d60b36741b7e377547ead7adaceb8c144f692a48c16c375c5f + build: hecbb4c5_50_cpu arch: x86_64 subdir: linux-64 - build_number: 13 + build_number: 50 constrains: - - apache-arrow-proc =*=cpu - parquet-cpp <0.0a0 - - arrow-cpp =13.0.0 + - apache-arrow-proc =*=cpu + - arrow-cpp =10.0.1 license: Apache-2.0 license_family: APACHE - size: 27837206 - timestamp: 1698343668924 + size: 27265549 + timestamp: 1698343574909 - platform: osx-64 name: libarrow - version: 13.0.0 + version: 10.0.1 category: main manager: conda dependencies: - __osx >=10.13 - - __osx >=10.9 - aws-crt-cpp >=0.24.4,<0.24.5.0a0 - aws-sdk-cpp >=1.11.182,<1.11.183.0a0 - bzip2 >=1.0.8,<2.0a0 + - gflags >=2.2.2,<2.3.0a0 - glog >=0.6.0,<0.7.0a0 - libabseil * cxx17* - libabseil >=20230802.1,<20230803.0a0 - libbrotlidec >=1.1.0,<1.2.0a0 - libbrotlienc >=1.1.0,<1.2.0a0 - - libcxx >=15.0.7 + - libcxx >=14.0.6 - libgoogle-cloud >=2.12.0,<2.13.0a0 - libgrpc >=1.58.1,<1.59.0a0 - libprotobuf >=4.24.3,<4.24.4.0a0 @@ -14023,38 +13855,38 @@ package: - re2 - snappy >=1.1.10,<2.0a0 - zstd >=1.5.5,<1.6.0a0 - url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-13.0.0-h5fe8ab2_13_cpu.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libarrow-10.0.1-h99c5134_50_cpu.conda hash: - md5: bb7134adc5278c105b3d31d646362c8e - sha256: 77721c6f6d61cd4d7d66295742f7b9841eb74bb3d4fd26d5f897469660fd8e3e - build: h5fe8ab2_13_cpu + md5: f1c548c758e5ea66f064cdd0a71453ed + sha256: c3d859372a1174957f144aa3b9261d99e27e75e33f934aa0901661a753bf822d + build: h99c5134_50_cpu arch: x86_64 subdir: osx-64 - build_number: 13 + build_number: 50 constrains: - - arrow-cpp =13.0.0 + - arrow-cpp =10.0.1 - parquet-cpp <0.0a0 - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE - size: 20004504 - timestamp: 1698343929046 + size: 19403362 + timestamp: 1698344177760 - platform: osx-arm64 name: libarrow - version: 13.0.0 + version: 10.0.1 category: main manager: conda dependencies: - - __osx >=10.9 - aws-crt-cpp >=0.24.4,<0.24.5.0a0 - aws-sdk-cpp >=1.11.182,<1.11.183.0a0 - bzip2 >=1.0.8,<2.0a0 + - gflags >=2.2.2,<2.3.0a0 - glog >=0.6.0,<0.7.0a0 - libabseil * cxx17* - libabseil >=20230802.1,<20230803.0a0 - libbrotlidec >=1.1.0,<1.2.0a0 - libbrotlienc >=1.1.0,<1.2.0a0 - - libcxx >=15.0.7 + - libcxx >=14.0.6 - libgoogle-cloud >=2.12.0,<2.13.0a0 - libgrpc >=1.58.1,<1.59.0a0 - libprotobuf >=4.24.3,<4.24.4.0a0 @@ -14068,29 +13900,28 @@ package: - re2 - snappy >=1.1.10,<2.0a0 - zstd >=1.5.5,<1.6.0a0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-13.0.0-h87fad27_13_cpu.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-10.0.1-h8276777_50_cpu.conda hash: - md5: 8f5d385e8fd5a134f559cc1c31b7342c - sha256: cb328cef3426281f3b7ec89c8b3d65d01edff5df822a0dec4a67513e380f2106 - build: h87fad27_13_cpu + md5: 58d967e1c7d76e3dda613dd14e6eb644 + sha256: f24caa6f0c9cf209be6eec530265576f5c7e0265caca9959ff1df7cc5cc9ebbe + build: h8276777_50_cpu arch: aarch64 subdir: osx-arm64 - build_number: 13 + build_number: 50 constrains: - parquet-cpp <0.0a0 + - arrow-cpp =10.0.1 - apache-arrow-proc =*=cpu - - arrow-cpp =13.0.0 license: Apache-2.0 license_family: APACHE - size: 17933618 - timestamp: 1698344906816 + size: 16945399 + timestamp: 1698344384688 - platform: win-64 name: libarrow - version: 13.0.0 + version: 10.0.1 category: main manager: conda dependencies: - - aws-crt-cpp >=0.24.4,<0.24.5.0a0 - aws-sdk-cpp >=1.11.182,<1.11.183.0a0 - bzip2 >=1.0.8,<2.0a0 - libabseil * cxx17* @@ -14115,178 +13946,178 @@ package: - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - zstd >=1.5.5,<1.6.0a0 - url: https://conda.anaconda.org/conda-forge/win-64/libarrow-13.0.0-hc7845e2_13_cpu.conda + url: https://conda.anaconda.org/conda-forge/win-64/libarrow-10.0.1-hd2d01ff_50_cpu.conda hash: - md5: 8f7bd67ced2f27162e1f3f33b7195296 - sha256: 0c163a028a59cb8bfad5138cbb975af24141c8b3280bd933082c6dd402871806 - build: hc7845e2_13_cpu + md5: b60e5b6a8def8b51d8822743c112fe95 + sha256: 37db84b253d730942be81705ac648c6c6cbef48386703f850da05f6e09cc435a + build: hd2d01ff_50_cpu arch: x86_64 subdir: win-64 - build_number: 13 + build_number: 50 constrains: - parquet-cpp <0.0a0 - - arrow-cpp =13.0.0 - apache-arrow-proc =*=cpu + - arrow-cpp =10.0.1 license: Apache-2.0 license_family: APACHE - size: 16639554 - timestamp: 1698344855452 + size: 15971089 + timestamp: 1698343937840 - platform: linux-64 name: libblas version: 3.9.0 category: main manager: conda dependencies: - - libopenblas >=0.3.24,<0.3.25.0a0 - - libopenblas >=0.3.24,<1.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda + - libopenblas >=0.3.25,<0.3.26.0a0 + - libopenblas >=0.3.25,<1.0a0 + url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda hash: - md5: 420f4e9be59d0dc9133a0f43f7bab3f3 - sha256: b1311b9414559c5760b08a32e0382ca27fa302c967968aa6f78e042519f728ce - build: 19_linux64_openblas + md5: 2b7bb4f7562c8cf334fc2e20c2d28abc + sha256: 8a0ee1de693a9b3da4a11b95ec81b40dd434bd01fa1f5f38f8268cd2146bf8f0 + build: 20_linux64_openblas arch: x86_64 subdir: linux-64 - build_number: 19 + build_number: 20 constrains: + - liblapacke 3.9.0 20_linux64_openblas + - libcblas 3.9.0 20_linux64_openblas - blas * openblas - - libcblas 3.9.0 19_linux64_openblas - - liblapack 3.9.0 19_linux64_openblas - - liblapacke 3.9.0 19_linux64_openblas + - liblapack 3.9.0 20_linux64_openblas license: BSD-3-Clause license_family: BSD - size: 14566 - timestamp: 1697484219912 + size: 14433 + timestamp: 1700568383457 - platform: osx-64 name: libblas version: 3.9.0 category: main manager: conda dependencies: - - libopenblas >=0.3.24,<0.3.25.0a0 - - libopenblas >=0.3.24,<1.0a0 - url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-19_osx64_openblas.conda + - libopenblas >=0.3.25,<0.3.26.0a0 + - libopenblas >=0.3.25,<1.0a0 + url: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-20_osx64_openblas.conda hash: - md5: e932b99c38915fa2ee252cdff6ea1f01 - sha256: c2c96103aa23a65f45b76716df49940cb0722258d3e0416f8fa06ade02464b23 - build: 19_osx64_openblas + md5: 1673476d205d14a9042172be795f63cb + sha256: 89cac4653b52817d44802d96c13e5f194320e2e4ea805596641d0f3e22e32525 + build: 20_osx64_openblas arch: x86_64 subdir: osx-64 - build_number: 19 + build_number: 20 constrains: - - liblapacke 3.9.0 19_osx64_openblas - - libcblas 3.9.0 19_osx64_openblas - - liblapack 3.9.0 19_osx64_openblas - blas * openblas + - liblapack 3.9.0 20_osx64_openblas + - liblapacke 3.9.0 20_osx64_openblas + - libcblas 3.9.0 20_osx64_openblas license: BSD-3-Clause license_family: BSD - size: 14812 - timestamp: 1697484725085 + size: 14739 + timestamp: 1700568675962 - platform: osx-arm64 name: libblas version: 3.9.0 category: main manager: conda dependencies: - - libopenblas >=0.3.24,<0.3.25.0a0 - - libopenblas >=0.3.24,<1.0a0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-19_osxarm64_openblas.conda + - libopenblas >=0.3.25,<0.3.26.0a0 + - libopenblas >=0.3.25,<1.0a0 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-20_osxarm64_openblas.conda hash: - md5: f50b1fd98593278e18319653cff9c475 - sha256: 51e78e3c9fa57f3fec12936b760928715ba0ab5253d02815202f9ec4c2c9255d - build: 19_osxarm64_openblas + md5: 49bc8dec26663241ee064b2d7116ec2d + sha256: 5b5b8394352c8ca06b15dcc9319d0af3e9f1dc03fc0a6f6deef05d664d6b763a + build: 20_osxarm64_openblas arch: aarch64 subdir: osx-arm64 - build_number: 19 + build_number: 20 constrains: - - libcblas 3.9.0 19_osxarm64_openblas - - liblapack 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 20_osxarm64_openblas + - liblapacke 3.9.0 20_osxarm64_openblas + - libcblas 3.9.0 20_osxarm64_openblas - blas * openblas - - liblapacke 3.9.0 19_osxarm64_openblas license: BSD-3-Clause license_family: BSD - size: 14817 - timestamp: 1697484577887 + size: 14722 + timestamp: 1700568881837 - platform: win-64 name: libblas version: 3.9.0 category: main manager: conda dependencies: - - mkl 2023.2.0 h6a75c08_50496 - url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-19_win64_mkl.conda + - mkl 2023.2.0 h6a75c08_50497 + url: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-20_win64_mkl.conda hash: - md5: 4f8a1a63cfbf74bc7b2813d9c6c205be - sha256: 915eae5e0dedbf87733a0b8c6f410678c77111a3fb26ca0a272e11ff979e7ef2 - build: 19_win64_mkl + md5: 6cad6cd2fbdeef4d651b8f752a4da960 + sha256: 34becfe991510be7b9ee05b4ae466c5a26a72af275c3071c1ca7e2308d3f7e64 + build: 20_win64_mkl arch: x86_64 subdir: win-64 - build_number: 19 + build_number: 20 constrains: - - liblapack 3.9.0 19_win64_mkl - - libcblas 3.9.0 19_win64_mkl - - liblapacke 3.9.0 19_win64_mkl + - liblapacke 3.9.0 20_win64_mkl - blas * mkl + - liblapack 3.9.0 20_win64_mkl + - libcblas 3.9.0 20_win64_mkl license: BSD-3-Clause license_family: BSD - size: 4984180 - timestamp: 1697485304263 + size: 4981090 + timestamp: 1700569135332 - platform: linux-64 name: libboost-headers - version: 1.82.0 + version: 1.83.0 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.82.0-ha770c72_6.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.83.0-ha770c72_0.conda hash: - md5: a943dcb8fd22cf23ce901ac84f6538c2 - sha256: c996950b85808115ea833e577a0af2969dbb0378c299560c2b945401a7770823 - build: ha770c72_6 + md5: 1fc57b3ba24d18cc75f431d7feb2c785 + sha256: aaa194e8b7ba401e6507a2f6dc0714d2f8f5a9951f8be18b96c250b0a1175982 + build: ha770c72_0 arch: x86_64 subdir: linux-64 - build_number: 6 + build_number: 0 constrains: - - boost-cpp =1.82.0 + - boost-cpp =1.83.0 license: BSL-1.0 - size: 13700720 - timestamp: 1696732043024 + size: 13764972 + timestamp: 1700826755254 - platform: osx-64 name: libboost-headers - version: 1.82.0 + version: 1.83.0 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.82.0-h694c41f_6.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libboost-headers-1.83.0-h694c41f_0.conda hash: - md5: 26a7214f82c75126cbd6d6a8e6792b31 - sha256: 84dae029e113178efa697fbbe6ff7aa270974f316fbf208a24242d35295e96a6 - build: h694c41f_6 + md5: fe6d48bba2424a94e85b696370371691 + sha256: 12a1d2d2cb2732e1ace732b17411c108691be104823b9b0426daefb7d4b8ec8d + build: h694c41f_0 arch: x86_64 subdir: osx-64 - build_number: 6 + build_number: 0 constrains: - - boost-cpp =1.82.0 + - boost-cpp =1.83.0 license: BSL-1.0 - size: 13795494 - timestamp: 1696732955800 + size: 13877796 + timestamp: 1700827757892 - platform: osx-arm64 name: libboost-headers - version: 1.82.0 + version: 1.83.0 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.82.0-hce30654_6.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libboost-headers-1.83.0-hce30654_0.conda hash: - md5: ae7c68cf82c23fe6c68f0efa064ef41a - sha256: 19cc7fff73fda78f142a875f06f2467fcbfc5c8c3e0db92b212e425de309a27d - build: hce30654_6 + md5: ff53ab92ecb249691bb72d0561ff13ed + sha256: e02286d2a73f70f0fd71e1db41d0feac2276dbc9a5479d7f0e8074f4b459faac + build: hce30654_0 arch: aarch64 subdir: osx-arm64 - build_number: 6 + build_number: 0 constrains: - - boost-cpp =1.82.0 + - boost-cpp =1.83.0 license: BSL-1.0 - size: 13795546 - timestamp: 1696733002284 + size: 13881642 + timestamp: 1700827869031 - platform: win-64 name: libboost-headers version: 1.82.0 @@ -14568,92 +14399,92 @@ package: category: main manager: conda dependencies: - - libblas 3.9.0 19_linux64_openblas - url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda + - libblas 3.9.0 20_linux64_openblas + url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda hash: - md5: d12374af44575413fbbd4a217d46ea33 - sha256: 84fddccaf58f42b07af7fb42512bd617efcb072f17bdef27f4c1884dbd33c86a - build: 19_linux64_openblas + md5: 36d486d72ab64ffea932329a1d3729a3 + sha256: 0e34fb0f82262f02fcb279ab4a1db8d50875dc98e3019452f8f387e6bf3c0247 + build: 20_linux64_openblas arch: x86_64 subdir: linux-64 - build_number: 19 + build_number: 20 constrains: + - liblapacke 3.9.0 20_linux64_openblas - blas * openblas - - liblapack 3.9.0 19_linux64_openblas - - liblapacke 3.9.0 19_linux64_openblas + - liblapack 3.9.0 20_linux64_openblas license: BSD-3-Clause license_family: BSD - size: 14458 - timestamp: 1697484230827 + size: 14383 + timestamp: 1700568410580 - platform: osx-64 name: libcblas version: 3.9.0 category: main manager: conda dependencies: - - libblas 3.9.0 19_osx64_openblas - url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-19_osx64_openblas.conda + - libblas 3.9.0 20_osx64_openblas + url: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-20_osx64_openblas.conda hash: - md5: 40e412c219ad8cf87ba664466071bcf6 - sha256: 70afde49736007bbb804d126a3983ba1fa04383006aae416a2971d538e274427 - build: 19_osx64_openblas + md5: b324ad206d39ce529fb9073f9d062062 + sha256: b0a4eab6d22b865d9b0e39f358f17438602621709db66b8da159197bedd2c5eb + build: 20_osx64_openblas arch: x86_64 subdir: osx-64 - build_number: 19 + build_number: 20 constrains: - - liblapack 3.9.0 19_osx64_openblas - - liblapacke 3.9.0 19_osx64_openblas + - liblapack 3.9.0 20_osx64_openblas + - liblapacke 3.9.0 20_osx64_openblas - blas * openblas license: BSD-3-Clause license_family: BSD - size: 14717 - timestamp: 1697484740520 + size: 14648 + timestamp: 1700568722960 - platform: osx-arm64 name: libcblas version: 3.9.0 category: main manager: conda dependencies: - - libblas 3.9.0 19_osxarm64_openblas - url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-19_osxarm64_openblas.conda + - libblas 3.9.0 20_osxarm64_openblas + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-20_osxarm64_openblas.conda hash: - md5: 5460a8d1beffd7f63994d891e6a20da4 - sha256: 19b1c5e3ddd383ec14540336f4704938218d3c1db4707ae10d5357afb22cccc1 - build: 19_osxarm64_openblas + md5: 89f4718753c08afe8cda4dd5791ba94c + sha256: d3a74638f60e034202e373cf2950c69a8d831190d497881d13cbf789434d2489 + build: 20_osxarm64_openblas arch: aarch64 subdir: osx-arm64 - build_number: 19 + build_number: 20 constrains: - - liblapack 3.9.0 19_osxarm64_openblas + - liblapack 3.9.0 20_osxarm64_openblas + - liblapacke 3.9.0 20_osxarm64_openblas - blas * openblas - - liblapacke 3.9.0 19_osxarm64_openblas license: BSD-3-Clause license_family: BSD - size: 14738 - timestamp: 1697484590682 + size: 14642 + timestamp: 1700568912840 - platform: win-64 name: libcblas version: 3.9.0 category: main manager: conda dependencies: - - libblas 3.9.0 19_win64_mkl - url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-19_win64_mkl.conda + - libblas 3.9.0 20_win64_mkl + url: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-20_win64_mkl.conda hash: - md5: 1b9ede5cff953aa1a5f4d9f8ec644972 - sha256: 66c8934bf8ead1e3ab3653155697a7d70878e96115742b681aac16d9bd25dd3d - build: 19_win64_mkl + md5: e6d36cfcb2f2dff0f659d2aa0813eb2d + sha256: e526023ed8e7f6fde43698cd326dd16c8448f29414bab8a9594b33deb57a5347 + build: 20_win64_mkl arch: x86_64 subdir: win-64 - build_number: 19 + build_number: 20 constrains: - - liblapack 3.9.0 19_win64_mkl - - liblapacke 3.9.0 19_win64_mkl - blas * mkl + - liblapack 3.9.0 20_win64_mkl + - liblapacke 3.9.0 20_win64_mkl license: BSD-3-Clause license_family: BSD - size: 4984046 - timestamp: 1697485351545 + size: 4980937 + timestamp: 1700569208640 - platform: linux-64 name: libclang version: 15.0.7 @@ -15780,6 +15611,229 @@ package: license_family: MIT size: 8468206 timestamp: 1695047804761 +- platform: linux-64 + name: libgdal-arrow-parquet + version: 3.7.2 + category: main + manager: conda + dependencies: + - __glibc >=2.17,<3.0.a0 + - blosc >=1.21.5,<2.0a0 + - cfitsio >=4.3.0,<4.3.1.0a0 + - freexl >=2.0.0,<3.0a0 + - geos >=3.12.0,<3.12.1.0a0 + - geotiff >=1.7.1,<1.8.0a0 + - giflib >=5.2.1,<5.3.0a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - hdf5 >=1.14.2,<1.14.3.0a0 + - json-c >=0.17,<0.18.0a0 + - kealib >=1.5.1,<1.6.0a0 + - libarchive >=3.7.2,<3.8.0a0 + - libarrow >=10.0.1,<10.0.2.0a0 + - libexpat >=2.5.0,<3.0a0 + - libgcc-ng >=12 + - libgdal 3.7.2 h3aa23ec_3 + - libjpeg-turbo >=2.1.5.1,<3.0a0 + - libkml >=1.3.0,<1.4.0a0 + - libnetcdf >=4.9.2,<4.9.3.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libpq >=15.4,<16.0a0 + - libspatialite >=5.1.0,<5.2.0a0 + - libsqlite >=3.43.0,<4.0a0 + - libstdcxx-ng >=12 + - libtiff >=4.6.0,<4.7.0a0 + - libuuid >=2.38.1,<3.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libxml2 >=2.11.5,<2.12.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openjpeg >=2.5.0,<3.0a0 + - openssl >=3.1.3,<4.0a0 + - pcre2 >=10.40,<10.41.0a0 + - poppler >=23.8.0,<23.9.0a0 + - postgresql + - proj >=9.3.0,<9.3.1.0a0 + - qhull >=2020.2,<2020.3.0a0 + - tiledb >=2.16,<2.17.0a0 + - xerces-c >=3.2.4,<3.3.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgdal-arrow-parquet-3.7.2-hcef7442_3.conda + hash: + md5: 8dc0668ea58a101604abd57f1c1fc582 + sha256: df477759e55412a6928904f9fe4d2adf5a9a17271b5c0464db8586136882dd5f + build: hcef7442_3 + arch: x86_64 + subdir: linux-64 + build_number: 3 + license: MIT + license_family: MIT + size: 682854 + timestamp: 1695218301841 +- platform: osx-64 + name: libgdal-arrow-parquet + version: 3.7.2 + category: main + manager: conda + dependencies: + - blosc >=1.21.5,<2.0a0 + - cfitsio >=4.3.0,<4.3.1.0a0 + - freexl >=2.0.0,<3.0a0 + - geos >=3.12.0,<3.12.1.0a0 + - geotiff >=1.7.1,<1.8.0a0 + - giflib >=5.2.1,<5.3.0a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - hdf5 >=1.14.2,<1.14.3.0a0 + - json-c >=0.17,<0.18.0a0 + - kealib >=1.5.1,<1.6.0a0 + - libarchive >=3.7.2,<3.8.0a0 + - libarrow >=10.0.1,<10.0.2.0a0 + - libcxx >=15.0.7 + - libexpat >=2.5.0,<3.0a0 + - libgdal 3.7.2 h00ad6d0_3 + - libjpeg-turbo >=2.1.5.1,<3.0a0 + - libkml >=1.3.0,<1.4.0a0 + - libnetcdf >=4.9.2,<4.9.3.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libpq >=15.4,<16.0a0 + - libspatialite >=5.1.0,<5.2.0a0 + - libsqlite >=3.43.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libxml2 >=2.11.5,<2.12.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openjpeg >=2.5.0,<3.0a0 + - openssl >=3.1.2,<4.0a0 + - pcre2 >=10.40,<10.41.0a0 + - poppler >=23.8.0,<23.9.0a0 + - postgresql + - proj >=9.3.0,<9.3.1.0a0 + - qhull >=2020.2,<2020.3.0a0 + - tiledb >=2.16,<2.17.0a0 + - xerces-c >=3.2.4,<3.3.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + url: https://conda.anaconda.org/conda-forge/osx-64/libgdal-arrow-parquet-3.7.2-hb392038_3.conda + hash: + md5: 2b328bddb0f6ef7716fe06ebb4703b33 + sha256: bae00baa7ddb75c4c6d85196adf349bf809d767a6a33f49eac4c580969507051 + build: hb392038_3 + arch: x86_64 + subdir: osx-64 + build_number: 3 + license: MIT + license_family: MIT + size: 630198 + timestamp: 1695049003354 +- platform: osx-arm64 + name: libgdal-arrow-parquet + version: 3.7.2 + category: main + manager: conda + dependencies: + - blosc >=1.21.5,<2.0a0 + - cfitsio >=4.3.0,<4.3.1.0a0 + - freexl >=2.0.0,<3.0a0 + - geos >=3.12.0,<3.12.1.0a0 + - geotiff >=1.7.1,<1.8.0a0 + - giflib >=5.2.1,<5.3.0a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - hdf5 >=1.14.2,<1.14.3.0a0 + - json-c >=0.17,<0.18.0a0 + - kealib >=1.5.1,<1.6.0a0 + - libarchive >=3.7.2,<3.8.0a0 + - libarrow >=10.0.1,<10.0.2.0a0 + - libcxx >=15.0.7 + - libexpat >=2.5.0,<3.0a0 + - libgdal 3.7.2 h1f9bd4d_3 + - libjpeg-turbo >=2.1.5.1,<3.0a0 + - libkml >=1.3.0,<1.4.0a0 + - libnetcdf >=4.9.2,<4.9.3.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libpq >=15.4,<16.0a0 + - libspatialite >=5.1.0,<5.2.0a0 + - libsqlite >=3.43.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libxml2 >=2.11.5,<2.12.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openjpeg >=2.5.0,<3.0a0 + - openssl >=3.1.2,<4.0a0 + - pcre2 >=10.40,<10.41.0a0 + - poppler >=23.8.0,<23.9.0a0 + - postgresql + - proj >=9.3.0,<9.3.1.0a0 + - qhull >=2020.2,<2020.3.0a0 + - tiledb >=2.16,<2.17.0a0 + - xerces-c >=3.2.4,<3.3.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-arrow-parquet-3.7.2-h1337460_3.conda + hash: + md5: c8b52ec7b1e851b4e3ba3b7ae99efa89 + sha256: 89f4c9b6c73e5350f7c6396a1eb1d6a768174014c787d48c3cf3137fd749a4ab + build: h1337460_3 + arch: aarch64 + subdir: osx-arm64 + build_number: 3 + license: MIT + license_family: MIT + size: 630576 + timestamp: 1695049254739 +- platform: win-64 + name: libgdal-arrow-parquet + version: 3.7.2 + category: main + manager: conda + dependencies: + - blosc >=1.21.5,<2.0a0 + - cfitsio >=4.3.0,<4.3.1.0a0 + - freexl >=2.0.0,<3.0a0 + - geos >=3.12.0,<3.12.1.0a0 + - geotiff >=1.7.1,<1.8.0a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - hdf5 >=1.14.2,<1.14.3.0a0 + - kealib >=1.5.1,<1.6.0a0 + - libarchive >=3.7.2,<3.8.0a0 + - libarrow >=10.0.1,<10.0.2.0a0 + - libexpat >=2.5.0,<3.0a0 + - libgdal 3.7.2 hfa9c32d_3 + - libjpeg-turbo >=2.1.5.1,<3.0a0 + - libkml >=1.3.0,<1.4.0a0 + - libnetcdf >=4.9.2,<4.9.3.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libpq >=15.4,<16.0a0 + - libspatialite >=5.1.0,<5.2.0a0 + - libsqlite >=3.43.0,<4.0a0 + - libtiff >=4.6.0,<4.7.0a0 + - libwebp-base >=1.3.2,<2.0a0 + - libxml2 >=2.11.5,<2.12.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - openjpeg >=2.5.0,<3.0a0 + - openssl >=3.1.2,<4.0a0 + - pcre2 >=10.40,<10.41.0a0 + - poppler >=23.8.0,<23.9.0a0 + - postgresql + - proj >=9.3.0,<9.3.1.0a0 + - qhull >=2020.2,<2020.3.0a0 + - tiledb >=2.16,<2.17.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xerces-c >=3.2.4,<3.3.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + url: https://conda.anaconda.org/conda-forge/win-64/libgdal-arrow-parquet-3.7.2-h7c7bd20_3.conda + hash: + md5: 239f5584a4712628800e32cdf37a26f4 + sha256: fd50e305f0824474080147af01ebb65165e833fcc6f702fea5381146b645a6a7 + build: h7c7bd20_3 + arch: x86_64 + subdir: win-64 + build_number: 3 + license: MIT + license_family: MIT + size: 635404 + timestamp: 1695049556802 - platform: osx-64 name: libgfortran version: 5.0.0 @@ -16581,115 +16635,115 @@ package: category: main manager: conda dependencies: - - libblas 3.9.0 19_linux64_openblas - url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda + - libblas 3.9.0 20_linux64_openblas + url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda hash: - md5: 9f100edf65436e3eabc2a51fc00b2c37 - sha256: 58f402aae605ebd0932e1cbbf855cd49dcdfa2fcb6aab790a4f6068ec5937878 - build: 19_linux64_openblas + md5: 6fabc51f5e647d09cc010c40061557e0 + sha256: ad7745b8d0f2ccb9c3ba7aaa7167d62fc9f02e45eb67172ae5f0dfb5a3b1a2cc + build: 20_linux64_openblas arch: x86_64 subdir: linux-64 - build_number: 19 + build_number: 20 constrains: + - liblapacke 3.9.0 20_linux64_openblas + - libcblas 3.9.0 20_linux64_openblas - blas * openblas - - libcblas 3.9.0 19_linux64_openblas - - liblapacke 3.9.0 19_linux64_openblas license: BSD-3-Clause license_family: BSD - size: 14487 - timestamp: 1697484241613 + size: 14350 + timestamp: 1700568424034 - platform: osx-64 name: liblapack version: 3.9.0 category: main manager: conda dependencies: - - libblas 3.9.0 19_osx64_openblas - url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-19_osx64_openblas.conda + - libblas 3.9.0 20_osx64_openblas + url: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-20_osx64_openblas.conda hash: - md5: 2e714df18db99ee6d7b4ac728f53ca62 - sha256: 6a1704c43a03195fecbbb226be5c257b2e37621e793967c3f31c8521f19e18df - build: 19_osx64_openblas + md5: 704bfc2af1288ea973b6755281e6ad32 + sha256: d64e11b93dada339cd0dcc057b3f3f6a5114b8c9bdf90cf6c04cbfa75fb02104 + build: 20_osx64_openblas arch: x86_64 subdir: osx-64 - build_number: 19 + build_number: 20 constrains: - - libcblas 3.9.0 19_osx64_openblas - - liblapacke 3.9.0 19_osx64_openblas - blas * openblas + - liblapacke 3.9.0 20_osx64_openblas + - libcblas 3.9.0 20_osx64_openblas license: BSD-3-Clause license_family: BSD - size: 14724 - timestamp: 1697484756327 + size: 14658 + timestamp: 1700568740660 - platform: osx-arm64 name: liblapack version: 3.9.0 category: main manager: conda dependencies: - - libblas 3.9.0 19_osxarm64_openblas - url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-19_osxarm64_openblas.conda + - libblas 3.9.0 20_osxarm64_openblas + url: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.9.0-20_osxarm64_openblas.conda hash: - md5: 3638eacb084c374f41f9efa40d20a47b - sha256: f19cff537403c9feed98c7e18259022102b087f2b72a757e8a417476b9cf30c1 - build: 19_osxarm64_openblas + md5: 1fefac78f2315455ce2d7f34782eac0a + sha256: e13f79828a7752f6e0a74cbe62df80c551285f6c37de86bc3bd9987c97faca57 + build: 20_osxarm64_openblas arch: aarch64 subdir: osx-arm64 - build_number: 19 + build_number: 20 constrains: - - libcblas 3.9.0 19_osxarm64_openblas + - liblapacke 3.9.0 20_osxarm64_openblas + - libcblas 3.9.0 20_osxarm64_openblas - blas * openblas - - liblapacke 3.9.0 19_osxarm64_openblas license: BSD-3-Clause license_family: BSD - size: 14721 - timestamp: 1697484603691 + size: 14648 + timestamp: 1700568930669 - platform: win-64 name: liblapack version: 3.9.0 category: main manager: conda dependencies: - - libblas 3.9.0 19_win64_mkl - url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-19_win64_mkl.conda + - libblas 3.9.0 20_win64_mkl + url: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.9.0-20_win64_mkl.conda hash: - md5: 574e6e8bcc85df2885eb2a87d31ae005 - sha256: e53093eab7674528e9eafbd5efa28f3170ec1388b8df6c9b8343760696f47907 - build: 19_win64_mkl + md5: 9510d07424d70fcac553d86b3e4a7c14 + sha256: 7627ef580c26e48c3496b5885fd32be4e4db49fa1077eb21235dc638489565f6 + build: 20_win64_mkl arch: x86_64 subdir: win-64 - build_number: 19 + build_number: 20 constrains: - - libcblas 3.9.0 19_win64_mkl - - liblapacke 3.9.0 19_win64_mkl + - liblapacke 3.9.0 20_win64_mkl - blas * mkl + - libcblas 3.9.0 20_win64_mkl license: BSD-3-Clause license_family: BSD - size: 4984073 - timestamp: 1697485397401 + size: 4980967 + timestamp: 1700569262298 - platform: win-64 name: liblapacke version: 3.9.0 category: main manager: conda dependencies: - - libblas 3.9.0 19_win64_mkl - - libcblas 3.9.0 19_win64_mkl - - liblapack 3.9.0 19_win64_mkl - url: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-19_win64_mkl.conda + - libblas 3.9.0 20_win64_mkl + - libcblas 3.9.0 20_win64_mkl + - liblapack 3.9.0 20_win64_mkl + url: https://conda.anaconda.org/conda-forge/win-64/liblapacke-3.9.0-20_win64_mkl.conda hash: - md5: c77175c01902a5a8eb9e5598bd9e7756 - sha256: 5fe8e60171e94735919cc8661aa20642f4b22e96c0dfb23badf4ce9aae85bcbe - build: 19_win64_mkl + md5: 960008cd6e9827a5c9b68e77fdf3d29f + sha256: cb637de64f79a353925322f315d7ba67fc5479ad350384861a691229f5011ff9 + build: 20_win64_mkl arch: x86_64 subdir: win-64 - build_number: 19 + build_number: 20 constrains: - blas * mkl license: BSD-3-Clause license_family: BSD - size: 4984065 - timestamp: 1697485443868 + size: 4984026 + timestamp: 1700569320415 - platform: linux-64 name: libllvm15 version: 15.0.7 @@ -17068,73 +17122,73 @@ package: timestamp: 1610382533961 - platform: linux-64 name: libopenblas - version: 0.3.24 + version: 0.3.25 category: main manager: conda dependencies: - libgcc-ng >=12 - libgfortran-ng - libgfortran5 >=12.3.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda hash: - md5: 6e4ef6ca28655124dcde9bd500e44c32 - sha256: c8e080ae4d57506238023e98869928ae93564e6407ef5b0c4d3a337e8c2b7662 + md5: d172b34a443b95f86089e8229ddc9a17 + sha256: 628564517895ee1b09cf72c817548bd80ef1acce6a8214a8520d9f7b44c4cfaf build: pthreads_h413a1c8_0 arch: x86_64 subdir: linux-64 build_number: 0 constrains: - - openblas >=0.3.24,<0.3.25.0a0 + - openblas >=0.3.25,<0.3.26.0a0 license: BSD-3-Clause license_family: BSD - size: 5492091 - timestamp: 1693785223074 + size: 5545169 + timestamp: 1700536004164 - platform: osx-64 name: libopenblas - version: 0.3.24 + version: 0.3.25 category: main manager: conda dependencies: - libgfortran 5.* - libgfortran5 >=12.3.0 - - llvm-openmp >=15.0.7 - url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.24-openmp_h48a4ad5_0.conda + - llvm-openmp >=16.0.6 + url: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.25-openmp_hfef2a42_0.conda hash: - md5: 077718837dd06cf0c3089070108869f6 - sha256: ff2c14f7ed121f1df3ad06bea353288eade77c12fb891212a27af88a61483490 - build: openmp_h48a4ad5_0 + md5: a01b96f00c3155c830d98a518c7dcbfb + sha256: 9895bccdbaa34958ab7dd1f29de66d1dfb94c551c7bb5a663666a500c67ee93c + build: openmp_hfef2a42_0 arch: x86_64 subdir: osx-64 build_number: 0 constrains: - - openblas >=0.3.24,<0.3.25.0a0 + - openblas >=0.3.25,<0.3.26.0a0 license: BSD-3-Clause license_family: BSD - size: 6157393 - timestamp: 1693785988209 + size: 6019426 + timestamp: 1700537709900 - platform: osx-arm64 name: libopenblas - version: 0.3.24 + version: 0.3.25 category: main manager: conda dependencies: - libgfortran 5.* - libgfortran5 >=12.3.0 - - llvm-openmp >=15.0.7 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.24-openmp_hd76b1f2_0.conda + - llvm-openmp >=16.0.6 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.25-openmp_h6c19121_0.conda hash: - md5: aacb05989f358affe1bafd4ea7294db4 - sha256: 21edfdf620ac5c93571aab452199b6b4622c445441dad88ab4d2eb326a7b91b3 - build: openmp_hd76b1f2_0 + md5: a1843550403212b9dedeeb31466ade03 + sha256: b112e0d500bc0314ea8d393efac3ab8c67857e5a2b345348c98e703ee92723e5 + build: openmp_h6c19121_0 arch: aarch64 subdir: osx-arm64 build_number: 0 constrains: - - openblas >=0.3.24,<0.3.25.0a0 + - openblas >=0.3.25,<0.3.26.0a0 license: BSD-3-Clause license_family: BSD - size: 2849225 - timestamp: 1693784744674 + size: 2896390 + timestamp: 1700535987588 - platform: linux-64 name: libopus version: 1.3.1 @@ -17944,79 +17998,79 @@ package: timestamp: 1699355576890 - platform: linux-64 name: libsqlite - version: 3.44.0 + version: 3.44.1 category: main manager: conda dependencies: - libgcc-ng >=12 - libzlib >=1.2.13,<1.3.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.1-h2797004_0.conda hash: - md5: b58e6816d137f3aabf77d341dd5d732b - sha256: 74ef5dcb900c38bec53140036e5e2a9cc7ffcd806da479ea2305f962a358a259 + md5: b4ad86d2527b890e43ff2efc68b239f4 + sha256: c37bb6ec8b09f690d84e8f14fabb75e00c221d11a256137d5b206e26f37e9483 build: h2797004_0 arch: x86_64 subdir: linux-64 build_number: 0 license: Unlicense - size: 845977 - timestamp: 1698854720770 + size: 846227 + timestamp: 1700684372427 - platform: osx-64 name: libsqlite - version: 3.44.0 + version: 3.44.1 category: main manager: conda dependencies: - libzlib >=1.2.13,<1.3.0a0 - url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.44.0-h92b6c6a_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.44.1-h92b6c6a_0.conda hash: - md5: 5dd5e957ebfee02720c30e0e2d127bbe - sha256: 0832dc9cf18e811d2b41f8f4951d5ab608678e3459b1a4f36347097d8a9abf68 + md5: 7cf15accdee2a4a1cf267a78c4b76c3d + sha256: e51e3e3e84df3cee02434283c8c83ed604fa50cea945a3b14904a59fac5537a5 build: h92b6c6a_0 arch: x86_64 subdir: osx-64 build_number: 0 license: Unlicense - size: 891073 - timestamp: 1698854990507 + size: 890892 + timestamp: 1700684863628 - platform: osx-arm64 name: libsqlite - version: 3.44.0 + version: 3.44.1 category: main manager: conda dependencies: - libzlib >=1.2.13,<1.3.0a0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.44.0-h091b4b1_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.44.1-h091b4b1_0.conda hash: - md5: 28eb31a5b4e704353ed575758e2fcf1d - sha256: 38e98953b572e2871f2b318fa7fe8d9997b0927970916c2d09402273b60ff832 + md5: 1750563ea42661aa9e83f1077e58b75a + sha256: 03da3a7c97a9f24371ccb4d187454bac5db7463bd5a38c22fc5d91ee8b436515 build: h091b4b1_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: Unlicense - size: 815079 - timestamp: 1698855024189 + size: 815120 + timestamp: 1700684967912 - platform: win-64 name: libsqlite - version: 3.44.0 + version: 3.44.1 category: main manager: conda dependencies: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.44.0-hcfcfb64_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.44.1-hcfcfb64_0.conda hash: - md5: 446fb1973cfeb8b32de4add3c9ac1057 - sha256: b2be4125343d89765269b537e90ea5ab7f219e7398e7ad610ddcdcf31e7b9e65 + md5: cb795bb06d345285ce8b9a4b0553574f + sha256: cdcc7e14f0b12e521c2a7255a04a8c259b06a2c8394f7e571412c0e07ec514f5 build: hcfcfb64_0 arch: x86_64 subdir: win-64 build_number: 0 license: Unlicense - size: 852871 - timestamp: 1698855272921 + size: 853647 + timestamp: 1700684837686 - platform: linux-64 name: libssh2 version: 1.11.0 @@ -18909,7 +18963,7 @@ package: timestamp: 1691593272628 - platform: win-64 name: libxml2 - version: 2.11.5 + version: 2.11.6 category: main manager: conda dependencies: @@ -18918,18 +18972,18 @@ package: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.11.5-hc3477c8_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.11.6-hc3477c8_0.conda hash: - md5: 27974f880a010b1441093d9f737a949f - sha256: ad3b5a510be2c5f9fe90b2c20e10adb135717304bcb3a197f256feb48d713d99 - build: hc3477c8_1 + md5: 08ffbb4c22dd3622e122058368f8b708 + sha256: 6ed853ef69bf43998eacc6fd022d7ac170d9e2d3d273b0be0dc3da593fb0fc90 + build: hc3477c8_0 arch: x86_64 subdir: win-64 - build_number: 1 + build_number: 0 license: MIT license_family: MIT - size: 1600640 - timestamp: 1692960798126 + size: 1627582 + timestamp: 1700245325646 - platform: linux-64 name: libxslt version: 1.1.37 @@ -19184,44 +19238,44 @@ package: timestamp: 1686575452215 - platform: osx-64 name: llvm-openmp - version: 17.0.4 + version: 17.0.5 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-17.0.4-hb6ac08f_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-17.0.5-hb6ac08f_0.conda hash: - md5: 31391b68245bc68504169e98ffaf2c44 - sha256: d49b6958d22075de5fb707fd5f593cfa4be059015db48b7f1cd5e47e7efde2ff + md5: 8ca3784280b7cb54163a46e8a918fb43 + sha256: 8ad5acab5d5fb38785c6f41e17e5e1729f305f4838cc3a4470688c6cf942c0da build: hb6ac08f_0 arch: x86_64 subdir: osx-64 build_number: 0 constrains: - - openmp 17.0.4|17.0.4.* + - openmp 17.0.5|17.0.5.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 299744 - timestamp: 1698833439461 + size: 299785 + timestamp: 1700007586102 - platform: osx-arm64 name: llvm-openmp - version: 17.0.4 + version: 17.0.5 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-17.0.4-hcd81f8e_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-17.0.5-hcd81f8e_0.conda hash: - md5: 88618857d4b3fadc13649d1a25cf1e4c - sha256: 99a8145f38c02f317d1293eaf0e34af028d94d6854dfb2dd044702995cf74b89 + md5: 7307ed345b859c2d6680d277dfc13bdd + sha256: d6ac131d98df60c85206455f49fe1921a9eeef9962bbe1f06ada22573c09b0e6 build: hcd81f8e_0 arch: aarch64 subdir: osx-arm64 build_number: 0 constrains: - - openmp 17.0.4|17.0.4.* + - openmp 17.0.5|17.0.5.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 274893 - timestamp: 1698833582372 + size: 275077 + timestamp: 1700007674975 - platform: linux-64 name: lxml version: 4.9.3 @@ -19232,19 +19286,19 @@ package: - libxml2 >=2.11.5,<2.12.0a0 - libxslt >=1.1.37,<2.0a0 - libzlib >=1.2.13,<1.3.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/lxml-4.9.3-py310h9b7343a_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/lxml-4.9.3-py311h1a07684_1.conda hash: - md5: be9c0cae4f36fab4ee98a79e806c9cb8 - sha256: eabdb36e81f675950b96911d70cb0fc085c92d6cdb4b9b8f6b79c28250f90b14 - build: py310h9b7343a_1 + md5: aab51e50d994e58efdfa5382139b0468 + sha256: 9ee461843278f695c5e301b4575e7dd02f69021e85023b62b17f7dfe2cd173e4 + build: py311h1a07684_1 arch: x86_64 subdir: linux-64 build_number: 1 license: BSD-3-Clause and GPL-2.0-only and ZPL-2.0 and LicenseRef-ElementTree - size: 1408960 - timestamp: 1695546921203 + size: 1442817 + timestamp: 1695546963684 - platform: osx-64 name: lxml version: 4.9.3 @@ -19757,13 +19811,13 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_1.conda hash: - md5: b74e07a054c479e45a83a83fc5be713c - sha256: ac46cc2f6d4bbeedcd2f508e43f43143a9286ced55730d8d97a3c91ceceb0d56 - build: py310h2372a71_1 + md5: 71120b5155a0c500826cf81536721a15 + sha256: e1a9930f35e39bf65bc293e24160b83ebf9f800f02749f65358e1c04882ee6b0 + build: py311h459d7ec_1 arch: x86_64 subdir: linux-64 build_number: 1 @@ -19771,8 +19825,8 @@ package: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD - size: 24054 - timestamp: 1695367637074 + size: 27174 + timestamp: 1695367575909 - platform: osx-64 name: markupsafe version: 2.1.3 @@ -19845,97 +19899,97 @@ package: timestamp: 1695367841578 - platform: linux-64 name: matplotlib - version: 3.8.1 + version: 3.8.2 category: main manager: conda dependencies: - - matplotlib-base >=3.8.1,<3.8.2.0a0 + - matplotlib-base >=3.8.2,<3.8.3.0a0 - pyqt >=5.10 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tornado >=5 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.1-py310hff52083_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.8.2-py311h38be061_0.conda hash: - md5: acd62190c3822df888791592130aa286 - sha256: b61c2252eee50ebf8332a5cb91261b84554e601bf55c9ccf6d180b54a5e2eccf - build: py310hff52083_0 + md5: ecffdcca48fcf288c2d9554e749be7ec + sha256: 6d57f7c9f7df54049195395582afe0ad5be66d9b43dd1638446c2b18fae73f5a + build: py311h38be061_0 arch: x86_64 subdir: linux-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 8416 - timestamp: 1698868771373 + size: 8404 + timestamp: 1700509701402 - platform: osx-64 name: matplotlib - version: 3.8.1 + version: 3.8.2 category: main manager: conda dependencies: - - matplotlib-base >=3.8.1,<3.8.2.0a0 + - matplotlib-base >=3.8.2,<3.8.3.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - tornado >=5 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.1-py311h6eed73b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.8.2-py311h6eed73b_0.conda hash: - md5: ecb3b48ca1bfb16ea92f42971f6db317 - sha256: f53c5672ee053fc026d50320537ef8ee9c52f8e2194f751e43e6d921f1c3faca + md5: d6bbefc17427fd6d400cf32319bf94a3 + sha256: bf9ed5d93a15797be72b94f35a254c6b19475555f3d9f2f89dd0436b319a79e7 build: py311h6eed73b_0 arch: x86_64 subdir: osx-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 8540 - timestamp: 1698869065085 + size: 8505 + timestamp: 1700510040548 - platform: osx-arm64 name: matplotlib - version: 3.8.1 + version: 3.8.2 category: main manager: conda dependencies: - - matplotlib-base >=3.8.1,<3.8.2.0a0 + - matplotlib-base >=3.8.2,<3.8.3.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - tornado >=5 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.1-py311ha1ab1f8_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.8.2-py311ha1ab1f8_0.conda hash: - md5: 797f33cafe2b7fed2ab1ce7e261c4c81 - sha256: bcf6e3eea9a8693e477b1b4ceeda6e124dc2cfd6e6c8313f82982d73332b36d2 + md5: 5f6939c9d4badfeeea1d98ccc9041d89 + sha256: e2a6419cfcba1a514a24c74e57e17e39ac8b15a3856ae9f23bd4c3d0e0ddd0fb build: py311ha1ab1f8_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 8589 - timestamp: 1698869242307 + size: 8587 + timestamp: 1700510516179 - platform: win-64 name: matplotlib - version: 3.8.1 + version: 3.8.2 category: main manager: conda dependencies: - - matplotlib-base >=3.8.1,<3.8.2.0a0 + - matplotlib-base >=3.8.2,<3.8.3.0a0 - pyqt >=5.10 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - tornado >=5 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.1-py311h1ea47a8_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.8.2-py311h1ea47a8_0.conda hash: - md5: 1839b8c39f09d94b734d5e627eeb79ea - sha256: d236fcbbecd9d99bf254a7a7105bcddb754552be8d2237574d8cfb4edca0d76c + md5: f45a9de009382412aa702e4d71e82206 + sha256: 9817d7c166f9f006c63cd8f7b46ed233cff34d3176ade3b0095dc653c9d50639 build: py311h1ea47a8_0 arch: x86_64 subdir: win-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 8809 - timestamp: 1698869468994 + size: 8807 + timestamp: 1700510029314 - platform: linux-64 name: matplotlib-base - version: 3.8.1 + version: 3.8.2 category: main manager: conda dependencies: @@ -19948,29 +20002,29 @@ package: - libgcc-ng >=12 - libstdcxx-ng >=12 - numpy >=1.21,<2 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.23.5,<2.0a0 - packaging >=20.0 - pillow >=8 - pyparsing >=2.3.1 - - python >=3.10,<3.11.0a0 + - python >=3.11,<3.12.0a0 - python-dateutil >=2.7 - - python_abi 3.10.* *_cp310 + - python_abi 3.11.* *_cp311 - tk >=8.6.13,<8.7.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py310h62c0568_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py311h54ef318_0.conda hash: - md5: e650bd952e5618050ccb088bc0c6dfb4 - sha256: 615197c8b2b816aa1f7874319bd41acb134fcb9cd55e7337563295c8ced0a30e - build: py310h62c0568_0 + md5: 9f80753bc008bfc9b95f39d9ff9f1694 + sha256: 69319da0e6bad1711cac1573710370f31e9630fe6c972ff7eac95649e0c04114 + build: py311h54ef318_0 arch: x86_64 subdir: linux-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 6976980 - timestamp: 1698868750483 + size: 7938458 + timestamp: 1700509663523 - platform: osx-64 name: matplotlib-base - version: 3.8.1 + version: 3.8.2 category: main manager: conda dependencies: @@ -19991,21 +20045,21 @@ package: - python >=3.11,<3.12.0a0 - python-dateutil >=2.7 - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.1-py311hd316c10_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.8.2-py311hd316c10_0.conda hash: - md5: 8952515c597009d2dfadf9ecaec30447 - sha256: 5976a3c061b7918ac84a7e38fec1af297fe29b5e2ec9405f43feb55f77b4f6fb + md5: 26921b949e2f6f74bc66483372cbd18a + sha256: b863c66fa22f39b0bf240520f6d710d6bd634096e6e4a95c4815fcc7e0abad42 build: py311hd316c10_0 arch: x86_64 subdir: osx-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 8059734 - timestamp: 1698869029832 + size: 7954253 + timestamp: 1700509977029 - platform: osx-arm64 name: matplotlib-base - version: 3.8.1 + version: 3.8.2 category: main manager: conda dependencies: @@ -20026,21 +20080,21 @@ package: - python >=3.11,<3.12.0a0 *_cpython - python-dateutil >=2.7 - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.1-py311hfdba5f6_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.8.2-py311hfdba5f6_0.conda hash: - md5: 7b2974aa0ecc495f1cb9f269fadf9981 - sha256: 2d61f4697a9906c4f56b8ffdcdd66edf64f7db9c5084827848f43390c203ee24 + md5: 2531c01b5d6066fb5283639d7a923779 + sha256: fa0ca87917aa449f7d7d6fb3941d0b01e0e9712342a9891af5540647f3398ece build: py311hfdba5f6_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 7711426 - timestamp: 1698869195412 + size: 7818264 + timestamp: 1700510455803 - platform: win-64 name: matplotlib-base - version: 3.8.1 + version: 3.8.2 category: main manager: conda dependencies: @@ -20061,18 +20115,18 @@ package: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.1-py311h6e989c2_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.8.2-py311h6e989c2_0.conda hash: - md5: d4e4b5785fdfd969303cdf55256378e0 - sha256: c153b558ff258c2ab2f654c7557f89e3804f7928ca2dfa8c77acfac6f0cab44d + md5: a836e9cbae513ebe9ef38f24a287606d + sha256: 9e6b89c45b8332323976fd83122470a7ce8a82b63904e4838f3110c9a5c402b7 build: py311h6e989c2_0 arch: x86_64 subdir: win-64 build_number: 0 license: PSF-2.0 license_family: PSF - size: 7828413 - timestamp: 1698869423233 + size: 7700145 + timestamp: 1700509958077 - platform: linux-64 name: matplotlib-inline version: 0.1.6 @@ -20483,56 +20537,56 @@ package: dependencies: - intel-openmp 2023.* - tbb 2021.* - url: https://conda.anaconda.org/conda-forge/win-64/mkl-2023.2.0-h6a75c08_50496.conda + url: https://conda.anaconda.org/conda-forge/win-64/mkl-2023.2.0-h6a75c08_50497.conda hash: - md5: 03da367d935ecf4d3e4005cf705d0e21 - sha256: 40dc6ac2aa071ca248223de7cdbdfdb216bc8632a17104b1507bcbf9276265d4 - build: h6a75c08_50496 + md5: 064cea9f45531e7b53584acf4bd8b044 + sha256: 46ec9e767279da219398b6e79c8fa95822b2ed3c8e02ab604615b7d1213a5d5a + build: h6a75c08_50497 arch: x86_64 subdir: win-64 - build_number: 50496 + build_number: 50497 license: LicenseRef-ProprietaryIntel license_family: Proprietary - size: 144749783 - timestamp: 1695995252418 + size: 144666110 + timestamp: 1698352013664 - platform: win-64 name: mkl-devel version: 2023.2.0 category: main manager: conda dependencies: - - mkl 2023.2.0 h6a75c08_50496 - - mkl-include 2023.2.0 h6a75c08_50496 - url: https://conda.anaconda.org/conda-forge/win-64/mkl-devel-2023.2.0-h57928b3_50496.conda + - mkl 2023.2.0 h6a75c08_50497 + - mkl-include 2023.2.0 h6a75c08_50497 + url: https://conda.anaconda.org/conda-forge/win-64/mkl-devel-2023.2.0-h57928b3_50497.conda hash: - md5: 381330681b4506191e1a71699ea9e6fc - sha256: fe0db5e29d42415a077a6f25084a0cd6925058a0fa3f074ae7acb9c6227a8d6b - build: h57928b3_50496 + md5: 0d52cfab24361c77268b54920c11903c + sha256: f74927afc015b7710b55b941da8d13cfa47898e532fe87f3c129448f1f3f4ede + build: h57928b3_50497 arch: x86_64 subdir: win-64 - build_number: 50496 + build_number: 50497 license: LicenseRef-ProprietaryIntel license_family: Proprietary - size: 5219790 - timestamp: 1695995725290 + size: 5130637 + timestamp: 1698352396807 - platform: win-64 name: mkl-include version: 2023.2.0 category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/win-64/mkl-include-2023.2.0-h6a75c08_50496.conda + url: https://conda.anaconda.org/conda-forge/win-64/mkl-include-2023.2.0-h6a75c08_50497.conda hash: - md5: 6d5b648b65d7d4fd9feb95be42c11011 - sha256: d7fd1f8340b23d530dbdf2c1f0dd516c98ec9e91eddb1b2bdf5773a51de079dc - build: h6a75c08_50496 + md5: 02fd1f15c56cc902aeaf3df3497cf266 + sha256: 110ac10cfa26f3b9e44dd4db82ab145a8202809f1cebd9e62a6698307c93901c + build: h6a75c08_50497 arch: x86_64 subdir: win-64 - build_number: 50496 + build_number: 50497 license: LicenseRef-ProprietaryIntel license_family: Proprietary - size: 690322 - timestamp: 1695994425589 + size: 688303 + timestamp: 1698351338951 - platform: linux-64 name: mock version: 5.1.0 @@ -21029,32 +21083,31 @@ package: timestamp: 1600387789153 - platform: linux-64 name: mypy - version: 1.7.0 + version: 1.7.1 category: main manager: conda dependencies: - libgcc-ng >=12 - mypy_extensions >=1.0.0 - psutil >=4.0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - - tomli >=1.1.0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - typing_extensions >=4.1.0 - url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.7.0-py310h2372a71_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.7.1-py311h459d7ec_0.conda hash: - md5: ae6a9aaa6528278cf589741c67fb88ed - sha256: 9414d8d19ac5b51c16f96284cb6a33d9e3b74368099eada8497f975f8f552549 - build: py310h2372a71_0 + md5: 8f9fd891c222781fc9df8210a2266a52 + sha256: ecfb60275988d7843a09e9700621c0f643ab016e8d47d1a7f08d3c49191fa645 + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 17121678 - timestamp: 1699638341500 + size: 17547859 + timestamp: 1700773831422 - platform: osx-64 name: mypy - version: 1.7.0 + version: 1.7.1 category: main manager: conda dependencies: @@ -21063,21 +21116,21 @@ package: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - typing_extensions >=4.1.0 - url: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.7.0-py311he705e18_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/mypy-1.7.1-py311he705e18_0.conda hash: - md5: 693b52d72447772c2d85e7016b8711aa - sha256: 1bb6dd753dcbf487ef0b82755379e6ca23cf45cde3786bfec99028dbaa8afcd8 + md5: d6ee705ffbc2eddc43221be852846ecb + sha256: dda57d4771350f816988ebf0ce43d6e215ff7ec67e3298b056edc9e36c40b5cd build: py311he705e18_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 11857181 - timestamp: 1699638473833 + size: 11914580 + timestamp: 1700773898403 - platform: osx-arm64 name: mypy - version: 1.7.0 + version: 1.7.1 category: main manager: conda dependencies: @@ -21087,21 +21140,21 @@ package: - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 - typing_extensions >=4.1.0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.7.0-py311h05b510d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.7.1-py311h05b510d_0.conda hash: - md5: 19960a9945b980ef34f30c1d90d28c93 - sha256: 6a77b884c89e0176f6ecf6965d2d737774cdbf208acd1b4310a37a2c4d660a05 + md5: 687fbf3fdc9e8f40ea0540d4224404b7 + sha256: 2eee3e790f43eb83246bb35875147d530e9b73dd59977ac76d1c1d466a7488f9 build: py311h05b510d_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 9642540 - timestamp: 1699638565018 + size: 9662715 + timestamp: 1700774048765 - platform: win-64 name: mypy - version: 1.7.0 + version: 1.7.1 category: main manager: conda dependencies: @@ -21113,18 +21166,18 @@ package: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/mypy-1.7.0-py311ha68e1ae_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/mypy-1.7.1-py311ha68e1ae_0.conda hash: - md5: c58cf58cc73b8e67bcdb84ab4e7a1d91 - sha256: 0f537dc06b0210760aa50cd685fcd138d1490c1f339fc2d92365ddf4f1aede9e + md5: 8b4c7d2048e4f54bb7d60b1821c197b9 + sha256: 2f23c536096431b2dfed592678f7f0dbd81614a9eab8864a7f5e2420cf6868c8 build: py311ha68e1ae_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 9820922 - timestamp: 1699638398847 + size: 9917025 + timestamp: 1700773775597 - platform: linux-64 name: mypy_extensions version: 1.0.0 @@ -21917,20 +21970,20 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.14-py310hcb5633a_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.14-py311h46250e7_1.conda hash: - md5: e398a4610031e135d289558bc55446d9 - sha256: 9b476f63a1442af428c756a68c5814f58a0ef2d924dc19d9f0cbc057d778f5df - build: py310hcb5633a_1 + md5: 8faffafe1f60438f96710edef4fdafe5 + sha256: 31e5270ba8ec992dedd02a36ba56d786729b8e372c171170c611d79a6e5c458d + build: py311h46250e7_1 arch: x86_64 subdir: linux-64 build_number: 1 license: MIT license_family: MIT - size: 623829 - timestamp: 1695423348872 + size: 623877 + timestamp: 1695423349623 - platform: osx-64 name: nh3 version: 0.2.14 @@ -22464,13 +22517,13 @@ package: - libgcc-ng >=12 - liblapack >=3.9.0,<4.0a0 - libstdcxx-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py310hb13e2d6_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py311h64a7726_0.conda hash: - md5: ac3b67e928cc71548efad9b522d42fef - sha256: d4671e365c2ed30bf8a376bdc65afcbeeae440ca2091c8712ff8f23678f64973 - build: py310hb13e2d6_0 + md5: bf16a9f625126e378302f08e7ed67517 + sha256: 0aab5cef67cc2a1cd584f6e9cc6f2065c7a28c142d7defcb8096e8f719d9b3bf + build: py311h64a7726_0 arch: x86_64 subdir: linux-64 build_number: 0 @@ -22478,8 +22531,8 @@ package: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD - size: 6893487 - timestamp: 1695291234099 + size: 8039946 + timestamp: 1694920380273 - platform: osx-64 name: numpy version: 1.26.0 @@ -23313,24 +23366,24 @@ package: dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - numpy >=1.22.4,<2.0a0 - - python >=3.10,<3.11.0a0 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 - python-dateutil >=2.8.1 - python-tzdata >=2022a - - python_abi 3.10.* *_cp310 + - python_abi 3.11.* *_cp311 - pytz >=2020.1 - url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.3-py310hcc13569_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.3-py311h320fe9a_0.conda hash: - md5: 30a39c1064e5efc578d83c2a5f7cd749 - sha256: bb2b3e4a3f3d40b87ac214b88393a7f1ee5b2cac41d249c580d184f7edb30653 - build: py310hcc13569_0 + md5: 3ea3486e16d559dfcb539070ed330a1e + sha256: d69759f8e5f3dcae2562e177cdfde5a45e4cd38db732301812aa558c1c80db57 + build: py311h320fe9a_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 12405541 - timestamp: 1699670625345 + size: 14913343 + timestamp: 1699670668363 - platform: osx-64 name: pandas version: 2.1.3 @@ -24457,20 +24510,20 @@ package: - libxcb >=1.15,<1.16.0a0 - libzlib >=1.2.13,<1.3.0a0 - openjpeg >=2.5.0,<3.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tk >=8.6.12,<8.7.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py310h29da1c1_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda hash: - md5: 8e93b1c69cddf89fd412178d3d418bae - sha256: 4c18593b1b90299e0f1f7a279ccce6dbe0aba694758ee039c0850e0119d3b3e8 - build: py310h29da1c1_1 + md5: 4d66ee2081a7cd444ff6f30d95873eef + sha256: 42f21344c2fb7ee614243a632e261580408b24003d83cf34548661c2973a368a + build: py311h8aef010_1 arch: x86_64 subdir: linux-64 build_number: 1 license: HPND - size: 46384048 - timestamp: 1695247436468 + size: 46908609 + timestamp: 1695247484014 - platform: osx-64 name: pillow version: 10.0.1 @@ -24884,16 +24937,16 @@ package: timestamp: 1694617398467 - platform: linux-64 name: platformdirs - version: 3.11.0 + version: 4.0.0 category: main manager: conda dependencies: - python >=3.7 - - typing-extensions >=4.6.3 - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda + - typing_extensions >=4.7.1 + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.0.0-pyhd8ed1ab_0.conda hash: - md5: 8f567c0a74aa44cf732f15773b4083b0 - sha256: b3d809ff5a18ee8514bba8bc05a23b4cdf1758090a18a2cf742af38aed405144 + md5: 6bb4ee32cd435deaeac72776c001e7ac + sha256: 67381d3f7cadca7df7699238e0dcce680ad20d7fd28804bab48611fecb084937 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -24901,20 +24954,20 @@ package: license: MIT license_family: MIT noarch: python - size: 19985 - timestamp: 1696272419779 + size: 19965 + timestamp: 1699715699938 - platform: osx-64 name: platformdirs - version: 3.11.0 + version: 4.0.0 category: main manager: conda dependencies: - python >=3.7 - - typing-extensions >=4.6.3 - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda + - typing_extensions >=4.7.1 + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.0.0-pyhd8ed1ab_0.conda hash: - md5: 8f567c0a74aa44cf732f15773b4083b0 - sha256: b3d809ff5a18ee8514bba8bc05a23b4cdf1758090a18a2cf742af38aed405144 + md5: 6bb4ee32cd435deaeac72776c001e7ac + sha256: 67381d3f7cadca7df7699238e0dcce680ad20d7fd28804bab48611fecb084937 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -24922,20 +24975,20 @@ package: license: MIT license_family: MIT noarch: python - size: 19985 - timestamp: 1696272419779 + size: 19965 + timestamp: 1699715699938 - platform: osx-arm64 name: platformdirs - version: 3.11.0 + version: 4.0.0 category: main manager: conda dependencies: - python >=3.7 - - typing-extensions >=4.6.3 - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda + - typing_extensions >=4.7.1 + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.0.0-pyhd8ed1ab_0.conda hash: - md5: 8f567c0a74aa44cf732f15773b4083b0 - sha256: b3d809ff5a18ee8514bba8bc05a23b4cdf1758090a18a2cf742af38aed405144 + md5: 6bb4ee32cd435deaeac72776c001e7ac + sha256: 67381d3f7cadca7df7699238e0dcce680ad20d7fd28804bab48611fecb084937 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -24943,20 +24996,20 @@ package: license: MIT license_family: MIT noarch: python - size: 19985 - timestamp: 1696272419779 + size: 19965 + timestamp: 1699715699938 - platform: win-64 name: platformdirs - version: 3.11.0 + version: 4.0.0 category: main manager: conda dependencies: - python >=3.7 - - typing-extensions >=4.6.3 - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda + - typing_extensions >=4.7.1 + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.0.0-pyhd8ed1ab_0.conda hash: - md5: 8f567c0a74aa44cf732f15773b4083b0 - sha256: b3d809ff5a18ee8514bba8bc05a23b4cdf1758090a18a2cf742af38aed405144 + md5: 6bb4ee32cd435deaeac72776c001e7ac + sha256: 67381d3f7cadca7df7699238e0dcce680ad20d7fd28804bab48611fecb084937 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -24964,8 +25017,8 @@ package: license: MIT license_family: MIT noarch: python - size: 19985 - timestamp: 1696272419779 + size: 19965 + timestamp: 1699715699938 - platform: linux-64 name: plotly version: 5.18.0 @@ -25931,84 +25984,84 @@ package: timestamp: 1697808796596 - platform: linux-64 name: prometheus_client - version: 0.18.0 + version: 0.19.0 category: main manager: conda dependencies: - python >=3.8 - url: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.18.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.19.0-pyhd8ed1ab_0.conda hash: - md5: 46f6be657443caffcc7201d51c07aadf - sha256: dca35462761fe9a06f348a0e6216a7a5934e3e29c33bc8e173fb344116568a95 - build: pyhd8ed1ab_1 + md5: 7baa10fa8073c371155cf451b71b848d + sha256: 1235a3dbb033f914163e0deaf22d244cb1c1b5d8829d0089e38c34079286acbe + build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 - build_number: 1 + build_number: 0 license: Apache-2.0 license_family: Apache noarch: python - size: 53871 - timestamp: 1699962321058 + size: 48463 + timestamp: 1700579462182 - platform: osx-64 name: prometheus_client - version: 0.18.0 + version: 0.19.0 category: main manager: conda dependencies: - python >=3.8 - url: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.18.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.19.0-pyhd8ed1ab_0.conda hash: - md5: 46f6be657443caffcc7201d51c07aadf - sha256: dca35462761fe9a06f348a0e6216a7a5934e3e29c33bc8e173fb344116568a95 - build: pyhd8ed1ab_1 + md5: 7baa10fa8073c371155cf451b71b848d + sha256: 1235a3dbb033f914163e0deaf22d244cb1c1b5d8829d0089e38c34079286acbe + build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 - build_number: 1 + build_number: 0 license: Apache-2.0 license_family: Apache noarch: python - size: 53871 - timestamp: 1699962321058 + size: 48463 + timestamp: 1700579462182 - platform: osx-arm64 name: prometheus_client - version: 0.18.0 + version: 0.19.0 category: main manager: conda dependencies: - python >=3.8 - url: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.18.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.19.0-pyhd8ed1ab_0.conda hash: - md5: 46f6be657443caffcc7201d51c07aadf - sha256: dca35462761fe9a06f348a0e6216a7a5934e3e29c33bc8e173fb344116568a95 - build: pyhd8ed1ab_1 + md5: 7baa10fa8073c371155cf451b71b848d + sha256: 1235a3dbb033f914163e0deaf22d244cb1c1b5d8829d0089e38c34079286acbe + build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 - build_number: 1 + build_number: 0 license: Apache-2.0 license_family: Apache noarch: python - size: 53871 - timestamp: 1699962321058 + size: 48463 + timestamp: 1700579462182 - platform: win-64 name: prometheus_client - version: 0.18.0 + version: 0.19.0 category: main manager: conda dependencies: - python >=3.8 - url: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.18.0-pyhd8ed1ab_1.conda + url: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.19.0-pyhd8ed1ab_0.conda hash: - md5: 46f6be657443caffcc7201d51c07aadf - sha256: dca35462761fe9a06f348a0e6216a7a5934e3e29c33bc8e173fb344116568a95 - build: pyhd8ed1ab_1 + md5: 7baa10fa8073c371155cf451b71b848d + sha256: 1235a3dbb033f914163e0deaf22d244cb1c1b5d8829d0089e38c34079286acbe + build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 - build_number: 1 + build_number: 0 license: Apache-2.0 license_family: Apache noarch: python - size: 53871 - timestamp: 1699962321058 + size: 48463 + timestamp: 1700579462182 - platform: linux-64 name: prompt-toolkit version: 3.0.41 @@ -26028,6 +26081,7 @@ package: constrains: - prompt_toolkit 3.0.41 license: BSD-3-Clause + license_family: BSD noarch: python size: 269969 timestamp: 1699963207861 @@ -26050,6 +26104,7 @@ package: constrains: - prompt_toolkit 3.0.41 license: BSD-3-Clause + license_family: BSD noarch: python size: 269969 timestamp: 1699963207861 @@ -26072,6 +26127,7 @@ package: constrains: - prompt_toolkit 3.0.41 license: BSD-3-Clause + license_family: BSD noarch: python size: 269969 timestamp: 1699963207861 @@ -26094,6 +26150,7 @@ package: constrains: - prompt_toolkit 3.0.41 license: BSD-3-Clause + license_family: BSD noarch: python size: 269969 timestamp: 1699963207861 @@ -26113,6 +26170,7 @@ package: subdir: linux-64 build_number: 0 license: BSD-3-Clause + license_family: BSD noarch: generic size: 6704 timestamp: 1699963217068 @@ -26132,6 +26190,7 @@ package: subdir: osx-64 build_number: 0 license: BSD-3-Clause + license_family: BSD noarch: generic size: 6704 timestamp: 1699963217068 @@ -26151,6 +26210,7 @@ package: subdir: osx-arm64 build_number: 0 license: BSD-3-Clause + license_family: BSD noarch: generic size: 6704 timestamp: 1699963217068 @@ -26170,6 +26230,7 @@ package: subdir: win-64 build_number: 0 license: BSD-3-Clause + license_family: BSD noarch: generic size: 6704 timestamp: 1699963217068 @@ -26180,20 +26241,20 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py310h2372a71_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py311h459d7ec_1.conda hash: - md5: cb25177acf28cc35cfa6c1ac1c679e22 - sha256: db8a99bc41c1b0405c8e9daa92b9d4e7711f9717aff7fd3feeba407ca2a91aa2 - build: py310h2372a71_1 + md5: 490d7fa8675afd1aa6f1b2332d156a45 + sha256: e92d2120fc4b98fe838b3d52d4907fae97808bdd504fb84aa33aea8c4be7bc61 + build: py311h459d7ec_1 arch: x86_64 subdir: linux-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 361313 - timestamp: 1695367285835 + size: 498698 + timestamp: 1695367306421 - platform: osx-64 name: psutil version: 5.9.5 @@ -26266,20 +26327,20 @@ package: dependencies: - libgcc-ng >=12 - libpq >=15.4,<16.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/psycopg2-2.9.7-py310h76c1b15_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/psycopg2-2.9.7-py311h68d4568_0.conda hash: - md5: 5095ef0aa40e5e443fe07add2ca86d03 - sha256: 219aa0d974fcadfe49f4b241c92390c0c8c568cf23f5241d353708da3798451b - build: py310h76c1b15_0 + md5: 624f0fd8a8a2d9def55842c99d771d63 + sha256: 3c6838186fa913ee627965dab7b72e81a4f39db2e3ae7aee2ea6e44208fa8908 + build: py311h68d4568_0 arch: x86_64 subdir: linux-64 build_number: 0 license: LGPL-3.0-or-later license_family: LGPL - size: 173388 - timestamp: 1694260310193 + size: 190078 + timestamp: 1694260316190 - platform: osx-64 name: psycopg2 version: 2.9.7 @@ -26606,110 +26667,111 @@ package: timestamp: 1642876055775 - platform: linux-64 name: pyarrow - version: 13.0.0 + version: 10.0.1 category: main manager: conda dependencies: - - libarrow 13.0.0 hecbb4c5_13_cpu + - gflags >=2.2.2,<2.3.0a0 + - libarrow 10.0.1 hecbb4c5_50_cpu - libgcc-ng >=12 - libstdcxx-ng >=12 - - numpy >=1.22.4,<2.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-13.0.0-py310hf9e7431_13_cpu.conda + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-10.0.1-py311hdf9aeb4_50_cpu.conda hash: - md5: 23de454506d5bfc068b62de2bb36dfb3 - sha256: 73eed77f6fb6e1214b51d5292690d95efae1fe9fcdc4150d9237a66d6151fb13 - build: py310hf9e7431_13_cpu + md5: bf109870d078c79d3b6faa0a3f10e600 + sha256: c3a63b1142d08d1c2f4bc3a52ab477d55b8605eef9d51a195f19dea3b12dd8be + build: py311hdf9aeb4_50_cpu arch: x86_64 subdir: linux-64 - build_number: 13 + build_number: 50 constrains: - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE - size: 4046058 - timestamp: 1698345048652 + size: 3429125 + timestamp: 1698344901620 - platform: osx-64 name: pyarrow - version: 13.0.0 + version: 10.0.1 category: main manager: conda dependencies: - - __osx >=10.9 - - libarrow 13.0.0 h5fe8ab2_13_cpu - - libcxx >=15.0.7 + - gflags >=2.2.2,<2.3.0a0 + - libarrow 10.0.1 h99c5134_50_cpu + - libcxx >=14.0.6 - numpy >=1.23.5,<2.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-13.0.0-py311h98a0319_13_cpu.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-10.0.1-py311h0d82e2d_50_cpu.conda hash: - md5: 80fdc679b1471045809a14e6f51a4665 - sha256: 9f04a92ed4aeb284ee1b4c93e0d44fa88bf2e3bcbe9aa7f491a504873f1568c0 - build: py311h98a0319_13_cpu + md5: ea933b6497a5ab73906dadacc6e355d3 + sha256: 2c7abdd6045e7daa63a3f5be921a953e7b67bb86b43b89f2dc812b35fc19ca98 + build: py311h0d82e2d_50_cpu arch: x86_64 subdir: osx-64 - build_number: 13 + build_number: 50 constrains: - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE - size: 3674860 - timestamp: 1698344431791 + size: 3080651 + timestamp: 1698345966492 - platform: osx-arm64 name: pyarrow - version: 13.0.0 + version: 10.0.1 category: main manager: conda dependencies: - - __osx >=10.9 - - libarrow 13.0.0 h87fad27_13_cpu - - libcxx >=15.0.7 + - gflags >=2.2.2,<2.3.0a0 + - libarrow 10.0.1 h8276777_50_cpu + - libcxx >=14.0.6 - numpy >=1.23.5,<2.0a0 - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-13.0.0-py311h637fcfe_13_cpu.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-10.0.1-py311h1e679ab_50_cpu.conda hash: - md5: 3b8606cf528e879b27d37c6b78c41412 - sha256: 2b94d9ae7d4bd8e8b7ec0d506e5ddddb7c9f70ed499b9992b71111bc118b56a9 - build: py311h637fcfe_13_cpu + md5: 4d4f81c5a82b192d16833de85489b0cd + sha256: 2c92bcd29ba43e0309d6948284280d7e15f01024bd14f9a17e56c79cb659f694 + build: py311h1e679ab_50_cpu arch: aarch64 subdir: osx-arm64 - build_number: 13 + build_number: 50 constrains: - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE - size: 3718551 - timestamp: 1698346891592 + size: 3000928 + timestamp: 1698344948625 - platform: win-64 name: pyarrow - version: 13.0.0 + version: 10.0.1 category: main manager: conda dependencies: - - libarrow 13.0.0 hc7845e2_13_cpu + - libarrow 10.0.1 hd2d01ff_50_cpu - numpy >=1.23.5,<2.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pyarrow-13.0.0-py311h6a6099b_13_cpu.conda + url: https://conda.anaconda.org/conda-forge/win-64/pyarrow-10.0.1-py311h6a6099b_50_cpu.conda hash: - md5: a6f600d623d657a55257da6ca85d9109 - sha256: 2f5b736e772e0505a6c9c7da05490f3320f7307b639a855a04ed92f9c92940be - build: py311h6a6099b_13_cpu + md5: 260ba0f58ad9fd995ad0643aa6d72a78 + sha256: cb0db5dbfc6b472c6ed49ed49b1a0f0309ead75715ea1f380e46489b8203fc2c + build: py311h6a6099b_50_cpu arch: x86_64 subdir: win-64 - build_number: 13 + build_number: 50 constrains: - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE - size: 3036905 - timestamp: 1698345609438 + size: 2878472 + timestamp: 1698344639815 - platform: linux-64 name: pycparser version: '2.21' @@ -26792,18 +26854,18 @@ package: timestamp: 1636257201998 - platform: linux-64 name: pydantic - version: 2.5.0 + version: 2.5.2 category: main manager: conda dependencies: - annotated-types >=0.4.0 - - pydantic-core 2.14.1 + - pydantic-core 2.14.5 - python >=3.7 - typing-extensions >=4.6.1 - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.5.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.5.2-pyhd8ed1ab_0.conda hash: - md5: e0c41d8a5ecffc34d6b7f2b49687c665 - sha256: d513a539cb199ff35269d633844bed03138a2451d536fc7a9044f05c5a6c3e66 + md5: 3f908ebfccbfd09946961862d26bb9af + sha256: e3baa6424af931d8d7c5a0554b24d85faf3471df8036181d598065beed3096de build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -26811,22 +26873,22 @@ package: license: MIT license_family: MIT noarch: python - size: 283055 - timestamp: 1699947684640 + size: 262032 + timestamp: 1700669351342 - platform: osx-64 name: pydantic - version: 2.5.0 + version: 2.5.2 category: main manager: conda dependencies: - annotated-types >=0.4.0 - - pydantic-core 2.14.1 + - pydantic-core 2.14.5 - python >=3.7 - typing-extensions >=4.6.1 - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.5.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.5.2-pyhd8ed1ab_0.conda hash: - md5: e0c41d8a5ecffc34d6b7f2b49687c665 - sha256: d513a539cb199ff35269d633844bed03138a2451d536fc7a9044f05c5a6c3e66 + md5: 3f908ebfccbfd09946961862d26bb9af + sha256: e3baa6424af931d8d7c5a0554b24d85faf3471df8036181d598065beed3096de build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -26834,22 +26896,22 @@ package: license: MIT license_family: MIT noarch: python - size: 283055 - timestamp: 1699947684640 + size: 262032 + timestamp: 1700669351342 - platform: osx-arm64 name: pydantic - version: 2.5.0 + version: 2.5.2 category: main manager: conda dependencies: - annotated-types >=0.4.0 - - pydantic-core 2.14.1 + - pydantic-core 2.14.5 - python >=3.7 - typing-extensions >=4.6.1 - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.5.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.5.2-pyhd8ed1ab_0.conda hash: - md5: e0c41d8a5ecffc34d6b7f2b49687c665 - sha256: d513a539cb199ff35269d633844bed03138a2451d536fc7a9044f05c5a6c3e66 + md5: 3f908ebfccbfd09946961862d26bb9af + sha256: e3baa6424af931d8d7c5a0554b24d85faf3471df8036181d598065beed3096de build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -26857,22 +26919,22 @@ package: license: MIT license_family: MIT noarch: python - size: 283055 - timestamp: 1699947684640 + size: 262032 + timestamp: 1700669351342 - platform: win-64 name: pydantic - version: 2.5.0 + version: 2.5.2 category: main manager: conda dependencies: - annotated-types >=0.4.0 - - pydantic-core 2.14.1 + - pydantic-core 2.14.5 - python >=3.7 - typing-extensions >=4.6.1 - url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.5.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.5.2-pyhd8ed1ab_0.conda hash: - md5: e0c41d8a5ecffc34d6b7f2b49687c665 - sha256: d513a539cb199ff35269d633844bed03138a2451d536fc7a9044f05c5a6c3e66 + md5: 3f908ebfccbfd09946961862d26bb9af + sha256: e3baa6424af931d8d7c5a0554b24d85faf3471df8036181d598065beed3096de build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -26880,54 +26942,54 @@ package: license: MIT license_family: MIT noarch: python - size: 283055 - timestamp: 1699947684640 + size: 262032 + timestamp: 1700669351342 - platform: linux-64 name: pydantic-core - version: 2.14.1 + version: 2.14.5 category: main manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - typing-extensions >=4.6.0 - url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.14.1-py310hcb5633a_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.14.5-py311h46250e7_0.conda hash: - md5: bd530722ab8e10ddad93ea97a74d1c63 - sha256: 7114da2e4794d416b6ed4081cf4e1a9218b2b959b0ebb4764543f960f2cede51 - build: py310hcb5633a_0 + md5: 9b2d1233d958079649cc8f91d814e04f + sha256: c546a042316c34bf6b9c5e16da4e6993f6712554c0ac5ee3f49260260789c38f + build: py311h46250e7_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 1600914 - timestamp: 1699546494175 + size: 1604548 + timestamp: 1700664420127 - platform: osx-64 name: pydantic-core - version: 2.14.1 + version: 2.14.5 category: main manager: conda dependencies: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - typing-extensions >=4.6.0 - url: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.14.1-py311h5e0f0e4_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.14.5-py311h5e0f0e4_0.conda hash: - md5: f494a2f4b570e682e4af2aa8324e808a - sha256: 0988c3ae1e2404283a5b01da964c8d4507bcab7492802148663bad766572c636 + md5: 915ef17e91fbe6c5a2d2ea502e112ae7 + sha256: d79248cd5511c1153981b7fdcad4ef72a17985e604488a3ad1f242e2cd1e2622 build: py311h5e0f0e4_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 1515087 - timestamp: 1699546758733 + size: 1516178 + timestamp: 1700664886915 - platform: osx-arm64 name: pydantic-core - version: 2.14.1 + version: 2.14.5 category: main manager: conda dependencies: @@ -26935,21 +26997,21 @@ package: - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 - typing-extensions >=4.6.0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.14.1-py311h94f323b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.14.5-py311h94f323b_0.conda hash: - md5: 925ca1f0cededad5a7fe084b22b3592c - sha256: b57136c6d71ac2fea03ec41a759d8cb98bf5ad3b61841f1227c9d11464417f04 + md5: 781b4ba31a7ef7f3e2b4f2726dd99a81 + sha256: cac857e276d469d69af66b7f1972a8329f7843237d1b666ef7e2918cf9f83944 build: py311h94f323b_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 1419044 - timestamp: 1699546854139 + size: 1420014 + timestamp: 1700664768614 - platform: win-64 name: pydantic-core - version: 2.14.1 + version: 2.14.5 category: main manager: conda dependencies: @@ -26959,29 +27021,29 @@ package: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.14.1-py311hc37eb10_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.14.5-py311hc37eb10_0.conda hash: - md5: a0e46f0ad208a9dac0621049b6d2b3e7 - sha256: 79fb1955b2c070159cff8a96408edfc165e903e951f2441fc8d4f7e259bb3f4f + md5: cf6cd58b77ebffaa1af9f4b56aec0dec + sha256: c88e9d27c31722158d630a9458182f02651161a341eb4712a9959325e849211a build: py311hc37eb10_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 1589951 - timestamp: 1699547320559 + size: 1588183 + timestamp: 1700665255417 - platform: linux-64 name: pygments - version: 2.16.1 + version: 2.17.2 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.16.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda hash: - md5: 40e5cb18165466773619e5c963f00a7b - sha256: 3f0f0fadc6084960ec8cc00a32a03529c562ffea3b527eb73b1653183daad389 + md5: 140a7f159396547e9799aa98f9f0742e + sha256: af5f8867450dc292f98ea387d4d8945fc574284677c8f60eaa9846ede7387257 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -26989,19 +27051,19 @@ package: license: BSD-2-Clause license_family: BSD noarch: python - size: 853439 - timestamp: 1691408777841 + size: 860425 + timestamp: 1700608076927 - platform: osx-64 name: pygments - version: 2.16.1 + version: 2.17.2 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.16.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda hash: - md5: 40e5cb18165466773619e5c963f00a7b - sha256: 3f0f0fadc6084960ec8cc00a32a03529c562ffea3b527eb73b1653183daad389 + md5: 140a7f159396547e9799aa98f9f0742e + sha256: af5f8867450dc292f98ea387d4d8945fc574284677c8f60eaa9846ede7387257 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -27009,19 +27071,19 @@ package: license: BSD-2-Clause license_family: BSD noarch: python - size: 853439 - timestamp: 1691408777841 + size: 860425 + timestamp: 1700608076927 - platform: osx-arm64 name: pygments - version: 2.16.1 + version: 2.17.2 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.16.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda hash: - md5: 40e5cb18165466773619e5c963f00a7b - sha256: 3f0f0fadc6084960ec8cc00a32a03529c562ffea3b527eb73b1653183daad389 + md5: 140a7f159396547e9799aa98f9f0742e + sha256: af5f8867450dc292f98ea387d4d8945fc574284677c8f60eaa9846ede7387257 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -27029,19 +27091,19 @@ package: license: BSD-2-Clause license_family: BSD noarch: python - size: 853439 - timestamp: 1691408777841 + size: 860425 + timestamp: 1700608076927 - platform: win-64 name: pygments - version: 2.16.1 + version: 2.17.2 category: main manager: conda dependencies: - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.16.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda hash: - md5: 40e5cb18165466773619e5c963f00a7b - sha256: 3f0f0fadc6084960ec8cc00a32a03529c562ffea3b527eb73b1653183daad389 + md5: 140a7f159396547e9799aa98f9f0742e + sha256: af5f8867450dc292f98ea387d4d8945fc574284677c8f60eaa9846ede7387257 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -27049,8 +27111,8 @@ package: license: BSD-2-Clause license_family: BSD noarch: python - size: 853439 - timestamp: 1691408777841 + size: 860425 + timestamp: 1700608076927 - platform: osx-64 name: pyobjc-core version: '10.0' @@ -27151,22 +27213,22 @@ package: - libgcc-ng >=12 - libgdal >=3.7.2,<3.8.0a0 - libstdcxx-ng >=12 - - numpy >=1.22.4,<2.0a0 + - numpy >=1.23.5,<2.0a0 - packaging - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.7.2-py310h7631d76_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.7.2-py311hbac4ec9_0.conda hash: - md5: 8ed47e443a58d60dfcac1efb74c12f81 - sha256: 1e127a9d1814caa9003bd9cde5bc3b8420ff1c9b368058a73212d000b11a18b8 - build: py310h7631d76_0 + md5: 32ece393a98d3c626b4df46b33f7e6ec + sha256: 52508f64db7cdd9fc25cfcb754d1297bfeef1440894dc2d78b5e8963315a733d + build: py311hbac4ec9_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 637580 - timestamp: 1698734487242 + size: 664732 + timestamp: 1698734484198 - platform: osx-64 name: pyogrio version: 0.7.2 @@ -27336,20 +27398,20 @@ package: - certifi - libgcc-ng >=12 - proj >=9.3.0,<9.3.1.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310h32c33b7_4.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_4.conda hash: - md5: 124211262afed349430d9a3de6b51e8f - sha256: 63a24f16449b14b67d3802f136654fc72824d2ff93a0ff786b80e0ddc34c70ef - build: py310h32c33b7_4 + md5: 75d504c6787edc377ebdba087a26a61b + sha256: 4eb94c421b5c635b770e5fbd2774cf1dd4570ad69baf1c248f978943df352896 + build: py311h1facc83_4 arch: x86_64 subdir: linux-64 build_number: 4 license: MIT license_family: MIT - size: 526744 - timestamp: 1699268314889 + size: 551801 + timestamp: 1699268320734 - platform: osx-64 name: pyproj version: 3.6.1 @@ -27428,23 +27490,23 @@ package: dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - pyqt5-sip 12.12.2 py310hc6cd4ac_5 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - pyqt5-sip 12.12.2 py311hb755f60_5 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - qt-main >=5.15.8,<5.16.0a0 - sip >=6.7.11,<6.8.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py310h04931ad_5.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.9-py311hf0fb5b6_5.conda hash: - md5: f4fe7a6e3d7c78c9de048ea9dda21690 - sha256: 92fe1c9eda6be7879ba798066016c1065047cc13d730105f5109835cbfeae8f1 - build: py310h04931ad_5 + md5: ec7e45bc76d9d0b69a74a2075932b8e8 + sha256: 74fcdb8772c7eaf654b32922f77d9a8a1350b3446111c69a32ba4d15be74905a + build: py311hf0fb5b6_5 arch: x86_64 subdir: linux-64 build_number: 5 license: GPL-3.0-only license_family: GPL - size: 5282574 - timestamp: 1695420653225 + size: 5315719 + timestamp: 1695420475603 - platform: osx-64 name: pyqt version: 5.15.9 @@ -27614,22 +27676,22 @@ package: - libgcc-ng >=12 - libstdcxx-ng >=12 - packaging - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - sip - toml - url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py310hc6cd4ac_5.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.12.2-py311hb755f60_5.conda hash: - md5: ef5333594a958b25912002886b82b253 - sha256: a6aec078683ed3cf1650b7c47e3f0fe185015d54ea37fe76b9f31f05e1fd087d - build: py310hc6cd4ac_5 + md5: e4d262cc3600e70b505a6761d29f6207 + sha256: cf6936273d92e5213b085bfd9ce1a37defb46b317b6ee991f2712bf4a25b8456 + build: py311hb755f60_5 arch: x86_64 subdir: linux-64 build_number: 5 license: GPL-3.0-only license_family: GPL - size: 84579 - timestamp: 1695418069976 + size: 85162 + timestamp: 1695418076285 - platform: osx-64 name: pyqt5-sip version: 12.12.2 @@ -27715,23 +27777,23 @@ package: - libgcc-ng >=12 - libstdcxx-ng >=12 - pyqt >=5.15.9,<5.16.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - qt-main >=5.15.8,<5.16.0a0 - qtwebkit - sip >=6.7.11,<6.8.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/pyqtwebkit-5.15.9-py310h37eb29e_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyqtwebkit-5.15.9-py311h4c6dc46_2.conda hash: - md5: 752b818cd7fd30676425682cd32ba513 - sha256: 520b66230f20074347bc0bb1c314538c13e7568568ba716042e93dcc369ca7ff - build: py310h37eb29e_2 + md5: c991f90dff9816159fefac95be32741e + sha256: 4f92cb54dd303eb4e940647b42eefc5ab00e0cb9d1873814b95fef78f1edd97d + build: py311h4c6dc46_2 arch: x86_64 subdir: linux-64 build_number: 2 license: LicenseRef-Commercial or GPL-3.0-only license_family: GPL - size: 155836 - timestamp: 1695649691521 + size: 155701 + timestamp: 1695649097615 - platform: osx-64 name: pyqtwebkit version: 5.15.9 @@ -28181,17 +28243,17 @@ package: timestamp: 1684965001294 - platform: linux-64 name: pytest-xdist - version: 3.4.0 + version: 3.5.0 category: main manager: conda dependencies: - execnet >=1.1 - pytest >=6.2.0 - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.4.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda hash: - md5: b8dc6f9db1b9670e564b68277a79ffeb - sha256: b835170885a0d2b4bfdc7bc5d09e5a175518f41b6ffa1a0ac891797cd94e3292 + md5: d5f595da2daead898ca958ac62f0307b + sha256: 8dc1d422e48e5a80eb72e26ed0135bb4843cf508d3b1cb006c3257c8639784d1 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -28201,21 +28263,21 @@ package: license: MIT license_family: MIT noarch: python - size: 36371 - timestamp: 1699728992127 + size: 36516 + timestamp: 1700593072448 - platform: osx-64 name: pytest-xdist - version: 3.4.0 + version: 3.5.0 category: main manager: conda dependencies: - execnet >=1.1 - pytest >=6.2.0 - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.4.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda hash: - md5: b8dc6f9db1b9670e564b68277a79ffeb - sha256: b835170885a0d2b4bfdc7bc5d09e5a175518f41b6ffa1a0ac891797cd94e3292 + md5: d5f595da2daead898ca958ac62f0307b + sha256: 8dc1d422e48e5a80eb72e26ed0135bb4843cf508d3b1cb006c3257c8639784d1 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -28225,21 +28287,21 @@ package: license: MIT license_family: MIT noarch: python - size: 36371 - timestamp: 1699728992127 + size: 36516 + timestamp: 1700593072448 - platform: osx-arm64 name: pytest-xdist - version: 3.4.0 + version: 3.5.0 category: main manager: conda dependencies: - execnet >=1.1 - pytest >=6.2.0 - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.4.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda hash: - md5: b8dc6f9db1b9670e564b68277a79ffeb - sha256: b835170885a0d2b4bfdc7bc5d09e5a175518f41b6ffa1a0ac891797cd94e3292 + md5: d5f595da2daead898ca958ac62f0307b + sha256: 8dc1d422e48e5a80eb72e26ed0135bb4843cf508d3b1cb006c3257c8639784d1 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -28249,21 +28311,21 @@ package: license: MIT license_family: MIT noarch: python - size: 36371 - timestamp: 1699728992127 + size: 36516 + timestamp: 1700593072448 - platform: win-64 name: pytest-xdist - version: 3.4.0 + version: 3.5.0 category: main manager: conda dependencies: - execnet >=1.1 - pytest >=6.2.0 - python >=3.7 - url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.4.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.5.0-pyhd8ed1ab_0.conda hash: - md5: b8dc6f9db1b9670e564b68277a79ffeb - sha256: b835170885a0d2b4bfdc7bc5d09e5a175518f41b6ffa1a0ac891797cd94e3292 + md5: d5f595da2daead898ca958ac62f0307b + sha256: 8dc1d422e48e5a80eb72e26ed0135bb4843cf508d3b1cb006c3257c8639784d1 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -28273,41 +28335,42 @@ package: license: MIT license_family: MIT noarch: python - size: 36371 - timestamp: 1699728992127 + size: 36516 + timestamp: 1700593072448 - platform: linux-64 name: python - version: 3.10.13 + version: 3.11.6 category: main manager: conda dependencies: - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.5.0,<3.0a0 - libffi >=3.4,<4.0a0 - libgcc-ng >=12 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.43.2,<4.0a0 + - libnsl >=2.0.0,<2.1.0a0 + - libsqlite >=3.43.0,<4.0a0 - libuuid >=2.38.1,<3.0a0 - libzlib >=1.2.13,<1.3.0a0 - ncurses >=6.4,<7.0a0 - - openssl >=3.1.4,<4.0a0 + - openssl >=3.1.3,<4.0a0 - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - xz >=5.2.6,<6.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_0_cpython.conda + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.6-hab00c5b_0_cpython.conda hash: - md5: f3a8c32aa764c3e7188b4b810fc9d6ce - sha256: a53410f459f314537b379982717b1c5911efc2f0cc26d63c4d6f831bcb31c964 - build: hd12c33a_0_cpython + md5: b0dfbe2fcbfdb097d321bfd50ecddab1 + sha256: 84f13bd70cff5dcdaee19263b2d4291d5793856a718efc1b63a9cfa9eb6e2ca1 + build: hab00c5b_0_cpython arch: x86_64 subdir: linux-64 build_number: 0 constrains: - - python_abi 3.10.* *_cp310 + - python_abi 3.11.* *_cp311 license: Python-2.0 - size: 25476977 - timestamp: 1698344640413 + size: 30720625 + timestamp: 1696331287478 - platform: osx-64 name: python version: 3.11.6 @@ -28485,15 +28548,15 @@ package: timestamp: 1626286448716 - platform: linux-64 name: python-fastjsonschema - version: 2.18.1 + version: 2.19.0 category: main manager: conda dependencies: - python >=3.3 - url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.18.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.0-pyhd8ed1ab_0.conda hash: - md5: 305141cff54af2f90e089d868fffce28 - sha256: 3fb1af1ac7525072c46e111bc4e96ddf971f792ab049ca3aa25dbebbaffb6f7d + md5: e4dbdb3585c0266b4710467fe7b75cf4 + sha256: fdfe3f387c5ebde803605e1e90871c424519d2bfe2eb3bf9caad1c5a07f4c462 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -28501,19 +28564,19 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 226030 - timestamp: 1696171963080 + size: 225881 + timestamp: 1700055660215 - platform: osx-64 name: python-fastjsonschema - version: 2.18.1 + version: 2.19.0 category: main manager: conda dependencies: - python >=3.3 - url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.18.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.0-pyhd8ed1ab_0.conda hash: - md5: 305141cff54af2f90e089d868fffce28 - sha256: 3fb1af1ac7525072c46e111bc4e96ddf971f792ab049ca3aa25dbebbaffb6f7d + md5: e4dbdb3585c0266b4710467fe7b75cf4 + sha256: fdfe3f387c5ebde803605e1e90871c424519d2bfe2eb3bf9caad1c5a07f4c462 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -28521,19 +28584,19 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 226030 - timestamp: 1696171963080 + size: 225881 + timestamp: 1700055660215 - platform: osx-arm64 name: python-fastjsonschema - version: 2.18.1 + version: 2.19.0 category: main manager: conda dependencies: - python >=3.3 - url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.18.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.0-pyhd8ed1ab_0.conda hash: - md5: 305141cff54af2f90e089d868fffce28 - sha256: 3fb1af1ac7525072c46e111bc4e96ddf971f792ab049ca3aa25dbebbaffb6f7d + md5: e4dbdb3585c0266b4710467fe7b75cf4 + sha256: fdfe3f387c5ebde803605e1e90871c424519d2bfe2eb3bf9caad1c5a07f4c462 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -28541,19 +28604,19 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 226030 - timestamp: 1696171963080 + size: 225881 + timestamp: 1700055660215 - platform: win-64 name: python-fastjsonschema - version: 2.18.1 + version: 2.19.0 category: main manager: conda dependencies: - python >=3.3 - url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.18.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.19.0-pyhd8ed1ab_0.conda hash: - md5: 305141cff54af2f90e089d868fffce28 - sha256: 3fb1af1ac7525072c46e111bc4e96ddf971f792ab049ca3aa25dbebbaffb6f7d + md5: e4dbdb3585c0266b4710467fe7b75cf4 + sha256: fdfe3f387c5ebde803605e1e90871c424519d2bfe2eb3bf9caad1c5a07f4c462 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -28561,8 +28624,8 @@ package: license: BSD-3-Clause license_family: BSD noarch: python - size: 226030 - timestamp: 1696171963080 + size: 225881 + timestamp: 1700055660215 - platform: linux-64 name: python-json-logger version: 2.0.7 @@ -28725,24 +28788,24 @@ package: timestamp: 1680081272948 - platform: linux-64 name: python_abi - version: '3.10' + version: '3.11' category: main manager: conda dependencies: [] - url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda hash: - md5: 26322ec5d7712c3ded99dd656142b8ce - sha256: 456bec815bfc2b364763084d08b412fdc4c17eb9ccc66a36cb775fa7ac3cbaec - build: 4_cp310 + md5: d786502c97404c94d7d58d258a445a65 + sha256: 0be3ac1bf852d64f553220c7e6457e9c047dfb7412da9d22fbaa67e60858b3cf + build: 4_cp311 arch: x86_64 subdir: linux-64 build_number: 4 constrains: - - python 3.10.* *_cpython + - python 3.11.* *_cpython license: BSD-3-Clause license_family: BSD - size: 6398 - timestamp: 1695147363189 + size: 6385 + timestamp: 1695147338551 - platform: osx-64 name: python_abi version: '3.11' @@ -28957,21 +29020,21 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - yaml >=0.2.5,<0.3.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda hash: - md5: bb010e368de4940771368bc3dc4c63e7 - sha256: aa78ccddb0a75fa722f0f0eb3537c73ee1219c9dd46cea99d6b9eebfdd780f3d - build: py310h2372a71_1 + md5: 52719a74ad130de8fb5d047dc91f247a + sha256: 28729ef1ffa7f6f9dfd54345a47c7faac5d34296d66a2b9891fb147f4efe1348 + build: py311h459d7ec_1 arch: x86_64 subdir: linux-64 build_number: 1 license: MIT license_family: MIT - size: 170627 - timestamp: 1695373587159 + size: 200626 + timestamp: 1695373818537 - platform: osx-64 name: pyyaml version: 6.0.1 @@ -29048,20 +29111,20 @@ package: - libgcc-ng >=12 - libsodium >=1.0.18,<1.0.19.0a0 - libstdcxx-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - zeromq >=4.3.5,<4.4.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.1-py310h795f18f_2.conda + url: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.1-py311h34ded2d_2.conda hash: - md5: 6391ac95effeebc612023b9507b558b3 - sha256: 68fa979d6e92ddef0a93d22a4e902383b89db7ca77aab0682272bdeb4b14881a - build: py310h795f18f_2 + md5: ea365280db99687905b4d76cf6a3568c + sha256: a5ed6592f32b0caf3883a2f863e8a6258845310d4eebeab2eaf1c5abed04d6b8 + build: py311h34ded2d_2 arch: x86_64 subdir: linux-64 build_number: 2 license: BSD-3-Clause AND LGPL-3.0-or-later - size: 456635 - timestamp: 1698062566269 + size: 538751 + timestamp: 1698062661477 - platform: osx-64 name: pyzmq version: 25.1.1 @@ -29253,9 +29316,9 @@ package: - pyqt >=5.15.9,<5.16.0a0 - pyqt5-sip - pyqtwebkit - - python >=3.10,<3.11.0a0 + - python >=3.11,<3.12.0a0 - python-dateutil - - python_abi 3.10.* *_cp310 + - python_abi 3.11.* *_cp311 - pytz - pyyaml - qca @@ -29270,18 +29333,18 @@ package: - six - sqlite - yaml - url: https://conda.anaconda.org/conda-forge/linux-64/qgis-3.28.12-py310h831c700_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/qgis-3.28.12-py311hfe10d84_0.conda hash: - md5: 346e875bee84eac581bf437d7fb80232 - sha256: 8cde23c1ee530cb136054557e07592091ff5488c0cee6dee4ebfb60524989e1c - build: py310h831c700_0 + md5: c388601ea6bec2e79aa92eba1ee909e3 + sha256: 7a58955bc60e8bb87d7adbb2328c165a13244cf9aaad95c0cdd6e24588951d6f + build: py311hfe10d84_0 arch: x86_64 subdir: linux-64 build_number: 0 license: GPL-2.0-only license_family: GPL - size: 89017740 - timestamp: 1699864547027 + size: 89102542 + timestamp: 1699862857799 - platform: osx-64 name: qgis version: 3.28.12 @@ -29501,6 +29564,160 @@ package: license_family: GPL size: 69716519 timestamp: 1699865367134 +- platform: linux-64 + name: qgis-plugin-manager + version: 1.6.1 + category: main + manager: conda + dependencies: + - python >=3.7 + url: https://conda.anaconda.org/conda-forge/noarch/qgis-plugin-manager-1.6.1-pyhd8ed1ab_0.conda + hash: + md5: 3039cc77e9dd82d527de5d77933a5d76 + sha256: 9df61faa73fb66315430af866fe90076fb363893ae6fe31d4105e36072b74a0a + build: pyhd8ed1ab_0 + arch: x86_64 + subdir: linux-64 + build_number: 0 + license: GPL-3.0-only + license_family: GPL + noarch: python + size: 44219 + timestamp: 1694708722178 +- platform: osx-64 + name: qgis-plugin-manager + version: 1.6.1 + category: main + manager: conda + dependencies: + - python >=3.7 + url: https://conda.anaconda.org/conda-forge/noarch/qgis-plugin-manager-1.6.1-pyhd8ed1ab_0.conda + hash: + md5: 3039cc77e9dd82d527de5d77933a5d76 + sha256: 9df61faa73fb66315430af866fe90076fb363893ae6fe31d4105e36072b74a0a + build: pyhd8ed1ab_0 + arch: x86_64 + subdir: osx-64 + build_number: 0 + license: GPL-3.0-only + license_family: GPL + noarch: python + size: 44219 + timestamp: 1694708722178 +- platform: osx-arm64 + name: qgis-plugin-manager + version: 1.6.1 + category: main + manager: conda + dependencies: + - python >=3.7 + url: https://conda.anaconda.org/conda-forge/noarch/qgis-plugin-manager-1.6.1-pyhd8ed1ab_0.conda + hash: + md5: 3039cc77e9dd82d527de5d77933a5d76 + sha256: 9df61faa73fb66315430af866fe90076fb363893ae6fe31d4105e36072b74a0a + build: pyhd8ed1ab_0 + arch: aarch64 + subdir: osx-arm64 + build_number: 0 + license: GPL-3.0-only + license_family: GPL + noarch: python + size: 44219 + timestamp: 1694708722178 +- platform: win-64 + name: qgis-plugin-manager + version: 1.6.1 + category: main + manager: conda + dependencies: + - python >=3.7 + url: https://conda.anaconda.org/conda-forge/noarch/qgis-plugin-manager-1.6.1-pyhd8ed1ab_0.conda + hash: + md5: 3039cc77e9dd82d527de5d77933a5d76 + sha256: 9df61faa73fb66315430af866fe90076fb363893ae6fe31d4105e36072b74a0a + build: pyhd8ed1ab_0 + arch: x86_64 + subdir: win-64 + build_number: 0 + license: GPL-3.0-only + license_family: GPL + noarch: python + size: 44219 + timestamp: 1694708722178 +- platform: linux-64 + name: qhull + version: '2020.2' + category: main + manager: conda + dependencies: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + url: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h4bd325d_2.tar.bz2 + hash: + md5: 5acb8407fefa1c1929c11c167237e776 + sha256: e1d6e4e74486ce4844c4bbdc7198bb4d8191b70881f6415d1f4b5fd8d98f18d7 + build: h4bd325d_2 + arch: x86_64 + subdir: linux-64 + build_number: 2 + license: Qhull + size: 1971736 + timestamp: 1631546549823 +- platform: osx-64 + name: qhull + version: '2020.2' + category: main + manager: conda + dependencies: + - libcxx >=11.1.0 + url: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h940c156_2.tar.bz2 + hash: + md5: 031bd4afafd89fff7bef4fb6c9f49058 + sha256: a1dff011b3f314ee417a7bd626eecbc44d536b20e51884d378cfc89cc8e90a45 + build: h940c156_2 + arch: x86_64 + subdir: osx-64 + build_number: 2 + license: Qhull + size: 1913462 + timestamp: 1631546922205 +- platform: osx-arm64 + name: qhull + version: '2020.2' + category: main + manager: conda + dependencies: + - libcxx >=11.1.0 + url: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-hc021e02_2.tar.bz2 + hash: + md5: 3a085cac271088b14b68c34d50576fe4 + sha256: dc423d80d1e36c0250a796f578ac1d090b76b1a5ba9de7a2a8c90388d284224e + build: hc021e02_2 + arch: aarch64 + subdir: osx-arm64 + build_number: 2 + license: Qhull + size: 1819204 + timestamp: 1631546794569 +- platform: win-64 + name: qhull + version: '2020.2' + category: main + manager: conda + dependencies: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + url: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-h70d2c02_2.tar.bz2 + hash: + md5: 110403ed058415fdd632298321da1fe0 + sha256: 5905c7c397181c845949f682cba0acb7b0f78124db9f5d8196f273a4ce7f655b + build: h70d2c02_2 + arch: x86_64 + subdir: win-64 + build_number: 2 + license: Qhull + size: 2342785 + timestamp: 1631547139388 - platform: linux-64 name: qjson version: 0.9.0 @@ -29590,22 +29807,22 @@ package: - libgcc-ng >=12 - libstdcxx-ng >=12 - pyqt >=5.15.9,<5.16.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - qt-main >=5.15.8,<5.16.0a0 - sip >=6.7.11,<6.8.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/qscintilla2-2.14.1-py310h37eb29e_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/qscintilla2-2.14.1-py311h4c6dc46_0.conda hash: - md5: a46094e78a8c5b8d27563cd4d6048bee - sha256: f02b69bf579a70ae8f5e202bbf0b32ca80b645bc08ed3d2b455e1f11b096be3e - build: py310h37eb29e_0 + md5: b79f1ea8ba7db0f42714110e91856d70 + sha256: 0ed3a91fcd25a49a59c7b9dd9edcaf75a293028355e48cb9a8a796973d3b3117 + build: py311h4c6dc46_0 arch: x86_64 subdir: linux-64 build_number: 0 license: GPL-3.0-or-later license_family: GPL - size: 1707302 - timestamp: 1695486405332 + size: 1710660 + timestamp: 1695486377934 - platform: osx-64 name: qscintilla2 version: 2.14.1 @@ -30143,7 +30360,7 @@ package: timestamp: 1691275738213 - platform: linux-64 name: quartodoc - version: 0.6.5 + version: 0.6.6 category: main manager: conda dependencies: @@ -30159,10 +30376,10 @@ package: - tabulate >=0.9.0 - typing-extensions >=4.4.0 - watchdog >=3.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.6.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.6.6-pyhd8ed1ab_0.conda hash: - md5: b6a31dcfbb44a796bf9a3d938af29cf8 - sha256: 07d2a6273f01e97744ca78f1bf52d5fa7a534fe81239d341cbe51d5d7c7f0f9d + md5: 1eaa52c457eaae45459a45ee3f3fde98 + sha256: f7fddcb986f515530e05eeb687b485a8c0565b6163da77f2ad4d117f82687052 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -30170,11 +30387,11 @@ package: license: MIT license_family: MIT noarch: python - size: 57836 - timestamp: 1697861921173 + size: 58091 + timestamp: 1700237790215 - platform: osx-64 name: quartodoc - version: 0.6.5 + version: 0.6.6 category: main manager: conda dependencies: @@ -30190,10 +30407,10 @@ package: - tabulate >=0.9.0 - typing-extensions >=4.4.0 - watchdog >=3.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.6.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.6.6-pyhd8ed1ab_0.conda hash: - md5: b6a31dcfbb44a796bf9a3d938af29cf8 - sha256: 07d2a6273f01e97744ca78f1bf52d5fa7a534fe81239d341cbe51d5d7c7f0f9d + md5: 1eaa52c457eaae45459a45ee3f3fde98 + sha256: f7fddcb986f515530e05eeb687b485a8c0565b6163da77f2ad4d117f82687052 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -30201,11 +30418,11 @@ package: license: MIT license_family: MIT noarch: python - size: 57836 - timestamp: 1697861921173 + size: 58091 + timestamp: 1700237790215 - platform: osx-arm64 name: quartodoc - version: 0.6.5 + version: 0.6.6 category: main manager: conda dependencies: @@ -30221,10 +30438,10 @@ package: - tabulate >=0.9.0 - typing-extensions >=4.4.0 - watchdog >=3.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.6.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.6.6-pyhd8ed1ab_0.conda hash: - md5: b6a31dcfbb44a796bf9a3d938af29cf8 - sha256: 07d2a6273f01e97744ca78f1bf52d5fa7a534fe81239d341cbe51d5d7c7f0f9d + md5: 1eaa52c457eaae45459a45ee3f3fde98 + sha256: f7fddcb986f515530e05eeb687b485a8c0565b6163da77f2ad4d117f82687052 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -30232,11 +30449,11 @@ package: license: MIT license_family: MIT noarch: python - size: 57836 - timestamp: 1697861921173 + size: 58091 + timestamp: 1700237790215 - platform: win-64 name: quartodoc - version: 0.6.5 + version: 0.6.6 category: main manager: conda dependencies: @@ -30252,10 +30469,10 @@ package: - tabulate >=0.9.0 - typing-extensions >=4.4.0 - watchdog >=3.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.6.5-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/quartodoc-0.6.6-pyhd8ed1ab_0.conda hash: - md5: b6a31dcfbb44a796bf9a3d938af29cf8 - sha256: 07d2a6273f01e97744ca78f1bf52d5fa7a534fe81239d341cbe51d5d7c7f0f9d + md5: 1eaa52c457eaae45459a45ee3f3fde98 + sha256: f7fddcb986f515530e05eeb687b485a8c0565b6163da77f2ad4d117f82687052 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -30263,8 +30480,8 @@ package: license: MIT license_family: MIT noarch: python - size: 57836 - timestamp: 1697861921173 + size: 58091 + timestamp: 1700237790215 - platform: linux-64 name: qwt version: 6.2.0 @@ -30598,17 +30815,17 @@ package: timestamp: 1694242843889 - platform: linux-64 name: referencing - version: 0.30.2 + version: 0.31.0 category: main manager: conda dependencies: - attrs >=22.2.0 - python >=3.8 - rpds-py >=0.7.0 - url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.31.0-pyhd8ed1ab_0.conda hash: - md5: a33161b983172ba6ef69d5fc850650cd - sha256: a6768fabc12f1eed87fec68c5c65439e908655cded1e458d70a164abbce13287 + md5: 38c2b9b24e9a58725a233f1fa32c23e9 + sha256: 108f27bf249a581acd0f1de0e1e6a4d814ab18943178c2d9a4df02f5c16d2102 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -30616,21 +30833,21 @@ package: license: MIT license_family: MIT noarch: python - size: 38061 - timestamp: 1691337409918 + size: 38223 + timestamp: 1700053390011 - platform: osx-64 name: referencing - version: 0.30.2 + version: 0.31.0 category: main manager: conda dependencies: - attrs >=22.2.0 - python >=3.8 - rpds-py >=0.7.0 - url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.31.0-pyhd8ed1ab_0.conda hash: - md5: a33161b983172ba6ef69d5fc850650cd - sha256: a6768fabc12f1eed87fec68c5c65439e908655cded1e458d70a164abbce13287 + md5: 38c2b9b24e9a58725a233f1fa32c23e9 + sha256: 108f27bf249a581acd0f1de0e1e6a4d814ab18943178c2d9a4df02f5c16d2102 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -30638,21 +30855,21 @@ package: license: MIT license_family: MIT noarch: python - size: 38061 - timestamp: 1691337409918 + size: 38223 + timestamp: 1700053390011 - platform: osx-arm64 name: referencing - version: 0.30.2 + version: 0.31.0 category: main manager: conda dependencies: - attrs >=22.2.0 - python >=3.8 - rpds-py >=0.7.0 - url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.31.0-pyhd8ed1ab_0.conda hash: - md5: a33161b983172ba6ef69d5fc850650cd - sha256: a6768fabc12f1eed87fec68c5c65439e908655cded1e458d70a164abbce13287 + md5: 38c2b9b24e9a58725a233f1fa32c23e9 + sha256: 108f27bf249a581acd0f1de0e1e6a4d814ab18943178c2d9a4df02f5c16d2102 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -30660,21 +30877,21 @@ package: license: MIT license_family: MIT noarch: python - size: 38061 - timestamp: 1691337409918 + size: 38223 + timestamp: 1700053390011 - platform: win-64 name: referencing - version: 0.30.2 + version: 0.31.0 category: main manager: conda dependencies: - attrs >=22.2.0 - python >=3.8 - rpds-py >=0.7.0 - url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.31.0-pyhd8ed1ab_0.conda hash: - md5: a33161b983172ba6ef69d5fc850650cd - sha256: a6768fabc12f1eed87fec68c5c65439e908655cded1e458d70a164abbce13287 + md5: 38c2b9b24e9a58725a233f1fa32c23e9 + sha256: 108f27bf249a581acd0f1de0e1e6a4d814ab18943178c2d9a4df02f5c16d2102 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -30682,8 +30899,8 @@ package: license: MIT license_family: MIT noarch: python - size: 38061 - timestamp: 1691337409918 + size: 38223 + timestamp: 1700053390011 - platform: linux-64 name: requests version: 2.31.0 @@ -31118,7 +31335,7 @@ package: timestamp: 1598024297745 - platform: linux-64 name: rich - version: 13.6.0 + version: 13.7.0 category: main manager: conda dependencies: @@ -31126,10 +31343,10 @@ package: - pygments >=2.13.0,<3.0.0 - python >=3.7.0 - typing_extensions >=4.0.0,<5.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/rich-13.6.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.0-pyhd8ed1ab_0.conda hash: - md5: 3ca4829f40710f581ca1d76bc907e99f - sha256: a2f8838a75ab8c2c1da0a813c7569d4f6efba0d2b5dc3a7659e2cb6d96bd8e19 + md5: d7a11d4f3024b2f4a6e0ae7377dd61e9 + sha256: 4bb25bf1f5664772b2c4c2e3878aa6e7dc2695f97e3da4ee8e47c51e179913bb build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -31137,11 +31354,11 @@ package: license: MIT license_family: MIT noarch: python - size: 183200 - timestamp: 1696096819794 + size: 184071 + timestamp: 1700160247583 - platform: osx-64 name: rich - version: 13.6.0 + version: 13.7.0 category: main manager: conda dependencies: @@ -31149,10 +31366,10 @@ package: - pygments >=2.13.0,<3.0.0 - python >=3.7.0 - typing_extensions >=4.0.0,<5.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/rich-13.6.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.0-pyhd8ed1ab_0.conda hash: - md5: 3ca4829f40710f581ca1d76bc907e99f - sha256: a2f8838a75ab8c2c1da0a813c7569d4f6efba0d2b5dc3a7659e2cb6d96bd8e19 + md5: d7a11d4f3024b2f4a6e0ae7377dd61e9 + sha256: 4bb25bf1f5664772b2c4c2e3878aa6e7dc2695f97e3da4ee8e47c51e179913bb build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -31160,11 +31377,11 @@ package: license: MIT license_family: MIT noarch: python - size: 183200 - timestamp: 1696096819794 + size: 184071 + timestamp: 1700160247583 - platform: osx-arm64 name: rich - version: 13.6.0 + version: 13.7.0 category: main manager: conda dependencies: @@ -31172,10 +31389,10 @@ package: - pygments >=2.13.0,<3.0.0 - python >=3.7.0 - typing_extensions >=4.0.0,<5.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/rich-13.6.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.0-pyhd8ed1ab_0.conda hash: - md5: 3ca4829f40710f581ca1d76bc907e99f - sha256: a2f8838a75ab8c2c1da0a813c7569d4f6efba0d2b5dc3a7659e2cb6d96bd8e19 + md5: d7a11d4f3024b2f4a6e0ae7377dd61e9 + sha256: 4bb25bf1f5664772b2c4c2e3878aa6e7dc2695f97e3da4ee8e47c51e179913bb build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -31183,11 +31400,11 @@ package: license: MIT license_family: MIT noarch: python - size: 183200 - timestamp: 1696096819794 + size: 184071 + timestamp: 1700160247583 - platform: win-64 name: rich - version: 13.6.0 + version: 13.7.0 category: main manager: conda dependencies: @@ -31195,10 +31412,10 @@ package: - pygments >=2.13.0,<3.0.0 - python >=3.7.0 - typing_extensions >=4.0.0,<5.0.0 - url: https://conda.anaconda.org/conda-forge/noarch/rich-13.6.0-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.0-pyhd8ed1ab_0.conda hash: - md5: 3ca4829f40710f581ca1d76bc907e99f - sha256: a2f8838a75ab8c2c1da0a813c7569d4f6efba0d2b5dc3a7659e2cb6d96bd8e19 + md5: d7a11d4f3024b2f4a6e0ae7377dd61e9 + sha256: 4bb25bf1f5664772b2c4c2e3878aa6e7dc2695f97e3da4ee8e47c51e179913bb build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -31206,70 +31423,73 @@ package: license: MIT license_family: MIT noarch: python - size: 183200 - timestamp: 1696096819794 + size: 184071 + timestamp: 1700160247583 - platform: linux-64 name: rpds-py - version: 0.13.0 + version: 0.13.1 category: main manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.13.0-py310hcb5633a_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.13.1-py311h46250e7_0.conda hash: - md5: d12491a3a4909d9c86b38d1312273fe0 - sha256: 532b0eac14d35ab05826df822fdc2407671f8c4adb4c6db03ad763db21ba7a6e - build: py310hcb5633a_0 + md5: b1924481122f7cb41cb001f5c96bf3f6 + sha256: 014f0393f43a67b43747b070a0619f84841d4c961597c30936d264abf899c39c + build: py311h46250e7_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT - size: 989249 - timestamp: 1700156621925 + license_family: MIT + size: 989447 + timestamp: 1700527185744 - platform: osx-64 name: rpds-py - version: 0.13.0 + version: 0.13.1 category: main manager: conda dependencies: - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.13.0-py311h5e0f0e4_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.13.1-py311h5e0f0e4_0.conda hash: - md5: 756946b85906adc3f1cc3b72705c311b - sha256: 7949d24240aa997507056baad89ea57f6d41d6704499fbd3739934ad906478d0 + md5: 96774911faf26609ab33aaa4246c1a06 + sha256: c591e79f21b60f5f37af31dd563f4515678f85b222b927138f94e8316cddf9e9 build: py311h5e0f0e4_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT - size: 285697 - timestamp: 1700156901456 + license_family: MIT + size: 285906 + timestamp: 1700527422020 - platform: osx-arm64 name: rpds-py - version: 0.13.0 + version: 0.13.1 category: main manager: conda dependencies: - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.13.0-py311h94f323b_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.13.1-py311h94f323b_0.conda hash: - md5: 22cfbdbd0c58fb9688194a98c568808e - sha256: e09733d7c15109e2cbfc3694e612629a45848648419b1f8987150dde64d6dbc0 + md5: c392d76b681cfa1ea2155233af59f947 + sha256: dd7ea62b2860ec1da543e017ad9163623befde9b16df0098b8a631c9188ad203 build: py311h94f323b_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT - size: 285067 - timestamp: 1700156943247 + license_family: MIT + size: 284899 + timestamp: 1700527486805 - platform: win-64 name: rpds-py - version: 0.13.0 + version: 0.13.1 category: main manager: conda dependencies: @@ -31278,17 +31498,18 @@ package: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.13.0-py311hc37eb10_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.13.1-py311hc37eb10_0.conda hash: - md5: e656c634deab3fd444afcb94e4dffa92 - sha256: b9fca209cc660d263d285a26bd903da41ad13486069ca3794df181a8897f17b9 + md5: 7bcae3d0801d12c9fc1be2ad18091803 + sha256: 7414d7bf9aea215f83d900f478d5efd548dede05dc33948fb477b7205599b9d9 build: py311hc37eb10_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT - size: 182240 - timestamp: 1700157870119 + license_family: MIT + size: 182046 + timestamp: 1700527924056 - platform: linux-64 name: rtree version: 1.1.0 @@ -31296,20 +31517,20 @@ package: manager: conda dependencies: - libspatialindex >=1.9.3,<1.9.4.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/rtree-1.1.0-py310hbdcdc62_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/rtree-1.1.0-py311h3bb2b0f_0.conda hash: - md5: 3611059800029512a633358108b4b911 - sha256: 0e79377c85d1349ec56f2fbbaac6dbe159d5701827efdafa8bd7ef1245d193da - build: py310hbdcdc62_0 + md5: 341bbb97186f23835d2d0456d96c5aba + sha256: 555d5b653283380ed397f4bbfa47ab7c62c2173ca06f9dadc5eb0b1bd99c95a7 + build: py311h3bb2b0f_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 49735 - timestamp: 1697503415458 + size: 62552 + timestamp: 1697503426564 - platform: osx-64 name: rtree version: 1.1.0 @@ -31381,22 +31602,22 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - ruamel.yaml.clib >=0.1.2 - setuptools - url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.5-py310h2372a71_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.5-py311h459d7ec_0.conda hash: - md5: 14fd49048b91c96a8fbf1113a8cc4f49 - sha256: b31d4eb844d1b667a9cddf63eafa2c303049ae559098f88e403c2ab5ebdd274e - build: py310h2372a71_0 + md5: 1101ec27377f8e45d8431a5f21d744f1 + sha256: c92e7bbb1d02286bcd3d3292208006f796ae45df82af3deec940339493415c04 + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 201830 - timestamp: 1699007525874 + size: 277088 + timestamp: 1699007549765 - platform: osx-64 name: ruamel.yaml version: 0.18.5 @@ -31474,20 +31695,20 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py310h2372a71_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h459d7ec_2.conda hash: - md5: 7c9da9721ee545d57ad759f020172853 - sha256: 00c76baad0a896f6f259093ec5328ac06cf422e6528745b28ee7e5057f54668f - build: py310h2372a71_2 + md5: 56bc3fe5180c0b23e05c7a5708153ac7 + sha256: cfd060725d39f136618547ecb8a593d82d460725fb447849815c26418c360c35 + build: py311h459d7ec_2 arch: x86_64 subdir: linux-64 build_number: 2 license: MIT license_family: MIT - size: 134875 - timestamp: 1695997043171 + size: 134322 + timestamp: 1695997009048 - platform: osx-64 name: ruamel.yaml.clib version: 0.2.7 @@ -31554,29 +31775,29 @@ package: timestamp: 1695997456870 - platform: linux-64 name: ruff - version: 0.1.5 + version: 0.1.6 category: main manager: conda dependencies: - libgcc-ng >=12 - libstdcxx-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.1.5-py310h3d77a66_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.1.6-py311h7145743_0.conda hash: - md5: 8669e32a32b406a1bbdabc43e5e3f0d2 - sha256: 9b8e9b293b1f0446e4d5b21cc9d62272c08a308a3c4b4f66498400157b124d5b - build: py310h3d77a66_0 + md5: aff8387edd5157da054c4b46cc38ffdc + sha256: dd8f7a3e2e7bc65fb6c2c32aae79ebc8623c6b87cbdbc8d2651be9ccd63e29d0 + build: py311h7145743_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT license_family: MIT - size: 4844367 - timestamp: 1699507779311 + size: 4864505 + timestamp: 1700256691736 - platform: osx-64 name: ruff - version: 0.1.5 + version: 0.1.6 category: main manager: conda dependencies: @@ -31584,21 +31805,21 @@ package: - libcxx >=16.0.6 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.1.5-py311hec6fdf1_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.1.6-py311hec6fdf1_0.conda hash: - md5: ff29608b152cbd76c422ad3f97004876 - sha256: ec15e79d5131afdd4592f7c1a878df0b7a8e022d5b644ab9fcb8d431915b4082 + md5: f0fa30260ad0ac05ef120b758c68d7ba + sha256: 2587bd6a04c6a1178b63438de97c091bcfca15f9bb5ea0d6a1f109a66187e33e build: py311hec6fdf1_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT license_family: MIT - size: 4589293 - timestamp: 1699508029856 + size: 4630555 + timestamp: 1700257550515 - platform: osx-arm64 name: ruff - version: 0.1.5 + version: 0.1.6 category: main manager: conda dependencies: @@ -31607,21 +31828,21 @@ package: - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.1.5-py311h6fc163c_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.1.6-py311h6fc163c_0.conda hash: - md5: 24659c389d8601c8076fb9401f3c59ed - sha256: a496efea6c4723c7a0e9ef11f38c8237c913ff3b6911085f1793885d102101a5 + md5: c9ff47502a21c1d072e8da209d9efba3 + sha256: 8bde8b2d66f34a242ea6759df3c21f3321d17a8cdb4d421ae489f97f42452920 build: py311h6fc163c_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT license_family: MIT - size: 4352507 - timestamp: 1699508211540 + size: 4384067 + timestamp: 1700257632511 - platform: win-64 name: ruff - version: 0.1.5 + version: 0.1.6 category: main manager: conda dependencies: @@ -31630,18 +31851,18 @@ package: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/ruff-0.1.5-py311hc14472d_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/ruff-0.1.6-py311hc14472d_0.conda hash: - md5: d76d37dff16a88d763749ecbbe01b53d - sha256: fe3d7b09bb772e45e4a4a31274f4feca0ec4b165560b49f64ac1ff7f143c35be + md5: 0cba574136a10193d13c0189de9e1743 + sha256: 8dc74a4ccde68cd0d8f53aaf990a4a55093c3bc53dafe43669dec5d5aa843a94 build: py311hc14472d_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT license_family: MIT - size: 4748020 - timestamp: 1699508487043 + size: 4787419 + timestamp: 1700257928941 - platform: linux-64 name: s2n version: 1.3.56 @@ -31672,23 +31893,23 @@ package: - joblib >=1.1.1 - libgcc-ng >=12 - libstdcxx-ng >=12 - - numpy >=1.22.4,<2.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - scipy - threadpoolctl >=2.0.0 - url: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.3.2-py310h1fdf081_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.3.2-py311hc009520_1.conda hash: - md5: 4b496f85644cce66ae83b7ab68e781a8 - sha256: 48a7396b62d82a064ec72e96020d89da6cd208e9bfb5d508693c4a9246502dd6 - build: py310h1fdf081_1 + md5: 6b92d3d0680eae9d1d9860a721f7fb51 + sha256: 638253cba17e44081674b2dd7bee2025c202e91b653182da511ca57de942689d + build: py311hc009520_1 arch: x86_64 subdir: linux-64 build_number: 1 license: BSD-3-Clause license_family: BSD - size: 8395896 - timestamp: 1698225291701 + size: 9575097 + timestamp: 1698225284583 - platform: osx-64 name: scikit-learn version: 1.3.2 @@ -31773,7 +31994,7 @@ package: timestamp: 1698225997015 - platform: linux-64 name: scipy - version: 1.11.3 + version: 1.11.4 category: main manager: conda dependencies: @@ -31784,31 +32005,31 @@ package: - libgfortran5 >=12.3.0 - liblapack >=3.9.0,<4.0a0 - libstdcxx-ng >=12 - - numpy >=1.22.4,<1.28 - - numpy >=1.22.4,<2.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py310hb13e2d6_1.conda + - numpy >=1.23.5,<1.28 + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.4-py311h64a7726_0.conda hash: - md5: 4260b359d8fbeab4f789a8b0f968079f - sha256: bb8cdaf0869979ef58b3c10491f235c0fabf0b091e591361d25a4ffd47d6aded - build: py310hb13e2d6_1 + md5: 9ac5334f1b5ed072d3dbc342503d7868 + sha256: 29b2fd4ce8ed591df89b6a1c4f598a414322f94ea1a973b366267d43ecf40ffd + build: py311h64a7726_0 arch: x86_64 subdir: linux-64 - build_number: 1 + build_number: 0 license: BSD-3-Clause - license_family: BSD - size: 14983190 - timestamp: 1696468679504 + size: 16045599 + timestamp: 1700813453003 - platform: osx-64 name: scipy - version: 1.11.3 + version: 1.11.4 category: main manager: conda dependencies: + - __osx >=10.9 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - - libcxx >=15.0.7 + - libcxx >=16.0.6 - libgfortran 5.* - libgfortran5 >=12.3.0 - libgfortran5 >=13.2.0 @@ -31817,27 +32038,27 @@ package: - numpy >=1.23.5,<2.0a0 - python >=3.11,<3.12.0a0 - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.3-py311h16c3c4d_1.conda + url: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.11.4-py311he0bea55_0.conda hash: - md5: 77164acef9bc09545bd3324a8f986be5 - sha256: 78270d60ea00482b4f64a4b2d5d4e432f48125f6b76780e2094c8363ad48b611 - build: py311h16c3c4d_1 + md5: baee74d27482a81394b088b3517e2143 + sha256: f174683a50833c463ec1cf23198970294f4e3a12f5df8f3997a4d4cee640bc08 + build: py311he0bea55_0 arch: x86_64 subdir: osx-64 - build_number: 1 + build_number: 0 license: BSD-3-Clause - license_family: BSD - size: 16243071 - timestamp: 1696469112175 + size: 15934429 + timestamp: 1700814198750 - platform: osx-arm64 name: scipy - version: 1.11.3 + version: 1.11.4 category: main manager: conda dependencies: + - __osx >=10.9 - libblas >=3.9.0,<4.0a0 - libcblas >=3.9.0,<4.0a0 - - libcxx >=15.0.7 + - libcxx >=16.0.6 - libgfortran 5.* - libgfortran5 >=12.3.0 - libgfortran5 >=13.2.0 @@ -31847,21 +32068,20 @@ package: - python >=3.11,<3.12.0a0 - python >=3.11,<3.12.0a0 *_cpython - python_abi 3.11.* *_cp311 - url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.3-py311h93d07a4_1.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.11.4-py311h2b215a9_0.conda hash: - md5: 1c687552b288a801a7851166f2494768 - sha256: 6347f47c02eef02afe1e5534c88269f73b2da28cdff8c826b210e529b8bd1f07 - build: py311h93d07a4_1 + md5: eeb78a4ed07acf5636a0cba7b16c8a89 + sha256: a76f172fc8e76c319b9d93c81829fcb3b498ee057e82117a744b37e751e66569 + build: py311h2b215a9_0 arch: aarch64 subdir: osx-arm64 - build_number: 1 + build_number: 0 license: BSD-3-Clause - license_family: BSD - size: 15110473 - timestamp: 1696469388055 + size: 14854215 + timestamp: 1700814446442 - platform: win-64 name: scipy - version: 1.11.3 + version: 1.11.4 category: main manager: conda dependencies: @@ -31875,18 +32095,17 @@ package: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.3-py311h0b4df5a_1.conda + url: https://conda.anaconda.org/conda-forge/win-64/scipy-1.11.4-py311h0b4df5a_0.conda hash: - md5: 67910f5db4ee7b8bbf39250c167d3a34 - sha256: 1fc5493e5c6706c3e1a925090478f1c8306f493602cb8a4d935de8aa361be36c - build: py311h0b4df5a_1 + md5: 7e367331519517cc9ba4635ceba0414c + sha256: a3ab79cf0c209b03b8cf95b9520d7a9afffaa9a803d9f33ede355ed98731239c + build: py311h0b4df5a_0 arch: x86_64 subdir: win-64 - build_number: 1 + build_number: 0 license: BSD-3-Clause - license_family: BSD - size: 14873188 - timestamp: 1696469599650 + size: 14921421 + timestamp: 1700815001090 - platform: linux-64 name: secretstorage version: 3.3.3 @@ -31896,20 +32115,20 @@ package: - cryptography - dbus - jeepney >=0.6 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py310hff52083_2.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py311h38be061_2.conda hash: - md5: 4ccc40bc490af727cfbf3e7f0289d9bd - sha256: a2b7f56b07b6e95bd05fd47ebe5b2cfc8af70ccd04994623f6508e90d3b5f857 - build: py310hff52083_2 + md5: 30a57eaa8e72cb0c2c84d6d7db32010c + sha256: 45e7d85a3663993e8bffdb7c6040561923c848e3262228b163042663caa4485e + build: py311h38be061_2 arch: x86_64 subdir: linux-64 build_number: 2 license: BSD-3-Clause license_family: BSD - size: 27313 - timestamp: 1695551879536 + size: 32421 + timestamp: 1695551942931 - platform: linux-64 name: semver version: 2.13.0 @@ -32165,21 +32384,21 @@ package: dependencies: - geos >=3.12.0,<3.12.1.0a0 - libgcc-ng >=12 - - numpy >=1.22.4,<2.0a0 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py310h7dcad9a_0.conda + - numpy >=1.23.5,<2.0a0 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda hash: - md5: 0d7c35fe5cc1f436e368ddd500deb979 - sha256: dc45ce90e8ebbd7074c05e4003614422ea14de83527582bb2728292a69173615 - build: py310h7dcad9a_0 + md5: c90e2469d7512f3bba893533a82d7a02 + sha256: 2a02e516c57a2122cf9acaec54b75a821ad5f959a7702b17cb8df2c3fe31ef20 + build: py311he06c224_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-3-Clause license_family: BSD - size: 481789 - timestamp: 1697191710761 + size: 574587 + timestamp: 1697191790758 - platform: osx-64 name: shapely version: 2.0.2 @@ -32260,21 +32479,21 @@ package: - libstdcxx-ng >=12 - packaging - ply - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - tomli - url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py310hc6cd4ac_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.12-py311hb755f60_0.conda hash: - md5: 68d5bfccaba2d89a7812098dd3966d9b - sha256: 4c350a7ed9f5fd98196a50bc74ce1dc3bb05b0c90d17ea120439755fe2075796 - build: py310hc6cd4ac_0 + md5: 02336abab4cb5dd794010ef53c54bd09 + sha256: 71a0ee22522b232bf50d4d03d012e53cd5d1251d09dffc1c72d7c33a1086fe6f + build: py311hb755f60_0 arch: x86_64 subdir: linux-64 build_number: 0 license: GPL-3.0-only license_family: GPL - size: 494293 - timestamp: 1697300616950 + size: 585197 + timestamp: 1697300605264 - platform: osx-64 name: sip version: 6.7.12 @@ -32765,89 +32984,89 @@ package: timestamp: 1669810397386 - platform: linux-64 name: sqlite - version: 3.44.0 + version: 3.44.1 category: main manager: conda dependencies: - libgcc-ng >=12 - - libsqlite 3.44.0 h2797004_0 + - libsqlite 3.44.1 h2797004_0 - libzlib >=1.2.13,<1.3.0a0 - ncurses >=6.4,<7.0a0 - readline >=8.2,<9.0a0 - url: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.1-h2c6b66d_0.conda hash: - md5: df56c636df4a98990462d66ac7be2330 - sha256: ae7031a471868c7057cc16eded7bb58fa3723d9c1650c9d3eb8de1ff65d89dbb + md5: cf535736bb0de7bf388dbfd2d6a50f53 + sha256: a0a2fc6c9d7e170c5738ad134f8b71f51a1c982c4496c47f8caa73ef4e5b17c8 build: h2c6b66d_0 arch: x86_64 subdir: linux-64 build_number: 0 license: Unlicense - size: 836571 - timestamp: 1698854732353 + size: 836157 + timestamp: 1700684397274 - platform: osx-64 name: sqlite - version: 3.44.0 + version: 3.44.1 category: main manager: conda dependencies: - - libsqlite 3.44.0 h92b6c6a_0 + - libsqlite 3.44.1 h92b6c6a_0 - libzlib >=1.2.13,<1.3.0a0 - ncurses >=6.4,<7.0a0 - readline >=8.2,<9.0a0 - url: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.44.0-h7461747_0.conda + url: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.44.1-h7461747_0.conda hash: - md5: 4c125fcbf57aa07682468a1e9d202cfa - sha256: a222b2686f7e62c27ec2aaa64e7f2d927a883e5ef62e4ea060b6bd53c032cfca + md5: f7aa681a7d0fc0102654ad2db704529c + sha256: fdb83496e2e4cd0d243283d268cbf8d6dbb44a71ca0b4dba9235067436adfdc5 build: h7461747_0 arch: x86_64 subdir: osx-64 build_number: 0 license: Unlicense - size: 886889 - timestamp: 1698855027090 + size: 888475 + timestamp: 1700684909064 - platform: osx-arm64 name: sqlite - version: 3.44.0 + version: 3.44.1 category: main manager: conda dependencies: - - libsqlite 3.44.0 h091b4b1_0 + - libsqlite 3.44.1 h091b4b1_0 - libzlib >=1.2.13,<1.3.0a0 - ncurses >=6.4,<7.0a0 - readline >=8.2,<9.0a0 - url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.44.0-hf2abe2d_0.conda + url: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.44.1-hf2abe2d_0.conda hash: - md5: 0080e3f5d7d13d3b1e244ed24642ca9e - sha256: 8263043d2a5762a5bbbb4ceee28382d97e70182fff8d45371b65fedda0b709ee + md5: e753159d79c46b400a0ab40e8fa373f9 + sha256: 6b49a9f825bb2bb2320ee7b061060a58217530c12b9f17372d64e2f28a23530f build: hf2abe2d_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: Unlicense - size: 800748 - timestamp: 1698855055771 + size: 802519 + timestamp: 1700685008150 - platform: win-64 name: sqlite - version: 3.44.0 + version: 3.44.1 category: main manager: conda dependencies: - - libsqlite 3.44.0 hcfcfb64_0 + - libsqlite 3.44.1 hcfcfb64_0 - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - url: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.44.0-hcfcfb64_0.conda + url: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.44.1-hcfcfb64_0.conda hash: - md5: 8bd8b9fbf5116bc98f5d6eef70f82af9 - sha256: f6a4ae8130b32f566d0e406ebeb315671e202f08408fd69c512f38fb8efc0c7c + md5: 952cac722cc293246148e2b1487fd92a + sha256: ccfc2801b89a9614aed04b995f12cdfd8c06947e06a95a2fb2056ca8c33e4e0f build: hcfcfb64_0 arch: x86_64 subdir: win-64 build_number: 0 license: Unlicense - size: 856389 - timestamp: 1698855293276 + size: 855981 + timestamp: 1700684875911 - platform: linux-64 name: stack_data version: 0.6.2 @@ -33975,20 +34194,20 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py310h2372a71_1.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py311h459d7ec_1.conda hash: - md5: b23e0147fa5f7a9380e06334c7266ad5 - sha256: 209b6788b81739d3cdc2f04ad3f6f323efd85b1a30f2edce98ab76d98079fac8 - build: py310h2372a71_1 + md5: a700fcb5cedd3e72d0c75d095c7a6eda + sha256: 3f0640415c6f50c6b31b5ce41a870ac48c130fda8921aae11afea84c54a6ba84 + build: py311h459d7ec_1 arch: x86_64 subdir: linux-64 build_number: 1 license: Apache-2.0 license_family: Apache - size: 641597 - timestamp: 1695373710038 + size: 843714 + timestamp: 1695373626426 - platform: osx-64 name: tornado version: 6.3.3 @@ -35086,20 +35305,20 @@ package: - cffi - libgcc-ng >=12 - libstdcxx-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda hash: - md5: 35e87277fba9944b8a975113538bb5df - sha256: 7bcb662f8d8181d77d77605c6e176a5bc6a421025a8969c6d793fe47134285bd - build: py310hd41b1e2_4 + md5: 586da7df03b68640de14dc3e8bcbf76f + sha256: c2d33e998f637b594632eba3727529171a06eb09896e36aa42f1ebcb03779472 + build: py311h9547e67_4 arch: x86_64 subdir: linux-64 build_number: 4 license: MIT license_family: MIT - size: 13811 - timestamp: 1695549503728 + size: 13961 + timestamp: 1695549513130 - platform: osx-64 name: ukkonen version: 1.0.1 @@ -35169,27 +35388,6 @@ package: license_family: MIT size: 17225 timestamp: 1695549858085 -- platform: linux-64 - name: unicodedata2 - version: 15.1.0 - category: main - manager: conda - dependencies: - - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda - hash: - md5: 72637c58d36d9475fda24700c9796f19 - sha256: 5ab2f2d4542ba0cc27d222c08ae61706babe7173b0c6dfa748aa37ff2fa9d824 - build: py310h2372a71_0 - arch: x86_64 - subdir: linux-64 - build_number: 0 - license: Apache-2.0 - license_family: Apache - size: 374055 - timestamp: 1695848183607 - platform: linux-64 name: uri-template version: 1.3.0 @@ -35480,18 +35678,18 @@ package: timestamp: 1694292382336 - platform: linux-64 name: virtualenv - version: 20.24.6 + version: 20.24.7 category: main manager: conda dependencies: - distlib <1,>=0.3.7 - filelock <4,>=3.12.2 - - platformdirs <4,>=3.9.1 + - platformdirs <5,>=3.9.1 - python >=3.8 - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.7-pyhd8ed1ab_0.conda hash: - md5: fb1fc875719e217ed799a7aae11d3be4 - sha256: 09492f89a22dc17d9b32f2a791deee93d06e99fb312c3d47430fe35343b7fbde + md5: db990278c2c00b268eed778de44f6057 + sha256: ad661ae59c64bd73c25dfadb00c601659f4d9cafbf428e36a690075e52bac96a build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 @@ -35499,22 +35697,22 @@ package: license: MIT license_family: MIT noarch: python - size: 3067859 - timestamp: 1698092779433 + size: 3059103 + timestamp: 1700749249290 - platform: osx-64 name: virtualenv - version: 20.24.6 + version: 20.24.7 category: main manager: conda dependencies: - distlib <1,>=0.3.7 - filelock <4,>=3.12.2 - - platformdirs <4,>=3.9.1 + - platformdirs <5,>=3.9.1 - python >=3.8 - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.7-pyhd8ed1ab_0.conda hash: - md5: fb1fc875719e217ed799a7aae11d3be4 - sha256: 09492f89a22dc17d9b32f2a791deee93d06e99fb312c3d47430fe35343b7fbde + md5: db990278c2c00b268eed778de44f6057 + sha256: ad661ae59c64bd73c25dfadb00c601659f4d9cafbf428e36a690075e52bac96a build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 @@ -35522,22 +35720,22 @@ package: license: MIT license_family: MIT noarch: python - size: 3067859 - timestamp: 1698092779433 + size: 3059103 + timestamp: 1700749249290 - platform: osx-arm64 name: virtualenv - version: 20.24.6 + version: 20.24.7 category: main manager: conda dependencies: - distlib <1,>=0.3.7 - filelock <4,>=3.12.2 - - platformdirs <4,>=3.9.1 + - platformdirs <5,>=3.9.1 - python >=3.8 - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.7-pyhd8ed1ab_0.conda hash: - md5: fb1fc875719e217ed799a7aae11d3be4 - sha256: 09492f89a22dc17d9b32f2a791deee93d06e99fb312c3d47430fe35343b7fbde + md5: db990278c2c00b268eed778de44f6057 + sha256: ad661ae59c64bd73c25dfadb00c601659f4d9cafbf428e36a690075e52bac96a build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 @@ -35545,22 +35743,22 @@ package: license: MIT license_family: MIT noarch: python - size: 3067859 - timestamp: 1698092779433 + size: 3059103 + timestamp: 1700749249290 - platform: win-64 name: virtualenv - version: 20.24.6 + version: 20.24.7 category: main manager: conda dependencies: - distlib <1,>=0.3.7 - filelock <4,>=3.12.2 - - platformdirs <4,>=3.9.1 + - platformdirs <5,>=3.9.1 - python >=3.8 - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.7-pyhd8ed1ab_0.conda hash: - md5: fb1fc875719e217ed799a7aae11d3be4 - sha256: 09492f89a22dc17d9b32f2a791deee93d06e99fb312c3d47430fe35343b7fbde + md5: db990278c2c00b268eed778de44f6057 + sha256: ad661ae59c64bd73c25dfadb00c601659f4d9cafbf428e36a690075e52bac96a build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 @@ -35568,8 +35766,8 @@ package: license: MIT license_family: MIT noarch: python - size: 3067859 - timestamp: 1698092779433 + size: 3059103 + timestamp: 1700749249290 - platform: win-64 name: vs2015_runtime version: 14.36.32532 @@ -35595,21 +35793,21 @@ package: category: main manager: conda dependencies: - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 - pyyaml >=3.10 - url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-3.0.0-py310hff52083_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-3.0.0-py311h38be061_1.conda hash: - md5: 31aa3b1adb5023ec880722ce7dc919f0 - sha256: 821f20ab3991ded8a183d57e7df2829e260c3a7cf821906a0e934ebc029be7a6 - build: py310hff52083_1 + md5: 1901b9f3ca3782f31450fd7158d2fe8a + sha256: c1fd4f6bd6f3c4009fe2f97d3ed8edd2f2a46058293e0176b06fa181eb66558f + build: py311h38be061_1 arch: x86_64 subdir: linux-64 build_number: 1 license: Apache-2.0 license_family: APACHE - size: 109957 - timestamp: 1695395379603 + size: 138066 + timestamp: 1695395380738 - platform: osx-64 name: watchdog version: 3.0.0 @@ -35676,84 +35874,84 @@ package: timestamp: 1695395884217 - platform: linux-64 name: wcwidth - version: 0.2.10 + version: 0.2.12 category: main manager: conda dependencies: - - backports.functools_lru_cache - - python >=3.6 - url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.10-pyhd8ed1ab_0.conda + - python >=3.8 + url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.12-pyhd8ed1ab_0.conda hash: - md5: 48978e4e99db7d1ee0d277f6dee20684 - sha256: e988673c05416073d0e776bac223b6c79fb5cc1207291c6c6f9e238624a135c0 + md5: bf4a1d1a97ca27b0b65bacd9e238b484 + sha256: ca757d0fc2dbd422af9d3238a8b4b630a6e11df3707a447bd89540656770d1d7 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 build_number: 0 license: MIT + license_family: MIT noarch: python - size: 32557 - timestamp: 1699959343164 + size: 32405 + timestamp: 1700608049984 - platform: osx-64 name: wcwidth - version: 0.2.10 + version: 0.2.12 category: main manager: conda dependencies: - - backports.functools_lru_cache - - python >=3.6 - url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.10-pyhd8ed1ab_0.conda + - python >=3.8 + url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.12-pyhd8ed1ab_0.conda hash: - md5: 48978e4e99db7d1ee0d277f6dee20684 - sha256: e988673c05416073d0e776bac223b6c79fb5cc1207291c6c6f9e238624a135c0 + md5: bf4a1d1a97ca27b0b65bacd9e238b484 + sha256: ca757d0fc2dbd422af9d3238a8b4b630a6e11df3707a447bd89540656770d1d7 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 build_number: 0 license: MIT + license_family: MIT noarch: python - size: 32557 - timestamp: 1699959343164 + size: 32405 + timestamp: 1700608049984 - platform: osx-arm64 name: wcwidth - version: 0.2.10 + version: 0.2.12 category: main manager: conda dependencies: - - backports.functools_lru_cache - - python >=3.6 - url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.10-pyhd8ed1ab_0.conda + - python >=3.8 + url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.12-pyhd8ed1ab_0.conda hash: - md5: 48978e4e99db7d1ee0d277f6dee20684 - sha256: e988673c05416073d0e776bac223b6c79fb5cc1207291c6c6f9e238624a135c0 + md5: bf4a1d1a97ca27b0b65bacd9e238b484 + sha256: ca757d0fc2dbd422af9d3238a8b4b630a6e11df3707a447bd89540656770d1d7 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 build_number: 0 license: MIT + license_family: MIT noarch: python - size: 32557 - timestamp: 1699959343164 + size: 32405 + timestamp: 1700608049984 - platform: win-64 name: wcwidth - version: 0.2.10 + version: 0.2.12 category: main manager: conda dependencies: - - backports.functools_lru_cache - - python >=3.6 - url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.10-pyhd8ed1ab_0.conda + - python >=3.8 + url: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.12-pyhd8ed1ab_0.conda hash: - md5: 48978e4e99db7d1ee0d277f6dee20684 - sha256: e988673c05416073d0e776bac223b6c79fb5cc1207291c6c6f9e238624a135c0 + md5: bf4a1d1a97ca27b0b65bacd9e238b484 + sha256: ca757d0fc2dbd422af9d3238a8b4b630a6e11df3707a447bd89540656770d1d7 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 build_number: 0 license: MIT + license_family: MIT noarch: python - size: 32557 - timestamp: 1699959343164 + size: 32405 + timestamp: 1700608049984 - platform: linux-64 name: webcolors version: '1.13' @@ -36118,20 +36316,20 @@ package: manager: conda dependencies: - libgcc-ng >=12 - - python >=3.10,<3.11.0a0 - - python_abi 3.10.* *_cp310 - url: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py310h2372a71_0.conda + - python >=3.11,<3.12.0a0 + - python_abi 3.11.* *_cp311 + url: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.16.0-py311h459d7ec_0.conda hash: - md5: d9dc9c45bdc2b38403e6b388581e92f0 - sha256: 2adc15cd1e66845c1ab498735e2f828003e2d5fe20eed1febddb712f58793c31 - build: py310h2372a71_0 + md5: 6669b5529d206c1f880b642cdd17ae05 + sha256: 6587e0b7d42368f767172b239a755fcf6363d91348faf9b7ab5743585369fc58 + build: py311h459d7ec_0 arch: x86_64 subdir: linux-64 build_number: 0 license: BSD-2-Clause license_family: BSD - size: 55415 - timestamp: 1699533000763 + size: 63465 + timestamp: 1699532930817 - platform: osx-64 name: wrapt version: 1.16.0 @@ -36198,7 +36396,7 @@ package: timestamp: 1699533574835 - platform: linux-64 name: xarray - version: 2023.10.1 + version: 2023.11.0 category: main manager: conda dependencies: @@ -36206,43 +36404,43 @@ package: - packaging >=21.3 - pandas >=1.4 - python >=3.9 - url: https://conda.anaconda.org/conda-forge/noarch/xarray-2023.10.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/xarray-2023.11.0-pyhd8ed1ab_0.conda hash: - md5: 9b20e5d68eea6878a0a6fc57a3043889 - sha256: 6062114745e9c01813506527d7e48c75dbe5eb6017e4c60ce8c98ef9fd757db2 + md5: f445b20bac3db8f604a48592087b2d8f + sha256: 71a2000fd5f5065e8c9a184c3f9262b27c4a5eeb5366a6d7e4d267d28e9f07d9 build: pyhd8ed1ab_0 arch: x86_64 subdir: linux-64 build_number: 0 constrains: - - seaborn >=0.11 - - netcdf4 >=1.6.0 - - iris >=3.2 - zarr >=2.12 - - pint >=0.19 - - h5py >=3.6 - - hdf5 >=1.12 - - cftime >=1.6 - sparse >=0.13 + - netcdf4 >=1.6.0 - cartopy >=0.20 - - dask-core >=2022.7 - - nc-time-axis >=1.4 - - scipy >=1.8 - - distributed >=2022.7 - - bottleneck >=1.3 - - matplotlib-base >=3.5 - toolz >=0.12 - h5netcdf >=1.0 - - flox >=0.5 + - distributed >=2022.7 + - scipy >=1.8 + - matplotlib-base >=3.5 + - seaborn >=0.11 + - hdf5 >=1.12 - numba >=0.55 + - h5py >=3.6 + - flox >=0.5 + - cftime >=1.6 + - pint >=0.19 + - iris >=3.2 + - dask-core >=2022.7 + - nc-time-axis >=1.4 + - bottleneck >=1.3 license: Apache-2.0 license_family: APACHE noarch: python - size: 711330 - timestamp: 1697764509357 + size: 713393 + timestamp: 1700303846370 - platform: osx-64 name: xarray - version: 2023.10.1 + version: 2023.11.0 category: main manager: conda dependencies: @@ -36250,43 +36448,43 @@ package: - packaging >=21.3 - pandas >=1.4 - python >=3.9 - url: https://conda.anaconda.org/conda-forge/noarch/xarray-2023.10.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/xarray-2023.11.0-pyhd8ed1ab_0.conda hash: - md5: 9b20e5d68eea6878a0a6fc57a3043889 - sha256: 6062114745e9c01813506527d7e48c75dbe5eb6017e4c60ce8c98ef9fd757db2 + md5: f445b20bac3db8f604a48592087b2d8f + sha256: 71a2000fd5f5065e8c9a184c3f9262b27c4a5eeb5366a6d7e4d267d28e9f07d9 build: pyhd8ed1ab_0 arch: x86_64 subdir: osx-64 build_number: 0 constrains: - - seaborn >=0.11 - - netcdf4 >=1.6.0 - - iris >=3.2 - zarr >=2.12 - - pint >=0.19 - - h5py >=3.6 - - hdf5 >=1.12 - - cftime >=1.6 - sparse >=0.13 + - netcdf4 >=1.6.0 - cartopy >=0.20 - - dask-core >=2022.7 - - nc-time-axis >=1.4 - - scipy >=1.8 - - distributed >=2022.7 - - bottleneck >=1.3 - - matplotlib-base >=3.5 - toolz >=0.12 - h5netcdf >=1.0 - - flox >=0.5 + - distributed >=2022.7 + - scipy >=1.8 + - matplotlib-base >=3.5 + - seaborn >=0.11 + - hdf5 >=1.12 - numba >=0.55 + - h5py >=3.6 + - flox >=0.5 + - cftime >=1.6 + - pint >=0.19 + - iris >=3.2 + - dask-core >=2022.7 + - nc-time-axis >=1.4 + - bottleneck >=1.3 license: Apache-2.0 license_family: APACHE noarch: python - size: 711330 - timestamp: 1697764509357 + size: 713393 + timestamp: 1700303846370 - platform: osx-arm64 name: xarray - version: 2023.10.1 + version: 2023.11.0 category: main manager: conda dependencies: @@ -36294,43 +36492,43 @@ package: - packaging >=21.3 - pandas >=1.4 - python >=3.9 - url: https://conda.anaconda.org/conda-forge/noarch/xarray-2023.10.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/xarray-2023.11.0-pyhd8ed1ab_0.conda hash: - md5: 9b20e5d68eea6878a0a6fc57a3043889 - sha256: 6062114745e9c01813506527d7e48c75dbe5eb6017e4c60ce8c98ef9fd757db2 + md5: f445b20bac3db8f604a48592087b2d8f + sha256: 71a2000fd5f5065e8c9a184c3f9262b27c4a5eeb5366a6d7e4d267d28e9f07d9 build: pyhd8ed1ab_0 arch: aarch64 subdir: osx-arm64 build_number: 0 constrains: - - seaborn >=0.11 - - netcdf4 >=1.6.0 - - iris >=3.2 - zarr >=2.12 - - pint >=0.19 - - h5py >=3.6 - - hdf5 >=1.12 - - cftime >=1.6 - sparse >=0.13 + - netcdf4 >=1.6.0 - cartopy >=0.20 - - dask-core >=2022.7 - - nc-time-axis >=1.4 - - scipy >=1.8 - - distributed >=2022.7 - - bottleneck >=1.3 - - matplotlib-base >=3.5 - toolz >=0.12 - h5netcdf >=1.0 - - flox >=0.5 + - distributed >=2022.7 + - scipy >=1.8 + - matplotlib-base >=3.5 + - seaborn >=0.11 + - hdf5 >=1.12 - numba >=0.55 + - h5py >=3.6 + - flox >=0.5 + - cftime >=1.6 + - pint >=0.19 + - iris >=3.2 + - dask-core >=2022.7 + - nc-time-axis >=1.4 + - bottleneck >=1.3 license: Apache-2.0 license_family: APACHE noarch: python - size: 711330 - timestamp: 1697764509357 + size: 713393 + timestamp: 1700303846370 - platform: win-64 name: xarray - version: 2023.10.1 + version: 2023.11.0 category: main manager: conda dependencies: @@ -36338,40 +36536,40 @@ package: - packaging >=21.3 - pandas >=1.4 - python >=3.9 - url: https://conda.anaconda.org/conda-forge/noarch/xarray-2023.10.1-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/xarray-2023.11.0-pyhd8ed1ab_0.conda hash: - md5: 9b20e5d68eea6878a0a6fc57a3043889 - sha256: 6062114745e9c01813506527d7e48c75dbe5eb6017e4c60ce8c98ef9fd757db2 + md5: f445b20bac3db8f604a48592087b2d8f + sha256: 71a2000fd5f5065e8c9a184c3f9262b27c4a5eeb5366a6d7e4d267d28e9f07d9 build: pyhd8ed1ab_0 arch: x86_64 subdir: win-64 build_number: 0 constrains: - - seaborn >=0.11 - - netcdf4 >=1.6.0 - - iris >=3.2 - zarr >=2.12 - - pint >=0.19 - - h5py >=3.6 - - hdf5 >=1.12 - - cftime >=1.6 - sparse >=0.13 + - netcdf4 >=1.6.0 - cartopy >=0.20 - - dask-core >=2022.7 - - nc-time-axis >=1.4 - - scipy >=1.8 - - distributed >=2022.7 - - bottleneck >=1.3 - - matplotlib-base >=3.5 - toolz >=0.12 - h5netcdf >=1.0 - - flox >=0.5 + - distributed >=2022.7 + - scipy >=1.8 + - matplotlib-base >=3.5 + - seaborn >=0.11 + - hdf5 >=1.12 - numba >=0.55 + - h5py >=3.6 + - flox >=0.5 + - cftime >=1.6 + - pint >=0.19 + - iris >=3.2 + - dask-core >=2022.7 + - nc-time-axis >=1.4 + - bottleneck >=1.3 license: Apache-2.0 license_family: APACHE noarch: python - size: 711330 - timestamp: 1697764509357 + size: 713393 + timestamp: 1700303846370 - platform: linux-64 name: xcb-util version: 0.4.0 diff --git a/pixi.toml b/pixi.toml index 4096ba08f..5a17dac8b 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,6 +1,6 @@ [project] name = "Ribasim" -version = "0.3.0" +version = "0.4.0" description = "Water resources modeling" authors = ["Deltares and contributors "] channels = ["conda-forge"] @@ -49,6 +49,7 @@ lint = { depends_on = [ "mypy-ribasim-python", "mypy-ribasim-testmodels", "mypy-ribasim-api", + "mypy-ribasim-qgis", ] } # Build build-ribasim-cli = { cmd = "julia --project build.jl --app", cwd = "build/create_binaries", depends_on = [ @@ -94,13 +95,16 @@ publish-ribasim-api = { cmd = "twine upload dist/*", cwd = "python/ribasim_api", ] } # QGIS install-ribasim-qgis = "python ribasim_qgis/scripts/install_ribasim_qgis.py" -install-imod-qgis = "python ribasim_qgis/scripts/install_imod_qgis.py" +install-imod-qgis = "python ribasim_qgis/scripts/install_qgis_plugin.py iMOD && python ribasim_qgis/scripts/enable_plugin.py imodqgis" +install-plugin-reloader = "python ribasim_qgis/scripts/install_qgis_plugin.py \"Plugin Reloader\" && python ribasim_qgis/scripts/enable_plugin.py plugin_reloader" start-docker-qgis = { cmd = "sh ./start.sh", cwd = ".docker" } test-ribasim-qgis = { cmd = "sh ./test.sh; sh ./stop.sh", cwd = ".docker", depends_on = ["start-docker-qgis"] } install-qgis-plugins = { depends_on = [ + "install-plugin-reloader", "install-ribasim-qgis", "install-imod-qgis", ] } +mypy-ribasim-qgis = "mypy ribasim_qgis" [dependencies] build = "*" @@ -134,6 +138,8 @@ qgis = "3.28.*" platformdirs = "*" pyqt-stubs = "*" types-requests = "*" +qgis-plugin-manager = "*" +libgdal-arrow-parquet = "3.7.2.*" [target.win-64.dependencies] quarto = "*" diff --git a/python/ribasim/pyproject.toml b/python/ribasim/pyproject.toml index 39413f09b..9fcb6193c 100644 --- a/python/ribasim/pyproject.toml +++ b/python/ribasim/pyproject.toml @@ -16,6 +16,7 @@ requires-python = ">=3.10" dependencies = [ "geopandas", "matplotlib", + "numpy", "pandas", "pandera != 0.16.0", "pyarrow", diff --git a/python/ribasim/ribasim/__init__.py b/python/ribasim/ribasim/__init__.py index 097f03a7d..89ffbc85f 100644 --- a/python/ribasim/ribasim/__init__.py +++ b/python/ribasim/ribasim/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.0" +__version__ = "0.6.0" from ribasim import models, utils diff --git a/python/ribasim/ribasim/config.py b/python/ribasim/ribasim/config.py index 5f45daa99..48d74e381 100644 --- a/python/ribasim/ribasim/config.py +++ b/python/ribasim/ribasim/config.py @@ -9,6 +9,7 @@ BasinProfileSchema, BasinStateSchema, BasinStaticSchema, + BasinSubgridSchema, BasinTimeSchema, DiscreteControlConditionSchema, DiscreteControlLogicSchema, @@ -46,6 +47,7 @@ class Results(BaseModel): outstate: str | None = None compression: Compression = Compression.zstd compression_level: int = 6 + subgrid: bool = False class Solver(BaseModel): @@ -158,10 +160,14 @@ class Basin(NodeModel): time: TableModel[BasinTimeSchema] = Field( default_factory=TableModel[BasinTimeSchema] ) + subgrid: TableModel[BasinSubgridSchema] = Field( + default_factory=TableModel[BasinSubgridSchema] + ) _sort_keys: dict[str, list[str]] = { "profile": ["node_id", "level"], "time": ["time", "node_id"], + "subgrid": ["subgrid_id", "basin_level"], } diff --git a/python/ribasim/ribasim/models.py b/python/ribasim/ribasim/models.py index 1d82a6fa8..38de5e958 100644 --- a/python/ribasim/ribasim/models.py +++ b/python/ribasim/ribasim/models.py @@ -33,6 +33,14 @@ class BasinStatic(BaseModel): remarks: str = Field("", description="a hack for pandera") +class BasinSubgrid(BaseModel): + subgrid_id: int + node_id: int + basin_level: float + subgrid_level: float + remarks: str = Field("", description="a hack for pandera") + + class BasinTime(BaseModel): node_id: int time: datetime @@ -223,6 +231,7 @@ class Root(BaseModel): basinprofile: BasinProfile | None = None basinstate: BasinState | None = None basinstatic: BasinStatic | None = None + basinsubgrid: BasinSubgrid | None = None basintime: BasinTime | None = None discretecontrolcondition: DiscreteControlCondition | None = None discretecontrollogic: DiscreteControlLogic | None = None diff --git a/python/ribasim_api/ribasim_api/__init__.py b/python/ribasim_api/ribasim_api/__init__.py index 9d4736142..e7e218d63 100644 --- a/python/ribasim_api/ribasim_api/__init__.py +++ b/python/ribasim_api/ribasim_api/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.4.0" +__version__ = "0.5.0" from ribasim_api.ribasim_api import RibasimApi diff --git a/python/ribasim_testmodels/ribasim_testmodels/__init__.py b/python/ribasim_testmodels/ribasim_testmodels/__init__.py index 04d1a2e54..994a8be3e 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/__init__.py +++ b/python/ribasim_testmodels/ribasim_testmodels/__init__.py @@ -1,4 +1,4 @@ -__version__ = "0.3.0" +__version__ = "0.4.0" from collections.abc import Callable diff --git a/python/ribasim_testmodels/ribasim_testmodels/trivial.py b/python/ribasim_testmodels/ribasim_testmodels/trivial.py index 9524aa219..22131df7f 100644 --- a/python/ribasim_testmodels/ribasim_testmodels/trivial.py +++ b/python/ribasim_testmodels/ribasim_testmodels/trivial.py @@ -72,7 +72,22 @@ def trivial_model() -> ribasim.Model: "urban_runoff": [0.0], } ) - basin = ribasim.Basin(profile=profile, static=static) + + # Create a subgrid level interpolation from one basin to three elements. Scale one to one, but: + # + # 1. start at -1.0 + # 2. start at 0.0 + # 3. start at 1.0 + # + subgrid = pd.DataFrame( + data={ + "subgrid_id": [1, 1, 2, 2, 3, 3], + "node_id": [1, 1, 1, 1, 1, 1], + "basin_level": [0.0, 1.0, 0.0, 1.0, 0.0, 1.0], + "subgrid_level": [-1.0, 0.0, 0.0, 1.0, 1.0, 2.0], + } + ) + basin = ribasim.Basin(profile=profile, static=static, subgrid=subgrid) # Set up a rating curve node: # Discharge: lose 1% of storage volume per day at storage = 1000.0. @@ -106,5 +121,6 @@ def trivial_model() -> ribasim.Model: tabulated_rating_curve=rating_curve, starttime="2020-01-01 00:00:00", endtime="2021-01-01 00:00:00", + results=ribasim.Results(subgrid=True), ) return model diff --git a/ribasim_qgis/core/geopackage.py b/ribasim_qgis/core/geopackage.py index 4b549cec4..d56508ca2 100644 --- a/ribasim_qgis/core/geopackage.py +++ b/ribasim_qgis/core/geopackage.py @@ -10,13 +10,16 @@ """ import sqlite3 from contextlib import contextmanager +from pathlib import Path -from qgis import processing +# qgis is monkey patched by plugins.processing. +# Importing from plugins directly for mypy +from plugins import processing from qgis.core import QgsVectorFileWriter, QgsVectorLayer @contextmanager -def sqlite3_cursor(path): +def sqlite3_cursor(path: Path): connection = sqlite3.connect(path) cursor = connection.cursor() try: @@ -26,13 +29,13 @@ def sqlite3_cursor(path): connection.close() -def layers(path: str) -> list[str]: +def layers(path: Path) -> list[str]: """ Return all layers that are present in the geopackage. Parameters ---------- - path: str + path: Path Path to the geopackage Returns @@ -46,14 +49,14 @@ def layers(path: str) -> list[str]: def write_layer( - path: str, layer: QgsVectorLayer, layername: str, newfile: bool = False + path: Path, layer: QgsVectorLayer, layername: str, newfile: bool = False ) -> QgsVectorLayer: """ Write a QgsVectorLayer to a GeoPackage database. Parameters ---------- - path: str + path: Path Path to the GeoPackage file layer: QgsVectorLayer QGIS map layer (in-memory) @@ -72,11 +75,13 @@ def write_layer( options.driverName = "gpkg" options.layerName = layername if not newfile: - options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer + options.actionOnExistingFile = ( + QgsVectorFileWriter.ActionOnExistingFile.CreateOrOverwriteLayer + ) write_result, error_message = QgsVectorFileWriter.writeAsVectorFormat( - layer, path, options + layer, str(path), options ) - if write_result != QgsVectorFileWriter.NoError: + if write_result != QgsVectorFileWriter.WriterError.NoError: raise RuntimeError( f"Layer {layername} could not be written to geopackage: {path}" f" with error: {error_message}" @@ -85,7 +90,7 @@ def write_layer( return layer -def remove_layer(path: str, layer: str) -> None: +def remove_layer(path: Path, layer: str) -> None: query = {"DATABASE": f"{path}|layername={layer}", "SQL": f"drop table {layer}"} try: processing.run("native:spatialiteexecutesql", query) diff --git a/ribasim_qgis/core/model.py b/ribasim_qgis/core/model.py new file mode 100644 index 000000000..5ef699f4d --- /dev/null +++ b/ribasim_qgis/core/model.py @@ -0,0 +1,35 @@ +from pathlib import Path + +import ribasim_qgis.tomllib as tomllib + + +def get_directory_path_from_model_file(model_path: Path, *, property: str) -> Path: + """Generate database absolute full path from model .toml file. + + Args: + path (Path): Path to model .toml file. + property (str): The property to retrieve from the model file and append to the path. + + Returns_: + Path: Full path to database Geopackage. + """ + with open(model_path, "rb") as f: + found_property = Path(tomllib.load(f)[property]) + # The .joinpath method (/) of pathlib.Path will take care of an absolute input_dir. + # No need to check it ourselves! + return (Path(model_path).parent / found_property).resolve() + + +def get_database_path_from_model_file(model_path: Path) -> Path: + """Get the database path database.gpkg based on the model file's input_dir. + + Args: + model_path (Path): Path to the model (.toml) file. + + Returns_: + Path: The full path to database.gpkg + """ + return ( + get_directory_path_from_model_file(model_path, property="input_dir") + / "database.gpkg" + ) diff --git a/ribasim_qgis/core/nodes.py b/ribasim_qgis/core/nodes.py index f79228f03..afc7690f4 100644 --- a/ribasim_qgis/core/nodes.py +++ b/ribasim_qgis/core/nodes.py @@ -20,15 +20,20 @@ """ +from __future__ import annotations + import abc -from typing import Any +from pathlib import Path +from typing import Any, cast from PyQt5.QtCore import Qt, QVariant from PyQt5.QtGui import QColor from qgis.core import ( Qgis, QgsCategorizedSymbolRenderer, + QgsCoordinateReferenceSystem, QgsEditorWidgetSetup, + QgsFeatureRenderer, QgsField, QgsLineSymbol, QgsMarkerLineSymbolLayer, @@ -47,12 +52,23 @@ class Input(abc.ABC): """Abstract base class for Ribasim input layers.""" - input_type = "" + def __init__(self, path: Path): + self._path = path + + @classmethod + @abc.abstractmethod + def input_type(cls) -> str: + ... + + @classmethod + @abc.abstractmethod + def geometry_type(cls) -> str: + ... - def __init__(self, path: str): - self.name = self.input_type - self.path = path - self.layer = None + @classmethod + @abc.abstractmethod + def attributes(cls) -> list[QgsField]: + ... @classmethod def is_spatial(cls): @@ -60,79 +76,91 @@ def is_spatial(cls): @classmethod def nodetype(cls): - return cls.input_type.split("/")[0].strip() + return cls.input_type().split("/")[0].strip() @classmethod - def create(cls, path: str, crs: Any, names: list[str]) -> "Input": + def create( + cls, + path: Path, + crs: QgsCoordinateReferenceSystem, + names: list[str], + ) -> Input: + if cls.input_type() in names: + raise ValueError(f"Name already exists in geopackage: {cls.input_type()}") instance = cls(path) - if instance.name in names: - raise ValueError(f"Name already exists in geopackage: {instance.name}") instance.layer = instance.new_layer(crs) return instance - def new_layer(self, crs: Any) -> Any: + def new_layer(self, crs: QgsCoordinateReferenceSystem) -> QgsVectorLayer: """ Separate creation of the instance with creating the layer, since the layer might also come from an existing geopackage. """ - layer = QgsVectorLayer(self.geometry_type, self.name, "memory") + layer = QgsVectorLayer(self.geometry_type(), self.input_type(), "memory") provider = layer.dataProvider() - provider.addAttributes(self.attributes) + assert provider is not None + provider.addAttributes(self.attributes()) layer.updateFields() layer.setCrs(crs) return layer - def set_defaults(self): - layer = self.layer + def set_defaults(self) -> None: defaults = getattr(self, "defaults", None) - if layer is None or defaults is None: + if self.layer is None or defaults is None: return - fields = layer.fields() + fields = self.layer.fields() for name, definition in defaults.items(): index = fields.indexFromName(name) - layer.setDefaultValueDefinition(index, definition) - return + self.layer.setDefaultValueDefinition(index, definition) def set_read_only(self) -> None: - return + pass @property - def renderer(self) -> None: - return + def renderer(self) -> QgsFeatureRenderer | None: + return None @property - def labels(self) -> None: - return + def labels(self) -> Any: + return None def layer_from_geopackage(self) -> QgsVectorLayer: - self.layer = QgsVectorLayer(f"{self.path}|layername={self.name}", self.name) - return + self.layer = QgsVectorLayer( + f"{self._path}|layername={self.input_type()}", self.input_type() + ) + return self.layer - def from_geopackage(self) -> tuple[Any, Any]: + def from_geopackage(self) -> tuple[QgsVectorLayer, Any, Any]: self.layer_from_geopackage() return (self.layer, self.renderer, self.labels) def write(self) -> None: - self.layer = geopackage.write_layer(self.path, self.layer, self.name) + self.layer = geopackage.write_layer(self._path, self.layer, self.input_type()) self.set_defaults() - return def remove_from_geopackage(self) -> None: - geopackage.remove_layer(self.path, self.name) - return + geopackage.remove_layer(self._path, self.input_type()) def set_editor_widget(self) -> None: # Calling during new_layer doesn't have any effect... - return + pass class Node(Input): - input_type = "Node" - geometry_type = "Point" - attributes = ( - QgsField("name", QVariant.String), - QgsField("type", QVariant.String), - ) + @classmethod + def input_type(cls) -> str: + return "Node" + + @classmethod + def geometry_type(cls) -> str: + return "Point" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("name", QVariant.String), + QgsField("type", QVariant.String), + ] @classmethod def is_spatial(cls): @@ -140,9 +168,8 @@ def is_spatial(cls): def write(self) -> None: # Special case the Node layer write because it needs to generate a new file. - self.layer = geopackage.write_layer( - self.path, self.layer, self.name, newfile=True + self._path, self.layer, self.input_type(), newfile=True ) self.set_defaults() return @@ -164,8 +191,8 @@ def set_editor_widget(self) -> None: @property def renderer(self) -> QgsCategorizedSymbolRenderer: - shape = QgsSimpleMarkerSymbolLayerBase - MARKERS = { + shape = Qgis.MarkerShape + MARKERS: dict[str, tuple[QColor, str, Qgis.MarkerShape]] = { "Basin": (QColor("blue"), "Basin", shape.Circle), "FractionalFlow": (QColor("red"), "FractionalFlow", shape.Triangle), "LinearResistance": ( @@ -187,21 +214,19 @@ def renderer(self) -> QgsCategorizedSymbolRenderer: "DiscreteControl": (QColor("black"), "DiscreteControl", shape.Star), "PidControl": (QColor("black"), "PidControl", shape.Cross2), "User": (QColor("green"), "User", shape.Square), - "": ( - QColor("white"), - "", - shape.Circle, - ), # All other nodes, or incomplete input + # All other nodes, or incomplete input + "": (QColor("white"), "", shape.Circle), } categories = [] - for value, (colour, label, shape) in MARKERS.items(): + for value, (color, label, marker_shape) in MARKERS.items(): symbol = QgsMarkerSymbol() - symbol.symbolLayer(0).setShape(shape) - symbol.setColor(QColor(colour)) + cast(QgsSimpleMarkerSymbolLayerBase, symbol.symbolLayer(0)).setShape( + marker_shape + ) + symbol.setColor(QColor(color)) symbol.setSize(4) - category = QgsRendererCategory(value, symbol, label, shape) - category.setRenderState(True) + category = QgsRendererCategory(value, symbol, label, render=True) categories.append(category) renderer = QgsCategorizedSymbolRenderer(attrName="type", categories=categories) @@ -212,21 +237,28 @@ def labels(self) -> Any: pal_layer = QgsPalLayerSettings() pal_layer.fieldName = """concat("name", ' #', "fid")""" pal_layer.isExpression = True - pal_layer.enabled = True pal_layer.dist = 2.0 labels = QgsVectorLayerSimpleLabeling(pal_layer) return labels class Edge(Input): - input_type = "Edge" - geometry_type = "Linestring" - attributes = [ - QgsField("name", QVariant.String), - QgsField("from_node_id", QVariant.Int), - QgsField("to_node_id", QVariant.Int), - QgsField("edge_type", QVariant.String), - ] + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("name", QVariant.String), + QgsField("from_node_id", QVariant.Int), + QgsField("to_node_id", QVariant.Int), + QgsField("edge_type", QVariant.String), + ] + + @classmethod + def geometry_type(cls) -> str: + return "Linestring" + + @classmethod + def input_type(cls) -> str: + return "Edge" @classmethod def is_spatial(cls): @@ -264,7 +296,7 @@ def renderer(self) -> QgsCategorizedSymbolRenderer: # Create an arrow marker to indicate directionality arrow_marker = QgsSimpleMarkerSymbolLayer() - arrow_marker.setShape(QgsSimpleMarkerSymbolLayer.ArrowHeadFilled) + arrow_marker.setShape(Qgis.MarkerShape.ArrowHeadFilled) arrow_marker.setColor(QColor(colour)) arrow_marker.setSize(3) arrow_marker.setStrokeStyle(Qt.PenStyle(Qt.NoPen)) @@ -272,9 +304,11 @@ def renderer(self) -> QgsCategorizedSymbolRenderer: # Add marker to line marker_symbol = QgsMarkerSymbol() marker_symbol.changeSymbolLayer(0, arrow_marker) - marker_line_symbol_layer = QgsMarkerLineSymbolLayer.create( - {"placements": "SegmentCenter"} + marker_line_symbol_layer = cast( + QgsMarkerLineSymbolLayer, + QgsMarkerLineSymbolLayer.create({"placements": "SegmentCenter"}), ) + marker_line_symbol_layer.setSubSymbol(marker_symbol) symbol.appendSymbolLayer(marker_line_symbol_layer) @@ -292,7 +326,6 @@ def labels(self) -> Any: pal_layer = QgsPalLayerSettings() pal_layer.fieldName = """concat("name", ' #', "fid")""" pal_layer.isExpression = True - pal_layer.enabled = True pal_layer.placement = Qgis.LabelPlacement.Line pal_layer.dist = 1.0 labels = QgsVectorLayerSimpleLabeling(pal_layer) @@ -300,265 +333,463 @@ def labels(self) -> Any: class BasinProfile(Input): - input_type = "Basin / profile" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("area", QVariant.Double), - QgsField("level", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "Basin / profile" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("area", QVariant.Double), + QgsField("level", QVariant.Double), + ] class BasinStatic(Input): - input_type = "Basin / static" - geometry_type = "No geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("drainage", QVariant.Double), - QgsField("potential_evaporation", QVariant.Double), - QgsField("infiltration", QVariant.Double), - QgsField("precipitation", QVariant.Double), - QgsField("urban_runoff", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "Basin / static" + + @classmethod + def geometry_type(cls) -> str: + return "No geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("drainage", QVariant.Double), + QgsField("potential_evaporation", QVariant.Double), + QgsField("infiltration", QVariant.Double), + QgsField("precipitation", QVariant.Double), + QgsField("urban_runoff", QVariant.Double), + ] class BasinTime(Input): - input_type = "Basin / time" - geometry_type = "No Geometry" - attributes = [ - QgsField("time", QVariant.DateTime), - QgsField("node_id", QVariant.Int), - QgsField("drainage", QVariant.Double), - QgsField("potential_evaporation", QVariant.Double), - QgsField("infiltration", QVariant.Double), - QgsField("precipitation", QVariant.Double), - QgsField("urban_runoff", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "Basin / time" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("time", QVariant.DateTime), + QgsField("node_id", QVariant.Int), + QgsField("drainage", QVariant.Double), + QgsField("potential_evaporation", QVariant.Double), + QgsField("infiltration", QVariant.Double), + QgsField("precipitation", QVariant.Double), + QgsField("urban_runoff", QVariant.Double), + ] + + +class BasinSubgridLevel(Input): + @classmethod + def input_type(cls) -> str: + return "Basin / subgrid" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("subgrid_id", QVariant.Int), + QgsField("node_id", QVariant.Int), + QgsField("basin_level", QVariant.Double), + QgsField("subgrid_level", QVariant.Double), + ] class BasinState(Input): - input_type = "Basin / state" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("level", QVariant.Double), - QgsField("concentration", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "Basin / state" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("level", QVariant.Double), + QgsField("concentration", QVariant.Double), + ] class TabulatedRatingCurveStatic(Input): - input_type = "TabulatedRatingCurve / static" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("active", QVariant.Bool), - QgsField("level", QVariant.Double), - QgsField("discharge", QVariant.Double), - QgsField("control_state", QVariant.String), - ] + @classmethod + def input_type(cls) -> str: + return "TabulatedRatingCurve / static" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("active", QVariant.Bool), + QgsField("level", QVariant.Double), + QgsField("discharge", QVariant.Double), + QgsField("control_state", QVariant.String), + ] class TabulatedRatingCurveTime(Input): - input_type = "TabulatedRatingCurve / time" - geometry_type = "No Geometry" - attributes = [ - QgsField("time", QVariant.DateTime), - QgsField("node_id", QVariant.Int), - QgsField("level", QVariant.Double), - QgsField("discharge", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "TabulatedRatingCurve / time" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("time", QVariant.DateTime), + QgsField("node_id", QVariant.Int), + QgsField("level", QVariant.Double), + QgsField("discharge", QVariant.Double), + ] class FractionalFlowStatic(Input): - input_type = "FractionalFlow / static" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("fraction", QVariant.Double), - QgsField("control_state", QVariant.String), - ] + @classmethod + def input_type(cls) -> str: + return "FractionalFlow / static" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("fraction", QVariant.Double), + QgsField("control_state", QVariant.String), + ] class LinearResistanceStatic(Input): - input_type = "LinearResistance / static" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("active", QVariant.Bool), - QgsField("resistance", QVariant.Double), - QgsField("control_state", QVariant.String), - ] + @classmethod + def input_type(cls) -> str: + return "LinearResistance / static" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("active", QVariant.Bool), + QgsField("resistance", QVariant.Double), + QgsField("control_state", QVariant.String), + ] class ManningResistanceStatic(Input): - input_type = "ManningResistance / static" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("active", QVariant.Bool), - QgsField("length", QVariant.Double), - QgsField("manning_n", QVariant.Double), - QgsField("profile_width", QVariant.Double), - QgsField("profile_slope", QVariant.Double), - QgsField("control_state", QVariant.String), - ] + @classmethod + def input_type(cls) -> str: + return "ManningResistance / static" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("active", QVariant.Bool), + QgsField("length", QVariant.Double), + QgsField("manning_n", QVariant.Double), + QgsField("profile_width", QVariant.Double), + QgsField("profile_slope", QVariant.Double), + QgsField("control_state", QVariant.String), + ] class LevelBoundaryStatic(Input): - input_type = "LevelBoundary / static" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("active", QVariant.Bool), - QgsField("level", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "LevelBoundary / static" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("active", QVariant.Bool), + QgsField("level", QVariant.Double), + ] class LevelBoundaryTime(Input): - input_type = "LevelBoundary / time" - geometry_type = "No Geometry" - attributes = [ - QgsField("time", QVariant.DateTime), - QgsField("node_id", QVariant.Int), - QgsField("time", QVariant.DateTime), - QgsField("level", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "LevelBoundary / time" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("time", QVariant.DateTime), + QgsField("node_id", QVariant.Int), + QgsField("time", QVariant.DateTime), + QgsField("level", QVariant.Double), + ] class PumpStatic(Input): - input_type = "Pump / static" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("active", QVariant.Bool), - QgsField("flow_rate", QVariant.Double), - QgsField("min_flow_rate", QVariant.Double), - QgsField("max_flow_rate", QVariant.Double), - QgsField("control_state", QVariant.String), - ] + @classmethod + def input_type(cls) -> str: + return "Pump / static" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("active", QVariant.Bool), + QgsField("flow_rate", QVariant.Double), + QgsField("min_flow_rate", QVariant.Double), + QgsField("max_flow_rate", QVariant.Double), + QgsField("control_state", QVariant.String), + ] class OutletStatic(Input): - input_type = "Outlet / static" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("active", QVariant.Bool), - QgsField("flow_rate", QVariant.Double), - QgsField("min_flow_rate", QVariant.Double), - QgsField("max_flow_rate", QVariant.Double), - QgsField("min_crest_level", QVariant.Double), - QgsField("control_state", QVariant.String), - ] + @classmethod + def input_type(cls) -> str: + return "Outlet / static" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("active", QVariant.Bool), + QgsField("flow_rate", QVariant.Double), + QgsField("min_flow_rate", QVariant.Double), + QgsField("max_flow_rate", QVariant.Double), + QgsField("min_crest_level", QVariant.Double), + QgsField("control_state", QVariant.String), + ] class TerminalStatic(Input): - input_type = "Terminal / static" - geometry_type = "No Geometry" - attributes = [QgsField("node_id", QVariant.Int)] + @classmethod + def input_type(cls) -> str: + return "Terminal / static" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [QgsField("node_id", QVariant.Int)] class FlowBoundaryStatic(Input): - input_type = "FlowBoundary / static" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("active", QVariant.Bool), - QgsField("flow_rate", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "FlowBoundary / static" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("active", QVariant.Bool), + QgsField("flow_rate", QVariant.Double), + ] class FlowBoundaryTime(Input): - input_type = "FlowBoundary / time" - geometry_type = "No Geometry" - attributes = [ - QgsField("time", QVariant.DateTime), - QgsField("node_id", QVariant.Int), - QgsField("flow_rate", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "FlowBoundary / time" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("time", QVariant.DateTime), + QgsField("node_id", QVariant.Int), + QgsField("flow_rate", QVariant.Double), + ] class DiscreteControlCondition(Input): - input_type = "DiscreteControl / condition" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("listen_feature_id", QVariant.Int), - QgsField("variable", QVariant.String), - QgsField("greater_than", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "DiscreteControl / condition" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("listen_feature_id", QVariant.Int), + QgsField("variable", QVariant.String), + QgsField("greater_than", QVariant.Double), + ] class DiscreteControlLogic(Input): - input_type = "DiscreteControl / logic" - geometry_type = "LineString" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("control_state", QVariant.String), - QgsField("truth_state", QVariant.String), - ] + @classmethod + def input_type(cls) -> str: + return "DiscreteControl / logic" + + @classmethod + def geometry_type(cls) -> str: + return "LineString" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("control_state", QVariant.String), + QgsField("truth_state", QVariant.String), + ] class PidControlStatic(Input): - input_type = "PidControl / static" - geometry_type = "LineString" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("active", QVariant.Bool), - QgsField("listen_node_id", QVariant.Int), - QgsField("target", QVariant.Double), - QgsField("proportional", QVariant.Double), - QgsField("integral", QVariant.Double), - QgsField("derivative", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "PidControl / static" + + @classmethod + def geometry_type(cls) -> str: + return "LineString" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("active", QVariant.Bool), + QgsField("listen_node_id", QVariant.Int), + QgsField("target", QVariant.Double), + QgsField("proportional", QVariant.Double), + QgsField("integral", QVariant.Double), + QgsField("derivative", QVariant.Double), + ] class PidControlTime(Input): - input_type = "PidControl / time" - geometry_type = "LineString" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("listen_node_id", QVariant.Int), - QgsField("time", QVariant.DateTime), - QgsField("target", QVariant.Double), - QgsField("proportional", QVariant.Double), - QgsField("integral", QVariant.Double), - QgsField("derivative", QVariant.Double), - ] + @classmethod + def input_type(cls) -> str: + return "PidControl / time" + + @classmethod + def geometry_type(cls) -> str: + return "LineString" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("listen_node_id", QVariant.Int), + QgsField("time", QVariant.DateTime), + QgsField("target", QVariant.Double), + QgsField("proportional", QVariant.Double), + QgsField("integral", QVariant.Double), + QgsField("derivative", QVariant.Double), + ] class UserStatic(Input): - input_type = "User / static" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("active", QVariant.Bool), - QgsField("demand", QVariant.Double), - QgsField("return_factor", QVariant.Double), - QgsField("priority", QVariant.Int), - ] + @classmethod + def input_type(cls) -> str: + return "User / static" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("active", QVariant.Bool), + QgsField("demand", QVariant.Double), + QgsField("return_factor", QVariant.Double), + QgsField("priority", QVariant.Int), + ] class UserTime(Input): - input_type = "User / time" - geometry_type = "No Geometry" - attributes = [ - QgsField("node_id", QVariant.Int), - QgsField("time", QVariant.DateTime), - QgsField("demand", QVariant.Double), - QgsField("return_factor", QVariant.Double), - QgsField("priority", QVariant.Int), - ] - - -NODES = {cls.input_type: cls for cls in Input.__subclasses__()} -NONSPATIALNODETYPES = { + @classmethod + def input_type(cls) -> str: + return "User / time" + + @classmethod + def geometry_type(cls) -> str: + return "No Geometry" + + @classmethod + def attributes(cls) -> list[QgsField]: + return [ + QgsField("node_id", QVariant.Int), + QgsField("time", QVariant.DateTime), + QgsField("demand", QVariant.Double), + QgsField("return_factor", QVariant.Double), + QgsField("priority", QVariant.Int), + ] + + +NODES: dict[str, type[Input]] = { + cls.input_type(): cls # type: ignore[type-abstract] # mypy doesn't see that all classes are concrete. + for cls in Input.__subclasses__() +} +NONSPATIALNODETYPES: set[str] = { cls.nodetype() for cls in Input.__subclasses__() if not cls.is_spatial() } EDGETYPES = {"flow", "control"} -def load_nodes_from_geopackage(path: str) -> dict[str, Input]: +def load_nodes_from_geopackage(path: Path) -> dict[str, Input]: # List the names in the geopackage gpkg_names = geopackage.layers(path) nodes = {} diff --git a/ribasim_qgis/core/topology.py b/ribasim_qgis/core/topology.py index 70d739021..301b66113 100644 --- a/ribasim_qgis/core/topology.py +++ b/ribasim_qgis/core/topology.py @@ -1,6 +1,19 @@ +from collections.abc import Iterable +from typing import TYPE_CHECKING, cast + import numpy as np -from qgis import processing -from qgis.core import QgsVectorLayer + +if TYPE_CHECKING: + from numpy.typing import NDArray +else: + from collections.abc import Sequence + + NDArray: type = Sequence + +# qgis is monkey patched by plugins.processing. +# Importing from plugins directly for mypy +from plugins import processing +from qgis.core import QgsFeature, QgsVectorLayer from qgis.core.additions.edit import edit @@ -16,9 +29,11 @@ def explode_lines(edge: QgsVectorLayer) -> None: # Avoid infinite recursion and stackoverflow edge.blockSignals(True) provider = edge.dataProvider() + assert provider is not None with edit(edge): - provider.deleteFeatures([f.id() for f in edge.getFeatures()]) + edge_iterator = cast(Iterable[QgsFeature], edge.getFeatures()) + provider.deleteFeatures([f.id() for f in edge_iterator]) new_features = list(memory_layer.getFeatures()) for i, feature in enumerate(new_features): feature["fid"] = i + 1 @@ -29,7 +44,11 @@ def explode_lines(edge: QgsVectorLayer) -> None: return -def derive_connectivity(node_index, node_xy, edge_xy) -> tuple[np.ndarray, np.ndarray]: +def derive_connectivity( + node_index: NDArray[np.int_], + node_xy: NDArray[np.float_], + edge_xy: NDArray[np.float_], +) -> tuple[NDArray[np.int_], NDArray[np.int_]]: """ Derive connectivity on the basis of xy locations. diff --git a/ribasim_qgis/metadata.txt b/ribasim_qgis/metadata.txt index 81fa43762..a8326a55e 100644 --- a/ribasim_qgis/metadata.txt +++ b/ribasim_qgis/metadata.txt @@ -7,7 +7,7 @@ name=Ribasim-QGIS qgisMinimumVersion=3.0 description=QGIS plugin to setup Ribasim models -version=0.3 +version=0.4 author=Deltares and contributors email=ribasim.info@deltares.nl diff --git a/ribasim_qgis/scripts/enable_plugin.py b/ribasim_qgis/scripts/enable_plugin.py index 3d7b280b3..c1e40c62e 100644 --- a/ribasim_qgis/scripts/enable_plugin.py +++ b/ribasim_qgis/scripts/enable_plugin.py @@ -1,4 +1,5 @@ import configparser +import sys import platformdirs @@ -27,3 +28,8 @@ def enable_plugin(plugin_name: str) -> None: with config_file.open("w") as f: config.write(f) + + +if __name__ == "__main__": + print(f"Enabling QGIS plugin {sys.argv[1]}") + enable_plugin(sys.argv[1]) diff --git a/ribasim_qgis/scripts/install_imod_qgis.py b/ribasim_qgis/scripts/install_imod_qgis.py deleted file mode 100644 index 393c02ae4..000000000 --- a/ribasim_qgis/scripts/install_imod_qgis.py +++ /dev/null @@ -1,15 +0,0 @@ -import io -import zipfile - -import requests -from enable_plugin import enable_plugin - -download_url = requests.get( - "https://api.github.com/repos/Deltares/imod-qgis/releases/latest" -).json()["assets"][0]["browser_download_url"] - -package = requests.get(download_url) -z = zipfile.ZipFile(io.BytesIO(package.content)) -z.extractall(".pixi/env/Library/python/plugins") - -enable_plugin("imodqgis") diff --git a/ribasim_qgis/scripts/install_qgis_plugin.py b/ribasim_qgis/scripts/install_qgis_plugin.py new file mode 100644 index 000000000..15344ae68 --- /dev/null +++ b/ribasim_qgis/scripts/install_qgis_plugin.py @@ -0,0 +1,25 @@ +import os +import shutil +import subprocess +import sys +from pathlib import Path + + +def install_qgis_plugin(plugin_name: str): + plugin_path = Path(".pixi/env/Library/python/plugins") + + try: + subprocess.check_call(["qgis-plugin-manager", "init"], cwd=plugin_path) + subprocess.check_call(["qgis-plugin-manager", "update"], cwd=plugin_path) + subprocess.check_call( + ["qgis-plugin-manager", "install", plugin_name], cwd=plugin_path + ) + finally: + # remove the qgis-manager-plugin cache, because QGIS tries to load it as a plugin + os.remove(plugin_path / "sources.list") + shutil.rmtree(plugin_path / ".cache_qgis_plugin_manager") + + +if __name__ == "__main__": + print(f"Installing QGIS plugin {sys.argv[1]}") + install_qgis_plugin(sys.argv[1]) diff --git a/ribasim_qgis/widgets/dataset_widget.py b/ribasim_qgis/widgets/dataset_widget.py index 78c5fdeee..4490aa0af 100644 --- a/ribasim_qgis/widgets/dataset_widget.py +++ b/ribasim_qgis/widgets/dataset_widget.py @@ -4,9 +4,12 @@ This widget also allows enabling or disabling individual elements for a computation. """ +from __future__ import annotations + +from collections.abc import Iterable from datetime import datetime from pathlib import Path -from typing import Any +from typing import Any, cast import numpy as np from PyQt5.QtCore import Qt @@ -25,16 +28,24 @@ QVBoxLayout, QWidget, ) -from qgis.core import QgsMapLayer, QgsProject +from qgis.core import ( + QgsFeature, + QgsMapLayer, + QgsProject, + QgsVectorLayer, +) from qgis.core.additions.edit import edit -import ribasim_qgis.tomllib as tomllib -from ribasim_qgis.core.nodes import Edge, Node, load_nodes_from_geopackage +from ribasim_qgis.core.model import ( + get_database_path_from_model_file, + get_directory_path_from_model_file, +) +from ribasim_qgis.core.nodes import Edge, Input, Node, load_nodes_from_geopackage from ribasim_qgis.core.topology import derive_connectivity, explode_lines class DatasetTreeWidget(QTreeWidget): - def __init__(self, parent=None): + def __init__(self, parent: QWidget | None): super().__init__(parent) self.setSelectionMode(QAbstractItemView.ExtendedSelection) self.setHeaderHidden(True) @@ -56,16 +67,16 @@ def items(self) -> list[QTreeWidgetItem]: def add_item(self, name: str, enabled: bool = True): item = QTreeWidgetItem() self.addTopLevelItem(item) - item.checkbox = QCheckBox() - item.checkbox.setChecked(True) - item.checkbox.setEnabled(enabled) - self.setItemWidget(item, 0, item.checkbox) + checkbox = QCheckBox() + checkbox.setChecked(True) + checkbox.setEnabled(enabled) + self.setItemWidget(item, 0, checkbox) item.setText(1, name) return item - def add_node_layer(self, element) -> None: + def add_node_layer(self, element: Input) -> None: # These are mandatory elements, cannot be unticked - item = self.add_item(name=element.name, enabled=True) + item = self.add_item(name=element.input_type(), enabled=True) item.element = element def remove_geopackage_layers(self) -> None: @@ -93,8 +104,9 @@ def remove_geopackage_layers(self) -> None: return # Start deleting - elements = {item.element for item in selection} + elements = {item.element for item in selection} # type: ignore[attr-defined] # TODO: dynamic item.element should be in some dict. qgs_instance = QgsProject.instance() + assert qgs_instance is not None for element in elements: layer = element.layer @@ -124,10 +136,13 @@ def remove_geopackage_layers(self) -> None: class DatasetWidget(QWidget): - def __init__(self, parent): + def __init__(self, parent: QWidget): + from ribasim_qgis.widgets.ribasim_widget import RibasimWidget + super().__init__(parent) - self.parent = parent - self.dataset_tree = DatasetTreeWidget() + + self.ribasim_widget = cast(RibasimWidget, parent) + self.dataset_tree = DatasetTreeWidget(self) self.dataset_tree.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) self.dataset_line_edit = QLineEdit() self.dataset_line_edit.setEnabled(False) # Just used as a viewing port @@ -141,8 +156,9 @@ def __init__(self, parent): self.suppress_popup_checkbox.stateChanged.connect(self.suppress_popup_changed) self.remove_button.clicked.connect(self.remove_geopackage_layer) self.add_button.clicked.connect(self.add_selection_to_qgis) - self.edge_layer = None - self.node_layer = None + self.edge_layer: QgsVectorLayer | None = None + self.node_layer: QgsVectorLayer | None = None + # Layout dataset_layout = QVBoxLayout() dataset_row = QHBoxLayout() @@ -159,13 +175,15 @@ def __init__(self, parent): self.setLayout(dataset_layout) @property - def path(self) -> str: + def path(self) -> Path: """Returns currently active path to Ribasim model (.toml)""" - return self.dataset_line_edit.text() + return Path(self.dataset_line_edit.text()) def explode_and_connect(self) -> None: node = self.node_layer edge = self.edge_layer + assert edge is not None + assert node is not None explode_lines(edge) n_node = node.featureCount() @@ -175,14 +193,16 @@ def explode_and_connect(self) -> None: node_xy = np.empty((n_node, 2), dtype=float) node_index = np.empty(n_node, dtype=int) - for i, feature in enumerate(node.getFeatures()): + node_iterator = cast(Iterable[QgsFeature], node.getFeatures()) + for i, feature in enumerate(node_iterator): point = feature.geometry().asPoint() node_xy[i, 0] = point.x() node_xy[i, 1] = point.y() node_index[i] = feature.attribute(0) # Store the feature id edge_xy = np.empty((n_edge, 2, 2), dtype=float) - for i, feature in enumerate(edge.getFeatures()): + edge_iterator = cast(Iterable[QgsFeature], edge.getFeatures()) + for i, feature in enumerate(edge_iterator): geometry = feature.geometry().asPolyline() for j, point in enumerate(geometry): edge_xy[i, j, 0] = point.x() @@ -197,7 +217,8 @@ def explode_and_connect(self) -> None: # Avoid infinite recursion edge.blockSignals(True) with edit(edge): - for feature, id1, id2 in zip(edge.getFeatures(), from_id, to_id): + edge_iterator = cast(Iterable[QgsFeature], edge.getFeatures()) + for feature, id1, id2 in zip(edge_iterator, from_id, to_id): fid = feature.id() # Nota bene: will fail with numpy integers, has to be Python type! edge.changeAttributeValue(fid, field1, int(id1)) @@ -216,8 +237,8 @@ def add_layer( suppress: bool = False, on_top: bool = False, labels: Any = None, - ) -> QgsMapLayer: - return self.parent.add_layer( + ) -> QgsMapLayer | None: + return self.ribasim_widget.add_layer( layer, destination, renderer, @@ -243,12 +264,12 @@ def add_selection_to_qgis(self) -> None: def load_geopackage(self) -> None: """Load the layers of a GeoPackage into the Layers Panel""" self.dataset_tree.clear() - geo_path = self._get_database_path_from_model_file() + geo_path = get_database_path_from_model_file(self.path) nodes = load_nodes_from_geopackage(geo_path) for node_layer in nodes.values(): self.dataset_tree.add_node_layer(node_layer) - name = str(Path(self.path).stem) - self.parent.create_groups(name) + name = self.path.stem + self.ribasim_widget.create_groups(name) for item in self.dataset_tree.items(): self.add_item_to_qgis(item) @@ -258,33 +279,32 @@ def load_geopackage(self) -> None: self.edge_layer.editingStopped.connect(self.explode_and_connect) return - def _get_database_path_from_model_file(self) -> str: - with open(self.path, "rb") as f: - input_dir = Path(tomllib.load(f)["input_dir"]) - # The .joinpath method (/) of pathlib.Path will take care of an absolute input_dir. - # No need to check it ourselves! - return str((Path(self.path).parent / input_dir / "database.gpkg").resolve()) - def new_model(self) -> None: """Create a new Ribasim model file, and set it as the active dataset.""" path, _ = QFileDialog.getSaveFileName(self, "Select file", "", "*.toml") if path != "": # Empty string in case of cancel button press self.dataset_line_edit.setText(path) - geo_path = Path(self.path).parent.joinpath("database.gpkg") - self._write_new_model(geo_path.name) + geo_path = self.path.with_name("database.gpkg") + self._write_new_model() + for input_type in (Node, Edge): - instance = input_type.create(str(geo_path), self.parent.crs, names=[]) + instance = input_type.create( + geo_path, + self.ribasim_widget.crs, + names=[], + ) instance.write() self.load_geopackage() - self.parent.toggle_node_buttons(True) + self.ribasim_widget.toggle_node_buttons(True) - def _write_new_model(self, database_name: str) -> None: + def _write_new_model(self) -> None: with open(self.path, "w") as f: f.writelines( [ - f'database = "{database_name}"\n', f"starttime = {datetime(2020, 1, 1)}\n", - f"endtime = {datetime(2030, 1, 1)}\n", + f"endtime = {datetime(2021, 1, 1)}\n", + 'input_dir = "."\n', + 'results_dir = "results"\n', ] ) @@ -295,7 +315,8 @@ def open_model(self) -> None: if path != "": # Empty string in case of cancel button press self.dataset_line_edit.setText(path) self.load_geopackage() - self.parent.toggle_node_buttons(True) + self.ribasim_widget.toggle_node_buttons(True) + self.refresh_results() self.dataset_tree.sortByColumn(0, Qt.SortOrder.AscendingOrder) def remove_geopackage_layer(self) -> None: @@ -325,7 +346,38 @@ def active_nodes(self): def selection_names(self) -> set[str]: selection = self.dataset_tree.items() # Append associated items - return {item.element.name for item in selection} + return {item.element.input_type() for item in selection} # type: ignore # TODO: dynamic item.element should be in some dict. - def add_node_layer(self, element) -> None: + def add_node_layer(self, element: Input) -> None: self.dataset_tree.add_node_layer(element) + + def refresh_results(self) -> None: + self.__set_node_results() + self.__set_edge_results() + + def __set_node_results(self) -> None: + node_layer = self.ribasim_widget.node_layer + assert node_layer is not None + self.__set_results(node_layer, "node_id", "basin.arrow") + + def __set_edge_results(self) -> None: + edge_layer = self.ribasim_widget.edge_layer + assert edge_layer is not None + self.__set_results(edge_layer, "edge_id", "flow.arrow") + + def __set_results( + self, + layer: QgsVectorLayer, + column: str, + output_file_name: str, + ) -> None: + path = ( + get_directory_path_from_model_file( + self.ribasim_widget.path, property="results_dir" + ) + / output_file_name + ) + if layer is not None: + layer.setCustomProperty("arrow_type", "timeseries") + layer.setCustomProperty("arrow_path", str(path)) + layer.setCustomProperty("arrow_fid_column", column) diff --git a/ribasim_qgis/widgets/nodes_widget.py b/ribasim_qgis/widgets/nodes_widget.py index bcce08be7..9baa7a690 100644 --- a/ribasim_qgis/widgets/nodes_widget.py +++ b/ribasim_qgis/widgets/nodes_widget.py @@ -1,16 +1,19 @@ from functools import partial +from typing import cast from PyQt5.QtWidgets import QGridLayout, QPushButton, QVBoxLayout, QWidget +from ribasim_qgis.core.model import get_database_path_from_model_file from ribasim_qgis.core.nodes import NODES class NodesWidget(QWidget): - def __init__(self, parent): - super().__init__(parent) - self.parent = parent + def __init__(self, parent: QWidget): + from ribasim_qgis.widgets.ribasim_widget import RibasimWidget - self.node_buttons = {} + super().__init__(parent) + self.ribasim_widget = cast(RibasimWidget, parent) + self.node_buttons: dict[str, QPushButton] = {} for node in NODES: if node in ("Node", "Edge"): continue @@ -19,6 +22,7 @@ def __init__(self, parent): self.node_buttons[node] = button self.toggle_node_buttons(False) # no dataset loaded yet + # layout node_layout = QVBoxLayout() node_grid = QGridLayout() n_row = -(len(self.node_buttons) // -2) # Ceiling division @@ -53,13 +57,17 @@ def new_node_layer(self, node_type: str) -> None: Name of the element type. """ klass = NODES[node_type] - names = self.parent.selection_names() - node = klass.create(self.parent.path, self.parent.crs, names) + names = self.ribasim_widget.selection_names() + node = klass.create( + get_database_path_from_model_file(self.ribasim_widget.path), + self.ribasim_widget.crs, + names, + ) # Write to geopackage node.write() # Add to QGIS - self.parent.add_layer( + self.ribasim_widget.add_layer( node.layer, "Ribasim Input", node.renderer, labels=node.labels ) # Add to dataset tree - self.parent.add_node_layer(node) + self.ribasim_widget.add_node_layer(node) diff --git a/ribasim_qgis/widgets/results_widget.py b/ribasim_qgis/widgets/results_widget.py deleted file mode 100644 index e096391b1..000000000 --- a/ribasim_qgis/widgets/results_widget.py +++ /dev/null @@ -1,36 +0,0 @@ -from PyQt5.QtWidgets import QFileDialog, QPushButton, QVBoxLayout, QWidget - - -class ResultsWidget(QWidget): - def __init__(self, parent): - super().__init__(parent) - self.parent = parent - self.node_results_button = QPushButton("Associate Node Results") - self.edge_results_button = QPushButton("Associate Edge Results") - self.node_results_button.clicked.connect(self.set_node_results) - self.edge_results_button.clicked.connect(self.set_edge_results) - layout = QVBoxLayout() - layout.addWidget(self.node_results_button) - layout.addWidget(self.edge_results_button) - layout.addStretch() - self.setLayout(layout) - - def _set_results(self, layer, column: str): - path, _ = QFileDialog.getOpenFileName(self, "Select file", "", "*.arrow") - if path == "": - return - if layer is not None: - layer.setCustomProperty("arrow_type", "timeseries") - layer.setCustomProperty("arrow_path", path) - layer.setCustomProperty("arrow_fid_column", column) - return - - def set_node_results(self): - node_layer = self.parent.dataset_widget.node_layer - self._set_results(node_layer, "node_id") - return - - def set_edge_results(self): - edge_layer = self.parent.dataset_widget.edge_layer - self._set_results(edge_layer, "edge_id") - return diff --git a/ribasim_qgis/widgets/ribasim_widget.py b/ribasim_qgis/widgets/ribasim_widget.py index aea0e364c..aaac74441 100644 --- a/ribasim_qgis/widgets/ribasim_widget.py +++ b/ribasim_qgis/widgets/ribasim_widget.py @@ -5,70 +5,94 @@ connection to the QGIS Layers Panel, and ensures there is a group for the Ribasim layers there. """ +from __future__ import annotations + from pathlib import Path -from typing import Any +from typing import Any, cast from PyQt5.QtWidgets import QTabWidget, QVBoxLayout, QWidget -from qgis.core import QgsEditFormConfig, QgsMapLayer, QgsProject - +from qgis.core import ( + QgsAbstractVectorLayerLabeling, + QgsCoordinateReferenceSystem, + QgsEditFormConfig, + QgsFeatureRenderer, + QgsLayerTreeGroup, + QgsMapLayer, + QgsProject, + QgsVectorLayer, +) +from qgis.gui import QgisInterface + +from ribasim_qgis.core.nodes import Input from ribasim_qgis.widgets.dataset_widget import DatasetWidget from ribasim_qgis.widgets.nodes_widget import NodesWidget -from ribasim_qgis.widgets.results_widget import ResultsWidget PYQT_DELETED_ERROR = "wrapped C/C++ object of type QgsLayerTreeGroup has been deleted" class RibasimWidget(QWidget): - def __init__(self, parent, iface): + def __init__(self, parent: QWidget, iface: QgisInterface): super().__init__(parent) self.iface = iface self.message_bar = self.iface.messageBar() - self.dataset_widget = DatasetWidget(self) - self.nodes_widget = NodesWidget(self) - self.results_widget = ResultsWidget(self) + self.__dataset_widget = DatasetWidget(self) + self.__nodes_widget = NodesWidget(self) # Layout - self.layout = QVBoxLayout() + layout = QVBoxLayout() self.tabwidget = QTabWidget() - self.layout.addWidget(self.tabwidget) - self.tabwidget.addTab(self.dataset_widget, "Model") - self.tabwidget.addTab(self.nodes_widget, "Nodes") - self.tabwidget.addTab(self.results_widget, "Results") - self.setLayout(self.layout) + layout.addWidget(self.tabwidget) + self.tabwidget.addTab(self.__dataset_widget, "Model") + self.tabwidget.addTab(self.__nodes_widget, "Nodes") + self.setLayout(layout) # QGIS Layers Panel groups - self.group = None - self.groups = {} + self.group: QgsLayerTreeGroup | None = None + self.groups: dict[str, QgsLayerTreeGroup] = {} return # Inter-widget communication # -------------------------- @property - def path(self) -> str: - return self.dataset_widget.path + def path(self) -> Path: + return self.__dataset_widget.path + + @property + def node_layer(self) -> QgsVectorLayer | None: + return self.__dataset_widget.node_layer + + @property + def edge_layer(self) -> QgsVectorLayer | None: + return self.__dataset_widget.edge_layer @property - def crs(self) -> Any: + def crs(self) -> QgsCoordinateReferenceSystem: """Returns coordinate reference system of current mapview""" - return self.iface.mapCanvas().mapSettings().destinationCrs() + map_canvas = self.iface.mapCanvas() + assert map_canvas is not None + map_settings = map_canvas.mapSettings() + assert map_settings is not None + return map_settings.destinationCrs() - def add_node_layer(self, element: Any): - self.dataset_widget.add_node_layer(element) + def add_node_layer(self, element: Input): + self.__dataset_widget.add_node_layer(element) def toggle_node_buttons(self, state: bool) -> None: - self.nodes_widget.toggle_node_buttons(state) + self.__nodes_widget.toggle_node_buttons(state) def selection_names(self): - return self.dataset_widget.selection_names() + return self.__dataset_widget.selection_names() # QGIS layers # ----------- def create_subgroup(self, name: str, part: str) -> None: try: + assert self.group is not None value = self.group.addGroup(f"{name}-{part}") + assert value is not None self.groups[part] = value except RuntimeError as e: if e.args[0] == PYQT_DELETED_ERROR: @@ -78,7 +102,10 @@ def create_subgroup(self, name: str, part: str) -> None: def create_groups(self, name: str) -> None: """Create an empty legend group in the QGIS Layers Panel.""" - root = QgsProject.instance().layerTreeRoot() + project = QgsProject.instance() + assert project is not None + root = project.layerTreeRoot() + assert root is not None self.group = root.addGroup(name) self.create_subgroup(name, "Ribasim Input") @@ -104,13 +131,13 @@ def add_to_group(self, maplayer: Any, destination: str, on_top: bool): def add_layer( self, - layer: Any, - destination: Any, - renderer: Any = None, - suppress: bool = None, + layer: QgsVectorLayer, + destination: str, + renderer: QgsFeatureRenderer | None = None, + suppress: bool | None = None, on_top: bool = False, - labels: Any = None, - ) -> QgsMapLayer: + labels: QgsAbstractVectorLayerLabeling | None = None, + ) -> QgsMapLayer | None: """ Add a layer to the Layers Panel @@ -137,15 +164,18 @@ def add_layer( maplayer: QgsMapLayer or None """ if layer is None: - return + return None add_to_legend = self.group is None - maplayer = QgsProject.instance().addMapLayer(layer, add_to_legend) + project = QgsProject.instance() + assert project is not None + maplayer = cast(QgsVectorLayer, project.addMapLayer(layer, add_to_legend)) + assert maplayer is not None if suppress is not None: config = maplayer.editFormConfig() config.setSuppress( - QgsEditFormConfig.SuppressOn + QgsEditFormConfig.FeatureFormSuppress.SuppressOn if suppress - else QgsEditFormConfig.SuppressDefault + else QgsEditFormConfig.FeatureFormSuppress.SuppressDefault ) maplayer.setEditFormConfig(config) if renderer is not None: diff --git a/utils/runstats.jl b/utils/runstats.jl index 9138b585b..ee14afcc8 100644 --- a/utils/runstats.jl +++ b/utils/runstats.jl @@ -18,7 +18,7 @@ using LibGit2 "Add key config settings like solver settings to a dictionary" function add_config!(dict, config::Ribasim.Config) - confdict = to_dict(config) + confdict = to_dict(getfield(config, :toml)) for (k, v) in confdict["solver"] if k == "saveat" # convert possible vector to scalar From 4c0af8291055226593c622f3119fdc236dbee542 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Wed, 29 Nov 2023 09:54:27 +0100 Subject: [PATCH 7/9] Merge error fix --- core/src/bmi.jl | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/core/src/bmi.jl b/core/src/bmi.jl index b2e592c7c..e7a3d4ff5 100644 --- a/core/src/bmi.jl +++ b/core/src/bmi.jl @@ -520,20 +520,6 @@ function save_subgrid_level(u, t, integrator) return copy(integrator.p.subgrid.level) end -function update_subgrid_level!(integrator)::Nothing - basin_level = get_tmp(integrator.p.basin.current_level, 0) - subgrid = integrator.p.subgrid - for (i, (index, interp)) in enumerate(zip(subgrid.basin_index, subgrid.interpolations)) - subgrid.level[i] = interp(basin_level[index]) - end -end - -"Interpolate the levels and save them to SavedValues" -function save_subgrid_level(u, t, integrator) - update_subgrid_level!(integrator) - return copy(integrator.p.subgrid.level) -end - "Load updates from 'Basin / time' into the parameters" function update_basin(integrator)::Nothing (; basin) = integrator.p From 5ae3ceee7fa0e142375193da285bf5cf76faa597 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Wed, 29 Nov 2023 12:27:00 +0100 Subject: [PATCH 8/9] Small vector init fix --- core/src/io.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io.jl b/core/src/io.jl index d51785c6d..b8dfa1841 100644 --- a/core/src/io.jl +++ b/core/src/io.jl @@ -187,7 +187,7 @@ function flow_table( # self-loops have no edge ID from_node_id = Int[] to_node_id = Int[] - unique_edge_ids_flow = Vector{Union{Int, Missing}}() + unique_edge_ids_flow = Union{Int, Missing}[] flow_vertical_dict_inverse = Dict(value => key for (key, value) in flow_vertical_dict) flow_dict_inverse = Dict(value => key for (key, value) in flow_dict) From 8878cd6423cabfeb6cd2ac8d3acce0f1f2508c51 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Wed, 29 Nov 2023 12:57:26 +0100 Subject: [PATCH 9/9] Clean up flow_table --- core/src/io.jl | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/core/src/io.jl b/core/src/io.jl index b8dfa1841..0f85b8d98 100644 --- a/core/src/io.jl +++ b/core/src/io.jl @@ -188,18 +188,24 @@ function flow_table( from_node_id = Int[] to_node_id = Int[] unique_edge_ids_flow = Union{Int, Missing}[] - flow_vertical_dict_inverse = Dict(value => key for (key, value) in flow_vertical_dict) - flow_dict_inverse = Dict(value => key for (key, value) in flow_dict) - for i in 1:length(flow_vertical_dict_inverse) - id = flow_vertical_dict_inverse[i] + vertical_flow_node_ids = Vector{NodeID}(undef, length(flow_vertical_dict)) + for (node_id, index) in flow_vertical_dict + vertical_flow_node_ids[index] = node_id + end + + for id in vertical_flow_node_ids push!(from_node_id, id.value) push!(to_node_id, id.value) push!(unique_edge_ids_flow, missing) end - for i in 1:length(flow_dict_inverse) - from_id, to_id = flow_dict_inverse[i] + flow_edge_ids = Vector{Tuple{NodeID, NodeID}}(undef, length(flow_dict)) + for (edge_id, index) in flow_dict + flow_edge_ids[index] = edge_id + end + + for (from_id, to_id) in flow_edge_ids push!(from_node_id, from_id.value) push!(to_node_id, to_id.value) push!(unique_edge_ids_flow, graph[from_id, to_id].id)