Skip to content

Commit 883e2b9

Browse files
committed
update symbolic derivative interval mod method
1 parent 597a68e commit 883e2b9

File tree

3 files changed

+160
-12
lines changed

3 files changed

+160
-12
lines changed

benchmarks/benchmark_interval_arithmetic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def absolute_eval():
124124

125125
res = abs(I)
126126

127-
performance_counter(time_cur, 'power ' + str(runs) + ' Runs AVG.', runs)
127+
performance_counter(time_cur, 'absolute ' + str(runs) + ' Runs AVG.', runs)
128128

129129
return {'I_inf': I.inf, 'I_sup': I.sup, 'res_inf': res.inf, 'res_sup': res.sup}
130130

benchmarks/benchmark_sym_derivative.py

Lines changed: 147 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44
from pybdr.util.functional import performance_counter, performance_counter_start
55

66

7-
def test_sym_derivative_case_00():
7+
def sym_derivative_case00_NUM_test():
88
sys_test = tank6eq
99
dimes = [6, 1]
1010

1111
m = Model(sys_test, dimes)
1212

1313
x_np, u_np = np.random.rand(6), np.random.rand(1)
1414

15+
print()
16+
print('NUM Derivative >>>>>>>>>>>>>>>>>>>>>>>>>>>')
1517
print()
1618

1719
time_cur = performance_counter_start()
@@ -142,15 +144,154 @@ def test_sym_derivative_case_00():
142144
time_cur = performance_counter(time_cur, 'derivative 31 Run 2+ AVG', 10)
143145

144146

145-
def test_sym_derivative_case_01():
147+
def sym_derivative_case00_INT_test():
148+
sys_test = tank6eq
149+
dimes = [6, 1]
150+
151+
m = Model(sys_test, dimes)
152+
153+
x_int, u_int = Interval.rand(6), Interval.rand(1)
154+
155+
print()
156+
print('INT Derivative >>>>>>>>>>>>>>>>>>>>>>>>>>>')
157+
print()
158+
159+
time_cur = performance_counter_start()
160+
161+
# ----------------------------------------------------------------------
162+
# order 0, for variable 0
163+
164+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0) # Run 1
165+
166+
time_cur = performance_counter(time_cur, 'derivative 00 Run 1')
167+
168+
# 10 runs
169+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0)
170+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0)
171+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0)
172+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0)
173+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0)
174+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0)
175+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0)
176+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0)
177+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0)
178+
int_derivative_00 = m.evaluate((x_int, u_int), 'interval', 0, 0)
179+
180+
time_cur = performance_counter(time_cur, 'derivative 00 Run 2+ AVG', 10)
181+
182+
# ----------------------------------------------------------------------
183+
# order 0, for variable 1
184+
185+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1) # Run 1
186+
187+
time_cur = performance_counter(time_cur, 'derivative 01 Run 1')
188+
189+
# 10 runs
190+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1)
191+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1)
192+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1)
193+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1)
194+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1)
195+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1)
196+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1)
197+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1)
198+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1)
199+
int_derivative_01 = m.evaluate((x_int, u_int), 'interval', 0, 1)
200+
201+
time_cur = performance_counter(time_cur, 'derivative 01 Run 2+ AVG', 10)
202+
203+
# ----------------------------------------------------------------------
204+
# order 1, for variable 0
205+
206+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0) # Run 1
207+
208+
time_cur = performance_counter(time_cur, 'derivative 10 Run 1')
209+
210+
# 10 runs
211+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0)
212+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0)
213+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0)
214+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0)
215+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0)
216+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0)
217+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0)
218+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0)
219+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0)
220+
int_derivative_10 = m.evaluate((x_int, u_int), 'interval', 1, 0)
221+
222+
time_cur = performance_counter(time_cur, 'derivative 10 Run 2+ AVG', 10)
223+
224+
# ----------------------------------------------------------------------
225+
# order 1, for variable 1
226+
227+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1) # Run 1
228+
229+
time_cur = performance_counter(time_cur, 'derivative 10 Run 1')
230+
231+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1)
232+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1)
233+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1)
234+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1)
235+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1)
236+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1)
237+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1)
238+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1)
239+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1)
240+
int_derivative_11 = m.evaluate((x_int, u_int), 'interval', 1, 1)
241+
242+
time_cur = performance_counter(time_cur, 'derivative 11 Run 2+ AVG', 10)
243+
244+
# ----------------------------------------------------------------------
245+
# order 3, for variable 0
246+
247+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0) # Run 1
248+
249+
time_cur = performance_counter(time_cur, 'derivative 10 Run 1')
250+
251+
# 10 runs
252+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0)
253+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0)
254+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0)
255+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0)
256+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0)
257+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0)
258+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0)
259+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0)
260+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0)
261+
int_derivative_30 = m.evaluate((x_int, u_int), 'interval', 3, 0)
262+
263+
time_cur = performance_counter(time_cur, 'derivative 30 Run 2+ AVG', 10)
264+
265+
# ----------------------------------------------------------------------
266+
# order 3, for variable 1
267+
268+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1) # Run 1
269+
270+
time_cur = performance_counter(time_cur, 'derivative 10 Run 1')
271+
272+
# 10 runs
273+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1)
274+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1)
275+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1)
276+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1)
277+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1)
278+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1)
279+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1)
280+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1)
281+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1)
282+
int_derivative_31 = m.evaluate((x_int, u_int), 'interval', 3, 1)
283+
284+
time_cur = performance_counter(time_cur, 'derivative 31 Run 2+ AVG', 10)
285+
286+
287+
def sym_derivative_case01_test():
146288
print("test_sym_derivative_case_01")
147289

