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