diff --git a/measurements/CPU/Figure5.png b/measurements/CPU/Figure5.png new file mode 100644 index 0000000..5b91b62 Binary files /dev/null and b/measurements/CPU/Figure5.png differ diff --git a/measurements/CPU/client_cpu.graphml b/measurements/CPU/client_cpu.graphml new file mode 100644 index 0000000..495721d --- /dev/null +++ b/measurements/CPU/client_cpu.graphml @@ -0,0 +1,185 @@ + + + + + + + + + + + + B:funbody_cpu.py + + + + + + + + + + + OUT: + + + + + + + + + + 0x2306_U1 + + + + + + + + 1751825758771 + + DEL_NODE + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ== + + + ADD_NODE + WyJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMzMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NDg3LCJ5IjozMTN9LHt9LCI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ== + + e425a002ed1453f66a4fb1dad3ad2923 + + + 1751825761336 + + SET_POS + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDg3LCJ5IjozMTN9XQ== + + + SET_POS + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6NDg3LCJ5IjozMTN9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + d7861c7337345a2010806e89311d85bf + + + 1751825767651 + + DEL_NODE + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ== + + + ADD_NODE + WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTA3LCJ5IjoxMDJ9LHt9LCIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ== + + 19b85e105d5758f18c55915fbce84663 + + + 1751825770936 + + SET_POS + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTA3LCJ5IjoxMDJ9XQ== + + + SET_POS + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTA3LCJ5IjoxMDJ9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + 03b8818572c5800d88c583073a1ef559 + + + 1751825773370 + + DEL_EDGE + WyI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLCJ0YXJnZXRJRCI6IjIxOTZjMTQ2LTE4MGMtNGQxNC1iYmFhLTM0MGY3NmUxNDgwOSIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQifV0= + + 1dd8b4edaeed282d75d1daeb3195b728 + + + 1751826367735 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + ca298c11df338ea36bce176af0fe3b69 + + + 1751826515156 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + c6ee9fdcb90f48bc1de9bdc44b7da91f + + + 1751826596605 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + b79566da6d5ea6c2cf2cbb618da677d2 + + + 1751826901740 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + ba871dc0f4bc75adee32e34c87854508 + + + 1751827730897 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + 8bb2b4d5cd9d445722b307d6bdb3d9fd + + + 1751828973865 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + 3609737de0e0d000c3d43a620f592090 + + + 1751872486908 + + UPDATE_NODE + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsid2lkdGgiOjIzMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsid2lkdGgiOjIzMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJCOmZ1bmJvZHlfY3B1LnB5Iix0cnVlXQ== + + a0691587adb56f1c913b278379ea8cd5 + + + \ No newline at end of file diff --git a/measurements/CPU/funbody_cpu.py b/measurements/CPU/funbody_cpu.py new file mode 100644 index 0000000..cdbb0a2 --- /dev/null +++ b/measurements/CPU/funbody_cpu.py @@ -0,0 +1,88 @@ +# funbody_throughput_test.py (MODIFIED FOR RESOURCE MONITORING & CORRECTED) +import time +import concore +import os +import json +import threading +import psutil +import csv + +# --- MONITORING FUNCTION (to be run in a separate thread) --- +def monitor_resources(stop_event, output_list): + """Monitors this script's CPU and memory usage.""" + process = psutil.Process(os.getpid()) + while not stop_event.is_set(): + cpu_percent = process.cpu_percent(interval=0.5) + memory_mb = process.memory_info().rss / (1024 * 1024) + output_list.append({'cpu_percent': cpu_percent, 'memory_mb': memory_mb}) + +print("funbody (Receiver) using ZMQ REP socket for Throughput & Resource Test.") + +TEST_DURATION = 10 +message_count = 0 +test_started = False +resource_records = [] +start_time = 0 + +# --- Start Monitoring --- +stop_monitoring = threading.Event() +monitor_thread = threading.Thread(target=monitor_resources, args=(stop_monitoring, resource_records)) +monitor_thread.start() + +# --- Main Throughput Test Logic (CORRECTED) --- +concore.init_zmq_port( + port_name=PORT_NAME_B_OUT, + port_type="bind", + address="tcp://0.0.0.0:" + PORT_B_OUT, # Bind to all interfaces on the specified port + socket_type_str="REP" +) + +print(f"Receiver waiting for messages on port {PORT_B_OUT}...") +while True: + # Wait for a message + message_str = concore.read(PORT_NAME_B_OUT, "stream", "{}") + + # Send an acknowledgment immediately after receiving + concore.write(PORT_NAME_B_OUT, "reply", "{}") # ADDED: Send acknowledgment + + if message_str is None: + continue # Or break, depending on desired behavior on timeout + + try: + # Since concore.read now handles JSON parsing, this might not be needed + # but we keep it for validation of the message structure. + message_dict = message_str if isinstance(message_str, dict) else json.loads(message_str) + except (json.JSONDecodeError, TypeError): + continue + + if isinstance(message_dict, dict) and 'type' in message_dict: + if message_dict['type'] == 'control': + if message_dict['value'] == 'START' and not test_started: + print("START signal received.") + test_started = True + start_time = time.perf_counter() + elif message_dict['value'] == 'STOP' and test_started: + print("STOP signal received.") + break # Exit the loop to end the test + elif message_dict['type'] == 'data' and test_started: + message_count += 1 + +# --- Stop Monitoring and Save Results --- +stop_monitoring.set() +monitor_thread.join() +concore.terminate_zmq() + +if message_count > 0: + end_time = time.perf_counter() + duration = end_time - start_time + throughput = message_count / duration if duration > 0 else 0 + print(f"\n--- TEST COMPLETE ---") + print(f"Received {message_count} messages in {duration:.2f} seconds.") + print(f"THROUGHPUT RESULT: {throughput:.2f} messages/second") + +if resource_records: + with open('receiver_usage.csv', 'w', newline='') as f: + writer = csv.DictWriter(f, fieldnames=['cpu_percent', 'memory_mb']) + writer.writeheader() + writer.writerows(resource_records) + print("Receiver resource usage saved to receiver_usage.csv") \ No newline at end of file diff --git a/measurements/CPU/funcall_cpu.py b/measurements/CPU/funcall_cpu.py new file mode 100644 index 0000000..500b486 --- /dev/null +++ b/measurements/CPU/funcall_cpu.py @@ -0,0 +1,74 @@ +# funcall_throughput_test.py (MODIFIED FOR RESOURCE MONITORING & CORRECTED) +import time +import concore +import os +import json +import threading +import psutil +import csv + +# --- MONITORING FUNCTION (to be run in a separate thread) --- +def monitor_resources(stop_event, output_list): + """Monitors this script's CPU and memory usage.""" + process = psutil.Process(os.getpid()) + while not stop_event.is_set(): + # Get CPU (as a percentage) and Memory (RSS in MB) + cpu_percent = process.cpu_percent(interval=0.5) + memory_mb = process.memory_info().rss / (1024 * 1024) + output_list.append({'cpu_percent': cpu_percent, 'memory_mb': memory_mb}) + +print("funcall (Sender) using ZMQ REQ socket for Throughput & Resource Test.") + +TEST_DURATION = 10 +message_count = 0 +resource_records = [] + +# --- Start Monitoring --- +stop_monitoring = threading.Event() +monitor_thread = threading.Thread(target=monitor_resources, args=(stop_monitoring, resource_records)) +monitor_thread.start() + +# --- Main Throughput Test Logic (CORRECTED) --- +concore.init_zmq_port( + port_name=PORT_NAME_IN_A, + port_type="connect", + address="tcp://192.168.0.109:" + PORT_IN_A, # Use 127.0.0.1 for local, or the receiver's IP + socket_type_str="REQ" +) +print(f"Sender starting. Will send data for {TEST_DURATION} seconds.") + +# Send START signal and wait for reply +start_signal = json.dumps({"type": "control", "value": "START"}) +concore.write(PORT_NAME_IN_A, "stream", start_signal) +concore.read(PORT_NAME_IN_A, "reply", "{}") # ADDED: Wait for acknowledgment + +time.sleep(1) +start_time = time.perf_counter() + +# Loop for the test duration +while (time.perf_counter() - start_time) < TEST_DURATION: + data_message = json.dumps({"type": "data", "value": message_count}) + concore.write(PORT_NAME_IN_A, "stream", data_message) + concore.read(PORT_NAME_IN_A, "reply", "{}") # ADDED: Wait for acknowledgment + message_count += 1 + +time.sleep(1) + +# Send STOP signal and wait for reply +stop_signal = json.dumps({"type": "control", "value": "STOP"}) +concore.write(PORT_NAME_IN_A, "stream", stop_signal) +concore.read(PORT_NAME_IN_A, "reply", "{}") # ADDED: Wait for acknowledgment + +print(f"Sender finished. Sent approximately {message_count} messages.") + +# --- Stop Monitoring and Save Results --- +stop_monitoring.set() +monitor_thread.join() +concore.terminate_zmq() + +if resource_records: + with open('sender_usage.csv', 'w', newline='') as f: + writer = csv.DictWriter(f, fieldnames=['cpu_percent', 'memory_mb']) + writer.writeheader() + writer.writerows(resource_records) + print("Sender resource usage saved to sender_usage.csv") \ No newline at end of file diff --git a/measurements/CPU/plot_fig5.py b/measurements/CPU/plot_fig5.py new file mode 100644 index 0000000..2990a9d --- /dev/null +++ b/measurements/CPU/plot_fig5.py @@ -0,0 +1,42 @@ +import pandas as pd +import seaborn as sns +import matplotlib.pyplot as plt + +# Load all data and calculate averages +try: + avg_cpu_sender_zmq = pd.read_csv('sender_usage.csv')['cpu_percent'].mean() + avg_mem_sender_zmq = pd.read_csv('sender_usage.csv')['memory_mb'].mean() + + # In a real test, you would also measure the receiver. For simplicity, we plot sender. + # avg_cpu_receiver_zmq = pd.read_csv('receiver_zmq_usage.csv')['cpu_percent'].mean() + # avg_mem_receiver_zmq = pd.read_csv('receiver_zmq_usage.csv')['memory_mb'].mean() + + # Create placeholder data for Mediator until you run the test + avg_cpu_sender_mediator = 25.5 # Example value + avg_mem_sender_mediator = 60.2 # Example value + +except FileNotFoundError: + print("One or more CSV files not found. Using placeholder data.") + # Placeholder data for plotting if you haven't run the experiment yet + avg_cpu_sender_zmq, avg_mem_sender_zmq = 15.0, 45.0 + avg_cpu_sender_mediator, avg_mem_sender_mediator = 25.5, 60.2 + +# Prepare data for plotting +data = { + 'Protocol': ['Mediator', 'ZeroMQ', 'Mediator', 'ZeroMQ'], + 'Metric': ['CPU Usage (%)', 'CPU Usage (%)', 'Memory Usage (MB)', 'Memory Usage (MB)'], + 'Value': [avg_cpu_sender_mediator, avg_cpu_sender_zmq, avg_mem_sender_mediator, avg_mem_sender_zmq] +} +df_plot = pd.DataFrame(data) + +# Create the grouped bar chart +plt.figure(figsize=(10, 7)) +sns.barplot(x='Metric', y='Value', hue='Protocol', data=df_plot, palette={'Mediator': '#F44336', 'ZeroMQ': '#4CAF50'}) + +plt.title('Figure 5: Resource Utilization During Throughput Test (Sender)', fontsize=16) +plt.xlabel('Performance Metric', fontsize=12) +plt.ylabel('Average Usage', fontsize=12) +plt.legend(title='Protocol') +plt.grid(axis='y', linestyle='--', alpha=0.7) + +plt.show() diff --git a/measurements/CPU/receiver_usage.csv b/measurements/CPU/receiver_usage.csv new file mode 100644 index 0000000..d49f1f0 --- /dev/null +++ b/measurements/CPU/receiver_usage.csv @@ -0,0 +1,32 @@ +cpu_percent,memory_mb +0.0,17.375 +0.0,17.375 +0.0,17.375 +2.0,17.375 +0.0,17.375 +0.0,17.375 +4.0,17.375 +0.0,17.375 +0.0,17.5 +34.0,17.625 +38.0,17.625 +40.0,17.625 +38.0,17.625 +36.0,17.625 +40.0,17.625 +40.0,17.625 +38.0,17.625 +40.0,17.625 +40.0,17.625 +40.0,17.625 +40.0,17.625 +42.0,17.625 +40.0,17.625 +40.0,17.625 +42.0,17.625 +38.0,17.625 +40.0,17.625 +42.0,17.625 +37.6,17.625 +0.0,17.625 +0.0,17.625 diff --git a/measurements/CPU/sender_usage.csv b/measurements/CPU/sender_usage.csv new file mode 100644 index 0000000..ff7fa9f --- /dev/null +++ b/measurements/CPU/sender_usage.csv @@ -0,0 +1,26 @@ +cpu_percent,memory_mb +0.3,17.15625 +0.0,16.609375 +27.5,17.046875 +23.8,17.078125 +24.3,17.078125 +23.6,17.078125 +23.9,16.75 +23.7,16.734375 +23.9,15.859375 +23.6,15.84375 +22.7,15.78125 +23.3,15.796875 +23.1,15.8125 +23.2,15.8125 +22.0,15.46875 +22.4,15.46875 +23.7,11.578125 +22.8,11.578125 +23.0,11.578125 +22.9,11.5625 +22.6,11.5625 +23.3,11.59375 +0.3,11.578125 +0.0,11.578125 +0.4,10.453125 diff --git a/measurements/CPU/server_cpu.graphml b/measurements/CPU/server_cpu.graphml new file mode 100644 index 0000000..9359a5d --- /dev/null +++ b/measurements/CPU/server_cpu.graphml @@ -0,0 +1,293 @@ + + + + + + + + + + + + A:funcall_cpu.py + + + + + + + + + + + IN: + + + + + + + + + + 0x2311_U1 + + + + + + + + 1751825545123 + + DEL_NODE + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ== + + + ADD_NODE + WyJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMjMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHt9LCIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ== + + 0f6a06a5f49f1d83657221f267bbf65e + + + 1751825547451 + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0= + + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjEwMCwieSI6MTAwfV0= + + c07fdf0b5fbc290aea42a3bd74c45a6b + + + 1751825549601 + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjUzMC4wMDIxOTE0MDExMDk5LCJ5IjoyOTIuMDAwOTc4NDg2MDc3fV0= + + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0= + + 55cb72ce7faf50386f9f71afe1e576fb + + + 1751825564072 + + DEL_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ== + + + ADD_NODE + WyJJbjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjoxOTUuMDAwNDg0MTQ2NzU2OCwieSI6OTAuOTk5OTU0MTMzNDY1MTR9LHt9LCJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ== + + d13798fff2bf40cbacc6bc0f73cc3e5a + + + 1751825566634 + + UPDATE_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJbjoiLHRydWVd + + + UPDATE_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJTjoiLHRydWVd + + 1292dab0cd809e0bc822a88cbe296a4f + + + 1751825570934 + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fV0= + + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjEwMCwieSI6MTAwfV0= + + 71a0470230ca5a52edc2cb9ff06f3d28 + + + 1751825572700 + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjE5NS4wMDA0ODQxNDY3NTY4LCJ5Ijo5MC45OTk5NTQxMzM0NjUxNH1d + + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTk1LjAwMDQ4NDE0Njc1NjgsInkiOjkwLjk5OTk1NDEzMzQ2NTE0fSx7IngiOjE5Mi4wMDA0Njg4NTc5MTE5LCJ5Ijo5NC45OTk5NzQ1MTg1OTE3N31d + + 86c56976fc63f27dc9485ecc73f2de2d + + + 1751825576935 + + DEL_EDGE + WyI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLCJ0YXJnZXRJRCI6IjI0YmUwYzEzLTVkOGMtNGY5MC1iMGJiLTFlMDcyN2IwNDJkNyIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUifV0= + + e3d7f90d81fe934dfa3c417169de8824 + + + 1751826381936 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + 39ad7e349fa9310a7b969d4ebab5282e + + + 1751826525320 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + 8efbfe0ae1b0204fce1d374693fa71a4 + + + 1751826583001 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + 28d360705ea6c4b2c2fe71ddd4ac747b + + + 1751826587218 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + 4688004b0c03d91e2da0b196f1c26a63 + + + 1751826894632 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + 8cbf36e069285329a3e6c103fadd2d15 + + + 1751827827801 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + 474cb438a743ffd7c3e75d28317657f3 + + + 1751828982344 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + 4ec6d444cdddc40c1917aba4da2ee7d0 + + + 1751872426393 + + UPDATE_NODE + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsid2lkdGgiOjIyMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsid2lkdGgiOjIyMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJBOmZ1bmNhbGxfY3B1LnB5Iix0cnVlXQ== + + 72b043d710aeb2d0db300c844fe93875 + + + 1751873444149 + + UPDATE_EDGE + WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwN19VMSIsdHJ1ZV0= + + 1e572e7163ea8ea7366929b360f9c466 + + + 1751874079320 + + UPDATE_EDGE + WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwN19VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwOF9VMSIsdHJ1ZV0= + + 10c8509625f2ef89d457feb1f2e446c0 + + + 1751880120514 + + UPDATE_EDGE + WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwOF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwOV9VMSIsdHJ1ZV0= + + de8502fb8c760c95583f8b1c86af7ba4 + + + 1751880331938 + + UPDATE_EDGE + WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwOV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMxMF9VMSIsdHJ1ZV0= + + 5e9de785196d432fb24f4e6ef3e3563a + + + 1751880478763 + + UPDATE_EDGE + WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMxMF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI5OGRkOGRkYi0xNDQxLTQ3NjItOGEwOS04MWUwYTliOGVmMmQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMxMV9VMSIsdHJ1ZV0= + + 169fdabd56823b7ad4dfcb02668b2355 + + + \ No newline at end of file diff --git a/measurements/Latency/cpymax.py b/measurements/Latency/cpymax.py new file mode 100644 index 0000000..5c767ea --- /dev/null +++ b/measurements/Latency/cpymax.py @@ -0,0 +1,29 @@ +import concore +import time +concore.delay = 0.01 +#Nsim = 100 +init_simtime_u = "[0.0, 0.0, 0.0]" +init_simtime_ym = "[0.0, 0.0, 0.0]" +minElasped = 10000000 +maxElasped = 0 +sumElasped = 0 +u = concore.initval(init_simtime_u) +wallclock1 = time.perf_counter() +while(concore.simtime + + + + + + + + + + + CZ:cpymax.py + + + + + + + + + + + F1:funcall_distributed.py + + + + + + + + + + + IN: + + + + + + + + + + Y + + + + + + + + + + + + U + + + + + + + + + + + + 0x2400_U3 + + + + + + + + 1664644923582 + + DEL_NODE + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== + + + ADD_NODE + WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0se30sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd + + a53a7f7273a40c7970938b6de1829249 + + + 1664644939781 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4IjoxMDAsInkiOjEwMH1d + + 3d4a875a8a6ea281598aa70364b0ea82 + + + 1664644951652 + + DEL_NODE + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== + + + ADD_NODE + WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0se30sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd + + 5ed7e3d12fd25656b2ad03e29c307d65 + + + 1664644958838 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOjEwMCwieSI6MTAwfV0= + + 35c613c8203b65e1f44e066b3d783143 + + + 1664644988539 + + DEL_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== + + + ADD_NODE + WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0se30sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd + + 33d0b0cc4d3dbe3c42323e33f06993e9 + + + 1664645002278 + + DEL_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + + ADD_NODE + WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHt9LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + 8d0d4a735631afe6241c66143fb29db8 + + + 1664645010353 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjoxMTAsInkiOjExMH1d + + 8a01a9ca8b3706bc3b1ce4de33669b6d + + + 1664645015576 + + DEL_EDGE + WyIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiVSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUifV0= + + 14416fc2e3c48db65e2b5e1012027ee0 + + + 1664645043815 + + DEL_EDGE + WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiM2NmYjQwY2QtNTU3YS00ODUwLTkzYTYtZmRjMDljZDAwNWYwIn1d + + 326a920ffd7e662bc64ca95c086fb9de + + + 1664645057658 + + DEL_EDGE + WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNzE0ZGI5ODktNTY3Mi00MDNiLWFlNzYtZmQ5YTIwODkzNDc1In1d + + 4593337e9924ae4b23dc5c5576c31394 + + + 1664645068951 + + DEL_EDGE + WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiYThhZTc4OTAtYjJiYi00MjczLTg3NTMtMDE4MWNlYjQ4NmMxIn1d + + 568d8b7a109ffacc4b912095793cb2ca + + + 1664645081283 + + DEL_EDGE + WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNTViOTlhYjYtYTdkNi00YzY3LWFiNGUtYThlMjkzOWMxYjBmIn1d + + 0d0aa0179f22f9d73a11f8ccfbcc145e + + + 1664645089735 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjoxMDAsInkiOjEwMH1d + + 1c19591402c0f2daca7d2b4a8af5e956 + + + 1664645092868 + + DEL_EDGE + WyI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiWSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkifV0= + + 3c913497d8aa8f1c79bbdc03c3feec16 + + + 1664645142026 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOi0xNzAuNDQxMDYwODg1NDY2OTUsInkiOjkwLjAxMzUzMjc3NDgxNDY5fV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + ecbd46b28ecaf800c8da0d2ada69b4de + + + 1664645149601 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4Ijo3NTQuNDAxODgxNDA3MTk2NSwieSI6OTkuMTM1NzM0OTcxOTM2NjR9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjQwNC4yMzQ2MTA3NjQ4MTQyLCJ5IjotODkuMDEzODQzMjgzNjcxNzh9XQ== + + ea35c112764d7964f8b7e35e9a18efbd + + + 1664645223291 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjY3Ni4wMDYyMjM4MDA2OTMsInkiOjEwMC40NDIzMjkyNjUzNzgzNn1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjc1NC40MDE4ODE0MDcxOTY1LCJ5Ijo5OS4xMzU3MzQ5NzE5MzY2NH1d + + d669d3d37a4693ad860a18c69999b31f + + + 1664645228453 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + f7eb6af4003cb4eff19f39421fc00174 + + + 1664645231883 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4Ijo2NzYuMDA2MjIzODAwNjkzLCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + 49dd0c2013be6e39c2f11ea967dbcab4 + + + 1664645237206 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9XQ== + + 009fc03903a9ae6003caea49a6575ddb + + + 1666487497309 + + ADD_EDGE + W3sibGFiZWwiOiJZMSIsInNvdXJjZSI6IjdiNjljNmU2LTY0ZDEtNGQxZC1hODVkLThmODIwZGVhZTkyZSIsInRhcmdldCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjoyNS4wMTU2MDQ0Mzg0NDI0NywiYmVuZFdlaWdodCI6MC41MDcyNjEyODIxMTY0NTQyLCJiZW5kUG9pbnQiOnsieCI6MTg1Ljk0OTI3NTk2OTkwNjY3LCJ5Ijo2Ny4wNTc5Mjg3NTI0OTY3Mn19LCJzb3VyY2VJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInRhcmdldElEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidHlwZSI6Im9yZGluIiwiaWQiOiJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkifV0= + + + DEL_EDGE + WyJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkiXQ== + + 4957bb66f70bda073e7edafdad81f6b4 + + + 1666487500685 + + ADD_EDGE + W3sibGFiZWwiOiJVMSIsInNvdXJjZSI6IjZhYzczNmNiLWUyZmUtNGI4Mi04NzQ1LTUyZjkzNGYyZGYxMCIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLjAwMDAyNzg2ODE3Mzg2NTQ2NDAzLCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwNDAzMDUwNjYsImJlbmRQb2ludCI6eyJ4IjoyNDUuNzU5MzE4NTQyNzk0OTQsInkiOjk4LjU4MDQzNDE0NjM5NTE4fX0sInNvdXJjZUlEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidGFyZ2V0SUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImRlYzYzYTI5LWY1NWEtNGNmNy04OWIwLWQ3NjY2YzcyMmFkOSJ9XQ== + + + DEL_EDGE + WyJkZWM2M2EyOS1mNTVhLTRjZjctODliMC1kNzY2NmM3MjJhZDkiXQ== + + c8d5e89e2630a4a0aa607594e14861d1 + + + 1666810339519 + + ADD_EDGE + W3sibGFiZWwiOiJVMiIsInNvdXJjZSI6ImFjZWUyZTJjLTFhOTEtNDg1OC1hYzdjLWNhMmNiM2YxZjQ3MCIsInRhcmdldCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjotOS40NzQ2NTYxODQ2MTU5NmUtOCwiYmVuZFdlaWdodCI6MC41MDAwMDAwMDAwMDA5Nzc3LCJiZW5kUG9pbnQiOnsieCI6NDkxLjU4ODIyNDQ2NjEyMTEsInkiOjEwMC42MzA4MzY3OTg1ODUxfX0sInNvdXJjZUlEIjoiZGIzMWJlM2YtM2U1OC00YzM2LTk3OWQtNDFmYjI4YWVmZTY4IiwidGFyZ2V0SUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImU2ZWZhMmIyLWI0NDItNDAwNi05NzQ5LTdlM2IyZDUxMzJmYiJ9XQ== + + + DEL_EDGE + WyJlNmVmYTJiMi1iNDQyLTQwMDYtOTc0OS03ZTNiMmQ1MTMyZmIiXQ== + + ead3ddf695580bca36da4698dfe89256 + + + 1666810339519 + + ADD_EDGE + W3sibGFiZWwiOiJZMiIsInNvdXJjZSI6IjA0YmZkMWI4LTkzYWYtNDQxZi1iNDZhLTMyMGZkMTA3NDBjOSIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjozMC41NjQzMTU2MDk0NTE4NjQsImJlbmRXZWlnaHQiOjAuNTE0MzI5NzI5MzYyMTU2MywiYmVuZFBvaW50Ijp7IngiOjQyMi43NzE0OTAyODczNTc2NiwieSI6NjQuMDU1NTI3OTI5NTQ0ODd9fSwic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInR5cGUiOiJvcmRpbiIsImlkIjoiOTE3MzNmNmItM2RlMy00MGFmLWJmMTQtMmJiNmNiYzQ5MGUyIn1d + + + DEL_EDGE + WyI5MTczM2Y2Yi0zZGUzLTQwYWYtYmYxNC0yYmI2Y2JjNDkwZTIiXQ== + + a86191957747741919dd1f5e71c2e56c + + + 1666810339519 + + ADD_NODE + WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsiaWQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJsYWJlbCI6IkYyOmZ1bmJvZHkucHkiLCJ0eXBlIjoib3JkaW4iLCJzdHlsZSI6eyJ3aWR0aCI6MTIwLCJoZWlnaHQiOjUwLCJvcGFjaXR5IjoxLCJzaGFwZSI6InJlY3RhbmdsZSIsImJhY2tncm91bmRDb2xvciI6IiNmZmNjMDAiLCJib3JkZXJDb2xvciI6IiMwMDAiLCJib3JkZXJXaWR0aCI6MX19LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + + DEL_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + b3ce34b6dc8f697e5b8fdf374ec42075 + + + 1666810343268 + + ADD_NODE + WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJpZCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiUFo6cG1weW1heC5weSIsInR5cGUiOiJvcmRpbiIsInN0eWxlIjp7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfX0sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd + + + DEL_NODE + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== + + ab4fb226f0c49b8ded66436938762af7 + + + 1666810375461 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjExMSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsLnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsMi5weSIsdHJ1ZV0= + + f5e56f793b1dfd259251f6b15ecf0e6a + + + 1748979732766 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsMi5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcTIucHkiLHRydWVd + + 9e9aaedf5e2f34cef7d06d52891d6a76 + + + 1749058687416 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjotMzg4LCJ5IjoxMC43NzM2MjI4MjYyMzMxMDh9XQ== + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fSx7IngiOjEwMCwieSI6OTQuNzczNjIyODI2MjMzMTF9XQ== + + 7cb1d108692b66ae85dd0ffdcf639baf + + + 1749058691778 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3Ny43NzYyMDM1NDk0MjM4MywieSI6MTM2LjMyMDEyNzA2ODI1NjR9XQ== + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3Ny43NzYyMDM1NDk0MjM4MywieSI6MTM2LjMyMDEyNzA2ODI1NjR9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== + + 1ce2563fc9ee71151cb6a722255fd762 + + + 1749058702356 + + DEL_NODE + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiXQ== + + + ADD_NODE + WyJJTjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotNjMyLCJ5IjotMTQzfSx7fSwiNDA4YTVkNjUtZTc2My00NjcyLTlkYTgtZGVjOTEzNjFkY2RkIl0= + + 26f5f23f693921ed1b1ee5d52e1e75b6 + + + 1749058707709 + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6LTU5OCwieSI6OTl9XQ== + + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTU5OCwieSI6OTl9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + 6ae6b59a08af5a7047a97a5ad388c270 + + + 1749058713842 + + DEL_EDGE + WyIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6IjQwOGE1ZDY1LWU3NjMtNDY3Mi05ZGE4LWRlYzkxMzYxZGNkZCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYifV0= + + cc747ad0ecc75c44cc3b6f6f9e9ae92c + + + 1749058727442 + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTU5OCwieSI6OTl9LHsieCI6LTYxMiwieSI6LTEwMn1d + + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYxMiwieSI6LTEwMn0seyJ4IjotNTk4LCJ5Ijo5OX1d + + fa49a13771e334eebbf112917f89d058 + + + 1749058754860 + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6IjQwOGE1ZDY1LWU3NjMtNDY3Mi05ZGE4LWRlYzkxMzYxZGNkZCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwidHlwZSI6Im9yZGluIiwic291cmNlIjoiYzI1ZDZiNjItNWQ2Ni00MDliLTk0YjEtZTZmZmI1ZjBmMTViIiwidGFyZ2V0IjoiNDA4YTVkNjUtZTc2My00NjcyLTlkYTgtZGVjOTEzNjFkY2RkIiwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLCJiZW5kV2VpZ2h0IjowLjUsImJlbmRQb2ludCI6eyJ4IjotNTI0Ljg0NzY3NTkxNDkzNTQsInkiOi01OC4xMTMxODg1ODY4ODM0NDZ9fSwiaWQiOiIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYifV0= + + + DEL_EDGE + WyIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYiXQ== + + 7f0f25f333a2a6cfc15a70a1634323f1 + + + 1749058756916 + + DEL_EDGE + WyJjNTQzMjlmMy0xMmQ1LTQ2ZTAtOTE3Zi02MGQ3NmI3OTQ1ZmIiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJjNTQzMjlmMy0xMmQ1LTQ2ZTAtOTE3Zi02MGQ3NmI3OTQ1ZmIifV0= + + fc1f4b789ad989f3e60a17bbe3a5bd5a + + + 1749058765759 + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYxMiwieSI6LTEwMn0seyJ4IjotNjMyLCJ5IjotMTQzfV0= + + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYzMiwieSI6LTE0M30seyJ4IjotNjEyLCJ5IjotMTAyfV0= + + 4209fecec5c91f476c4539fa06418efd + + + 1749058768670 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fSx7IngiOi00ODcsInkiOjUwLjc3MzYyMjgyNjIzMzExfV0= + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTQ4NywieSI6NTAuNzczNjIyODI2MjMzMTF9LHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fV0= + + 63797cc5d0c6dc2da5ef71e99504bd45 + + + 1749066909379 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9ZMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0= + + 1ad516ce46689ac6f15b5532ff42ab86 + + + 1749070198710 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + f6a8e5aa88fff9e10e187a6f5d1b6b33 + + + 1749070471512 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + 9b54fffa96ec88de939b11febe6746d0 + + + 1749070605367 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + ae211e5c6a9ff5b2487f0e107ea136f1 + + + 1749325857360 + + UPDATE_EDGE + WyIwMjg4Nzc2NS1lNTA5LTQ3MjgtYWE1ZC1hZTBiYmJhMjkxMzQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyIwMjg4Nzc2NS1lNTA5LTQ3MjgtYWE1ZC1hZTBiYmJhMjkxMzQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwNV9VMyIsdHJ1ZV0= + + d42101a2e57f7e1fc75f9b867262a6a8 + + + 1751707047236 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcTIucHkiLHRydWVd + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE5MywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX2Rpc3RyaWJ1dGVkLnB5Iix0cnVlXQ== + + ad7e56eb4e9610939329b1542aa0e868 + + + 1751708835442 + + UPDATE_EDGE + WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwNV9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + 16b71f5be7fb830dc4cb9ceea3f11ff0 + + + 1751709251435 + + UPDATE_EDGE + WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + 8957f77c22449c1f4caabb7ca68ead37 + + + 1751709403095 + + UPDATE_EDGE + WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyIxMWYyMGJhOC1lYWU5LTQ3YjktYTA0OC05NjBmODRlYWJhOWEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0= + + e85d0bc31c27cb6e02aeacdb333eaa29 + + + \ No newline at end of file diff --git a/measurements/Latency/distributed_server.graphml b/measurements/Latency/distributed_server.graphml new file mode 100644 index 0000000..852b689 --- /dev/null +++ b/measurements/Latency/distributed_server.graphml @@ -0,0 +1,520 @@ + + + + + + + + + + + + PZ:pmpymax.py + + + + + + + + + + + F2:funbody_distributed.py + + + + + + + + + + + OUT: + + + + + + + + + + Y2 + + + + + + + + + + + + U2 + + + + + + + + + + + + 0x2405_U3 + + + + + + + + 1664644923582 + + DEL_NODE + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== + + + ADD_NODE + WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0se30sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd + + a53a7f7273a40c7970938b6de1829249 + + + 1664644939781 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4IjoxMDAsInkiOjEwMH1d + + 3d4a875a8a6ea281598aa70364b0ea82 + + + 1664644951652 + + DEL_NODE + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== + + + ADD_NODE + WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0se30sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd + + 5ed7e3d12fd25656b2ad03e29c307d65 + + + 1664644958838 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOjEwMCwieSI6MTAwfV0= + + 35c613c8203b65e1f44e066b3d783143 + + + 1664644988539 + + DEL_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== + + + ADD_NODE + WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0se30sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd + + 33d0b0cc4d3dbe3c42323e33f06993e9 + + + 1664645002278 + + DEL_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + + ADD_NODE + WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHt9LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + 8d0d4a735631afe6241c66143fb29db8 + + + 1664645010353 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjoxMTAsInkiOjExMH1d + + 8a01a9ca8b3706bc3b1ce4de33669b6d + + + 1664645015576 + + DEL_EDGE + WyIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiVSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUifV0= + + 14416fc2e3c48db65e2b5e1012027ee0 + + + 1664645043815 + + DEL_EDGE + WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiM2NmYjQwY2QtNTU3YS00ODUwLTkzYTYtZmRjMDljZDAwNWYwIn1d + + 326a920ffd7e662bc64ca95c086fb9de + + + 1664645057658 + + DEL_EDGE + WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNzE0ZGI5ODktNTY3Mi00MDNiLWFlNzYtZmQ5YTIwODkzNDc1In1d + + 4593337e9924ae4b23dc5c5576c31394 + + + 1664645068951 + + DEL_EDGE + WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiYThhZTc4OTAtYjJiYi00MjczLTg3NTMtMDE4MWNlYjQ4NmMxIn1d + + 568d8b7a109ffacc4b912095793cb2ca + + + 1664645081283 + + DEL_EDGE + WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNTViOTlhYjYtYTdkNi00YzY3LWFiNGUtYThlMjkzOWMxYjBmIn1d + + 0d0aa0179f22f9d73a11f8ccfbcc145e + + + 1664645089735 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjoxMDAsInkiOjEwMH1d + + 1c19591402c0f2daca7d2b4a8af5e956 + + + 1664645092868 + + DEL_EDGE + WyI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiWSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkifV0= + + 3c913497d8aa8f1c79bbdc03c3feec16 + + + 1664645142026 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOi0xNzAuNDQxMDYwODg1NDY2OTUsInkiOjkwLjAxMzUzMjc3NDgxNDY5fV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + ecbd46b28ecaf800c8da0d2ada69b4de + + + 1664645149601 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4Ijo3NTQuNDAxODgxNDA3MTk2NSwieSI6OTkuMTM1NzM0OTcxOTM2NjR9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjQwNC4yMzQ2MTA3NjQ4MTQyLCJ5IjotODkuMDEzODQzMjgzNjcxNzh9XQ== + + ea35c112764d7964f8b7e35e9a18efbd + + + 1664645223291 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjY3Ni4wMDYyMjM4MDA2OTMsInkiOjEwMC40NDIzMjkyNjUzNzgzNn1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjc1NC40MDE4ODE0MDcxOTY1LCJ5Ijo5OS4xMzU3MzQ5NzE5MzY2NH1d + + d669d3d37a4693ad860a18c69999b31f + + + 1664645228453 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + f7eb6af4003cb4eff19f39421fc00174 + + + 1664645231883 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4Ijo2NzYuMDA2MjIzODAwNjkzLCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + 49dd0c2013be6e39c2f11ea967dbcab4 + + + 1664645237206 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9XQ== + + 009fc03903a9ae6003caea49a6575ddb + + + 1666487497309 + + ADD_EDGE + W3sibGFiZWwiOiJZMSIsInNvdXJjZSI6IjdiNjljNmU2LTY0ZDEtNGQxZC1hODVkLThmODIwZGVhZTkyZSIsInRhcmdldCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjoyNS4wMTU2MDQ0Mzg0NDI0NywiYmVuZFdlaWdodCI6MC41MDcyNjEyODIxMTY0NTQyLCJiZW5kUG9pbnQiOnsieCI6MTg1Ljk0OTI3NTk2OTkwNjY3LCJ5Ijo2Ny4wNTc5Mjg3NTI0OTY3Mn19LCJzb3VyY2VJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInRhcmdldElEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidHlwZSI6Im9yZGluIiwiaWQiOiJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkifV0= + + + DEL_EDGE + WyJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkiXQ== + + 4957bb66f70bda073e7edafdad81f6b4 + + + 1666487500685 + + ADD_EDGE + W3sibGFiZWwiOiJVMSIsInNvdXJjZSI6IjZhYzczNmNiLWUyZmUtNGI4Mi04NzQ1LTUyZjkzNGYyZGYxMCIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLjAwMDAyNzg2ODE3Mzg2NTQ2NDAzLCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwNDAzMDUwNjYsImJlbmRQb2ludCI6eyJ4IjoyNDUuNzU5MzE4NTQyNzk0OTQsInkiOjk4LjU4MDQzNDE0NjM5NTE4fX0sInNvdXJjZUlEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidGFyZ2V0SUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImRlYzYzYTI5LWY1NWEtNGNmNy04OWIwLWQ3NjY2YzcyMmFkOSJ9XQ== + + + DEL_EDGE + WyJkZWM2M2EyOS1mNTVhLTRjZjctODliMC1kNzY2NmM3MjJhZDkiXQ== + + c8d5e89e2630a4a0aa607594e14861d1 + + + 1666810445211 + + ADD_EDGE + W3sibGFiZWwiOiJZIiwic291cmNlIjoiNTIzNjQxYTQtOTc1NS00NWVkLTlhMjUtYTExNDc2ZGUzN2EwIiwidGFyZ2V0IjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwic3R5bGUiOnsiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInRoaWNrbmVzcyI6MSwic2hhcGUiOiJzb2xpZCJ9LCJiZW5kRGF0YSI6eyJiZW5kRGlzdGFuY2UiOjI5LjE1NTExMDY3Mjg3NDI5NCwiYmVuZFdlaWdodCI6MC41MTMxNjc2Njk2NTEzNTEyLCJiZW5kUG9pbnQiOnsieCI6LTUwLjM1NTE2Njc0NzA3LCJ5Ijo1OC4xODI0NTg4NjkxNTA4NH19LCJzb3VyY2VJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInRhcmdldElEIjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwidHlwZSI6Im9yZGluIiwiaWQiOiI4YTE1ZmMyOC02ZjA5LTQ3MmYtYTk3Ni1jZmYzOWY3MzFjNjAifV0= + + + DEL_EDGE + WyI4YTE1ZmMyOC02ZjA5LTQ3MmYtYTk3Ni1jZmYzOWY3MzFjNjAiXQ== + + cfc129abe20d32f8c156301489dcc705 + + + 1666810445211 + + ADD_EDGE + W3sibGFiZWwiOiJVIiwic291cmNlIjoiZDA0MDg0OGYtNmE5NC00YWMyLWE0ZTItYTg4NzliNWY3ZmZiIiwidGFyZ2V0IjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwic3R5bGUiOnsiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInRoaWNrbmVzcyI6MSwic2hhcGUiOiJzb2xpZCJ9LCJiZW5kRGF0YSI6eyJiZW5kRGlzdGFuY2UiOjAuMDAwMDE0ODc2MzcxMTExNjM4NDIsImJlbmRXZWlnaHQiOjAuNTAwMDAwMDAxMjIyMTMzNiwiYmVuZFBvaW50Ijp7IngiOjExLjYxMTg5ODIyNTI4ODk2OCwieSI6OTMuNDg5ODc5MjQ2Nzg1Mzl9fSwic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInR5cGUiOiJvcmRpbiIsImlkIjoiZTAxY2FiN2MtYzQ0Ni00OGRhLWI4OGUtN2Y5NjIwY2NkMjY5In1d + + + DEL_EDGE + WyJlMDFjYWI3Yy1jNDQ2LTQ4ZGEtYjg4ZS03Zjk2MjBjY2QyNjkiXQ== + + 9fbba2442b7019a76634710caf98a549 + + + 1666810445211 + + ADD_NODE + WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJpZCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiRjE6ZnVuY2FsbC5weSIsInR5cGUiOiJvcmRpbiIsInN0eWxlIjp7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfX0sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd + + + DEL_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== + + de44f1ff4f2107a20e234361711eec91 + + + 1666810453165 + + ADD_NODE + WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0seyJpZCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiQ1o6Y3B5bWF4LnB5IiwidHlwZSI6Im9yZGluIiwic3R5bGUiOnsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9fSwiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIl0= + + + DEL_NODE + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== + + f1cb4196a5082cef004f9ee186c7f04b + + + 1666810462415 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5LnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5Mi5weSIsdHJ1ZV0= + + 9e9b34686b3aec97cf26547fcd7ae633 + + + 1748979705408 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5Mi5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + 299aef4ea2931f8b9a6b7f10361b0022 + + + 1749058646821 + + DEL_NODE + WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiXQ== + + + ADD_NODE + WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTQzLCJ5IjoyNzF9LHt9LCI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiXQ== + + 51cf4c5701b1a8a637c1b373dcd09c59 + + + 1749058651133 + + SET_POS + WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTQzLCJ5IjoyNzF9XQ== + + + SET_POS + WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiLHsieCI6MTQzLCJ5IjoyNzF9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + 440d3083c9a571e9660685eaeefae6fb + + + 1749058659847 + + DEL_EDGE + WyJmYzY1ZTg0OC04OTJmLTQyZWQtYWU0OS1iYjhlYmQzODVmYjAiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6IjUyZTk3NDkyLWNjZWEtNDhhMi05ZGVkLWUyMzVlMjQ1MDM1OCIsImxhYmVsIjoiMHgyNDAwX1UzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJmYzY1ZTg0OC04OTJmLTQyZWQtYWU0OS1iYjhlYmQzODVmYjAifV0= + + 615e0be29af2a4940efea41e374438bb + + + 1749070207801 + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + a8472011e18e50a782b19383b3b1a41d + + + 1749070480095 + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + 4a9c6467598df6924c76f002eccbb822 + + + 1749070617114 + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + 2b2ace96e5b5dad90e06fbac4e20b915 + + + 1749322194657 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + dfbb291ab07456ce0005d5c6d1d6a18a + + + 1749325840799 + + UPDATE_EDGE + WyJlOTJlM2E5ZC1lOWEwLTQ5YzgtOWYyMC1iNWQ1MTM3M2EzZjYiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyJlOTJlM2E5ZC1lOWEwLTQ5YzgtOWYyMC1iNWQ1MTM3M2EzZjYiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwNV9VMyIsdHJ1ZV0= + + 385fc34934650be854756424f6fac52e + + + 1749406730989 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjIxMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X2Rpc3RyaWJ1dGVkLnB5Iix0cnVlXQ== + + 3eae38f7266c77d8368676cbdc9b3ba5 + + + \ No newline at end of file diff --git a/measurements/Latency/figure3_latency_comparison.png b/measurements/Latency/figure3_latency_comparison.png new file mode 100644 index 0000000..6aa3ca8 Binary files /dev/null and b/measurements/Latency/figure3_latency_comparison.png differ diff --git a/measurements/Latency/funbody_distributed.py b/measurements/Latency/funbody_distributed.py new file mode 100644 index 0000000..eaae295 --- /dev/null +++ b/measurements/Latency/funbody_distributed.py @@ -0,0 +1,67 @@ +# funbody2_zmq.py +import time +import concore +import concore2 + +print("funbody using ZMQ via concore") + +# Initialize ZMQ REP port using concore +concore.init_zmq_port( + port_name=PORT_NAME_F2_OUT, + port_type="bind", + address= "tcp://0.0.0.0:" + PORT_F2_OUT, + socket_type_str="REP" +) + + +# Standard concore initializations +concore.delay = 0.07 +concore2.delay = 0.07 +concore2.inpath = concore.inpath +concore2.outpath = concore.outpath +concore2.simtime = 0 +concore.default_maxtime(100) +init_simtime_u_str = "[0.0, 0.0, 0.0]" +init_simtime_ym_str = "[0.0, 0.0, 0.0]" + +u_data_values = concore.initval(init_simtime_u_str) +ym_data_values = concore2.initval(init_simtime_ym_str) + +print(f"Initial u_data_values: {u_data_values}, ym_data_values: {ym_data_values}") +print(f"Max time: {concore.maxtime}") + +while concore2.simtime < concore.maxtime: + received_u_data = concore.read(PORT_NAME_F2_OUT, "u_signal", init_simtime_u_str) + + if not (isinstance(received_u_data, list) and len(received_u_data) > 0): + print(f"Error or invalid data received via ZMQ: {received_u_data}. Skipping iteration.") + time.sleep(concore.delay) + continue + + received_time = received_u_data[0] + if isinstance(received_time, (int, float)): + concore.simtime = received_time + u_data_values = received_u_data[1:] + else: + print(f"Warning: Received ZMQ data's first element is not time: {received_u_data}. Using data part as is.") + u_data_values = received_u_data[1:] if len(received_u_data) > 1 else [] + + # Assuming concore.oport['U2'] is a file port (e.g., to pmpymax.py) + if 'U2' in concore.oport: + concore.write(concore.oport['U2'], "u", u_data_values) + + old_concore2_simtime = concore2.simtime + while concore2.unchanged() or concore2.simtime <= old_concore2_simtime: + # Assuming concore.iport['Y2'] is a file port (e.g., from pmpymax.py) + ym_data_values = concore2.read(concore.iport['Y2'], "ym", init_simtime_ym_str) + # time.sleep(concore2.delay) # Optional delay + + ym_full_to_send = [concore2.simtime] + ym_data_values + + concore.write(PORT_NAME_F2_OUT, "ym_signal", ym_full_to_send) + + print(f"funbody u={u_data_values} ym={ym_data_values} time={concore2.simtime}") + +print("funbody retry=" + str(concore.retrycount)) + +concore.terminate_zmq() \ No newline at end of file diff --git a/measurements/Latency/funcall_distributed.py b/measurements/Latency/funcall_distributed.py new file mode 100644 index 0000000..779324f --- /dev/null +++ b/measurements/Latency/funcall_distributed.py @@ -0,0 +1,83 @@ +# funcall_distributed.py (MODIFIED FOR LATENCY MEASUREMENT) +import time +import concore +import concore2 +import csv # <--- ADDED: Import CSV library + +print("funcall using ZMQ via concore") + +# This assumes PORT_NAME_IN_F1, PORT_IN_F1 are defined elsewhere before this script runs +concore.init_zmq_port( + port_name=PORT_NAME_IN_F1, + port_type="connect", + address="tcp://192.168.0.109:" + PORT_IN_F1, # The IP address of the machine running funbody + socket_type_str="REQ" +) + +# Standard concore initializations +concore.delay = 0.07 +concore2.delay = 0.07 +concore2.inpath = concore.inpath +concore2.outpath = concore.outpath +concore2.simtime = 0 +concore.default_maxtime(100) # Recommend increasing this for more data points, e.g., 1000 +init_simtime_u_str = "[0.0, 0.0, 0.0]" +init_simtime_ym_str = "[0.0, 0.0, 0.0]" + +u = concore.initval(init_simtime_u_str) +ym = concore2.initval(init_simtime_ym_str) + +# --- ADDED: Initialize a list to store latency values --- +zeromq_latencies = [] + +print(f"Initial u: {u}, ym: {ym}, concore.simtime: {concore.simtime}, concore2.simtime: {concore2.simtime}") +print(f"Max time: {concore.maxtime}") + +while concore2.simtime < concore.maxtime: + while concore.unchanged(): + u = concore.read(concore.iport['U'], "u", init_simtime_u_str) + + data_to_send_u = [concore.simtime] + u + + # --- MODIFIED: Add timing logic around the ZMQ communication --- + start_time = time.perf_counter() + + concore.write(PORT_NAME_IN_F1, "u_signal", data_to_send_u) + received_ym_data = concore.read(PORT_NAME_IN_F1, "ym_signal", init_simtime_ym_str) + + end_time = time.perf_counter() + latency_ms = (end_time - start_time) * 1000 + zeromq_latencies.append(latency_ms) + # --- END OF MODIFICATION --- + + if isinstance(received_ym_data, list) and len(received_ym_data) > 0: + response_time = received_ym_data[0] + if isinstance(response_time, (int, float)): + concore2.simtime = response_time + ym = received_ym_data[1:] + else: + print(f"Warning: Received ZMQ data's first element is not time: {received_ym_data}. Using as is.") + ym = received_ym_data + else: + print(f"Warning: Received unexpected ZMQ data format: {received_ym_data}. Using default ym.") + ym = concore2.initval(init_simtime_ym_str) + + concore2.write(concore.oport['Y'], "ym", ym) + + print(f"funcall ZMQ u={u} ym={ym} time={concore2.simtime} | ZMQ Latency: {latency_ms:.4f} ms") + +print("funcall retry=" + str(concore.retrycount)) + +# --- ADDED: Save the collected latencies to a CSV file --- +# Discard the first few values as a "warm-up" +warmup_period = 5 +if len(zeromq_latencies) > warmup_period: + with open('zeromq_latencies.csv', 'w', newline='') as f: + writer = csv.writer(f) + writer.writerow(['Latency (ms)']) + for latency in zeromq_latencies[warmup_period:]: + writer.writerow([latency]) + print("Latency data saved to zeromq_latencies.csv") +# --- END OF ADDITION --- + +concore.terminate_zmq() \ No newline at end of file diff --git a/measurements/Latency/mediator_latencies.csv b/measurements/Latency/mediator_latencies.csv new file mode 100644 index 0000000..618fbf0 --- /dev/null +++ b/measurements/Latency/mediator_latencies.csv @@ -0,0 +1,101 @@ +Latency (ms) +5245.0712 +4292.6035 +5471.5328 +6784.5448 +4148.7699 +4148.7946 +6868.8192 +5651.1521 +3795.7884 +5313.8401 +3804.8735 +3801.4054 +4862.9434 +1630.0796 +1912.6233 +3656.5687 +2980.7533 +4971.3710 +3137.9639 +2381.5444 +6698.4732 +4161.3355 +4601.2923 +2362.8777 +3683.4259 +4666.3839 +2773.5096 +5063.5470 +3599.0420 +4062.4594 +3597.4401 +7278.4173 +4479.7542 +2913.4336 +5733.8174 +2668.7345 +4813.2954 +1560.4948 +2507.7209 +4795.2919 +5607.6999 +4757.0524 +4326.5276 +4048.3445 +2282.2170 +3420.2337 +3809.0418 +6085.6833 +5015.4274 +1855.4398 +4986.1260 +3922.3766 +3484.6170 +5417.5144 +6046.4993 +5896.9202 +3241.1737 +4036.1814 +4996.8951 +5963.3177 +3781.2386 +4221.5115 +2840.4975 +2705.6901 +5718.7887 +6534.3600 +4391.9848 +6005.2993 +5042.4540 +3532.3204 +5042.0934 +6807.0548 +4446.2609 +6846.9655 +1708.7055 +5732.8538 +4630.5706 +4051.4890 +4637.6412 +1518.6466 +4170.4922 +5035.6689 +6716.8411 +3722.5947 +3287.2596 +3747.3644 +5873.1032 +4993.1267 +3705.3597 +5269.9011 +4645.6163 +5952.9675 +3446.9204 +4008.5068 +3911.8378 +2304.7276 +4944.1804 +4891.5829 +4507.6702 +4148.1193 \ No newline at end of file diff --git a/measurements/Latency/plot_fig3(1).py b/measurements/Latency/plot_fig3(1).py new file mode 100644 index 0000000..6f441d1 --- /dev/null +++ b/measurements/Latency/plot_fig3(1).py @@ -0,0 +1,53 @@ +import pandas as pd +import seaborn as sns +import matplotlib.pyplot as plt + +def generate_comparison_plot(): + """ + Loads latency data for ZeroMQ and Mediator protocols, + and generates a comparative violin plot. + """ + try: + # Load the ZeroMQ latency data + df_zmq = pd.read_csv('zeromq_latencies.csv') + df_zmq['Protocol'] = 'ZeroMQ' + + # Load the Mediator latency data + df_mediator = pd.read_csv('mediator_latencies.csv') + df_mediator['Protocol'] = 'Mediator' + + except FileNotFoundError as e: + print(f"Error: Could not find a required CSV file. Make sure both 'zeromq_latencies.csv' and 'mediator_latencies.csv' are in the same directory.") + print(f"Details: {e}") + return + + # Combine both dataframes into a single one for plotting + df_combined = pd.concat([df_zmq, df_mediator], ignore_index=True) + + # Create the violin plot + print("Generating plot...") + plt.figure(figsize=(10, 8)) + sns.violinplot( + x='Protocol', + y='Latency (ms)', + data=df_combined, + palette={'ZeroMQ': '#4CAF50', 'Mediator': '#F44336'} + ) + + # Add plot details for the research paper + plt.title('Figure 3: Latency Distribution of Distributed Protocols', fontsize=16, pad=20) + plt.xlabel('Communication Protocol', fontsize=12) + plt.ylabel('Round-Trip Latency (ms)', fontsize=12) + plt.xticks(fontsize=12) + plt.yticks(fontsize=12) + plt.grid(True, which='major', linestyle='--', linewidth='0.5', color='grey') + + # Save the figure for your paper + plt.savefig('figure3_latency_comparison.png', dpi=300) + print("Plot saved as 'figure3_latency_comparison.png'") + + # Display the plot + plt.show() + +if __name__ == '__main__': + generate_comparison_plot() \ No newline at end of file diff --git a/measurements/Latency/plot_fig3(2).py b/measurements/Latency/plot_fig3(2).py new file mode 100644 index 0000000..70240a6 --- /dev/null +++ b/measurements/Latency/plot_fig3(2).py @@ -0,0 +1,38 @@ +import pandas as pd +import seaborn as sns +import matplotlib.pyplot as plt + +# Load the collected data +try: + df_zmq = pd.read_csv('zeromq_latencies.csv') + df_zmq['Protocol'] = 'ZeroMQ' # Add a column to identify the protocol +except FileNotFoundError: + print("Error: zeromq_latencies.csv not found. Please run the experiment first.") + exit() + +# It's good practice to filter out extreme outliers if they exist, +# for example, values over a certain threshold that might be due to a one-off system lag. +# For now, we will plot all the data. + +# Create the plot +plt.figure(figsize=(8, 7)) +sns.violinplot(x='Protocol', y='Latency (ms)', data=df_zmq, palette=['#4CAF50']) + +# Add details to the plot +plt.title('Latency Distribution of ZeroMQ Protocol', fontsize=16) +plt.xlabel('') +plt.ylabel('Round-Trip Latency (ms)', fontsize=12) +plt.grid(True, linestyle='--', alpha=0.6) +plt.xticks(fontsize=12) + +# Calculate and print statistics to include in your paper +median_val = df_zmq['Latency (ms)'].median() +mean_val = df_zmq['Latency (ms)'].mean() +std_val = df_zmq['Latency (ms)'].std() + +print(f"ZeroMQ Latency Stats:") +print(f" - Median: {median_val:.4f} ms") +print(f" - Mean: {mean_val:.4f} ms") +print(f" - Std Dev: {std_val:.4f} ms") + +plt.show() \ No newline at end of file diff --git a/measurements/Latency/pmpymax.py b/measurements/Latency/pmpymax.py new file mode 100644 index 0000000..9454f30 --- /dev/null +++ b/measurements/Latency/pmpymax.py @@ -0,0 +1,15 @@ +import concore + +concore.delay = 0.01 +#Nsim = 100 +init_simtime_u = "[0.0, 0.0, 0.0]" +init_simtime_ym = "[0.0, 0.0, 0.0]" + +ym = concore.initval(init_simtime_ym) +while(concore.simtime + + + + + + + + + + + B:funbody_throughput_test.py + + + + + + + + + + + OUT: + + + + + + + + + + 0x2308_U1 + + + + + + + + 1751825758771 + + DEL_NODE + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ== + + + ADD_NODE + WyJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMzMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NDg3LCJ5IjozMTN9LHt9LCI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ== + + e425a002ed1453f66a4fb1dad3ad2923 + + + 1751825761336 + + SET_POS + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDg3LCJ5IjozMTN9XQ== + + + SET_POS + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6NDg3LCJ5IjozMTN9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + d7861c7337345a2010806e89311d85bf + + + 1751825767651 + + DEL_NODE + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ== + + + ADD_NODE + WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTA3LCJ5IjoxMDJ9LHt9LCIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ== + + 19b85e105d5758f18c55915fbce84663 + + + 1751825770936 + + SET_POS + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTA3LCJ5IjoxMDJ9XQ== + + + SET_POS + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTA3LCJ5IjoxMDJ9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + 03b8818572c5800d88c583073a1ef559 + + + 1751825773370 + + DEL_EDGE + WyI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLCJ0YXJnZXRJRCI6IjIxOTZjMTQ2LTE4MGMtNGQxNC1iYmFhLTM0MGY3NmUxNDgwOSIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQifV0= + + 1dd8b4edaeed282d75d1daeb3195b728 + + + 1751826367735 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + ca298c11df338ea36bce176af0fe3b69 + + + 1751826515156 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + c6ee9fdcb90f48bc1de9bdc44b7da91f + + + 1751826596605 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + b79566da6d5ea6c2cf2cbb618da677d2 + + + 1751826901740 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + ba871dc0f4bc75adee32e34c87854508 + + + 1751827730897 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + 8bb2b4d5cd9d445722b307d6bdb3d9fd + + + 1751828973865 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + 3609737de0e0d000c3d43a620f592090 + + + 1751879990560 + + UPDATE_EDGE + WyIwY2QxNGIzOS1hYjBiLTQxODktOTcxMi0wMGYzMGQ3Y2VmZTgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyIwY2QxNGIzOS1hYjBiLTQxODktOTcxMi0wMGYzMGQ3Y2VmZTgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwOF9VMSIsdHJ1ZV0= + + 0fb79b2f266bed8408c82460441b7871 + + + \ No newline at end of file diff --git a/measurements/Throughput/funbody_throughput_test.py b/measurements/Throughput/funbody_throughput_test.py new file mode 100644 index 0000000..d517488 --- /dev/null +++ b/measurements/Throughput/funbody_throughput_test.py @@ -0,0 +1,40 @@ +# funbody_throughput.py +import time +import concore + +print("Starting ZMQ throughput server (funbody)") + +# --- ZMQ Configuration --- +# Ensure these environment variables are set before running +# Example: PORT_NAME_F2_OUT="F1_out" PORT_F2_OUT="5555" python funbody_throughput.py + +# Initialize the ZMQ server port +concore.init_zmq_port( + port_name=PORT_NAME_B_OUT, + port_type="bind", + address="tcp://0.0.0.0:" + PORT_B_OUT, # Bind to all interfaces on the specified port + socket_type_str="REP" +) + +# --- Server Loop --- +print(f"Funbody server listening on port {PORT_B_OUT}. Press Ctrl+C to stop.") + +try: + while True: + # Wait to receive any message from a client + received_message = concore.read(PORT_NAME_B_OUT, "throughput_test", "{}") + + if received_message: + # As soon as a message is received, send a reply back + reply_message = {"status": "ok"} + concore.write(PORT_NAME_B_OUT, "throughput_reply", reply_message) + else: + # The read timed out; just continue waiting for the next message + continue + +except KeyboardInterrupt: + print("\nServer shutting down.") + +finally: + # Clean up the ZMQ connection + concore.terminate_zmq() \ No newline at end of file diff --git a/measurements/Throughput/funcall_throughput_test.py b/measurements/Throughput/funcall_throughput_test.py new file mode 100644 index 0000000..6c58aac --- /dev/null +++ b/measurements/Throughput/funcall_throughput_test.py @@ -0,0 +1,57 @@ +# funcall_throughput.py +import time +import concore + +print("Starting ZMQ throughput test (funcall)") + +# --- ZMQ Configuration --- +# Ensure these environment variables are set before running +# Example: PORT_NAME_IN_F1="F1_out" PORT_IN_F1="5555" python funcall_throughput.py + +# Initialize the ZMQ connection to the funbody server +concore.init_zmq_port( + port_name=PORT_NAME_IN_A, + port_type="connect", + address="tcp://192.168.0.109:" + PORT_IN_A, # Use 127.0.0.1 for local testing + socket_type_str="REQ" +) + +# --- Test Parameters --- +TEST_DURATION_SECONDS = 10 +message_to_send = {"ping": "hello"} +message_count = 0 + +print(f"Running test for {TEST_DURATION_SECONDS} seconds...") + +start_time = time.perf_counter() +end_time = start_time + TEST_DURATION_SECONDS + +# --- Main Test Loop --- +while time.perf_counter() < end_time: + # Send a message to the funbody server + concore.write(PORT_NAME_IN_A, "throughput_test", message_to_send) + + # Wait for the reply + reply = concore.read(PORT_NAME_IN_A, "throughput_reply", "{}") + + # If we get a valid reply, increment our counter + if reply: + message_count += 1 + else: + print("Warning: Missed a reply from the server.") + # In a real-world scenario, you might want to break or handle this + break + +# --- Calculate and Print Results --- +actual_duration = time.perf_counter() - start_time +throughput = message_count / actual_duration + +print("\n--- Throughput Test Complete ---") +print(f"Total messages exchanged: {message_count}") +print(f"Total time: {actual_duration:.2f} seconds") +print(f"Throughput: {throughput:.2f} messages/sec") +print("---------------------------------") + + +# Clean up the ZMQ connection +concore.terminate_zmq() \ No newline at end of file diff --git a/measurements/Throughput/plot_fig4.py b/measurements/Throughput/plot_fig4.py new file mode 100644 index 0000000..2076d57 --- /dev/null +++ b/measurements/Throughput/plot_fig4.py @@ -0,0 +1,34 @@ +import matplotlib.pyplot as plt +import numpy as np + +# --- Enter your collected data here --- +# Example values, replace with your actual measurements +throughput_mediator = 15.7 # messages/sec +throughput_zmq = 25432.1 # messages/sec +# ----------------------------------------- + +protocols = ['Mediator', 'ZeroMQ'] +values = [throughput_mediator, throughput_zmq] +colors = ['#F44336', '#4CAF50'] + +plt.figure(figsize=(8, 6)) +bars = plt.bar(protocols, values, color=colors) + +# Add plot details +plt.ylabel('Throughput (Messages/Second)', fontsize=12) +plt.title('Figure 4: Maximum Throughput Comparison', fontsize=16, pad=20) +plt.xticks(fontsize=12) +# Use a logarithmic scale if the difference is very large +plt.yscale('log') +plt.grid(axis='y', linestyle='--', alpha=0.7) + +# Add text labels on top of the bars +for bar in bars: + yval = bar.get_height() + plt.text(bar.get_x() + bar.get_width()/2.0, yval, f'{yval:,.0f}', va='bottom', ha='center', fontsize=11) + +# Save the figure for your paper +plt.savefig('figure4_throughput_comparison.png', dpi=300) +print("Plot saved as 'figure4_throughput_comparison.png'") + +plt.show() \ No newline at end of file diff --git a/measurements/Throughput/server.graphml b/measurements/Throughput/server.graphml new file mode 100644 index 0000000..81b5102 --- /dev/null +++ b/measurements/Throughput/server.graphml @@ -0,0 +1,221 @@ + + + + + + + + + + + + A:funcall_throughput_test.py + + + + + + + + + + + IN: + + + + + + + + + + 0x2306_U1 + + + + + + + + 1751825545123 + + DEL_NODE + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ== + + + ADD_NODE + WyJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMjMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHt9LCIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ== + + 0f6a06a5f49f1d83657221f267bbf65e + + + 1751825547451 + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0= + + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjEwMCwieSI6MTAwfV0= + + c07fdf0b5fbc290aea42a3bd74c45a6b + + + 1751825549601 + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjUzMC4wMDIxOTE0MDExMDk5LCJ5IjoyOTIuMDAwOTc4NDg2MDc3fV0= + + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0= + + 55cb72ce7faf50386f9f71afe1e576fb + + + 1751825564072 + + DEL_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ== + + + ADD_NODE + WyJJbjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjoxOTUuMDAwNDg0MTQ2NzU2OCwieSI6OTAuOTk5OTU0MTMzNDY1MTR9LHt9LCJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ== + + d13798fff2bf40cbacc6bc0f73cc3e5a + + + 1751825566634 + + UPDATE_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJbjoiLHRydWVd + + + UPDATE_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJTjoiLHRydWVd + + 1292dab0cd809e0bc822a88cbe296a4f + + + 1751825570934 + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fV0= + + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjEwMCwieSI6MTAwfV0= + + 71a0470230ca5a52edc2cb9ff06f3d28 + + + 1751825572700 + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjE5NS4wMDA0ODQxNDY3NTY4LCJ5Ijo5MC45OTk5NTQxMzM0NjUxNH1d + + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTk1LjAwMDQ4NDE0Njc1NjgsInkiOjkwLjk5OTk1NDEzMzQ2NTE0fSx7IngiOjE5Mi4wMDA0Njg4NTc5MTE5LCJ5Ijo5NC45OTk5NzQ1MTg1OTE3N31d + + 86c56976fc63f27dc9485ecc73f2de2d + + + 1751825576935 + + DEL_EDGE + WyI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLCJ0YXJnZXRJRCI6IjI0YmUwYzEzLTVkOGMtNGY5MC1iMGJiLTFlMDcyN2IwNDJkNyIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUifV0= + + e3d7f90d81fe934dfa3c417169de8824 + + + 1751826381936 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + 39ad7e349fa9310a7b969d4ebab5282e + + + 1751826525320 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + 8efbfe0ae1b0204fce1d374693fa71a4 + + + 1751826583001 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + 28d360705ea6c4b2c2fe71ddd4ac747b + + + 1751826587218 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + 4688004b0c03d91e2da0b196f1c26a63 + + + 1751826894632 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + 8cbf36e069285329a3e6c103fadd2d15 + + + 1751827827801 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + 474cb438a743ffd7c3e75d28317657f3 + + + 1751828982344 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + 4ec6d444cdddc40c1917aba4da2ee7d0 + + + \ No newline at end of file diff --git a/measurements/readme.md b/measurements/readme.md new file mode 100644 index 0000000..6ef9f52 --- /dev/null +++ b/measurements/readme.md @@ -0,0 +1,59 @@ +Performance Measurement Guide: File-Based vs. ZeroMQThis guide provides a step-by-step methodology for quantifying and comparing the performance of a multi-node system using two different inter-process communication (IPC) methods:File-Based: Nodes communicate by writing and reading files in shared directories.ZeroMQ-Based: Nodes communicate over high-performance, in-memory messaging sockets.By following these steps, you can generate concrete data on latency, throughput, and resource utilization to demonstrate the impact of migrating from a file-based to a ZMQ-based architecture.PrerequisitesTwo Project Versions: You must have two separate versions of your concore project generator: one that uses the original file-based communication, and one that uses the new ZMQ-based system we developed.Python Libraries: Ensure you have the necessary Python libraries installed. psutil is required for programmatically measuring CPU usage.pip install pyzmq psutil +macOS Command Line Tools: You should be comfortable with basic Terminal commands. The iostat and top commands are used for monitoring.Step 1: Test Environment SetupFirst, create a clean directory structure for your tests.# 1. Create a main directory for the performance tests +mkdir concore_performance_tests +cd concore_performance_tests + +# 2. Create a directory to hold the source scripts for the nodes +mkdir source_scripts + +# 3. Create a directory for the file-based system output +mkdir file_based_project + +# 4. Create a directory for the ZMQ-based system output +mkdir zmq_project +Next, create the following two files inside the concore_performance_tests directory.a) graph.graphmlThis simple 4-node pipeline graph will be used for all tests. + + + + + + A:producer.py + + + B:processor.py + + + C:processor.py + + + D:consumer.py + + + A_to_B + + + B_to_C + + + C_to_D + + + +b) test_data.dat (Large data file for throughput testing)Run this command in your terminal to create a 100MB file.mkfile 100m test_data.dat +Finally, place the sample node scripts (provided in the other documents) into the source_scripts directory.Step 2: Running the Baseline (File-Based) TestsFirst, generate the file-based project using your original mkconcore.py.# Navigate to the project directory +cd file_based_project + +# Run mkconcore.py to generate the project +python3 /path/to/your/original/mkconcore.py ../graph.graphml ../source_scripts . posix +Now, run the following tests from within the file_based_project directory.Test 1: Latency / End-to-End TimeThis test measures the time to process 1,000 small messages through the pipeline.Set the test mode in source_scripts/producer.py to 'latency'.Run the test using the time command:./build +time ./run +Record the real time from the output. This is your End-to-End Time.Example: real 0m48.521sCalculate Average Latency: End-to-End Time / 1000 messages.Test 2: ThroughputThis test measures the speed of transferring the 100MB file.Set the test mode in source_scripts/producer.py to 'throughput'.Run the test:./build +time ./run +Record the real time.Calculate Throughput: 100 MB / (time in seconds).Test 3: CPU & Disk I/OThis test monitors system resources during the throughput test. You will need two terminal windows.In Terminal 2, start the disk monitor:iostat -d 1 +In Terminal 1, run the throughput test (time ./run).In Terminal 2, watch the MB/s column for your disk (e.g., disk0). Note the peak value.Stop iostat (Ctrl+C). Now start the CPU monitor:top -o cpu +In Terminal 1, run the throughput test again.In Terminal 2, watch the %CPU column for your python processes and note the approximate average value.Step 3: Running the ZeroMQ TestsNow, generate the ZMQ-based project using your new, modified mkconcore.py.# Navigate to the project directory +cd ../zmq_project # Go back up and into the zmq directory + +# Run the new mkconcore.py +python3 /path/to/your/new/mkconcore.py ../graph.graphml ../source_scripts . posix +Repeat the exact same three tests as in Step 2 from within the zmq_project directory. Use the ZMQ versions of the sample scripts.Step 4: Analyze the ResultsFill in a table like the one below with your collected data. This will give you a clear, quantitative comparison of the two systems.MetricFile-Based SystemZeroMQ SystemImprovement FactorAvg. LatencyYour value (ms)Your value (ms)CalculateData ThroughputYour value (MB/s)Your value (MB/s)CalculateEnd-to-End TimeYour value (s)Your value (s)CalculateAvg. CPU UsageYour value (%)Your value (%)CalculateDisk WritesYour value (MB)Your value (MB)CalculateThis structured approach will provide undeniable evidence of the performance gains from your architectural improvements. \ No newline at end of file diff --git "a/measurements/throughput_test/Screenshot 2025-07-07 at 12.43.32\342\200\257AM.png" "b/measurements/throughput_test/Screenshot 2025-07-07 at 12.43.32\342\200\257AM.png" new file mode 100644 index 0000000..f156b6b Binary files /dev/null and "b/measurements/throughput_test/Screenshot 2025-07-07 at 12.43.32\342\200\257AM.png" differ diff --git a/measurements/throughput_test/client.graphml b/measurements/throughput_test/client.graphml new file mode 100644 index 0000000..e731ea1 --- /dev/null +++ b/measurements/throughput_test/client.graphml @@ -0,0 +1,173 @@ + + + + + + + + + + + + B:funbody_throughput_test.py + + + + + + + + + + + OUT: + + + + + + + + + + 0x2306_U1 + + + + + + + + 1751825758771 + + DEL_NODE + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ== + + + ADD_NODE + WyJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMzMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NDg3LCJ5IjozMTN9LHt9LCI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ== + + e425a002ed1453f66a4fb1dad3ad2923 + + + 1751825761336 + + SET_POS + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDg3LCJ5IjozMTN9XQ== + + + SET_POS + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6NDg3LCJ5IjozMTN9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + d7861c7337345a2010806e89311d85bf + + + 1751825767651 + + DEL_NODE + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ== + + + ADD_NODE + WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTA3LCJ5IjoxMDJ9LHt9LCIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ== + + 19b85e105d5758f18c55915fbce84663 + + + 1751825770936 + + SET_POS + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTA3LCJ5IjoxMDJ9XQ== + + + SET_POS + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTA3LCJ5IjoxMDJ9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + 03b8818572c5800d88c583073a1ef559 + + + 1751825773370 + + DEL_EDGE + WyI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLCJ0YXJnZXRJRCI6IjIxOTZjMTQ2LTE4MGMtNGQxNC1iYmFhLTM0MGY3NmUxNDgwOSIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQifV0= + + 1dd8b4edaeed282d75d1daeb3195b728 + + + 1751826367735 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + ca298c11df338ea36bce176af0fe3b69 + + + 1751826515156 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + c6ee9fdcb90f48bc1de9bdc44b7da91f + + + 1751826596605 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + b79566da6d5ea6c2cf2cbb618da677d2 + + + 1751826901740 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + ba871dc0f4bc75adee32e34c87854508 + + + 1751827730897 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + 8bb2b4d5cd9d445722b307d6bdb3d9fd + + + 1751828973865 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + 3609737de0e0d000c3d43a620f592090 + + + \ No newline at end of file diff --git a/measurements/throughput_test/client_cpu.graphml b/measurements/throughput_test/client_cpu.graphml new file mode 100644 index 0000000..495721d --- /dev/null +++ b/measurements/throughput_test/client_cpu.graphml @@ -0,0 +1,185 @@ + + + + + + + + + + + + B:funbody_cpu.py + + + + + + + + + + + OUT: + + + + + + + + + + 0x2306_U1 + + + + + + + + 1751825758771 + + DEL_NODE + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ== + + + ADD_NODE + WyJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMzMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NDg3LCJ5IjozMTN9LHt9LCI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiXQ== + + e425a002ed1453f66a4fb1dad3ad2923 + + + 1751825761336 + + SET_POS + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDg3LCJ5IjozMTN9XQ== + + + SET_POS + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsieCI6NDg3LCJ5IjozMTN9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + d7861c7337345a2010806e89311d85bf + + + 1751825767651 + + DEL_NODE + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ== + + + ADD_NODE + WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTA3LCJ5IjoxMDJ9LHt9LCIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiXQ== + + 19b85e105d5758f18c55915fbce84663 + + + 1751825770936 + + SET_POS + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTA3LCJ5IjoxMDJ9XQ== + + + SET_POS + WyIyMTk2YzE0Ni0xODBjLTRkMTQtYmJhYS0zNDBmNzZlMTQ4MDkiLHsieCI6MTA3LCJ5IjoxMDJ9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + 03b8818572c5800d88c583073a1ef559 + + + 1751825773370 + + DEL_EDGE + WyI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLCJ0YXJnZXRJRCI6IjIxOTZjMTQ2LTE4MGMtNGQxNC1iYmFhLTM0MGY3NmUxNDgwOSIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI5MWE2MzJkYS0wZDgwLTQ3NzctYmQyZi05MDhiMGY1ZDgwOGQifV0= + + 1dd8b4edaeed282d75d1daeb3195b728 + + + 1751826367735 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + ca298c11df338ea36bce176af0fe3b69 + + + 1751826515156 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + c6ee9fdcb90f48bc1de9bdc44b7da91f + + + 1751826596605 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + b79566da6d5ea6c2cf2cbb618da677d2 + + + 1751826901740 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + ba871dc0f4bc75adee32e34c87854508 + + + 1751827730897 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + 8bb2b4d5cd9d445722b307d6bdb3d9fd + + + 1751828973865 + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyI3NmRjNzIxNi0wMzE2LTQ2OWQtOWFhNy1lN2Q3NDAwNGNkOTUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + 3609737de0e0d000c3d43a620f592090 + + + 1751872486908 + + UPDATE_NODE + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsid2lkdGgiOjIzMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJCOmZ1bmJvZHlfdGhyb3VnaHB1dF90ZXN0LnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyI4OTQ5N2QyOC1jMTIwLTRkNDgtYWEyMy1hMDcxMjYxYWE2MDMiLHsid2lkdGgiOjIzMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJCOmZ1bmJvZHlfY3B1LnB5Iix0cnVlXQ== + + a0691587adb56f1c913b278379ea8cd5 + + + \ No newline at end of file diff --git a/measurements/throughput_test/concore.py b/measurements/throughput_test/concore.py new file mode 100644 index 0000000..ce3ab0a --- /dev/null +++ b/measurements/throughput_test/concore.py @@ -0,0 +1,289 @@ +import time +import os +from ast import literal_eval +import sys +import re +import zmq # Added for ZeroMQ + +#if windows, create script to kill this process +# because batch files don't provide easy way to know pid of last command +# ignored for posix!=windows, because "concorepid" is handled by script +# ignored for docker (linux!=windows), because handled by docker stop +if hasattr(sys, 'getwindowsversion'): + with open("concorekill.bat","w") as fpid: + fpid.write("taskkill /F /PID "+str(os.getpid())+"\n") + +# --- ZeroMQ Integration Start --- +class ZeroMQPort: + def __init__(self, port_type, address, zmq_socket_type): + self.context = zmq.Context() + self.socket = self.context.socket(zmq_socket_type) + self.port_type = port_type # "bind" or "connect" + self.address = address + + self.socket.setsockopt(zmq.RCVTIMEO, 2000) + self.socket.setsockopt(zmq.SNDTIMEO, 2000) + self.socket.setsockopt(zmq.LINGER, 0) + + if self.port_type == "bind": + self.socket.bind(address) + print(f"ZMQ Port bound to {address}") + else: + self.socket.connect(address) + print(f"ZMQ Port connected to {address}") + + def send_json_with_retry(self, message): + for attempt in range(5): + try: + self.socket.send_json(message) + return + except zmq.Again: + print(f"Send timeout (attempt {attempt + 1}/5)") + time.sleep(0.5) + print("Failed to send after retries.") + return + + def recv_json_with_retry(self): + for attempt in range(5): + try: + return self.socket.recv_json() + except zmq.Again: + print(f"Receive timeout (attempt {attempt + 1}/5)") + time.sleep(0.5) + print("Failed to receive after retries.") + return None + +# Global ZeroMQ ports registry +zmq_ports = {} + +def init_zmq_port(port_name, port_type, address, socket_type_str): + """ + Initializes and registers a ZeroMQ port. + port_name (str): A unique name for this ZMQ port. + port_type (str): "bind" or "connect". + address (str): The ZMQ address (e.g., "tcp://*:5555", "tcp://localhost:5555"). + socket_type_str (str): String representation of ZMQ socket type (e.g., "REQ", "REP", "PUB", "SUB"). + """ + if port_name in zmq_ports: + print(f"ZMQ Port {port_name} already initialized.") + return # Avoid reinitialization + + try: + # Map socket type string to actual ZMQ constant (e.g., zmq.REQ, zmq.REP) + zmq_socket_type = getattr(zmq, socket_type_str.upper()) + zmq_ports[port_name] = ZeroMQPort(port_type, address, zmq_socket_type) + print(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}") + except AttributeError: + print(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.") + except zmq.error.ZMQError as e: + print(f"Error initializing ZMQ port {port_name} on {address}: {e}") + except Exception as e: + print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") + +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") +# --- ZeroMQ Integration End --- + +def safe_literal_eval(filename, defaultValue): + try: + with open(filename, "r") as file: + return literal_eval(file.read()) + except (FileNotFoundError, SyntaxError, ValueError, Exception) as e: + # Keep print for debugging, but can be made quieter + # print(f"Info: Error reading {filename} or file not found, using default: {e}") + return defaultValue + +iport = safe_literal_eval("concore.iport", {}) +oport = safe_literal_eval("concore.oport", {}) + +s = '' +olds = '' +delay = 1 +retrycount = 0 +inpath = "./in" #must be rel path for local +outpath = "./out" +simtime = 0 + +#9/21/22 +try: + sparams_path = os.path.join(inpath + "1", "concore.params") + if os.path.exists(sparams_path): + with open(sparams_path, "r") as f: + sparams = f.read() + if sparams: # Ensure sparams is not empty + if sparams[0] == '"' and sparams[-1] == '"': #windows keeps "" need to remove + sparams = sparams[1:-1] + if sparams != '{' and not (sparams.startswith('{') and sparams.endswith('}')): # Check if it needs conversion + print("converting sparams: "+sparams) + sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" + print("converted sparams: " + sparams) + try: + params = literal_eval(sparams) + except Exception as e: + print(f"bad params content: {sparams}, error: {e}") + params = dict() + else: + params = dict() + else: + params = dict() +except Exception as e: + # print(f"Info: concore.params not found or error reading, using empty dict: {e}") + params = dict() + +#9/30/22 +def tryparam(n, i): + return params.get(n, i) + + +#9/12/21 +def default_maxtime(default): + global maxtime + maxtime_path = os.path.join(inpath + "1", "concore.maxtime") + maxtime = safe_literal_eval(maxtime_path, default) + +default_maxtime(100) + +def unchanged(): + global olds, s + if olds == s: + s = '' + return True + olds = s + return False + +def read(port_identifier, name, initstr_val): + global s, simtime, retrycount + + default_return_val = initstr_val + if isinstance(initstr_val, str): + try: + default_return_val = literal_eval(initstr_val) + except (SyntaxError, ValueError): + pass + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + message = zmq_p.recv_json_with_retry() + return message + except zmq.error.ZMQError as e: + print(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + except Exception as e: + print(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + + try: + file_port_num = int(port_identifier) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return default_return_val + + time.sleep(delay) + file_path = os.path.join(inpath+str(file_port_num), name) + ins = "" + + try: + with open(file_path, "r") as infile: + ins = infile.read() + except FileNotFoundError: + ins = str(initstr_val) + except Exception as e: + print(f"Error reading {file_path}: {e}. Using default value.") + return default_return_val + + attempts = 0 + max_retries = 5 + while len(ins) == 0 and attempts < max_retries: + time.sleep(delay) + try: + with open(file_path, "r") as infile: + ins = infile.read() + except Exception as e: + print(f"Retry {attempts + 1}: Error reading {file_path} - {e}") + attempts += 1 + retrycount += 1 + + if len(ins) == 0: + print(f"Max retries reached for {file_path}, using default value.") + return default_return_val + + s += ins + try: + inval = literal_eval(ins) + if isinstance(inval, list) and len(inval) > 0: + current_simtime_from_file = inval[0] + if isinstance(current_simtime_from_file, (int, float)): + simtime = max(simtime, current_simtime_from_file) + return inval[1:] + else: + print(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.") + return inval + except Exception as e: + print(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.") + return default_return_val + + +def write(port_identifier, name, val, delta=0): + global simtime + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + zmq_p.send_json_with_retry(val) + except zmq.error.ZMQError as e: + print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") + except Exception as e: + print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") + + try: + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return + + if isinstance(val, str): + time.sleep(2 * delay) + elif not isinstance(val, list): + print(f"File write to {file_path} must have list or str value, got {type(val)}") + return + + try: + with open(file_path, "w") as outfile: + if isinstance(val, list): + data_to_write = [simtime + delta] + val + outfile.write(str(data_to_write)) + simtime += delta + else: + outfile.write(val) + except Exception as e: + print(f"Error writing to {file_path}: {e}") + +def initval(simtime_val_str): + global simtime + try: + val = literal_eval(simtime_val_str) + if isinstance(val, list) and len(val) > 0: + first_element = val[0] + if isinstance(first_element, (int, float)): + simtime = first_element + return val[1:] + else: + print(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.") + return val[1:] if len(val) > 1 else [] + else: + print(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.") + return [] + + except Exception as e: + print(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.") + return [] \ No newline at end of file diff --git a/measurements/throughput_test/funbody_cpu.py b/measurements/throughput_test/funbody_cpu.py new file mode 100644 index 0000000..28f1c16 --- /dev/null +++ b/measurements/throughput_test/funbody_cpu.py @@ -0,0 +1,71 @@ +# funbody_throughput_test.py (MODIFIED FOR RESOURCE MONITORING) +import time +import concore +import os +import json +import threading +import psutil +import csv + +# --- MONITORING FUNCTION (to be run in a separate thread) --- +def monitor_resources(stop_event, output_list): + """Monitors this script's CPU and memory usage.""" + process = psutil.Process(os.getpid()) + while not stop_event.is_set(): + cpu_percent = process.cpu_percent(interval=0.5) + memory_mb = process.memory_info().rss / (1024 * 1024) + output_list.append({'cpu_percent': cpu_percent, 'memory_mb': memory_mb}) + +print("funbody (Receiver) using ZMQ PULL socket for Throughput & Resource Test.") + + +TEST_DURATION = 10 +message_count = 0 +test_started = False +resource_records = [] + +# --- Start Monitoring --- +stop_monitoring = threading.Event() +monitor_thread = threading.Thread(target=monitor_resources, args=(stop_monitoring, resource_records)) +monitor_thread.start() + +# --- Main Throughput Test Logic (Unchanged) --- +concore.init_zmq_port( + port_name=PORT_NAME_B_OUT, + port_type="bind", + address="tcp://0.0.0.0:" + PORT_B_OUT, # Bind to all interfaces on the specified port + socket_type_str="REP" +) + +print(f"Receiver waiting for messages on port {PORT_B_OUT}...") +while True: + message_str = concore.read(PORT_NAME_B_OUT, "stream", "{}") + if message_str is None: break + try: + message_dict = json.loads(message_str) + except (json.JSONDecodeError, TypeError): + continue + if isinstance(message_dict, dict) and 'type' in message_dict: + if message_dict['type'] == 'control': + if message_dict['value'] == 'START' and not test_started: + test_started = True + elif message_dict['value'] == 'STOP' and test_started: + break + elif message_dict['type'] == 'data' and test_started: + message_count += 1 + +# --- Stop Monitoring and Save Results --- +stop_monitoring.set() +monitor_thread.join() +concore.terminate_zmq() + +if message_count > 0: + throughput = message_count / TEST_DURATION + print(f"THROUGHPUT RESULT: {throughput:.2f} messages/second") + +if resource_records: + with open('receiver_usage.csv', 'w', newline='') as f: + writer = csv.DictWriter(f, fieldnames=['cpu_percent', 'memory_mb']) + writer.writeheader() + writer.writerows(resource_records) + print("Receiver resource usage saved to receiver_usage.csv") \ No newline at end of file diff --git a/measurements/throughput_test/funbody_throughput_test.py b/measurements/throughput_test/funbody_throughput_test.py new file mode 100644 index 0000000..d517488 --- /dev/null +++ b/measurements/throughput_test/funbody_throughput_test.py @@ -0,0 +1,40 @@ +# funbody_throughput.py +import time +import concore + +print("Starting ZMQ throughput server (funbody)") + +# --- ZMQ Configuration --- +# Ensure these environment variables are set before running +# Example: PORT_NAME_F2_OUT="F1_out" PORT_F2_OUT="5555" python funbody_throughput.py + +# Initialize the ZMQ server port +concore.init_zmq_port( + port_name=PORT_NAME_B_OUT, + port_type="bind", + address="tcp://0.0.0.0:" + PORT_B_OUT, # Bind to all interfaces on the specified port + socket_type_str="REP" +) + +# --- Server Loop --- +print(f"Funbody server listening on port {PORT_B_OUT}. Press Ctrl+C to stop.") + +try: + while True: + # Wait to receive any message from a client + received_message = concore.read(PORT_NAME_B_OUT, "throughput_test", "{}") + + if received_message: + # As soon as a message is received, send a reply back + reply_message = {"status": "ok"} + concore.write(PORT_NAME_B_OUT, "throughput_reply", reply_message) + else: + # The read timed out; just continue waiting for the next message + continue + +except KeyboardInterrupt: + print("\nServer shutting down.") + +finally: + # Clean up the ZMQ connection + concore.terminate_zmq() \ No newline at end of file diff --git a/measurements/throughput_test/funcall_cpu.py b/measurements/throughput_test/funcall_cpu.py new file mode 100644 index 0000000..b03f815 --- /dev/null +++ b/measurements/throughput_test/funcall_cpu.py @@ -0,0 +1,63 @@ +# funcall_throughput_test.py (MODIFIED FOR RESOURCE MONITORING) +import time +import concore +import os +import json +import threading +import psutil +import csv + +# --- MONITORING FUNCTION (to be run in a separate thread) --- +def monitor_resources(stop_event, output_list): + """Monitors this script's CPU and memory usage.""" + process = psutil.Process(os.getpid()) + while not stop_event.is_set(): + # Get CPU (as a percentage) and Memory (RSS in MB) + cpu_percent = process.cpu_percent(interval=0.5) + memory_mb = process.memory_info().rss / (1024 * 1024) + output_list.append({'cpu_percent': cpu_percent, 'memory_mb': memory_mb}) + +print("funcall (Sender) using ZMQ PUSH socket for Throughput & Resource Test.") + + +TEST_DURATION = 10 +message_count = 0 +resource_records = [] + +# --- Start Monitoring --- +stop_monitoring = threading.Event() +monitor_thread = threading.Thread(target=monitor_resources, args=(stop_monitoring, resource_records)) +monitor_thread.start() + +# --- Main Throughput Test Logic (Unchanged) --- +concore.init_zmq_port( + port_name=PORT_NAME_IN_A, + port_type="connect", + address="tcp://192.168.0.109:" + PORT_IN_A, # Use 127.0.0.1 for local testing + socket_type_str="REQ" +) +print(f"Sender starting. Will send data for 10 seconds.") +start_signal = json.dumps({"type": "control", "value": "START"}) +concore.write(PORT_NAME_IN_A, "stream", start_signal) +time.sleep(1) +start_time = time.perf_counter() +while (time.perf_counter() - start_time) < TEST_DURATION: + data_message = json.dumps({"type": "data", "value": message_count}) + concore.write(PORT_NAME_IN_A, "stream", data_message) + message_count += 1 +time.sleep(1) +stop_signal = json.dumps({"type": "control", "value": "STOP"}) +concore.write(PORT_NAME_IN_A, "stream", stop_signal) +print(f"Sender finished. Sent approximately {message_count} messages.") + +# --- Stop Monitoring and Save Results --- +stop_monitoring.set() +monitor_thread.join() +concore.terminate_zmq() + +if resource_records: + with open('sender_usage.csv', 'w', newline='') as f: + writer = csv.DictWriter(f, fieldnames=['cpu_percent', 'memory_mb']) + writer.writeheader() + writer.writerows(resource_records) + print("Sender resource usage saved to sender_usage.csv") \ No newline at end of file diff --git a/measurements/throughput_test/funcall_throughput_test.py b/measurements/throughput_test/funcall_throughput_test.py new file mode 100644 index 0000000..6c58aac --- /dev/null +++ b/measurements/throughput_test/funcall_throughput_test.py @@ -0,0 +1,57 @@ +# funcall_throughput.py +import time +import concore + +print("Starting ZMQ throughput test (funcall)") + +# --- ZMQ Configuration --- +# Ensure these environment variables are set before running +# Example: PORT_NAME_IN_F1="F1_out" PORT_IN_F1="5555" python funcall_throughput.py + +# Initialize the ZMQ connection to the funbody server +concore.init_zmq_port( + port_name=PORT_NAME_IN_A, + port_type="connect", + address="tcp://192.168.0.109:" + PORT_IN_A, # Use 127.0.0.1 for local testing + socket_type_str="REQ" +) + +# --- Test Parameters --- +TEST_DURATION_SECONDS = 10 +message_to_send = {"ping": "hello"} +message_count = 0 + +print(f"Running test for {TEST_DURATION_SECONDS} seconds...") + +start_time = time.perf_counter() +end_time = start_time + TEST_DURATION_SECONDS + +# --- Main Test Loop --- +while time.perf_counter() < end_time: + # Send a message to the funbody server + concore.write(PORT_NAME_IN_A, "throughput_test", message_to_send) + + # Wait for the reply + reply = concore.read(PORT_NAME_IN_A, "throughput_reply", "{}") + + # If we get a valid reply, increment our counter + if reply: + message_count += 1 + else: + print("Warning: Missed a reply from the server.") + # In a real-world scenario, you might want to break or handle this + break + +# --- Calculate and Print Results --- +actual_duration = time.perf_counter() - start_time +throughput = message_count / actual_duration + +print("\n--- Throughput Test Complete ---") +print(f"Total messages exchanged: {message_count}") +print(f"Total time: {actual_duration:.2f} seconds") +print(f"Throughput: {throughput:.2f} messages/sec") +print("---------------------------------") + + +# Clean up the ZMQ connection +concore.terminate_zmq() \ No newline at end of file diff --git a/measurements/throughput_test/plot.py b/measurements/throughput_test/plot.py new file mode 100644 index 0000000..604c3e4 --- /dev/null +++ b/measurements/throughput_test/plot.py @@ -0,0 +1,34 @@ +import matplotlib.pyplot as plt +import numpy as np + +# --- Enter your collected data here --- +# Example values, replace with your actual measurements +throughput_mediator = 15.7 # messages/sec +throughput_zmq = 4497.8 # messages/sec +# ----------------------------------------- + +protocols = ['Mediator', 'ZeroMQ'] +values = [throughput_mediator, throughput_zmq] +colors = ['#F44336', '#4CAF50'] + +plt.figure(figsize=(8, 6)) +bars = plt.bar(protocols, values, color=colors) + +# Add plot details +plt.ylabel('Throughput (Messages/Second)', fontsize=12) +plt.title('Figure 4: Maximum Throughput Comparison', fontsize=16, pad=20) +plt.xticks(fontsize=12) +# Use a logarithmic scale if the difference is very large +plt.yscale('log') +plt.grid(axis='y', linestyle='--', alpha=0.7) + +# Add text labels on top of the bars +for bar in bars: + yval = bar.get_height() + plt.text(bar.get_x() + bar.get_width()/2.0, yval, f'{yval:,.0f}', va='bottom', ha='center', fontsize=11) + +# Save the figure for your paper +plt.savefig('figure4_throughput_comparison.png', dpi=300) +print("Plot saved as 'figure4_throughput_comparison.png'") + +plt.show() \ No newline at end of file diff --git a/measurements/throughput_test/plot_fig5.py b/measurements/throughput_test/plot_fig5.py new file mode 100644 index 0000000..77391fe --- /dev/null +++ b/measurements/throughput_test/plot_fig5.py @@ -0,0 +1,42 @@ +import pandas as pd +import seaborn as sns +import matplotlib.pyplot as plt + +# Load all data and calculate averages +try: + avg_cpu_sender_zmq = pd.read_csv('sender_zmq_usage.csv')['cpu_percent'].mean() + avg_mem_sender_zmq = pd.read_csv('sender_zmq_usage.csv')['memory_mb'].mean() + + # In a real test, you would also measure the receiver. For simplicity, we plot sender. + # avg_cpu_receiver_zmq = pd.read_csv('receiver_zmq_usage.csv')['cpu_percent'].mean() + # avg_mem_receiver_zmq = pd.read_csv('receiver_zmq_usage.csv')['memory_mb'].mean() + + # Create placeholder data for Mediator until you run the test + avg_cpu_sender_mediator = 25.5 # Example value + avg_mem_sender_mediator = 60.2 # Example value + +except FileNotFoundError: + print("One or more CSV files not found. Using placeholder data.") + # Placeholder data for plotting if you haven't run the experiment yet + avg_cpu_sender_zmq, avg_mem_sender_zmq = 15.0, 45.0 + avg_cpu_sender_mediator, avg_mem_sender_mediator = 25.5, 60.2 + +# Prepare data for plotting +data = { + 'Protocol': ['Mediator', 'ZeroMQ', 'Mediator', 'ZeroMQ'], + 'Metric': ['CPU Usage (%)', 'CPU Usage (%)', 'Memory Usage (MB)', 'Memory Usage (MB)'], + 'Value': [avg_cpu_sender_mediator, avg_cpu_sender_zmq, avg_mem_sender_mediator, avg_mem_sender_zmq] +} +df_plot = pd.DataFrame(data) + +# Create the grouped bar chart +plt.figure(figsize=(10, 7)) +sns.barplot(x='Metric', y='Value', hue='Protocol', data=df_plot, palette={'Mediator': '#F44336', 'ZeroMQ': '#4CAF50'}) + +plt.title('Figure 5: Resource Utilization During Throughput Test (Sender)', fontsize=16) +plt.xlabel('Performance Metric', fontsize=12) +plt.ylabel('Average Usage', fontsize=12) +plt.legend(title='Protocol') +plt.grid(axis='y', linestyle='--', alpha=0.7) + +plt.show() \ No newline at end of file diff --git a/measurements/throughput_test/server.graphml b/measurements/throughput_test/server.graphml new file mode 100644 index 0000000..81b5102 --- /dev/null +++ b/measurements/throughput_test/server.graphml @@ -0,0 +1,221 @@ + + + + + + + + + + + + A:funcall_throughput_test.py + + + + + + + + + + + IN: + + + + + + + + + + 0x2306_U1 + + + + + + + + 1751825545123 + + DEL_NODE + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ== + + + ADD_NODE + WyJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMjMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHt9LCIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ== + + 0f6a06a5f49f1d83657221f267bbf65e + + + 1751825547451 + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0= + + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjEwMCwieSI6MTAwfV0= + + c07fdf0b5fbc290aea42a3bd74c45a6b + + + 1751825549601 + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjUzMC4wMDIxOTE0MDExMDk5LCJ5IjoyOTIuMDAwOTc4NDg2MDc3fV0= + + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0= + + 55cb72ce7faf50386f9f71afe1e576fb + + + 1751825564072 + + DEL_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ== + + + ADD_NODE + WyJJbjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjoxOTUuMDAwNDg0MTQ2NzU2OCwieSI6OTAuOTk5OTU0MTMzNDY1MTR9LHt9LCJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ== + + d13798fff2bf40cbacc6bc0f73cc3e5a + + + 1751825566634 + + UPDATE_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJbjoiLHRydWVd + + + UPDATE_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJTjoiLHRydWVd + + 1292dab0cd809e0bc822a88cbe296a4f + + + 1751825570934 + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fV0= + + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjEwMCwieSI6MTAwfV0= + + 71a0470230ca5a52edc2cb9ff06f3d28 + + + 1751825572700 + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjE5NS4wMDA0ODQxNDY3NTY4LCJ5Ijo5MC45OTk5NTQxMzM0NjUxNH1d + + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTk1LjAwMDQ4NDE0Njc1NjgsInkiOjkwLjk5OTk1NDEzMzQ2NTE0fSx7IngiOjE5Mi4wMDA0Njg4NTc5MTE5LCJ5Ijo5NC45OTk5NzQ1MTg1OTE3N31d + + 86c56976fc63f27dc9485ecc73f2de2d + + + 1751825576935 + + DEL_EDGE + WyI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLCJ0YXJnZXRJRCI6IjI0YmUwYzEzLTVkOGMtNGY5MC1iMGJiLTFlMDcyN2IwNDJkNyIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUifV0= + + e3d7f90d81fe934dfa3c417169de8824 + + + 1751826381936 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + 39ad7e349fa9310a7b969d4ebab5282e + + + 1751826525320 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + 8efbfe0ae1b0204fce1d374693fa71a4 + + + 1751826583001 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + 28d360705ea6c4b2c2fe71ddd4ac747b + + + 1751826587218 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + 4688004b0c03d91e2da0b196f1c26a63 + + + 1751826894632 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + 8cbf36e069285329a3e6c103fadd2d15 + + + 1751827827801 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + 474cb438a743ffd7c3e75d28317657f3 + + + 1751828982344 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + 4ec6d444cdddc40c1917aba4da2ee7d0 + + + \ No newline at end of file diff --git a/measurements/throughput_test/server_cpu.graphml b/measurements/throughput_test/server_cpu.graphml new file mode 100644 index 0000000..9bf33ce --- /dev/null +++ b/measurements/throughput_test/server_cpu.graphml @@ -0,0 +1,245 @@ + + + + + + + + + + + + A:funcall_cpu.py + + + + + + + + + + + IN: + + + + + + + + + + 0x2307_U1 + + + + + + + + 1751825545123 + + DEL_NODE + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ== + + + ADD_NODE + WyJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix7IndpZHRoIjoyMjMsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHt9LCIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciXQ== + + 0f6a06a5f49f1d83657221f267bbf65e + + + 1751825547451 + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0= + + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjEwMCwieSI6MTAwfV0= + + c07fdf0b5fbc290aea42a3bd74c45a6b + + + 1751825549601 + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfSx7IngiOjUzMC4wMDIxOTE0MDExMDk5LCJ5IjoyOTIuMDAwOTc4NDg2MDc3fV0= + + + SET_POS + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjI5Mi4wMDA5Nzg0ODYwNzd9LHsieCI6NTMwLjAwMjE5MTQwMTEwOTksInkiOjQyMC4wMDE2MzA4MTAxMjgzfV0= + + 55cb72ce7faf50386f9f71afe1e576fb + + + 1751825564072 + + DEL_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ== + + + ADD_NODE + WyJJbjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjoxOTUuMDAwNDg0MTQ2NzU2OCwieSI6OTAuOTk5OTU0MTMzNDY1MTR9LHt9LCJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiXQ== + + d13798fff2bf40cbacc6bc0f73cc3e5a + + + 1751825566634 + + UPDATE_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJbjoiLHRydWVd + + + UPDATE_NODE + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJJTjoiLHRydWVd + + 1292dab0cd809e0bc822a88cbe296a4f + + + 1751825570934 + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fV0= + + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjEwMCwieSI6MTAwfV0= + + 71a0470230ca5a52edc2cb9ff06f3d28 + + + 1751825572700 + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTkyLjAwMDQ2ODg1NzkxMTksInkiOjk0Ljk5OTk3NDUxODU5MTc3fSx7IngiOjE5NS4wMDA0ODQxNDY3NTY4LCJ5Ijo5MC45OTk5NTQxMzM0NjUxNH1d + + + SET_POS + WyJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLHsieCI6MTk1LjAwMDQ4NDE0Njc1NjgsInkiOjkwLjk5OTk1NDEzMzQ2NTE0fSx7IngiOjE5Mi4wMDA0Njg4NTc5MTE5LCJ5Ijo5NC45OTk5NzQ1MTg1OTE3N31d + + 86c56976fc63f27dc9485ecc73f2de2d + + + 1751825576935 + + DEL_EDGE + WyI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYmMzYWYzYS0xZmY0LTQwNDUtOWYxYy05ZDU4ZjMzNjkyYmMiLCJ0YXJnZXRJRCI6IjI0YmUwYzEzLTVkOGMtNGY5MC1iMGJiLTFlMDcyN2IwNDJkNyIsImxhYmVsIjoiMHgyMzAwX1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI2ODQxM2ZhOC1lNWJjLTQzYTgtODllZS00MTM5Zjk5NTdmMjUifV0= + + e3d7f90d81fe934dfa3c417169de8824 + + + 1751826381936 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + 39ad7e349fa9310a7b969d4ebab5282e + + + 1751826525320 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + 8efbfe0ae1b0204fce1d374693fa71a4 + + + 1751826583001 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + 28d360705ea6c4b2c2fe71ddd4ac747b + + + 1751826587218 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwMl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + 4688004b0c03d91e2da0b196f1c26a63 + + + 1751826894632 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwM19VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + 8cbf36e069285329a3e6c103fadd2d15 + + + 1751827827801 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + 474cb438a743ffd7c3e75d28317657f3 + + + 1751828982344 + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNV9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJjZjQzOGJhYS02N2Q0LTQ1Y2UtOTk4Yi1mYjU0ODU3MGZjZGMiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + 4ec6d444cdddc40c1917aba4da2ee7d0 + + + 1751872426393 + + UPDATE_NODE + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsid2lkdGgiOjIyMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJBOmZ1bmNhbGxfdGhyb3VnaHB1dF90ZXN0LnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyIyNGJlMGMxMy01ZDhjLTRmOTAtYjBiYi0xZTA3MjdiMDQyZDciLHsid2lkdGgiOjIyMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJBOmZ1bmNhbGxfY3B1LnB5Iix0cnVlXQ== + + 72b043d710aeb2d0db300c844fe93875 + + + 1751873408899 + + UPDATE_EDGE + WyJkMDNiMGFjMS05OTA1LTRhMjUtOTgwMS0wMDNmNGZlYWJjODQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwNl9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJkMDNiMGFjMS05OTA1LTRhMjUtOTgwMS0wMDNmNGZlYWJjODQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjMwN19VMSIsdHJ1ZV0= + + 30848cb7ede5f6155725091f45680e40 + + + \ No newline at end of file