LIBRARY
Math.Tests.IntegerToReal
Converts constant and time-varying Integer signals back to Real.
Chains Constant(5.0) → RealToInteger → IntegerToReal and verifies that the final Real output is 5. A second chain feeds a sine wave (amplitude 5) through RealToInteger into IntegerToReal so the Real output steps through the rounded integer values over time.
Usage
BlockComponents.Math.Tests.IntegerToReal()
Behavior
julia
using BlockComponents #hide
using ModelingToolkit #hide
@named sys = BlockComponents.Math.Tests.IntegerToReal() #hide
let eqs = full_equations(sys); Base.length(eqs) > 25 ? nothing : eqs end #hide<< @example-block not executed in draft mode >>Source
dyad
"""
Converts constant and time-varying Integer signals back to Real.
Chains Constant(5.0) → RealToInteger → IntegerToReal and verifies that the
final Real output is 5. A second chain feeds a sine wave (amplitude 5) through
RealToInteger into IntegerToReal so the Real output steps through the rounded
integer values over time.
"""
test component IntegerToReal
"Constant source providing the Real input"
c1 = BlockComponents.Sources.Constant(k = 5) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 20, "y1": 20, "x2": 120, "y2": 120, "rot": 0}
},
"tags": []
}
}
"RealToInteger adapter to produce Integer signal"
r2i = BlockComponents.Math.RealToInteger() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 160, "y1": 20, "x2": 260, "y2": 120, "rot": 0}
},
"tags": []
}
}
"IntegerToReal block under test"
i2r = BlockComponents.Math.IntegerToReal() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 310, "y1": 20, "x2": 410, "y2": 120, "rot": 0}
},
"tags": []
}
}
"Sine source sweeping negative and positive values"
sine = BlockComponents.Sources.Sine(amplitude = 5, frequency = 1) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 20, "y1": 140, "x2": 120, "y2": 240, "rot": 0}
},
"tags": []
}
}
"RealToInteger adapter for the second chain"
r2i_2 = BlockComponents.Math.RealToInteger() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 160, "y1": 140, "x2": 260, "y2": 240, "rot": 0}
},
"tags": []
}
}
"Second IntegerToReal block driven by the sine chain"
i2r_2 = BlockComponents.Math.IntegerToReal() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 300, "y1": 140, "x2": 400, "y2": 240, "rot": 0}
},
"tags": []
}
}
relations
connect(c1.y, r2i.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(r2i.y, i2r.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(sine.y, r2i_2.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(r2i_2.y, i2r_2.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
metadata {
"Dyad": {
"icons": {"default": "dyad://BlockComponents/Example.svg"},
"tests": {"case1": {"stop": 1, "expect": {"signals": ["i2r.y", "i2r_2.y", "sine.y"]}}}
}
}
endFlattened Source
dyad
"""
Converts constant and time-varying Integer signals back to Real.
Chains Constant(5.0) → RealToInteger → IntegerToReal and verifies that the
final Real output is 5. A second chain feeds a sine wave (amplitude 5) through
RealToInteger into IntegerToReal so the Real output steps through the rounded
integer values over time.
"""
test component IntegerToReal
"Constant source providing the Real input"
c1 = BlockComponents.Sources.Constant(k = 5) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 20, "y1": 20, "x2": 120, "y2": 120, "rot": 0}
},
"tags": []
}
}
"RealToInteger adapter to produce Integer signal"
r2i = BlockComponents.Math.RealToInteger() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 160, "y1": 20, "x2": 260, "y2": 120, "rot": 0}
},
"tags": []
}
}
"IntegerToReal block under test"
i2r = BlockComponents.Math.IntegerToReal() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 310, "y1": 20, "x2": 410, "y2": 120, "rot": 0}
},
"tags": []
}
}
"Sine source sweeping negative and positive values"
sine = BlockComponents.Sources.Sine(amplitude = 5, frequency = 1) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 20, "y1": 140, "x2": 120, "y2": 240, "rot": 0}
},
"tags": []
}
}
"RealToInteger adapter for the second chain"
r2i_2 = BlockComponents.Math.RealToInteger() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 160, "y1": 140, "x2": 260, "y2": 240, "rot": 0}
},
"tags": []
}
}
"Second IntegerToReal block driven by the sine chain"
i2r_2 = BlockComponents.Math.IntegerToReal() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 300, "y1": 140, "x2": 400, "y2": 240, "rot": 0}
},
"tags": []
}
}
relations
connect(c1.y, r2i.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(r2i.y, i2r.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(sine.y, r2i_2.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(r2i_2.y, i2r_2.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
metadata {
"Dyad": {
"icons": {"default": "dyad://BlockComponents/Example.svg"},
"tests": {"case1": {"stop": 1, "expect": {"signals": ["i2r.y", "i2r_2.y", "sine.y"]}}}
}
}
endTest Cases
julia
using BlockComponents
using DyadInterface: TransientAnalysis, rebuild_sol, ODEAlg
using ModelingToolkit: toggle_namespacing, get_initial_conditions, @named
using CSV, DataFrames, Plots
snapshotsdir = joinpath(dirname(dirname(pathof(BlockComponents))), "test", "snapshots")<< @setup-block not executed in draft mode >>Test Case case1
julia
@named model_case1 = BlockComponents.Math.Tests.IntegerToReal()
model_case1 = toggle_namespacing(model_case1, false)
model_case1 = toggle_namespacing(model_case1, true)
result_case1 = TransientAnalysis(; model = model_case1, alg = ODEAlg.Auto(), start = 0e+0, stop = 1e+0, abstol=1e-6, reltol=1e-6)
sol_case1 = rebuild_sol(result_case1)<< @setup-block not executed in draft mode >>julia
df_case1 = DataFrame(:t => sol_case1[:t], :actual => sol_case1[model_case1.i2r.y])
dfr_case1 = try CSV.read(joinpath(snapshotsdir, "BlockComponents.Math.Tests.IntegerToReal_case1_sig0.ref"), DataFrame); catch e; nothing; end
plt = plot(sol_case1, idxs=[model_case1.i2r.y], width=2, label="Actual value of i2r.y")
if !isnothing(dfr_case1)
scatter!(plt, dfr_case1.t, dfr_case1.expected, mc=:red, ms=3, label="Expected value of i2r.y")
end<< @setup-block not executed in draft mode >>julia
plt<< @example-block not executed in draft mode >>julia
df_case1 = DataFrame(:t => sol_case1[:t], :actual => sol_case1[model_case1.i2r_2.y])
dfr_case1 = try CSV.read(joinpath(snapshotsdir, "BlockComponents.Math.Tests.IntegerToReal_case1_sig1.ref"), DataFrame); catch e; nothing; end
plt = plot(sol_case1, idxs=[model_case1.i2r_2.y], width=2, label="Actual value of i2r_2.y")
if !isnothing(dfr_case1)
scatter!(plt, dfr_case1.t, dfr_case1.expected, mc=:red, ms=3, label="Expected value of i2r_2.y")
end<< @setup-block not executed in draft mode >>julia
plt<< @example-block not executed in draft mode >>julia
df_case1 = DataFrame(:t => sol_case1[:t], :actual => sol_case1[model_case1.sine.y])
dfr_case1 = try CSV.read(joinpath(snapshotsdir, "BlockComponents.Math.Tests.IntegerToReal_case1_sig2.ref"), DataFrame); catch e; nothing; end
plt = plot(sol_case1, idxs=[model_case1.sine.y], width=2, label="Actual value of sine.y")
if !isnothing(dfr_case1)
scatter!(plt, dfr_case1.t, dfr_case1.expected, mc=:red, ms=3, label="Expected value of sine.y")
end<< @setup-block not executed in draft mode >>julia
plt<< @example-block not executed in draft mode >>Related
Examples
Experiments
Analyses
Tests