Skip to content
This repository has been archived by the owner on Apr 4, 2023. It is now read-only.

Commit

Permalink
Bump Version
Browse files Browse the repository at this point in the history
  • Loading branch information
pedromxavier committed Dec 17, 2022
1 parent 2e0f55f commit 1bd00c6
Show file tree
Hide file tree
Showing 9 changed files with 285 additions and 237 deletions.
4 changes: 2 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "Anneal"
uuid = "e4d9eb7f-b088-426e-aeb5-1c0dae3d8abb"
version = "0.5.6"
version = "0.5.7"
authors = [
"pedromxavier <pedroxavier@psr-inc.com>",
"pedroripper <pedroripper@psr-inc.com>",
Expand All @@ -21,5 +21,5 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
BenchmarkTools = "1.3"
JuMP = "1"
MathOptInterface = "1"
QUBOTools = "0.5.3"
QUBOTools = "0.5.4"
julia = "1.6"
189 changes: 99 additions & 90 deletions src/interface/automatic/attributes.jl
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
# ~*~ :: MathOptInterface Attributes :: ~*~ ::
const MOI_ATTRIBUTES = Union{
MOI.Name,
MOI.Silent,
MOI.TimeLimitSec,
MOI.NumberOfThreads,
# MOI.VariablePrimalStart,
}

mutable struct MOIAttributeData{T}
const _MOI_ATTRIBUTES =
Union{MOI.Name,MOI.Silent,MOI.TimeLimitSec,MOI.NumberOfThreads,MOI.VariablePrimalStart}

mutable struct _MOIAttributeData{T}
# ~*~ Regular ~*~
name::String
silent::Bool
Expand All @@ -16,106 +11,128 @@ mutable struct MOIAttributeData{T}
# ~*~ Extra ~*~
variable_primal_start::Dict{VI,T}

function MOIAttributeData{T}(;
name::String="",
silent::Bool=false,
time_limit_sec::Union{Float64,Nothing}=nothing,
number_of_threads::Integer=Threads.nthreads(),
variable_primal_start=Dict{VI,T}()
function _MOIAttributeData{T}(;
name::String = "",
silent::Bool = false,
time_limit_sec::Union{Float64,Nothing} = nothing,
number_of_threads::Integer = Threads.nthreads(),
variable_primal_start = Dict{VI,T}(),
) where {T}

new{T}(
return new{T}(
name,
silent,
time_limit_sec,
number_of_threads,
variable_primal_start,
)
end

function MOIAttributeData(; kws...)
MOIAttributeData{Float64}(; kws...)
end
end

# ~*~ :: get :: ~*~ ::
function Base.getindex(::MOIAttributeData, ::X) where {X<:MOI.AbstractOptimizerAttribute}
function MOI.get(::_MOIAttributeData, ::X) where {X<:MOI.AbstractOptimizerAttribute}
error("Attribute '$X' is not supported")
end

Base.getindex(moiattrs::MOIAttributeData, ::MOI.Name) = moiattrs.name
Base.getindex(moiattrs::MOIAttributeData, ::MOI.Silent) = moiattrs.silent
Base.getindex(moiattrs::MOIAttributeData, ::MOI.TimeLimitSec) = moiattrs.time_limit_sec
Base.getindex(moiattrs::MOIAttributeData, ::MOI.NumberOfThreads) = moiattrs.number_of_threads
MOI.get(data::_MOIAttributeData, ::MOI.Name) = data.name
MOI.get(data::_MOIAttributeData, ::MOI.Silent) = data.silent
MOI.get(data::_MOIAttributeData, ::MOI.TimeLimitSec) = data.time_limit_sec
MOI.get(data::_MOIAttributeData, ::MOI.NumberOfThreads) = data.number_of_threads

function Base.getindex(moiattrs::MOIAttributeData{T}, ::MOI.VariablePrimalStart, vi::VI) where {T}
if haskey(moiattrs.variable_primal_start, vi)
return moiattrs.variable_primal_start[vi]
else
error("No warm-start value for '$vi'")
end
function MOI.get(data::_MOIAttributeData, ::MOI.VariablePrimalStart, vi::VI)
return get(data.variable_primal_start, vi, nothing)
end

# ~*~ :: set :: ~*~ ::
Base.setindex!(moiattrs::MOIAttributeData, name::String, ::MOI.Name) = (moiattrs.name = name)
Base.setindex!(moiattrs::MOIAttributeData, silent::Bool, ::MOI.Silent) = (moiattrs.silent = silent)
function MOI.set(data::_MOIAttributeData, ::MOI.Name, name::String)
data.name = name

function Base.setindex!(moiattrs::MOIAttributeData, time_limit_sec::Union{Float64,Nothing}, ::MOI.TimeLimitSec)
return nothing
end

function MOI.set(data::_MOIAttributeData, ::MOI.Silent, silent::Bool)
data.silent = silent

return nothing
end

function MOI.set(
data::_MOIAttributeData,
::MOI.TimeLimitSec,
time_limit_sec::Union{Float64,Nothing},
)
@assert isnothing(time_limit_sec) || time_limit_sec >= 0.0

moiattrs.time_limit_sec = time_limit_sec
data.time_limit_sec = time_limit_sec

return nothing
end

function Base.setindex!(moiattrs::MOIAttributeData, number_of_threads::Integer, ::MOI.NumberOfThreads)
function MOI.set(data::_MOIAttributeData, ::MOI.NumberOfThreads, number_of_threads::Integer)
@assert number_of_threads > 0

moiattrs.number_of_threads = number_of_threads
data.number_of_threads = number_of_threads

return nothing
end

function Base.setindex!(moiattrs::MOIAttributeData{T}, value::T, ::MOI.VariablePrimalStart, vi::VI) where {T}
moiattrs.variable_primal_start[vi] = value
function MOI.set(
data::_MOIAttributeData{T},
::MOI.VariablePrimalStart,
vi::VI,
value::T,
) where {T}
data.variable_primal_start[vi] = value

return nothing
end

function MOI.set(
data::_MOIAttributeData{T},
::MOI.VariablePrimalStart,
vi::VI,
::Nothing,
) where {T}
delete!(data.variable_primal_start, vi)

return nothing
end

# ~*~ :: Sampler Attributes :: ~*~ ::
abstract type AbstractSamplerAttribute <: MOI.AbstractOptimizerAttribute end

const _SAMPLER_ATTRIBUTES = Union{_MOI_ATTRIBUTES,<:AbstractSamplerAttribute}

mutable struct SamplerAttribute{T<:Any}
value::T
rawattr::Union{String,Nothing}
optattr::Union{<:AbstractSamplerAttribute,Nothing}

function SamplerAttribute{T}(
default::T;
rawattr::Union{String,Nothing}=nothing,
optattr::Union{<:AbstractSamplerAttribute,Nothing}=nothing
rawattr::Union{String,Nothing} = nothing,
optattr::Union{<:AbstractSamplerAttribute,Nothing} = nothing,
) where {T}
@assert !isnothing(rawattr) || !isnothing(optattr)

new{T}(default, rawattr, optattr)
end
@assert !(isnothing(rawattr) && isnothing(optattr))

function SamplerAttribute(args...)
SamplerAttribute{Any}(args...)
return new{T}(default, rawattr, optattr)
end
end

SamplerAttribute(args...) = SamplerAttribute{Any}(args...)

function Base.copy(attr::SamplerAttribute{T}) where {T}
SamplerAttribute{T}(
attr.value;
rawattr=attr.rawattr,
optattr=attr.optattr
)
return SamplerAttribute{T}(attr.value; rawattr = attr.rawattr, optattr = attr.optattr)
end

struct SamplerAttributeData{T}
struct _SamplerAttributeData{T}
rawattrs::Dict{String,SamplerAttribute}
optattrs::Dict{AbstractSamplerAttribute,SamplerAttribute}
moiattrs::MOIAttributeData{T}
moiattrs::_MOIAttributeData{T}

function SamplerAttributeData{T}(attrs::Vector) where {T}
function _SamplerAttributeData{T}(attrs::Vector) where {T}
rawattrs = Dict{String,SamplerAttribute}()
optattrs = Dict{AbstractSamplerAttribute,SamplerAttribute}()
moiattrs = MOIAttributeData{T}()
moiattrs = _MOIAttributeData{T}()

for attr::SamplerAttribute in attrs
if !isnothing(attr.rawattr)
Expand All @@ -127,80 +144,72 @@ struct SamplerAttributeData{T}
end
end

new{T}(rawattrs, optattrs, moiattrs)
return new{T}(rawattrs, optattrs, moiattrs)
end
end

# ~*~ :: get :: ~*~ ::
function Base.getindex(attrs::SamplerAttributeData, attr::MOI_ATTRIBUTES, args...)
return attrs.moiattrs[attr, args...]
function MOI.get(data::_SamplerAttributeData, attr::_MOI_ATTRIBUTES, args...)
return MOI.get(data.moiattrs, attr, args...)
end

function Base.getindex(attrs::SamplerAttributeData, attr::AbstractSamplerAttribute)
if haskey(attrs.optattrs, attr)
data = attrs.optattrs[attr]

return data.value
function MOI.get(data::_SamplerAttributeData, attr::AbstractSamplerAttribute)
if haskey(data.optattrs, attr)
return data.optattrs[attr].value
else
error("Attribute '$attr' is not supported")
end
end

function Base.getindex(attrs::SamplerAttributeData, raw_attr::String)
if haskey(attrs.rawattrs, raw_attr)
data = attrs.rawattrs[raw_attr]

return data.value
function MOI.get(data::_SamplerAttributeData, raw_attr::String)
if haskey(data.rawattrs, raw_attr)
return data.rawattrs[raw_attr].value
else
error("Attribute '$raw_attr' is not supported")
end
end

function MOI.get(sampler::AutomaticSampler, attr::Union{MOI_ATTRIBUTES,AbstractSamplerAttribute})
return sampler.attrs[attr]
function MOI.get(sampler::AutomaticSampler, attr::_SAMPLER_ATTRIBUTES)
return MOI.get(sampler.attrs, attr)
end

function MOI.get(sampler::AutomaticSampler, attr::MOI.VariablePrimalStart, vi::VI)
return sampler.attrs[attr, vi]
return MOI.get(sampler.attrs, attr, vi)
end

function MOI.get(sampler::AutomaticSampler, attr::MOI.RawOptimizerAttribute)
return sampler.attrs[attr.name]
return MOI.get(sampler.attrs, attr.name)
end

# ~*~ :: set :: ~*~ ::
function Base.setindex!(attrs::SamplerAttributeData, value, attr::MOI_ATTRIBUTES, args...)
attrs.moiattrs[attr, args...] = value
function MOI.set(data::_SamplerAttributeData, attr::_MOI_ATTRIBUTES, args...)
MOI.set(data.moiattrs, attr, args...)
end

function Base.setindex!(attrs::SamplerAttributeData, value, attr::AbstractSamplerAttribute)
if haskey(attrs.optattrs, attr)
data = attrs.optattrs[attr]

data.value = value
function MOI.set(data::_SamplerAttributeData, attr::AbstractSamplerAttribute, value)
if haskey(data.optattrs, attr)
data.optattrs[attr].value = value
else
error("Attribute '$attr' is not supported")
end
end

function Base.setindex!(attrs::SamplerAttributeData, value, raw_attr::String)
if haskey(attrs.rawattrs, raw_attr)
data = attrs.rawattrs[raw_attr]

data.value = value
function MOI.set(data::_SamplerAttributeData, raw_attr::String, value)
if haskey(data.rawattrs, raw_attr)
data.rawattrs[raw_attr].value = value
else
error("Attribute '$raw_attr' is not supported")
end
end

function MOI.set(sampler::AutomaticSampler, attr::Union{MOI_ATTRIBUTES,AbstractSamplerAttribute}, value)
sampler.attrs[attr] = value
function MOI.set(sampler::AutomaticSampler, attr::_SAMPLER_ATTRIBUTES, value)
MOI.set(sampler.attrs, attr, value)
end

function MOI.set(sampler::AutomaticSampler, attr::MOI.VariablePrimalStart, vi::VI, value)
sampler.attrs[attr, vi] = value
MOI.set(sampler.attrs, attr, vi, value)
end

function MOI.set(sampler::AutomaticSampler, attr::MOI.RawOptimizerAttribute, value)
sampler.attrs[attr.name] = value
MOI.set(sampler.attrs, attr.name, value)
end
14 changes: 8 additions & 6 deletions src/interface/automatic/macros.jl
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
const __ANEW_REGISTRY = Set{Module}()

const __ANEW_DEFAULT_PARAMS() = Dict{Symbol,Any}(
:name => "Binary Quadratic Sampler",
:sense => :min,
:domain => :bool,
:version => v"1.0.0",
:name => "QUBO Sampler",
:sense => :min,
:domain => :bool,
:version => v"1.0.0",
:attributes => Dict{Symbol,Any}[],
)

Expand Down Expand Up @@ -334,13 +334,15 @@ macro anew(raw_args...)
source::Union{QUBOTools.Model,Nothing}
target::Union{QUBOTools.Model,Nothing}
# ~*~ Attributes ~*~ #
attrs::Anneal.SamplerAttributeData{T}
attrs::Anneal._SamplerAttributeData{T}

function $(esc(id)){T}(args...; kws...) where {T}
return new{T}(
nothing,
nothing,
Anneal.SamplerAttributeData{T}(copy.(__SAMPLER_ATTRIBUTES)),
Anneal._SamplerAttributeData{T}(
copy.(__SAMPLER_ATTRIBUTES)
),
)
end
end
Expand Down
Loading

2 comments on commit 1bd00c6

@pedromxavier
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@JuliaRegistrator
Copy link

Choose a reason for hiding this comment

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

Registration pull request created: JuliaRegistries/General/74305

After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.

This will be done automatically if the Julia TagBot GitHub Action is installed, or can be done manually through the github interface, or via:

git tag -a v0.5.7 -m "<description of version>" 1bd00c6f575c8a0ec1203718e85a85618f7f8e30
git push origin v0.5.7

Please sign in to comment.