Skip to content

Commit

Permalink
WIP Entity rework
Browse files Browse the repository at this point in the history
  • Loading branch information
Tasqu committed Jan 28, 2025
1 parent 9db05f5 commit 83813b2
Show file tree
Hide file tree
Showing 9 changed files with 104 additions and 383 deletions.
9 changes: 4 additions & 5 deletions src/SpineInterface.jl
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,11 @@ export Map
export map_to_time_series
export maximum_parameter_value
export members
export Object
export Entity
export object_class
export object_classes
export ObjectClass
export ObjectLike
export EntityClass
export EntityLike
export overlap_duration
export overlaps
export Parameter
Expand All @@ -94,8 +94,7 @@ export realize
export refresh!
export relationship_class
export relationship_classes
export RelationshipClass
export RelationshipLike
export EntityLike
export roll!
export run_request
export set_value_translator
Expand Down
56 changes: 28 additions & 28 deletions src/api/core.jl
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
anything
The singleton instance of type [`Anything`](@ref), used to specify *all-pass* filters
in calls to [`RelationshipClass()`](@ref).
in calls to [`EntityClass()`](@ref).
"""
anything = Anything()

Expand Down Expand Up @@ -60,7 +60,7 @@ julia> commodity(state_of_matter=commodity(:gas))
wind
```
"""
function (oc::ObjectClass)(; kwargs...)
function (oc::EntityClass)(; kwargs...)
isempty(kwargs) && return oc.objects
function cond(o)
for (p, v) in kwargs
Expand All @@ -71,12 +71,12 @@ function (oc::ObjectClass)(; kwargs...)
end
filter(cond, oc.objects)
end
function (oc::ObjectClass)(name::Symbol)
function (oc::EntityClass)(name::Symbol)
i = findfirst(o -> o.name == name, oc.objects)
!isnothing(i) && return oc.objects[i]
nothing
end
(oc::ObjectClass)(name::String) = oc(Symbol(name))
(oc::EntityClass)(name::String) = oc(Symbol(name))

