@@ -428,11 +428,10 @@ end
428
428
struct Parameter{T <: Real }
429
429
data:: Vector{T}
430
430
ref:: T
431
- n:: Int
432
431
end
433
432
434
433
function Base. isequal (x:: Parameter , y:: Parameter )
435
- b0 = x . n == y . n
434
+ b0 = length (x . data) == length (y . data)
436
435
if b0
437
436
b1 = all (x. data .== y. data)
438
437
b2 = x. ref == y. ref
@@ -465,7 +464,7 @@ Base.:^(x::Parameter, y::Parameter) = Base.power_by_squaring(x.ref, y.ref)
465
464
Base. isless (x:: Parameter , y:: Number ) = Base. isless (x. ref, y)
466
465
Base. isless (y:: Number , x:: Parameter ) = Base. isless (y, x. ref)
467
466
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)
469
468
470
469
function Base. show (io:: IO , m:: MIME"text/plain" , p:: Parameter )
471
470
if ! isempty (p. data)
@@ -484,9 +483,8 @@ function Parameter(x::T; tofloat = true) where {T <: Real}
484
483
P = T
485
484
end
486
485
487
- return Parameter (P[], x, 0 )
486
+ return Parameter (P[], x)
488
487
end
489
- Parameter (x:: Vector{T} , dt:: T ) where {T <: Real } = Parameter (x, dt, length (x))
490
488
491
489
function get_sampled_data (t, memory:: Parameter{T} ) where {T}
492
490
if t < 0
@@ -505,18 +503,19 @@ function get_sampled_data(t, memory::Parameter{T}) where {T}
505
503
i2 = i1 + 1
506
504
507
505
t1 = (i1 - 1 ) * memory. ref
508
- x1 = @inbounds getindex ( memory. data, i1)
506
+ x1 = @inbounds memory. data[i1]
509
507
510
508
if t == t1
511
509
return x1
512
510
else
513
- if i2 > memory. n
514
- i2 = memory. n
511
+ n = length (memory. data)
512
+ if i2 > n
513
+ i2 = n
515
514
i1 = i2 - 1
516
515
end
517
516
518
517
t2 = (i2 - 1 ) * memory. ref
519
- x2 = @inbounds getindex ( memory. data, i2)
518
+ x2 = @inbounds memory. data[i2]
520
519
return linear_interpolation (x1, x2, t1, t2, t)
521
520
end
522
521
end
@@ -526,19 +525,26 @@ Symbolics.@register_symbolic get_sample_time(memory)
526
525
527
526
Symbolics. @register_symbolic get_sampled_data (t, memory)
528
527
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
+
529
532
function first_order_backwards_difference (t, memory)
530
533
Δt = get_sample_time (memory)
531
534
x1 = get_sampled_data (t, memory)
532
- x0 = get_sampled_data (t - Δt, memory)
535
+ x0 = get_sampled_data_const (t - Δt, memory)
533
536
534
537
return (x1 - x0) / Δt
535
538
end
536
539
537
540
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)
539
544
end
540
545
541
546
SampledData (T:: Type ; name) = SampledData (T[], zero (T); name)
547
+ SampledData (dt:: T ) where {T <: Real } = SampledData (T[], dt; name)
542
548
function SampledData (data:: Vector{T} , dt:: T ; name) where {T <: Real }
543
549
SampledData (; name, buffer = Parameter (data, dt))
544
550
end
571
577
@deprecate Input SampledData
572
578
573
579
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