148290

149-
def test_sym_derivative_case_02():
291+
def sym_derivative_case02_test():
150292
print("test_sym_derivative_case_02")
151293

152294

153295
if __name__ == "__main__":
154-
test_sym_derivative_case_00()
155-
test_sym_derivative_case_01()
156-
test_sym_derivative_case_02()
296+
sym_derivative_case00_NUM_test()
297+
sym_derivative_case00_INT_test()

pybdr/model/model.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ def evaluate(self, xs: tuple, mod: str, order: int, v: int):
7878

7979
def _eval_numpy():
8080
if mod not in self.__inr_series[order] or v not in self.__inr_series[order][mod]:
81-
self.__inr_series[order][mod] = {}
81+
if mod not in self.__inr_series:
82+
self.__inr_series[order][mod] = {}
8283
d = self.__series(order, "sym", v)
8384
d = d if order == 0 else d.squeeze(axis=-1)
8485
d = ImmutableDenseNDimArray(d)
@@ -91,17 +92,23 @@ def _eval_numpy():
9192
def _eval_interval():
9293
from pybdr.geometry import Interval
9394

94-
if mod not in self.__inr_series[order]:
95+
if mod not in self.__inr_series[order] or v not in self.__inr_series[order][mod]:
96+
if mod not in self.__inr_series:
97+
self.__inr_series[order][mod] = {}
9598
d = self.__series(order, "sym", v)
9699
ff = np.frompyfunc(lambda x: x.is_number, 1, 1)
97100
xx = ff(d).astype(dtype=bool)
98101
mask = xx == 0
99102
if len(d[mask]) <= 0:
100-
self.__inr_series[order][mod] = {v: [None, mask]}
103+
if v not in self.__inr_series[order][mod]:
104+
self.__inr_series[order][mod][v] = [None, mask]
105+
# self.__inr_series[order][mod] = {v: [None, mask]}
101106
else:
102107
sym_d = ImmutableDenseNDimArray(d[mask])
103108
vf = lambdify(self.__inr_x, sym_d, Interval.functional())
104-
self.__inr_series[order][mod] = {v: [vf, mask]}
109+
if v not in self.__inr_series[order][mod]:
110+
self.__inr_series[order][mod][v] = [vf, mask]
111+
# self.__inr_series[order][mod] = {v: [vf, mask]}
105112

106113
vm = self.__series(order, mod, v)
107114
d = self.__series(order, "sym", v)
@@ -126,7 +133,7 @@ def _eval_interval():
126133
inv_mask = np.logical_not(vm[1])
127134
lb[inv_mask] = d[inv_mask].astype(dtype=float)
128135
ub[inv_mask] = d[inv_mask].astype(dtype=float)
129-
# finally return the result as interval tensor
136+
# finally, return the result as interval tensor
130137
return Interval(lb.squeeze(-1), ub.squeeze(-1))
131138

132139
if mod == "numpy":

0 commit comments

Comments
 (0)