"""
(<rc>::RelationshipClass)(;<keyword arguments>)
Expand Down Expand Up @@ -134,7 +134,7 @@ julia> node__commodity(commodity=commodity(:gas), _default=:nogas)
:nogas
```
"""
function (rc::RelationshipClass)(; _compact::Bool=true, _default::Any=[], kwargs...)
function (rc::EntityClass)(; _compact::Bool=true, _default::Any=[], kwargs...)
isempty(kwargs) && return rc.relationships
relationships = if !_compact
_find_rels(rc; kwargs...)
Expand Down Expand Up @@ -318,7 +318,7 @@ function _get_value(pv::ParameterValue{T}, kw, arg, upd, cycles; kwargs...) wher
i === nothing && return _get_value_cyclic(pv, kw, arg, upd, cycles; kwargs...)
pv.value.values[i](upd; kwargs...)
end
function _get_value(pv::ParameterValue{T}, kw, arg::Object, upd, cycles; kwargs...) where {V,T<:Map{Symbol,V}}
function _get_value(pv::ParameterValue{T}, kw, arg::Entity, upd, cycles; kwargs...) where {V,T<:Map{Symbol,V}}
i = _search_equal(pv.value.indexes, arg.name)
i === nothing && return _get_value_cyclic(pv, kw, arg, upd, cycles; kwargs...)
pv.value.values[i](upd; kwargs...)
Expand Down Expand Up @@ -480,7 +480,7 @@ julia> collect(indices(demand))
function indices(p::Parameter; kwargs...)
(ent for class in p.classes for ent in indices(p, class; kwargs...))
end
function indices(p::Parameter, class::Union{ObjectClass,RelationshipClass}; kwargs...)
function indices(p::Parameter, class::EntityClass; kwargs...)
(
ent
for ent in _entities(class; kwargs...)
Expand All @@ -496,41 +496,41 @@ Like `indices` but also yields tuples for single-dimensional entities.
function indices_as_tuples(p::Parameter; kwargs...)
(ent for class in p.classes for ent in indices_as_tuples(p, class; kwargs...))
end
function indices_as_tuples(p::Parameter, class::Union{ObjectClass,RelationshipClass}; kwargs...)
function indices_as_tuples(p::Parameter, class::EntityClass; kwargs...)
(
_entity_tuple(ent, class)
for ent in _entities(class; kwargs...)
if _get(class.parameter_values[_entity_key(ent)], p.name, class.parameter_defaults)() !== nothing
)
end

_entities(class::ObjectClass; kwargs...) = class()
_entities(class::RelationshipClass; kwargs...) = class(; _compact=false, kwargs...)
#_entities(class::ObjectClass; kwargs...) = class()
_entities(class::EntityClass; kwargs...) = class(; _compact=false, kwargs...)

_entity_key(o::ObjectLike) = o
_entity_key(r::RelationshipLike) = tuple(r...)
#_entity_key(o::ObjectLike) = o
_entity_key(r::EntityLike) = tuple(r...)

_entity_tuple(o::ObjectLike, class) = (; (class.name => o,)...)
_entity_tuple(r::RelationshipLike, class) = r
#_entity_tuple(o::ObjectLike, class) = (; (class.name => o,)...)
_entity_tuple(r::EntityLike, class) = r

classes(p::Parameter) = p.classes

push_class!(p::Parameter, class::Union{ObjectClass,RelationshipClass}) = push!(p.classes, class)
push_class!(p::Parameter, class::EntityClass) = push!(p.classes, class)

"""
add_objects!(object_class, objects)
Remove from `objects` everything that's already in `object_class`, and append the rest.
Return the modified `object_class`.
"""
function add_objects!(object_class::ObjectClass, objects::Array)
function add_objects!(object_class::EntityClass, objects::Array)
setdiff!(objects, object_class.objects)
append!(object_class.objects, objects)
merge!(object_class.parameter_values, Dict(obj => Dict() for obj in objects))
object_class
end

function add_object_parameter_values!(object_class::ObjectClass, parameter_values::Dict; merge_values=false)
function add_object_parameter_values!(object_class::EntityClass, parameter_values::Dict; merge_values=false)
add_objects!(object_class, only.(keys(parameter_values)))
do_merge! = merge_values ? mergewith!(merge!) : merge!
for (obj, vals) in parameter_values
Expand All @@ -539,12 +539,12 @@ function add_object_parameter_values!(object_class::ObjectClass, parameter_value
end
end

function add_object_parameter_defaults!(object_class::ObjectClass, parameter_defaults::Dict; merge_values=false)
function add_object_parameter_defaults!(object_class::EntityClass, parameter_defaults::Dict; merge_values=false)
do_merge! = merge_values ? mergewith!(merge!) : merge!
do_merge!(object_class.parameter_defaults, parameter_defaults)
end

function add_object!(object_class::ObjectClass, object::ObjectLike)
function add_object!(object_class::EntityClass, object::EntityLike)
add_objects!(object_class, [object])
end

Expand All @@ -554,19 +554,19 @@ end
Remove from `relationships` everything that's already in `relationship_class`, and append the rest.
Return the modified `relationship_class`.
"""
function add_relationships!(relationship_class::RelationshipClass, object_tuples::Vector{T}) where T<:ObjectTupleLike
function add_relationships!(relationship_class::EntityClass, object_tuples::Vector{T}) where T<:EntityTupleLike
relationships = [(; zip(relationship_class.object_class_names, obj_tup)...) for obj_tup in object_tuples]
add_relationships!(relationship_class, relationships)
end
function add_relationships!(relationship_class::RelationshipClass, relationships::Vector)
function add_relationships!(relationship_class::EntityClass, relationships::Vector)
relationships = setdiff(relationships, relationship_class.relationships)
_append_relationships!(relationship_class, relationships)
merge!(relationship_class.parameter_values, Dict(values(rel) => Dict() for rel in relationships))
relationship_class
end

function add_relationship_parameter_values!(
relationship_class::RelationshipClass, parameter_values::Dict; merge_values=false
relationship_class::EntityClass, parameter_values::Dict; merge_values=false
)
add_relationships!(relationship_class, collect(keys(parameter_values)))
do_merge! = merge_values ? mergewith!(merge!) : merge!
Expand All @@ -577,20 +577,20 @@ function add_relationship_parameter_values!(
end

function add_relationship_parameter_defaults!(
relationship_class::RelationshipClass, parameter_defaults::Dict; merge_values=false
relationship_class::EntityClass, parameter_defaults::Dict; merge_values=false
)
do_merge! = merge_values ? mergewith!(merge!) : merge!
do_merge!(relationship_class.parameter_defaults, parameter_defaults)
end

function add_relationship!(relationship_class::RelationshipClass, relationship::RelationshipLike)
function add_relationship!(relationship_class::EntityClass, relationship::EntityLike)
add_relationships!(relationship_class, [relationship])
end

function add_parameter_values!(cls::ObjectClass, vals; kwargs...)
function add_parameter_values!(cls::EntityClass, vals; kwargs...)
add_object_parameter_values!(cls, vals; kwargs...)
end
function add_parameter_values!(cls::RelationshipClass, vals; kwargs...)
function add_parameter_values!(cls::EntityClass, vals; kwargs...)
add_relationship_parameter_values!(cls, vals; kwargs...)
end

Expand Down Expand Up @@ -702,7 +702,7 @@ function realize(call, upd=nothing)
end
end

function add_dimension!(cls::RelationshipClass, name::Symbol, obj)
function add_dimension!(cls::EntityClass, name::Symbol, obj)
push!(cls.object_class_names, name)
push!(cls.intact_object_class_names, name)
map!(rel -> (; rel..., Dict(name => obj)...), cls.relationships, cls.relationships)
Expand All @@ -716,7 +716,7 @@ function add_dimension!(cls::RelationshipClass, name::Symbol, obj)
nothing
end

dimensions(cls::RelationshipClass) = cls.object_class_names
dimensions(cls::EntityClass) = cls.object_class_names

const __active_env = Ref(:__base__)

Expand Down
Loading

0 comments on commit 83813b2

Please sign in to comment.