From 73479003495c6057661355bbb8477fe88514b484 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 17 Nov 2019 13:53:09 -0800 Subject: [PATCH 1/4] Extract print_model() methods to DataModel.print() --- .../analysis/callback_duration.ipynb | 2 +- .../data_model/__init__.py | 4 ++ .../data_model/cpu_time.py | 6 +-- .../tracetools_analysis/data_model/profile.py | 6 +-- .../tracetools_analysis/data_model/ros2.py | 38 ++++++++++++------- .../tracetools_analysis/process.py | 2 +- .../tracetools_analysis/processor/__init__.py | 2 +- 7 files changed, 37 insertions(+), 23 deletions(-) diff --git a/tracetools_analysis/analysis/callback_duration.ipynb b/tracetools_analysis/analysis/callback_duration.ipynb index 5953137..5b324f9 100644 --- a/tracetools_analysis/analysis/callback_duration.ipynb +++ b/tracetools_analysis/analysis/callback_duration.ipynb @@ -69,7 +69,7 @@ "# Process\n", "events = load_file(converted_file_path)\n", "handler = Ros2Handler.process(events)\n", - "#handler.data.print_model()" + "#handler.data.print()" ] }, { diff --git a/tracetools_analysis/tracetools_analysis/data_model/__init__.py b/tracetools_analysis/tracetools_analysis/data_model/__init__.py index 3364fad..b752c23 100644 --- a/tracetools_analysis/tracetools_analysis/data_model/__init__.py +++ b/tracetools_analysis/tracetools_analysis/data_model/__init__.py @@ -25,3 +25,7 @@ class DataModel(): def __init__(self) -> None: pass + + def print(self) -> None: + """Print the data model.""" + return None diff --git a/tracetools_analysis/tracetools_analysis/data_model/cpu_time.py b/tracetools_analysis/tracetools_analysis/data_model/cpu_time.py index 07dece0..a2a1a33 100644 --- a/tracetools_analysis/tracetools_analysis/data_model/cpu_time.py +++ b/tracetools_analysis/tracetools_analysis/data_model/cpu_time.py @@ -51,9 +51,9 @@ class CpuTimeDataModel(DataModel): } self.times = self.times.append(data, ignore_index=True) - def print_model(self) -> None: - """Debug method to print every contained df.""" + def print(self) -> None: print('====================CPU TIME DATA MODEL====================') tail = 20 - print(f'Times (tail={tail}):\n{self.times.tail(tail).to_string()}') + print(f'Times (tail={tail}):') + print(self.times.tail(tail).to_string()) print('===========================================================') diff --git a/tracetools_analysis/tracetools_analysis/data_model/profile.py b/tracetools_analysis/tracetools_analysis/data_model/profile.py index 6a8a027..35e658c 100644 --- a/tracetools_analysis/tracetools_analysis/data_model/profile.py +++ b/tracetools_analysis/tracetools_analysis/data_model/profile.py @@ -61,9 +61,9 @@ class ProfileDataModel(DataModel): } self.times = self.times.append(data, ignore_index=True) - def print_model(self) -> None: - """Debug method to print every contained df.""" + def print(self) -> None: print('====================PROFILE DATA MODEL====================') tail = 20 - print(f'Times (tail={tail}):\n{self.times.tail(tail).to_string()}') + print(f'Times (tail={tail}):') + print(self.times.tail(tail).to_string()) print('==========================================================') diff --git a/tracetools_analysis/tracetools_analysis/data_model/ros2.py b/tracetools_analysis/tracetools_analysis/data_model/ros2.py index 7654254..e95c4f7 100644 --- a/tracetools_analysis/tracetools_analysis/data_model/ros2.py +++ b/tracetools_analysis/tracetools_analysis/data_model/ros2.py @@ -154,28 +154,38 @@ class Ros2DataModel(DataModel): } self.callback_instances = self.callback_instances.append(data, ignore_index=True) - def print_model(self) -> None: - """Debug method to print every contained df.""" - print('====================ROS DATA MODEL====================') - print(f'Contexts:\n{self.contexts.to_string()}') + def print(self) -> None: + print('====================ROS 2 DATA MODEL===================') + print('Contexts:') + print(self.contexts.to_string()) print() - print(f'Nodes:\n{self.nodes.to_string()}') + print('Nodes:') + print(self.nodes.to_string()) print() - print(f'Publishers:\n{self.publishers.to_string()}') + print('Publishers:') + print(self.publishers.to_string()) print() - print(f'Subscriptions:\n{self.subscriptions.to_string()}') + print('Subscriptions:') + print(self.subscriptions.to_string()) print() - print(f'Subscription objects:\n{self.subscription_objects.to_string()}') + print('Subscription objects:') + print(self.subscription_objects.to_string()) print() - print(f'Services:\n{self.services.to_string()}') + print('Services:') + print(self.services.to_string()) print() - print(f'Clients:\n{self.clients.to_string()}') + print('Clients:') + print(self.clients.to_string()) print() - print(f'Timers:\n{self.timers.to_string()}') + print('Timers:') + print(self.timers.to_string()) print() - print(f'Callback objects:\n{self.callback_objects.to_string()}') + print('Callback objects:') + print(self.callback_objects.to_string()) print() - print(f'Callback symbols:\n{self.callback_symbols.to_string()}') + print('Callback symbols:') + print(self.callback_symbols.to_string()) print() - print(f'Callback instances:\n{self.callback_instances.to_string()}') + print('Callback instances:') + print(self.callback_instances.to_string()) print('==================================================') diff --git a/tracetools_analysis/tracetools_analysis/process.py b/tracetools_analysis/tracetools_analysis/process.py index d7ea399..dd8a2cd 100644 --- a/tracetools_analysis/tracetools_analysis/process.py +++ b/tracetools_analysis/tracetools_analysis/process.py @@ -137,7 +137,7 @@ def process( ros2_handler = Ros2Handler.process(events) time_diff = time.time() - start_time - ros2_handler.data.print_model() + ros2_handler.data.print() print(f'processed {len(events)} events in {time_diff_to_str(time_diff)}') diff --git a/tracetools_analysis/tracetools_analysis/processor/__init__.py b/tracetools_analysis/tracetools_analysis/processor/__init__.py index b807e2d..cd51f55 100644 --- a/tracetools_analysis/tracetools_analysis/processor/__init__.py +++ b/tracetools_analysis/tracetools_analysis/processor/__init__.py @@ -243,7 +243,7 @@ class DependencySolver(): class Processor(): - """Base processor class.""" + """Processor class, which dispatches events to event handlers.""" def __init__( self, From 3eac741a4cb68b9850b61b023c50dfe6f8fd0596 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 17 Nov 2019 14:15:49 -0800 Subject: [PATCH 2/4] Rename to print_data() (oops) --- tracetools_analysis/analysis/callback_duration.ipynb | 2 +- tracetools_analysis/tracetools_analysis/data_model/__init__.py | 2 +- tracetools_analysis/tracetools_analysis/data_model/cpu_time.py | 2 +- tracetools_analysis/tracetools_analysis/data_model/profile.py | 2 +- tracetools_analysis/tracetools_analysis/data_model/ros2.py | 2 +- tracetools_analysis/tracetools_analysis/process.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tracetools_analysis/analysis/callback_duration.ipynb b/tracetools_analysis/analysis/callback_duration.ipynb index 5b324f9..2138202 100644 --- a/tracetools_analysis/analysis/callback_duration.ipynb +++ b/tracetools_analysis/analysis/callback_duration.ipynb @@ -69,7 +69,7 @@ "# Process\n", "events = load_file(converted_file_path)\n", "handler = Ros2Handler.process(events)\n", - "#handler.data.print()" + "#handler.data.print_data()" ] }, { diff --git a/tracetools_analysis/tracetools_analysis/data_model/__init__.py b/tracetools_analysis/tracetools_analysis/data_model/__init__.py index b752c23..394c0db 100644 --- a/tracetools_analysis/tracetools_analysis/data_model/__init__.py +++ b/tracetools_analysis/tracetools_analysis/data_model/__init__.py @@ -26,6 +26,6 @@ class DataModel(): def __init__(self) -> None: pass - def print(self) -> None: + def print_data(self) -> None: """Print the data model.""" return None diff --git a/tracetools_analysis/tracetools_analysis/data_model/cpu_time.py b/tracetools_analysis/tracetools_analysis/data_model/cpu_time.py index a2a1a33..f09b628 100644 --- a/tracetools_analysis/tracetools_analysis/data_model/cpu_time.py +++ b/tracetools_analysis/tracetools_analysis/data_model/cpu_time.py @@ -51,7 +51,7 @@ class CpuTimeDataModel(DataModel): } self.times = self.times.append(data, ignore_index=True) - def print(self) -> None: + def print_data(self) -> None: print('====================CPU TIME DATA MODEL====================') tail = 20 print(f'Times (tail={tail}):') diff --git a/tracetools_analysis/tracetools_analysis/data_model/profile.py b/tracetools_analysis/tracetools_analysis/data_model/profile.py index 35e658c..ff68b21 100644 --- a/tracetools_analysis/tracetools_analysis/data_model/profile.py +++ b/tracetools_analysis/tracetools_analysis/data_model/profile.py @@ -61,7 +61,7 @@ class ProfileDataModel(DataModel): } self.times = self.times.append(data, ignore_index=True) - def print(self) -> None: + def print_data(self) -> None: print('====================PROFILE DATA MODEL====================') tail = 20 print(f'Times (tail={tail}):') diff --git a/tracetools_analysis/tracetools_analysis/data_model/ros2.py b/tracetools_analysis/tracetools_analysis/data_model/ros2.py index e95c4f7..66f3cf5 100644 --- a/tracetools_analysis/tracetools_analysis/data_model/ros2.py +++ b/tracetools_analysis/tracetools_analysis/data_model/ros2.py @@ -154,7 +154,7 @@ class Ros2DataModel(DataModel): } self.callback_instances = self.callback_instances.append(data, ignore_index=True) - def print(self) -> None: + def print_data(self) -> None: print('====================ROS 2 DATA MODEL===================') print('Contexts:') print(self.contexts.to_string()) diff --git a/tracetools_analysis/tracetools_analysis/process.py b/tracetools_analysis/tracetools_analysis/process.py index dd8a2cd..a0248f0 100644 --- a/tracetools_analysis/tracetools_analysis/process.py +++ b/tracetools_analysis/tracetools_analysis/process.py @@ -137,7 +137,7 @@ def process( ros2_handler = Ros2Handler.process(events) time_diff = time.time() - start_time - ros2_handler.data.print() + ros2_handler.data.print_data() print(f'processed {len(events)} events in {time_diff_to_str(time_diff)}') From 1be3ca06eff5873c080c867487f52a4d29049fc3 Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 17 Nov 2019 14:17:22 -0800 Subject: [PATCH 3/4] Expose DataModel.print_data() through Processor.print_data() --- .../tracetools_analysis/processor/__init__.py | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/tracetools_analysis/tracetools_analysis/processor/__init__.py b/tracetools_analysis/tracetools_analysis/processor/__init__.py index cd51f55..7fee4a4 100644 --- a/tracetools_analysis/tracetools_analysis/processor/__init__.py +++ b/tracetools_analysis/tracetools_analysis/processor/__init__.py @@ -256,12 +256,14 @@ class Processor(): :param handlers: the `EventHandler`s to use for processing :param kwargs: the parameters to pass on to new handlers """ + self._initial_handlers = list(handlers) expanded_handlers = self._expand_dependencies(*handlers, **kwargs) self._handler_multimap = self._get_handler_maps(expanded_handlers) self._register_with_handlers(expanded_handlers) self._progress_display = ProcessingProgressDisplay( [type(handler).__name__ for handler in expanded_handlers], ) + self._processing_done = False @staticmethod def _expand_dependencies( @@ -304,16 +306,21 @@ class Processor(): for handler in handlers: handler.register_processor(self) - def process(self, events: List[DictEvent]) -> None: + def process( + self, + events: List[DictEvent], + ) -> None: """ Process all events. :param events: the events to process """ - self._progress_display.set_work_total(len(events)) - for event in events: - self._process_event(event) - self._progress_display.did_work() + if not self._processing_done: + self._progress_display.set_work_total(len(events)) + for event in events: + self._process_event(event) + self._progress_display.did_work() + self._processing_done = True def _process_event(self, event: DictEvent) -> None: """Process a single event.""" @@ -346,6 +353,12 @@ class Processor(): metadata = EventMetadata(event_name, timestamp, cpu_id, procname, pid, tid) handler_function(event, metadata) + def print_data(self) -> None: + """Print processed data.""" + if self._processing_done: + for handler in self._initial_handlers: + handler.data.print_data() + class ProcessingProgressDisplay(): """Display processing progress periodically on stdout.""" From 2527efe69f4041214baef5e36e6666d23b4fd6fc Mon Sep 17 00:00:00 2001 From: Christophe Bedard Date: Sun, 17 Nov 2019 14:27:10 -0800 Subject: [PATCH 4/4] Update process() API method to use print_data() --- tracetools_analysis/tracetools_analysis/process.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tracetools_analysis/tracetools_analysis/process.py b/tracetools_analysis/tracetools_analysis/process.py index a0248f0..ce985ad 100644 --- a/tracetools_analysis/tracetools_analysis/process.py +++ b/tracetools_analysis/tracetools_analysis/process.py @@ -25,6 +25,7 @@ from typing import Tuple from tracetools_analysis.convert import convert from tracetools_analysis.convert import DEFAULT_CONVERT_FILE_NAME from tracetools_analysis.loading import load_file +from tracetools_analysis.processor import Processor from tracetools_analysis.processor.ros2 import Ros2Handler from tracetools_read.trace import is_trace_directory @@ -134,10 +135,11 @@ def process( start_time = time.time() events = load_file(converted_file_path) - ros2_handler = Ros2Handler.process(events) + processor = Processor(Ros2Handler()) + processor.process(events) time_diff = time.time() - start_time - ros2_handler.data.print_data() + processor.print_data() print(f'processed {len(events)} events in {time_diff_to_str(time_diff)}')