-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatars.jl
More file actions
165 lines (133 loc) · 4.57 KB
/
datars.jl
File metadata and controls
165 lines (133 loc) · 4.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
@testset "DataRS tests" begin show_testset_section() #Scope for test data
using MDDatasets
using Test
#==Input data
===============================================================================#
#get_ydata: Generates sine data from input parameters
get_ydata(t, tbit, vdd, trise) = sin(2pi*t/tbit)*(trise/tbit)+vdd
t = DataF1((1:2)*1e-9)
#Construct DataRS object from parametric sweeps:
data = fill(DataRS, PSweep("tbit", [1, 3] * 1e-9)) do tbit
#Need to explicitly specify DataRS{DataF1} as type for inner-most sweep:
fill(DataRS{DataF1}, PSweep("VDD", 0.9 * [0.9, 1])) do vdd
trise = 0.1*tbit
return get_ydata(t, tbit, vdd, trise)
end
end
#Construct DataRS object from parametric sweeps:
_datagen1(indep::Bool) = fill(DataRS, PSweep("A", Float64[1, 3])) do A
offset = indep ? 0 : A
#Need to explicitly specify DataRS{DataFloat} as type for inner-most sweep:
fill(DataRS{DataFloat}, PSweep("B", Float64[3, 5, 6] .+ offset)) do B
return 10A + B
end
end
#==Tests
===============================================================================#
@testset "Validate _datamatch()" begin show_testset_description()
datars_dep=_datagen1(false)
other = datars_dep*1.0
@test !_datamatch(datars_dep, other+1) #Make sure _datamatch works
@test _datamatch(datars_dep, other)
end
@testset "Construction of DataRS objects" begin show_testset_description()
#TODO: write tests to verify structure
@info("Visually confirm structure of \"data\":")
@show data
@test data.sweep.id == "tbit" #should be outer-most loop
@test data.elem[1].sweep.id == "VDD" #should be inner-most loop
#Simple (independent) parameter sweep:
swlist = PSweep[
PSweep("v1", [1,2])
PSweep("v2", [4,5])
]
dhrs = fill(t, DataRS, swlist)
@test dhrs.sweep.id == "v1" #should be outer-most loop
@test dhrs.elem[1].sweep.id == "v2" #should be inner-most loop
dhrs_0 = zeros(DataRS, swlist)
dhrs_1 = ones(DataRS, swlist)
dhrs_2 = fill(2, DataRS, swlist)
@test _datamatch(dhrs_2-dhrs_1, dhrs_1)
@test _datamatch(dhrs_2-dhrs_1, dhrs_1)
@test _datamatch(dhrs_2-2*dhrs_1, dhrs_0)
#TODO: Check that we actually have zeros, etc.
end
@testset "Access parameter data" begin show_testset_description()
#Extract value of tbit (first sweep):
data_tbit = parameter(data, "tbit")
#Get sweep values:
sw_tbit = data.sweep.v
sw_vdd = data.elem[1].sweep.v
for itbit in 1:length(sw_tbit), ivdd in 1:length(sw_vdd)
@test data_tbit.elem[itbit].elem[ivdd] == sw_tbit[itbit]
end
end
@testset "Broacasting operations on DataRS" begin show_testset_description()
#Get sweep values:
sw_tbit = data.sweep.v
sw_vdd = data.elem[1].sweep.v
_v = 0*data+5 #Same dimensionality as data
@testset "_v = 0*data+5" begin
v5 = zeros(length(t)) .+ 5
for itbit in 1:length(sw_tbit), ivdd in 1:length(sw_vdd)
_elem = _v.elem[itbit].elem[ivdd]
@test _elem.x == t.x
@test _elem.y == v5
end
end
_vshift = data + _v
@testset "_vshift = data + _v" begin
for itbit in 1:length(sw_tbit), ivdd in 1:length(sw_vdd)
_elem = _vshift.elem[itbit].elem[ivdd]
@test _elem.x == t.x
@test _elem.y == data.elem[itbit].elem[ivdd].y .+ 5
end
end
_m1 = maximum(data)
@testset "_m1 = maximum(data)" begin
for itbit in 1:length(sw_tbit), ivdd in 1:length(sw_vdd)
_elem = _m1.elem[itbit].elem[ivdd]
@test typeof(_elem) == Float64
@test _elem == maximum(data.elem[itbit].elem[ivdd].y)
end
end
_delta = data - _m1
@testset "_delta = data - _m1" begin
for itbit in 1:length(sw_tbit), ivdd in 1:length(sw_vdd)
_elem = _delta.elem[itbit].elem[ivdd]
@test _elem.x == t.x
_y = data.elem[itbit].elem[ivdd].y
@test _elem.y == _y .- maximum(_y)
end
end
_m2 = maximum(_m1) #Collapse inner-most dimension again
@testset "_m2 = maximum(_m1)" begin
for itbit in 1:length(sw_tbit)
_elem = _m2.elem[itbit]
@test typeof(_elem) == Float64
@test _elem == maximum(_m1.elem[itbit])
end
end
_m3 = maximum(_m2) #Collapse inner-most dimension again
@testset "_m3 = maximum(_m2)" begin
_elem = _m3
m2val = [_m2.elem[i] for i in 1:length(_m2)] #collect values in m2
@test typeof(_elem) == Float64
@test _elem == maximum(m2val)
end
end
@testset "Conversion (DataHR <=> DataRS)" begin show_testset_description()
datars_indep=_datagen1(true)
datars_dep=_datagen1(false)
datahr = convert(DataHR, datars_indep)
#TODO: test something
@test_throws ArgumentError convert(DataHR, datars_dep)
datars_2 = convert(DataRS, datahr)
@test _datamatch(datars_2, datars_2)
try
datars_2 - datars_indep
catch
@warn("Cannot operate with DataRS re-created through DataHR because of PSweep comparison & way fill!(::DataRS) works.")
end
end
end