Skip to content

Commit f9ebf03

Browse files
Brad Carmanoxinabox
authored andcommitted
updated Parameter struct
1 parent ec04e3b commit f9ebf03

File tree

1 file changed

+61
-11
lines changed

1 file changed

+61
-11
lines changed

src/Blocks/sources.jl

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -428,11 +428,10 @@ end
428428
struct Parameter{T <: Real}
429429
data::Vector{T}
430430
ref::T
431-
n::Int
432431
end
433432

434433
function Base.isequal(x::Parameter, y::Parameter)
435-
b0 = x.n == y.n
434+
b0 = length(x.data) == length(y.data)
436435
if b0
437436
b1 = all(x.data .== y.data)
438437
b2 = x.ref == y.ref
@@ -465,7 +464,7 @@ Base.:^(x::Parameter, y::Parameter) = Base.power_by_squaring(x.ref, y.ref)
465464
Base.isless(x::Parameter, y::Number) = Base.isless(x.ref, y)
466465
Base.isless(y::Number, x::Parameter) = Base.isless(y, x.ref)
467466

468-
Base.copy(x::Parameter{T}) where {T} = Parameter{T}(copy(x.data), x.ref, x.n)
467+
Base.copy(x::Parameter{T}) where {T} = Parameter{T}(copy(x.data), x.ref)
469468

470469
function Base.show(io::IO, m::MIME"text/plain", p::Parameter)
471470
if !isempty(p.data)
@@ -484,9 +483,8 @@ function Parameter(x::T; tofloat = true) where {T <: Real}
484483
P = T
485484
end
486485

487-
return Parameter(P[], x, 0)
486+
return Parameter(P[], x)
488487
end
489-
Parameter(x::Vector{T}, dt::T) where {T <: Real} = Parameter(x, dt, length(x))
490488

491489
function get_sampled_data(t, memory::Parameter{T}) where {T}
492490
if t < 0
@@ -505,18 +503,19 @@ function get_sampled_data(t, memory::Parameter{T}) where {T}
505503
i2 = i1 + 1
506504

507505
t1 = (i1 - 1) * memory.ref
508-
x1 = @inbounds getindex(memory.data, i1)
506+
x1 = @inbounds memory.data[i1]
509507

510508
if t == t1
511509
return x1
512510
else
513-
if i2 > memory.n
514-
i2 = memory.n
511+
n = length(memory.data)
512+
if i2 > n
513+
i2 = n
515514
i1 = i2 - 1
516515
end
517516

518517
t2 = (i2 - 1) * memory.ref
519-
x2 = @inbounds getindex(memory.data, i2)
518+
x2 = @inbounds memory.data[i2]
520519
return linear_interpolation(x1, x2, t1, t2, t)
521520
end
522521
end
@@ -526,19 +525,26 @@ Symbolics.@register_symbolic get_sample_time(memory)
526525

527526
Symbolics.@register_symbolic get_sampled_data(t, memory)
528527

528+
get_sampled_data_const(t, memory::Parameter) = get_sampled_data(t, memory)
529+
Symbolics.@register_symbolic get_sampled_data_const(t, memory)
530+
Symbolics.derivative(::typeof(get_sampled_data_const), args::NTuple{2, Any}, ::Val{1}) = 0
531+
529532
function first_order_backwards_difference(t, memory)
530533
Δt = get_sample_time(memory)
531534
x1 = get_sampled_data(t, memory)
532-
x0 = get_sampled_data(t - Δt, memory)
535+
x0 = get_sampled_data_const(t - Δt, memory)
533536

534537
return (x1 - x0) / Δt
535538
end
536539

537540
function Symbolics.derivative(::typeof(get_sampled_data), args::NTuple{2, Any}, ::Val{1})
538-
first_order_backwards_difference(args[1], args[2])
541+
t = @inbounds args[1]
542+
memory = @inbounds args[2]
543+
first_order_backwards_difference(t, memory)
539544
end
540545

541546
SampledData(T::Type; name) = SampledData(T[], zero(T); name)
547+
SampledData(dt::T) where {T <: Real} = SampledData(T[], dt; name)
542548
function SampledData(data::Vector{T}, dt::T; name) where {T <: Real}
543549
SampledData(; name, buffer = Parameter(data, dt))
544550
end
@@ -571,3 +577,47 @@ end
571577
@deprecate Input SampledData
572578

573579
Base.convert(::Type{T}, x::Parameter{T}) where {T <: Real} = x.ref
580+
581+
# Beta Code for potential AE Hack ----------------------
582+
function set_sampled_data!(memory::Parameter{T}, t, x, Δt::Parameter{T}) where {T}
583+
if t < 0
584+
t = zero(t)
585+
end
586+
587+
if t == zero(t)
588+
empty!(memory.data)
589+
end
590+
591+
n = length(memory.data)
592+
i = round(Int, t / Δt) + 1 #expensive
593+
if i == n + 1
594+
push!(memory.data, x)
595+
elseif i<=n
596+
@inbounds memory.data[i] = x
597+
else
598+
error("Memory buffer skipped a step: n=$n, i=$i")
599+
end
600+
601+
# memory.ref = Δt
602+
603+
return x
604+
end
605+
Symbolics.@register_symbolic set_sampled_data!(memory, t, x, Δt)
606+
607+
function Symbolics.derivative(::typeof(set_sampled_data!), args::NTuple{4, Any}, ::Val{2})
608+
memory = @inbounds args[1]
609+
t = @inbounds args[2]
610+
x = @inbounds args[3]
611+
Δt = @inbounds args[4]
612+
first_order_backwards_difference(t, x, Δt, memory)
613+
end
614+
Symbolics.derivative(::typeof(set_sampled_data!), args::NTuple{4, Any}, ::Val{3}) = 1
615+
616+
function first_order_backwards_difference(t, x, Δt, memory)
617+
618+
x1 = set_sampled_data!(memory, t, x, Δt)
619+
x0 = get_sampled_data_const(t - Δt, memory)
620+
621+
return (x1 - x0) / Δt
622+
end
623+

0 commit comments

Comments
 (0)