Skip to content

Commit 90a5d34

Browse files
committed
Adding logger classes.
1 parent 93cc635 commit 90a5d34

File tree

1 file changed

+321
-0
lines changed

1 file changed

+321
-0
lines changed
Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
import time as time_module
2+
import numpy as np
3+
4+
try:
5+
from mpi4py import MPI
6+
except:
7+
MPI = None
8+
9+
from threading import Thread
10+
from threading import Event
11+
from time import sleep
12+
13+
class TimingLog():
14+
stime = 0
15+
etime = 0
16+
mtime = 0
17+
_samples = []
18+
_times_steps = []
19+
_iter = 0
20+
21+
def __init__(self):
22+
self.stime = 0
23+
self.etime = 0
24+
self.mtime = 0
25+
self._samples = []
26+
self._times_steps = []
27+
self._iter = 0
28+
29+
@property
30+
def timing(self):
31+
return self._times_steps
32+
33+
@property
34+
def samples(self):
35+
return self._samples
36+
37+
def __len__(self):
38+
return len(self._samples)
39+
40+
def get_values(self):
41+
return self._times_steps
42+
43+
def get_value(self, index):
44+
N = len(self._times_steps)
45+
result = 0
46+
if N > 0:
47+
result = self._times_steps[min(max(index, 0), N - 1)]
48+
return result
49+
50+
def start_timing(self):
51+
if MPI:
52+
mpi_comm = MPI.COMM_WORLD
53+
mpi_rank = mpi_comm.Get_rank()
54+
if mpi_rank == 0:
55+
# self.stime = MPI.Wtime()
56+
# self.stime = time_module.perf_counter()
57+
self.stime = time_module.process_time()
58+
else:
59+
self.stime = time_module.process_time()
60+
61+
def stop_timing(self):
62+
if MPI:
63+
mpi_comm = MPI.COMM_WORLD
64+
mpi_rank = mpi_comm.Get_rank()
65+
if mpi_rank == 0:
66+
# self.etime = MPI.Wtime()
67+
# self.etime = time_module.perf_counter()
68+
self.etime = time_module.process_time()
69+
else:
70+
self.etime = time_module.process_time()
71+
72+
def accumulate_timing(self):
73+
if MPI:
74+
mpi_comm = MPI.COMM_WORLD
75+
mpi_rank = mpi_comm.Get_rank()
76+
if mpi_rank == 0:
77+
self.mtime += (self.etime-self.stime)
78+
else:
79+
self.mtime = 0
80+
else:
81+
self.mtime += (self.etime-self.stime)
82+
83+
def advance_iteration(self):
84+
if MPI:
85+
mpi_comm = MPI.COMM_WORLD
86+
mpi_rank = mpi_comm.Get_rank()
87+
if mpi_rank == 0:
88+
self._times_steps.append(self.mtime)
89+
self._samples.append(self._iter)
90+
self._iter += 1
91+
self.mtime = 0
92+
else:
93+
self._times_steps.append(self.mtime)
94+
self._samples.append(self._iter)
95+
self._iter += 1
96+
self.mtime = 0
97+
98+
def add_aux_measure(self, value):
99+
if MPI:
100+
mpi_comm = MPI.COMM_WORLD
101+
mpi_rank = mpi_comm.Get_rank()
102+
if mpi_rank == 0:
103+
self.mtime += value
104+
else:
105+
self.mtime += 0
106+
else:
107+
self.mtime += value
108+
109+
def sum(self):
110+
result = 0
111+
if MPI:
112+
mpi_comm = MPI.COMM_WORLD
113+
mpi_rank = mpi_comm.Get_rank()
114+
if mpi_rank == 0:
115+
result = np.array(self._times_steps).sum()
116+
else:
117+
result = np.array(self._times_steps).sum()
118+
return result
119+
120+
def reset(self):
121+
if self._times_steps is not None and len(self._times_steps) > 0:
122+
del self._times_steps[:]
123+
if self._samples is not None and len(self._samples) > 0:
124+
del self._samples[:]
125+
self.stime = 0
126+
self.etime = 0
127+
self.mtime = 0
128+
self._samples = []
129+
self._times_steps = []
130+
self._iter = 0
131+
132+
133+
class ParamLogging():
134+
_samples = []
135+
_params = []
136+
_iter = 0
137+
138+
def __init__(self):
139+
self._samples = []
140+
self._params = []
141+
self._iter = 0
142+
143+
@property
144+
def samples(self):
145+
return self._samples
146+
147+
@property
148+
def params(self):
149+
return self._params
150+
151+
def get_params(self):
152+
return self._params
153+
154+
def get_param(self, index):
155+
N = len(self._params)
156+
result = 0
157+
if N > 0:
158+
result = self._params[min(max(index, 0), N-1)]
159+
return result
160+
161+
def __len__(self):
162+
return len(self._samples)
163+
164+
def advance_iteration(self, param):
165+
if MPI:
166+
# mpi_comm = MPI.COMM_WORLD
167+
# mpi_rank = mpi_comm.Get_rank()
168+
169+
self._params.append(param)
170+
self._samples.append(self._iter)
171+
self._iter += 1
172+
# if mpi_rank == 0:
173+
# self._params.append(param)
174+
# self._samples.append(self._iter)
175+
# self._iter += 1
176+
else:
177+
self._params.append(param)
178+
self._samples.append(self._iter)
179+
self._iter += 1
180+
181+
class Asynchronous_ParamLogging():
182+
_samples = []
183+
_params = []
184+
_iter = 0
185+
_measure_func = None
186+
_measure_start_value = None # for differential measurements
187+
_measure_partial_values = []
188+
_measure_interval = 0.25 # 250 ms
189+
_event = None
190+
_thread = None
191+
differential_measurement = False
192+
193+
def __init__(self):
194+
self._samples = []
195+
self._params = []
196+
self._measure_partial_values = []
197+
self._iter = 0
198+
self._measure_func = None
199+
self._measure_start_value = None
200+
self._measure_interval = 0.25 # 250 ms
201+
self._event = None
202+
self._thread = None
203+
self.differential_measurement = False
204+
205+
def __del__(self):
206+
del self._samples[:]
207+
del self._params[:]
208+
del self._measure_partial_values[:]
209+
210+
@property
211+
def samples(self):
212+
return self._samples
213+
214+
@property
215+
def params(self):
216+
return self._params
217+
218+
@property
219+
def measure_func(self):
220+
return self._measure_func
221+
222+
@measure_func.setter
223+
def measure_func(self, function):
224+
self._measure_func = function
225+
226+
@property
227+
def measure_interval(self):
228+
return self._measure_interval
229+
230+
@measure_interval.setter
231+
def measure_interval(self, interval):
232+
"""
233+
Set measure interval in seconds
234+
:param interval: interval in seconds (fractional possible)
235+
:return: None
236+
"""
237+
self._measure_interval = interval
238+
239+
@property
240+
def measure_start_value(self):
241+
return self._measure_start_value
242+
243+
@measure_start_value.setter
244+
def measure_start_value(self, value):
245+
self._measure_start_value = value
246+
247+
def async_run(self):
248+
if self.differential_measurement:
249+
self.async_run_diff_measurement()
250+
else:
251+
pass
252+
253+
def async_run_diff_measurement(self):
254+
if self._measure_start_value is None:
255+
self._measure_start_value = self._measure_func()
256+
self._measure_partial_values.append(0)
257+
while not self._event.is_set():
258+
self._measure_partial_values.append( self._measure_func()-self._measure_start_value )
259+
sleep(self._measure_interval)
260+
261+
def async_run_measurement(self):
262+
while not self._event.is_set():
263+
self._measure_partial_values.append( self.measure_func() )
264+
sleep(self.measure_interval)
265+
266+
def start_partial_measurement(self):
267+
assert self._measure_func is not None, "Measurement function is None - invalid. Exiting ..."
268+
assert self._thread is None, "Measurement already running - double-start invalid. Exiting ..."
269+
if len(self._measure_partial_values) > 0:
270+
del self._measure_partial_values[:]
271+
self._measure_partial_values = []
272+
self._event = Event()
273+
self._thread = Thread(target=self.async_run_measurement)
274+
self._thread.start()
275+
276+
def stop_partial_measurement(self):
277+
"""
278+
function to stop the measurement. The function also internally advances the iteration with the mean (or max)
279+
of the measured partial values.
280+
:return: None
281+
"""
282+
self._event.set()
283+
self._thread.join()
284+
sleep(self._measure_interval)
285+
del self._thread
286+
self._thread = None
287+
self._measure_start_value = None
288+
# param_partial_mean = np.array(self._measure_partial_values).mean()
289+
param_partial_mean = np.array(self._measure_partial_values).max()
290+
self.advance_iteration(param_partial_mean)
291+
292+
def get_params(self):
293+
return self._params
294+
295+
def get_param(self, index):
296+
N = len(self._params)
297+
result = 0
298+
if N > 0:
299+
result = self._params[min(max(index, 0), N-1)]
300+
return result
301+
302+
def __len__(self):
303+
return len(self._samples)
304+
305+
def advance_iteration(self, param):
306+
if MPI:
307+
# mpi_comm = MPI.COMM_WORLD
308+
# mpi_rank = mpi_comm.Get_rank()
309+
310+
self._params.append(param)
311+
self._samples.append(self._iter)
312+
self._iter += 1
313+
# if mpi_rank == 0:
314+
# self._params.append(param)
315+
# self._samples.append(self._iter)
316+
# self._iter += 1
317+
else:
318+
self._params.append(param)
319+
self._samples.append(self._iter)
320+
self._iter += 1
321+

0 commit comments

Comments
 (0)