{ "cells": [ { "cell_type": "raw", "execution_count": 1, "id": "4730bc83-62e5-4223-bd19-ea615d6993b6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "{\n", " \"cells\": [\n", " {\n", " \"cell_type\": \"code\",\n", " \"execution_count\": 1,\n", " \"id\": \"4730bc83-62e5-4223-bd19-ea615d6993b6\",\n", " \"metadata\": {},\n", " \"outputs\": [\n", " {\n", " \"data\": {\n", " \"text/html\": [\n", " \"\\n\",\n", " \" \\n\",\n", " \" \\n\",\n", " \" \"\n", " ]\n", " },\n", " \"metadata\": {},\n", " \"output_type\": \"display_data\"\n", " }\n", " ],\n", " \"source\": [\n", " \"import contextlib\\n\",\n", " \"import ctypes\\n\",\n", " \"import io\\n\",\n", " \"import numpy as np\\n\",\n", " \"import os\\n\",\n", " \"import pandas as pd\\n\",\n", " \"import re\\n\",\n", " \"import sys\\n\",\n", " \"import tempfile\\n\",\n", " \"from IPython.display import Image\\n\",\n", " \"from lets_plot import *\\n\",\n", " \"\\n\",\n", " \"LetsPlot.setup_html()\\n\",\n", " \"\\n\",\n", " \"variant = \\\"release\\\"\\n\",\n", " \"\\n\",\n", " \"MVG_EXPORT_DATA = []\\n\",\n", " \"\\n\",\n", " \"\\n\",\n", " \"# best-effort: flush all C stdio buffers\\n\",\n", " \"try:\\n\",\n", " \" _libc = ctypes.CDLL(None)\\n\",\n", " \" _fflush_all = lambda: _libc.fflush(None)\\n\",\n", " \"except Exception:\\n\",\n", " \" _fflush_all = lambda: None\\n\",\n", " \"\\n\",\n", " \"\\n\",\n", " \"def capture_c_output(fn, *args, **kwargs) -> str:\\n\",\n", " \" \\\"\\\"\\\"\\n\",\n", " \" Run fn(*args, **kwargs) and capture anything written to C stdout/stderr.\\n\",\n", " \" Returns a single string with stdout followed by stderr.\\n\",\n", " \" \\\"\\\"\\\"\\n\",\n", " \" # Flush Python and C buffers before swapping FDs\\n\",\n", " \" sys.stdout.flush(); sys.stderr.flush(); _fflush_all()\\n\",\n", " \"\\n\",\n", " \" # Duplicate current stdout/stderr FDs\\n\",\n", " \" old_out_fd = os.dup(1)\\n\",\n", " \" old_err_fd = os.dup(2)\\n\",\n", " \"\\n\",\n", " \" with tempfile.TemporaryFile() as tmp_out, tempfile.TemporaryFile() as tmp_err:\\n\",\n", " \" try:\\n\",\n", " \" # Redirect FD 1 and 2 to our temp files\\n\",\n", " \" os.dup2(tmp_out.fileno(), 1)\\n\",\n", " \" os.dup2(tmp_err.fileno(), 2)\\n\",\n", " \"\\n\",\n", " \" # Run the function (which may call into C)\\n\",\n", " \" fn(*args, **kwargs)\\n\",\n", " \"\\n\",\n", " \" # Flush again before restoring\\n\",\n", " \" sys.stdout.flush(); sys.stderr.flush(); _fflush_all()\\n\",\n", " \" finally:\\n\",\n", " \" # Restore original FDs\\n\",\n", " \" os.dup2(old_out_fd, 1)\\n\",\n", " \" os.dup2(old_err_fd, 2)\\n\",\n", " \" os.close(old_out_fd)\\n\",\n", " \" os.close(old_err_fd)\\n\",\n", " \"\\n\",\n", " \" # Read captured data\\n\",\n", " \" tmp_out.seek(0); tmp_err.seek(0)\\n\",\n", " \" out = tmp_out.read().decode(\\\"utf-8\\\", errors=\\\"replace\\\")\\n\",\n", " \" err = tmp_err.read().decode(\\\"utf-8\\\", errors=\\\"replace\\\")\\n\",\n", " \"\\n\",\n", " \" return out + err\\n\",\n", " \" \\n\",\n", " \"\\n\",\n", " \"def _parse_and_store_output(output_text, file_name, n, solid, scale, void):\\n\",\n", " \" \\\"\\\"\\\"\\n\",\n", " \" Helper function to parse output, including timestamps with minutes,\\n\",\n", " \" and append to the global data list.\\n\",\n", " \" \\\"\\\"\\\"\\n\",\n", " \" \\n\",\n", " \" \\n\",\n", " \" def to_seconds(time_str):\\n\",\n", " \" \\\"\\\"\\\"\\n\",\n", " \" Converts a complex time string (including minutes) into total seconds.\\n\",\n", " \" This version correctly prioritizes specific units like 'ms' over 'm'.\\n\",\n", " \" \\\"\\\"\\\"\\n\",\n", " \" if not time_str:\\n\",\n", " \" return None\\n\",\n", " \" time_str = time_str.strip()\\n\",\n", " \" \\n\",\n", " \" # --- Check for the most specific units FIRST ---\\n\",\n", " \" if 'ms' in time_str:\\n\",\n", " \" return float(time_str.replace('ms', '').strip()) / 1000\\n\",\n", " \" if 'us' in time_str:\\n\",\n", " \" return float(time_str.replace('us', '').strip()) / 1_000_000\\n\",\n", " \" if 'ns' in time_str:\\n\",\n", " \" return float(time_str.replace('ns', '').strip()) / 1_000_000_000\\n\",\n", " \" \\n\",\n", " \" # --- Now, check for the composite minute/second format ---\\n\",\n", " \" if 'm' in time_str:\\n\",\n", " \" total_seconds = 0\\n\",\n", " \" parts = time_str.split('m')\\n\",\n", " \" minutes = float(parts[0].strip())\\n\",\n", " \" total_seconds += minutes * 60\\n\",\n", " \" \\n\",\n", " \" # If there's a seconds part after 'm', add it\\n\",\n", " \" if len(parts) > 1 and parts[1].strip():\\n\",\n", " \" seconds_str = parts[1].replace('s', '').strip()\\n\",\n", " \" if seconds_str:\\n\",\n", " \" total_seconds += float(seconds_str)\\n\",\n", " \" return total_seconds\\n\",\n", " \" \\n\",\n", " \" # --- Finally, check for standalone seconds ---\\n\",\n", " \" if 's' in time_str:\\n\",\n", " \" return float(time_str.replace('s', '').strip())\\n\",\n", " \" \\n\",\n", " \" # Fallback for unitless numbers (should not happen with this log format)\\n\",\n", " \" try:\\n\",\n", " \" return float(time_str)\\n\",\n", " \" except ValueError:\\n\",\n", " \" return None\\n\",\n", " \" \\n\",\n", " \" \\n\",\n", " \" if 'ms' in time_str: return float(time_str.replace('ms', '')) / 1000\\n\",\n", " \" if 'us' in time_str: return float(time_str.replace('us', '')) / 1_000_000\\n\",\n", " \" if 'ns' in time_str: return float(time_str.replace('ns', '')) / 1_000_000_000\\n\",\n", " \" if 's' in time_str: return float(time_str.replace('s', ''))\\n\",\n", " \" \\n\",\n", " \" try:\\n\",\n", " \" return float(time_str)\\n\",\n", " \" except ValueError:\\n\",\n", " \" return None\\n\",\n", " \"\\n\",\n", " \" \\n\",\n", " \" map_pattern = re.compile(r\\\"(.+?): exportMvg\\\\(\\\\)\\\\: plot mapped to canvas\\\")\\n\",\n", " \" paint_pattern = re.compile(r\\\"(.+?): exportMvg\\\\(\\\\)\\\\: plot painted\\\")\\n\",\n", " \" snapshot_pattern = re.compile(r\\\"(.+?): exportMvg\\\\(\\\\)\\\\: snapshot taken\\\")\\n\",\n", " \" \\n\",\n", " \" map_match = map_pattern.search(output_text)\\n\",\n", " \" paint_match = paint_pattern.search(output_text)\\n\",\n", " \" snapshot_match = snapshot_pattern.search(output_text)\\n\",\n", " \"\\n\",\n", " \" mapping_time = to_seconds(map_match.group(1) if map_match else None)\\n\",\n", " \" paint_time = to_seconds(paint_match.group(1) if paint_match else None)\\n\",\n", " \" snapshot_time = to_seconds(snapshot_match.group(1) if snapshot_match else None)\\n\",\n", " \" \\n\",\n", " \" MVG_EXPORT_DATA.append({\\n\",\n", " \" \\\"file_name\\\": file_name,\\n\",\n", " \" \\\"n\\\": n,\\n\",\n", " \" \\\"solid\\\": solid,\\n\",\n", " \" \\\"scale\\\": scale,\\n\",\n", " \" \\\"void\\\": void,\\n\",\n", " \" \\\"mapping_time\\\": mapping_time,\\n\",\n", " \" \\\"paint_time\\\": paint_time - mapping_time,\\n\",\n", " \" \\\"snapshot_time\\\": snapshot_time - paint_time,\\n\",\n", " \" \\\"total_time\\\": snapshot_time\\n\",\n", " \" })\\n\",\n", " \" \\n\",\n", " \"\\n\",\n", " \"def save_mvg(ns, solid, scale, void=False):\\n\",\n", " \" \\\"\\\"\\\"\\n\",\n", " \" Saves plots and automatically captures and parses the ggsave output\\n\",\n", " \" by capturing both stdout and stderr.\\n\",\n", " \" \\\"\\\"\\\"\\n\",\n", " \"\\n\",\n", " \" # show demo plot\\n\",\n", " \" p_n(100, solid, void).show()\\n\",\n", " \" \\n\",\n", " \" i = 1\\n\",\n", " \" \\n\",\n", " \" for n in ns:\\n\",\n", " \" if solid:\\n\",\n", " \" name = \\\"solid_\\\" + str(n)\\n\",\n", " \" else:\\n\",\n", " \" name = \\\"stroked_\\\" + str(n)\\n\",\n", " \"\\n\",\n", " \" p = p_n(n, solid, void)\\n\",\n", " \"\\n\",\n", " \" file_name = f\\\"{name}@{scale}x.mvg\\\" if scale != 1 else f\\\"{name}.mvg\\\"\\n\",\n", " \"\\n\",\n", " \" captured_output = capture_c_output(ggsave, p, file_name, scale=scale)\\n\",\n", " \" \\n\",\n", " \" print(str(i) + \\\" of \\\" + str(len(ns)) + \\\" (n=\\\" + str(n) + \\\", solid=\\\" + str(solid) + \\\", void=\\\" + str(void) + \\\", scale=\\\" + str(scale) + \\\")\\\\n\\\" + captured_output)\\n\",\n", " \" \\n\",\n", " \" _parse_and_store_output(captured_output, file_name, n, solid, scale, void)\\n\",\n", " \" i = i + 1\\n\",\n", " \"\\n\",\n", " \"def p_n(n, solid, void):\\n\",\n", " \" np.random.seed(42)\\n\",\n", " \" \\n\",\n", " \" x = np.random.uniform(size=n)\\n\",\n", " \" y = np.random.uniform(size=n)\\n\",\n", " \" v = np.random.normal(size=n)\\n\",\n", " \" \\n\",\n", " \" p = ggplot({'x': x, 'y': y, 'v': v}, aes('x', 'y', fill='x'))\\n\",\n", " \" \\n\",\n", " \" if void:\\n\",\n", " \" theme = theme_void()\\n\",\n", " \" show_legend = False\\n\",\n", " \" else:\\n\",\n", " \" theme = geom_blank()\\n\",\n", " \" show_legend = True\\n\",\n", " \"\\n\",\n", " \" if solid:\\n\",\n", " \" l = geom_point(show_legend=show_legend)\\n\",\n", " \" else:\\n\",\n", " \" l = geom_point(shape=1, show_legend=show_legend)\\n\",\n", " \"\\n\",\n", " \" return p + l + theme\\n\",\n", " \"\\n\"\n", " ]\n", " },\n", " {\n", " \"cell_type\": \"markdown\",\n", " \"id\": \"5ce5c772-ddb8-4011-9b2b-a9e887520d64\",\n", " \"metadata\": {},\n", " \"source\": [\n", " \"# Solid\"\n", " ]\n", " },\n", " {\n", " \"cell_type\": \"code\",\n", " \"execution_count\": 2,\n", " \"id\": \"f3497a12-bb65-4b22-ad34-823369bd7636\",\n", " \"metadata\": {},\n", " \"outputs\": [\n", " {\n", " \"data\": {\n", " \"text/html\": [\n", " \"
\\n\",\n", " \" \"\n", " ]\n", " },\n", " \"metadata\": {},\n", " \"output_type\": \"display_data\"\n", " },\n", " {\n", " \"name\": \"stdout\",\n", " \"output_type\": \"stream\",\n", " \"text\": [\n", " \"1 of 5 (n=1000, solid=True, void=False, scale=1)\\n\",\n", " \"0s: exportMvg(): plotSpec parsed\\n\",\n", " \"521.833us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=1.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"13.296250ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"151.704875ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"152.365042ms: exportMvg(): canvas size: (600, 400), pixelDensity=1.0\\n\",\n", " \"156.480833ms: exportMvg(): plot painted\\n\",\n", " \"290.737542ms: exportMvg(): snapshot taken\\n\",\n", " \"294.542167ms: exportMvg(): bitmap extracted\\n\",\n", " \"295.902083ms: exportMvg(): MVG extracted, length=123494\\n\",\n", " \"296.227333ms: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"2 of 5 (n=5000, solid=True, void=False, scale=1)\\n\",\n", " \"208ns: exportMvg(): plotSpec parsed\\n\",\n", " \"60.875us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=1.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"22.710958ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"339.750458ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"340.359250ms: exportMvg(): canvas size: (600, 400), pixelDensity=1.0\\n\",\n", " \"360.405291ms: exportMvg(): plot painted\\n\",\n", " \"573.116958ms: exportMvg(): snapshot taken\\n\",\n", " \"576.791666ms: exportMvg(): bitmap extracted\\n\",\n", " \"581.003041ms: exportMvg(): MVG extracted, length=562493\\n\",\n", " \"581.226500ms: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"3 of 5 (n=10000, solid=True, void=False, scale=1)\\n\",\n", " \"250ns: exportMvg(): plotSpec parsed\\n\",\n", " \"49.875us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=1.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"43.872875ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"610.093625ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"610.728333ms: exportMvg(): canvas size: (600, 400), pixelDensity=1.0\\n\",\n", " \"662.805916ms: exportMvg(): plot painted\\n\",\n", " \"984.507125ms: exportMvg(): snapshot taken\\n\",\n", " \"988.148ms: exportMvg(): bitmap extracted\\n\",\n", " \"996.173541ms: exportMvg(): MVG extracted, length=1110822\\n\",\n", " \"996.544958ms: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"4 of 5 (n=20000, solid=True, void=False, scale=1)\\n\",\n", " \"41ns: exportMvg(): plotSpec parsed\\n\",\n", " \"77.625us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=1.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"93.194541ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"1.281383708s: exportMvg(): plot mapped to canvas\\n\",\n", " \"1.281957166s: exportMvg(): canvas size: (600, 400), pixelDensity=1.0\\n\",\n", " \"1.361364375s: exportMvg(): plot painted\\n\",\n", " \"1.938448250s: exportMvg(): snapshot taken\\n\",\n", " \"1.942208250s: exportMvg(): bitmap extracted\\n\",\n", " \"1.958994041s: exportMvg(): MVG extracted, length=2206404\\n\",\n", " \"1.961260458s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"5 of 5 (n=50000, solid=True, void=False, scale=1)\\n\",\n", " \"333ns: exportMvg(): plotSpec parsed\\n\",\n", " \"67.833us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=1.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"802.818083ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"5.310952208s: exportMvg(): plot mapped to canvas\\n\",\n", " \"5.313709625s: exportMvg(): canvas size: (600, 400), pixelDensity=1.0\\n\",\n", " \"5.526666250s: exportMvg(): plot painted\\n\",\n", " \"7.047491208s: exportMvg(): snapshot taken\\n\",\n", " \"7.051464s: exportMvg(): bitmap extracted\\n\",\n", " \"7.095691125s: exportMvg(): MVG extracted, length=5495800\\n\",\n", " \"7.097929250s: exportMvg(): resources disposed\\n\",\n", " \"\\n\"\n", " ]\n", " }\n", " ],\n", " \"source\": [\n", " \"save_mvg([1000, 5000, 10_000, 20_000, 50_000], solid=True, scale=1)\"\n", " ]\n", " },\n", " {\n", " \"cell_type\": \"code\",\n", " \"execution_count\": 3,\n", " \"id\": \"dd9bf1af-0638-4048-b1fe-3a7776c720e4\",\n", " \"metadata\": {},\n", " \"outputs\": [\n", " {\n", " \"data\": {\n", " \"text/html\": [\n", " \" \\n\",\n", " \" \"\n", " ]\n", " },\n", " \"metadata\": {},\n", " \"output_type\": \"display_data\"\n", " },\n", " {\n", " \"name\": \"stdout\",\n", " \"output_type\": \"stream\",\n", " \"text\": [\n", " \"1 of 5 (n=1000, solid=True, void=False, scale=2)\\n\",\n", " \"125ns: exportMvg(): plotSpec parsed\\n\",\n", " \"53.458us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"13.230625ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"204.641167ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"206.909292ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"211.248667ms: exportMvg(): plot painted\\n\",\n", " \"524.073583ms: exportMvg(): snapshot taken\\n\",\n", " \"558.849333ms: exportMvg(): bitmap extracted\\n\",\n", " \"564.902333ms: exportMvg(): MVG extracted, length=123494\\n\",\n", " \"565.559333ms: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"2 of 5 (n=5000, solid=True, void=False, scale=2)\\n\",\n", " \"167ns: exportMvg(): plotSpec parsed\\n\",\n", " \"81.042us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"22.629ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"348.808417ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"350.838125ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"373.865959ms: exportMvg(): plot painted\\n\",\n", " \"871.862167ms: exportMvg(): snapshot taken\\n\",\n", " \"887.376500ms: exportMvg(): bitmap extracted\\n\",\n", " \"892.400750ms: exportMvg(): MVG extracted, length=562495\\n\",\n", " \"892.695334ms: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"3 of 5 (n=10000, solid=True, void=False, scale=2)\\n\",\n", " \"209ns: exportMvg(): plotSpec parsed\\n\",\n", " \"73.125us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"45.167334ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"692.640042ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"696.254459ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"760.028167ms: exportMvg(): plot painted\\n\",\n", " \"1.479292417s: exportMvg(): snapshot taken\\n\",\n", " \"1.495355459s: exportMvg(): bitmap extracted\\n\",\n", " \"1.503527792s: exportMvg(): MVG extracted, length=1110820\\n\",\n", " \"1.504090500s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"4 of 5 (n=20000, solid=True, void=False, scale=2)\\n\",\n", " \"41ns: exportMvg(): plotSpec parsed\\n\",\n", " \"67.541us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"93.382291ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"1.259610416s: exportMvg(): plot mapped to canvas\\n\",\n", " \"1.262181666s: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"1.349311500s: exportMvg(): plot painted\\n\",\n", " \"2.599702541s: exportMvg(): snapshot taken\\n\",\n", " \"2.614853500s: exportMvg(): bitmap extracted\\n\",\n", " \"2.631417458s: exportMvg(): MVG extracted, length=2206406\\n\",\n", " \"2.632439083s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"5 of 5 (n=50000, solid=True, void=False, scale=2)\\n\",\n", " \"250ns: exportMvg(): plotSpec parsed\\n\",\n", " \"111.292us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"230.238584ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"3.235150792s: exportMvg(): plot mapped to canvas\\n\",\n", " \"3.237281375s: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"3.443972167s: exportMvg(): plot painted\\n\",\n", " \"6.773627542s: exportMvg(): snapshot taken\\n\",\n", " \"6.790757709s: exportMvg(): bitmap extracted\\n\",\n", " \"6.840090834s: exportMvg(): MVG extracted, length=5495800\\n\",\n", " \"6.842326167s: exportMvg(): resources disposed\\n\",\n", " \"\\n\"\n", " ]\n", " }\n", " ],\n", " \"source\": [\n", " \"save_mvg([1000, 5000, 10_000, 20_000, 50_000], solid=True, scale=2)\"\n", " ]\n", " },\n", " {\n", " \"cell_type\": \"markdown\",\n", " \"id\": \"ff0ffd6b-4f2b-4f87-bd43-1e914a5744aa\",\n", " \"metadata\": {},\n", " \"source\": [\n", " \"# Stroked\"\n", " ]\n", " },\n", " {\n", " \"cell_type\": \"code\",\n", " \"execution_count\": 4,\n", " \"id\": \"50718e4c-5335-4c94-9008-ca7f10713065\",\n", " \"metadata\": {},\n", " \"outputs\": [\n", " {\n", " \"data\": {\n", " \"text/html\": [\n", " \" \\n\",\n", " \" \"\n", " ]\n", " },\n", " \"metadata\": {},\n", " \"output_type\": \"display_data\"\n", " },\n", " {\n", " \"name\": \"stdout\",\n", " \"output_type\": \"stream\",\n", " \"text\": [\n", " \"1 of 5 (n=1000, solid=False, void=False, scale=1)\\n\",\n", " \"250ns: exportMvg(): plotSpec parsed\\n\",\n", " \"89.083us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=1.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"30.318791ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"489.949750ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"490.565ms: exportMvg(): canvas size: (600, 400), pixelDensity=1.0\\n\",\n", " \"518.203375ms: exportMvg(): plot painted\\n\",\n", " \"657.718416ms: exportMvg(): snapshot taken\\n\",\n", " \"666.083208ms: exportMvg(): bitmap extracted\\n\",\n", " \"672.138541ms: exportMvg(): MVG extracted, length=201285\\n\",\n", " \"672.435166ms: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"2 of 5 (n=5000, solid=False, void=False, scale=1)\\n\",\n", " \"83ns: exportMvg(): plotSpec parsed\\n\",\n", " \"74.5us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=1.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"33.366458ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"401.640208ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"402.380375ms: exportMvg(): canvas size: (600, 400), pixelDensity=1.0\\n\",\n", " \"435.786833ms: exportMvg(): plot painted\\n\",\n", " \"753.048542ms: exportMvg(): snapshot taken\\n\",\n", " \"757.01ms: exportMvg(): bitmap extracted\\n\",\n", " \"764.667875ms: exportMvg(): MVG extracted, length=951649\\n\",\n", " \"765.469292ms: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"3 of 5 (n=10000, solid=False, void=False, scale=1)\\n\",\n", " \"250ns: exportMvg(): plotSpec parsed\\n\",\n", " \"87.875us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=1.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"44.163708ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"709.910583ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"710.514ms: exportMvg(): canvas size: (600, 400), pixelDensity=1.0\\n\",\n", " \"809.035541ms: exportMvg(): plot painted\\n\",\n", " \"1.435448500s: exportMvg(): snapshot taken\\n\",\n", " \"1.439370375s: exportMvg(): bitmap extracted\\n\",\n", " \"1.454707416s: exportMvg(): MVG extracted, length=1889111\\n\",\n", " \"1.455353416s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"4 of 5 (n=20000, solid=False, void=False, scale=1)\\n\",\n", " \"84ns: exportMvg(): plotSpec parsed\\n\",\n", " \"73.417us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=1.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"110.986375ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"1.334035167s: exportMvg(): plot mapped to canvas\\n\",\n", " \"1.334754834s: exportMvg(): canvas size: (600, 400), pixelDensity=1.0\\n\",\n", " \"1.498602750s: exportMvg(): plot painted\\n\",\n", " \"2.481634584s: exportMvg(): snapshot taken\\n\",\n", " \"2.485502584s: exportMvg(): bitmap extracted\\n\",\n", " \"2.514975167s: exportMvg(): MVG extracted, length=3762798\\n\",\n", " \"2.516456459s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"5 of 5 (n=50000, solid=False, void=False, scale=1)\\n\",\n", " \"42ns: exportMvg(): plotSpec parsed\\n\",\n", " \"71.417us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=1.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"1.197814500s: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"4.460475084s: exportMvg(): plot mapped to canvas\\n\",\n", " \"4.461300s: exportMvg(): canvas size: (600, 400), pixelDensity=1.0\\n\",\n", " \"4.814341542s: exportMvg(): plot painted\\n\",\n", " \"7.199791250s: exportMvg(): snapshot taken\\n\",\n", " \"7.204037584s: exportMvg(): bitmap extracted\\n\",\n", " \"7.292499084s: exportMvg(): MVG extracted, length=9387029\\n\",\n", " \"7.293668209s: exportMvg(): resources disposed\\n\",\n", " \"\\n\"\n", " ]\n", " }\n", " ],\n", " \"source\": [\n", " \"save_mvg([1000, 5000, 10_000, 20_000, 50_000], solid=False, scale=1)\"\n", " ]\n", " },\n", " {\n", " \"cell_type\": \"code\",\n", " \"execution_count\": 5,\n", " \"id\": \"a66a566c-5cee-4695-a34e-270c4317ec9e\",\n", " \"metadata\": {},\n", " \"outputs\": [\n", " {\n", " \"data\": {\n", " \"text/html\": [\n", " \" \\n\",\n", " \" \"\n", " ]\n", " },\n", " \"metadata\": {},\n", " \"output_type\": \"display_data\"\n", " },\n", " {\n", " \"name\": \"stdout\",\n", " \"output_type\": \"stream\",\n", " \"text\": [\n", " \"1 of 10 (n=1000, solid=False, void=False, scale=2)\\n\",\n", " \"334ns: exportMvg(): plotSpec parsed\\n\",\n", " \"204.459us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"31.818167ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"229.399167ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"232.651084ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"240.953834ms: exportMvg(): plot painted\\n\",\n", " \"604.786292ms: exportMvg(): snapshot taken\\n\",\n", " \"620.824542ms: exportMvg(): bitmap extracted\\n\",\n", " \"622.594542ms: exportMvg(): MVG extracted, length=201285\\n\",\n", " \"622.928625ms: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"2 of 10 (n=2000, solid=False, void=False, scale=2)\\n\",\n", " \"83ns: exportMvg(): plotSpec parsed\\n\",\n", " \"67.458us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"26.105333ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"277.926250ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"279.960875ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"291.815208ms: exportMvg(): plot painted\\n\",\n", " \"772.110208ms: exportMvg(): snapshot taken\\n\",\n", " \"806.130750ms: exportMvg(): bitmap extracted\\n\",\n", " \"817.168750ms: exportMvg(): MVG extracted, length=389161\\n\",\n", " \"817.583458ms: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"3 of 10 (n=3000, solid=False, void=False, scale=2)\\n\",\n", " \"42ns: exportMvg(): plotSpec parsed\\n\",\n", " \"50.334us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"13.221334ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"217.000042ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"218.933167ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"236.411209ms: exportMvg(): plot painted\\n\",\n", " \"849.730042ms: exportMvg(): snapshot taken\\n\",\n", " \"864.533292ms: exportMvg(): bitmap extracted\\n\",\n", " \"868.869834ms: exportMvg(): MVG extracted, length=576927\\n\",\n", " \"869.196417ms: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"4 of 10 (n=4000, solid=False, void=False, scale=2)\\n\",\n", " \"84ns: exportMvg(): plotSpec parsed\\n\",\n", " \"46.834us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"17.854875ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"338.693084ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"341.081709ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"377.691959ms: exportMvg(): plot painted\\n\",\n", " \"1.263547250s: exportMvg(): snapshot taken\\n\",\n", " \"1.278656834s: exportMvg(): bitmap extracted\\n\",\n", " \"1.284530250s: exportMvg(): MVG extracted, length=763796\\n\",\n", " \"1.284984084s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"5 of 10 (n=5000, solid=False, void=False, scale=2)\\n\",\n", " \"83ns: exportMvg(): plotSpec parsed\\n\",\n", " \"285.042us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"32.235708ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"360.525125ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"363.733042ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"393.532375ms: exportMvg(): plot painted\\n\",\n", " \"1.544002750s: exportMvg(): snapshot taken\\n\",\n", " \"1.559382792s: exportMvg(): bitmap extracted\\n\",\n", " \"1.566904375s: exportMvg(): MVG extracted, length=951649\\n\",\n", " \"1.567367167s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"6 of 10 (n=6000, solid=False, void=False, scale=2)\\n\",\n", " \"83ns: exportMvg(): plotSpec parsed\\n\",\n", " \"65.875us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"35.748875ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"434.267833ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"436.398625ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"475.102375ms: exportMvg(): plot painted\\n\",\n", " \"1.801664416s: exportMvg(): snapshot taken\\n\",\n", " \"1.816822208s: exportMvg(): bitmap extracted\\n\",\n", " \"1.827002333s: exportMvg(): MVG extracted, length=1139472\\n\",\n", " \"1.827378291s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"7 of 10 (n=7000, solid=False, void=False, scale=2)\\n\",\n", " \"167ns: exportMvg(): plotSpec parsed\\n\",\n", " \"85.667us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"35.387042ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"497.958625ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"499.813250ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"545.966792ms: exportMvg(): plot painted\\n\",\n", " \"2.236404667s: exportMvg(): snapshot taken\\n\",\n", " \"2.251214375s: exportMvg(): bitmap extracted\\n\",\n", " \"2.261219083s: exportMvg(): MVG extracted, length=1326863\\n\",\n", " \"2.261549542s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"8 of 10 (n=8000, solid=False, void=False, scale=2)\\n\",\n", " \"209ns: exportMvg(): plotSpec parsed\\n\",\n", " \"56.584us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"36.382834ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"515.741625ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"518.565042ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"600.561834ms: exportMvg(): plot painted\\n\",\n", " \"2.573277959s: exportMvg(): snapshot taken\\n\",\n", " \"2.588211667s: exportMvg(): bitmap extracted\\n\",\n", " \"2.599533667s: exportMvg(): MVG extracted, length=1514031\\n\",\n", " \"2.600167625s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"9 of 10 (n=9000, solid=False, void=False, scale=2)\\n\",\n", " \"41ns: exportMvg(): plotSpec parsed\\n\",\n", " \"64.291us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"42.644833ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"571.640083ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"573.803958ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"645.477291ms: exportMvg(): plot painted\\n\",\n", " \"5.973600875s: exportMvg(): snapshot taken\\n\",\n", " \"5.988748083s: exportMvg(): bitmap extracted\\n\",\n", " \"6.001935875s: exportMvg(): MVG extracted, length=1701529\\n\",\n", " \"6.002541916s: exportMvg(): resources disposed\\n\",\n", " \"\\n\",\n", " \"10 of 10 (n=10000, solid=False, void=False, scale=2)\\n\",\n", " \"208ns: exportMvg(): plotSpec parsed\\n\",\n", " \"84.542us: exportMvg(): exportParameters(dpi=96.0, scaleFactor=2.0, sizingPolicy=SizingPolicy(widthMode=FIXED, heightMode=FIXED, width=null, height=null))\\n\",\n", " \"75.169542ms: exportMvg(): plotCanvasFigure built, size=(600, 400)\\n\",\n", " \"704.192500ms: exportMvg(): plot mapped to canvas\\n\",\n", " \"706.234167ms: exportMvg(): canvas size: (600, 400), pixelDensity=2.0\\n\",\n", " \"770.193542ms: exportMvg(): plot painted\\n\",\n", " \"5.115618750s: exportMvg(): snapshot taken\\n\",\n", " \"5.130567792s: exportMvg(): bitmap extracted\\n\",\n", " \"5.164952458s: exportMvg(): MVG extracted, length=1889109\\n\",\n", " \"5.166579375s: exportMvg(): resources disposed\\n\",\n", " \"\\n\"\n", " ]\n", " }\n", " ],\n", " \"source\": [\n", " \"save_mvg([1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10_000], solid=False, scale=2)\"\n", " ]\n", " },\n", " {\n", " \"cell_type\": \"markdown\",\n", " \"id\": \"ebb611fa-258e-464c-9e00-0f33b58b1799\",\n", " \"metadata\": {},\n", " \"source\": [\n", " \"# Summary\"\n", " ]\n", " },\n", " {\n", " \"cell_type\": \"code\",\n", " \"execution_count\": 6,\n", " \"id\": \"7dbc1fc0-3e22-4178-8a25-6d4952c1305b\",\n", " \"metadata\": {},\n", " \"outputs\": [\n", " {\n", " \"name\": \"stdout\",\n", " \"output_type\": \"stream\",\n", " \"text\": [\n", " \"\\n\",\n", " \"--- Extracted Data ---\\n\",\n", " \" file_name n solid scale void mapping_time \\\\\\n\",\n", " \"0 solid_1000.mvg 1000 True 1 False 0.151705 \\n\",\n", " \"1 solid_5000.mvg 5000 True 1 False 0.339750 \\n\",\n", " \"2 solid_10000.mvg 10000 True 1 False 0.610094 \\n\",\n", " \"3 solid_20000.mvg 20000 True 1 False 1.281384 \\n\",\n", " \"4 solid_50000.mvg 50000 True 1 False 5.310952 \\n\",\n", " \"5 solid_1000@2x.mvg 1000 True 2 False 0.204641 \\n\",\n", " \"6 solid_5000@2x.mvg 5000 True 2 False 0.348808 \\n\",\n", " \"7 solid_10000@2x.mvg 10000 True 2 False 0.692640 \\n\",\n", " \"8 solid_20000@2x.mvg 20000 True 2 False 1.259610 \\n\",\n", " \"9 solid_50000@2x.mvg 50000 True 2 False 3.235151 \\n\",\n", " \"10 stroked_1000.mvg 1000 False 1 False 0.489950 \\n\",\n", " \"11 stroked_5000.mvg 5000 False 1 False 0.401640 \\n\",\n", " \"12 stroked_10000.mvg 10000 False 1 False 0.709911 \\n\",\n", " \"13 stroked_20000.mvg 20000 False 1 False 1.334035 \\n\",\n", " \"14 stroked_50000.mvg 50000 False 1 False 4.460475 \\n\",\n", " \"15 stroked_1000@2x.mvg 1000 False 2 False 0.229399 \\n\",\n", " \"16 stroked_2000@2x.mvg 2000 False 2 False 0.277926 \\n\",\n", " \"17 stroked_3000@2x.mvg 3000 False 2 False 0.217000 \\n\",\n", " \"18 stroked_4000@2x.mvg 4000 False 2 False 0.338693 \\n\",\n", " \"19 stroked_5000@2x.mvg 5000 False 2 False 0.360525 \\n\",\n", " \"20 stroked_6000@2x.mvg 6000 False 2 False 0.434268 \\n\",\n", " \"21 stroked_7000@2x.mvg 7000 False 2 False 0.497959 \\n\",\n", " \"22 stroked_8000@2x.mvg 8000 False 2 False 0.515742 \\n\",\n", " \"23 stroked_9000@2x.mvg 9000 False 2 False 0.571640 \\n\",\n", " \"24 stroked_10000@2x.mvg 10000 False 2 False 0.704192 \\n\",\n", " \"\\n\",\n", " \" paint_time snapshot_time total_time \\n\",\n", " \"0 0.004776 0.134257 0.290738 \\n\",\n", " \"1 0.020655 0.212712 0.573117 \\n\",\n", " \"2 0.052712 0.321701 0.984507 \\n\",\n", " \"3 0.079981 0.577084 1.938448 \\n\",\n", " \"4 0.215714 1.520825 7.047491 \\n\",\n", " \"5 0.006608 0.312825 0.524074 \\n\",\n", " \"6 0.025058 0.497996 0.871862 \\n\",\n", " \"7 0.067388 0.719264 1.479292 \\n\",\n", " \"8 0.089701 1.250391 2.599703 \\n\",\n", " \"9 0.208821 3.329655 6.773628 \\n\",\n", " \"10 0.028254 0.139515 0.657718 \\n\",\n", " \"11 0.034147 0.317262 0.753049 \\n\",\n", " \"12 0.099125 0.626413 1.435448 \\n\",\n", " \"13 0.164568 0.983032 2.481635 \\n\",\n", " \"14 0.353866 2.385450 7.199791 \\n\",\n", " \"15 0.011555 0.363832 0.604786 \\n\",\n", " \"16 0.013889 0.480295 0.772110 \\n\",\n", " \"17 0.019411 0.613319 0.849730 \\n\",\n", " \"18 0.038999 0.885855 1.263547 \\n\",\n", " \"19 0.033007 1.150470 1.544003 \\n\",\n", " \"20 0.040835 1.326562 1.801664 \\n\",\n", " \"21 0.048008 1.690438 2.236405 \\n\",\n", " \"22 0.084820 1.972716 2.573278 \\n\",\n", " \"23 0.073837 5.328124 5.973601 \\n\",\n", " \"24 0.066001 4.345425 5.115619 \\n\"\n", " ]\n", " }\n", " ],\n", " \"source\": [\n", " \"# 3. Convert the global data list to a pandas DataFrame\\n\",\n", " \"results_df = pd.DataFrame(MVG_EXPORT_DATA)\\n\",\n", " \"\\n\",\n", " \"# 4. Display the DataFrame\\n\",\n", " \"print(\\\"\\\\n--- Extracted Data ---\\\")\\n\",\n", " \"print(results_df)\"\n", " ]\n", " },\n", " {\n", " \"cell_type\": \"code\",\n", " \"execution_count\": 7,\n", " \"id\": \"579ac7bd-cf35-4c83-8ba7-63a86540c635\",\n", " \"metadata\": {},\n", " \"outputs\": [\n", " {\n", " \"data\": {\n", " \"text/html\": [\n", " \"\\n\",\n", " \"