diff --git a/common/benchmarking.py b/common/benchmarking.py
new file mode 100644
index 0000000..632a236
--- /dev/null
+++ b/common/benchmarking.py
@@ -0,0 +1,68 @@
+# Simple benchmarking utility.
+
+from IPython.core.magic import register_cell_magic
+from IPython import get_ipython
+import time
+from logica.common import sqlite3_logica
+import pandas
+import signal
+
+timing = {}
+reports = []
+timeout = 200
+
+def Clear():
+ global timing, reports
+ timing = {}
+ reports = []
+
+
+@register_cell_magic
+def loop(line, cell):
+ global timing
+ local_timing = {}
+ ip = get_ipython()
+ problem_name, iterator = ip.ev(line)
+ stop = False
+
+ for item in iterator:
+ if stop:
+ print('Skipping %s (previous timeout).' % item)
+ timing[item] = local_timing[item] = 'TIMEOUT (> %d)' % timeout
+ continue
+
+ print('Running %s.' % item)
+ ip.user_ns['loop_parameter'] = item
+
+ timed_out = [False]
+ def handler(signum, frame):
+ timed_out[0] = True
+ raise KeyboardInterrupt("Timeout")
+
+ old_handler = signal.getsignal(signal.SIGALRM)
+ signal.signal(signal.SIGALRM, handler)
+ signal.alarm(timeout)
+
+ start_time = time.perf_counter()
+ try:
+ ip.run_cell(cell.replace('{loop_parameter}', item))
+ finally:
+ signal.alarm(0)
+ signal.signal(signal.SIGALRM, old_handler)
+ elapsed = time.perf_counter() - start_time
+
+ if timed_out[0]:
+ print('*** TIMEOUT on %s ***' % item)
+ stop = True
+ elapsed = 'TIMEOUT (> %d)' % timeout
+
+ timing[item] = elapsed
+ local_timing[item] = elapsed
+
+ report = (' === Timing for %s ===\n' % problem_name) + (
+ sqlite3_logica.DataframeAsArtisticTable(
+ pandas.DataFrame({'problem': list(local_timing.keys()),
+ 'time': list(local_timing.values())})))
+ reports.append(report)
+ print(report)
+
diff --git a/common/concertina_lib.py b/common/concertina_lib.py
index cd95c89..073e493 100644
--- a/common/concertina_lib.py
+++ b/common/concertina_lib.py
@@ -176,7 +176,11 @@ def __init__(self, config, engine, display_mode='colab', iterations=None):
self.all_actions = {a["name"] for a in self.config}
self.complete_actions = set()
self.running_actions = set()
- assert display_mode in ('colab', 'terminal', 'colab-text', 'silent'), (
+ self.show_only_running = False
+ if os.getenv('LOGICA_TERMINAL_ONELINE', 'no') == 'yes':
+ self.show_only_running = True
+ assert display_mode in ('colab', 'terminal',
+ 'colab-text', 'silent'), (
'Unrecognized display mode: %s' % display_mode)
self.display_mode = display_mode
self.display_id = self.GetDisplayId()
@@ -293,6 +297,13 @@ def AsArtGraph():
extra_lines = self.ProgressBar().split('\n')
return AsArtGraph().GetPicture(updating=updating,
extra_lines=extra_lines)
+ def ShowRunning(self, updating):
+ nodes, edges = self.AsNodesAndEdges()
+ running = [n for n in nodes if n.startswith('\033[1m')]
+ if not running:
+ return '*'
+ return '[%d / %d] ' % (len(self.complete_actions),
+ len(self.all_actions)) + running[0]
def AsNodesAndEdges(self):
"""Nodes and edges to display in terminal."""
@@ -405,14 +416,18 @@ def UpdateDisplay(self, final=False):
self.display_update_period = min(0.5, self.display_update_period * 1.2)
if (now - self.recent_display_update_seconds <
self.display_update_period and
- not final):
+ not final and
+ not self.show_only_running):
# Avoid frequent display updates slowing down execution.
return
self.recent_display_update_seconds = now
if self.display_mode == 'colab':
update_display(self.AsGraphViz(), display_id=self.display_id)
elif self.display_mode == 'terminal':
- print(self.AsTextPicture(updating=True))
+ if self.show_only_running:
+ print(self.ShowRunning(updating=True))
+ else:
+ print(self.AsTextPicture(updating=True))
elif self.display_mode == 'colab-text':
update_display(
self.StateAsSimpleHTML(),
diff --git a/common/graph.py b/common/graph.py
index 838feb5..d8c0420 100644
--- a/common/graph.py
+++ b/common/graph.py
@@ -217,4 +217,17 @@ def Convert(l):
def HierarchicalOptions():
return {'layout': {'hierarchical': {'direction': 'UD',
- 'sortMethod': 'directed'}}}
\ No newline at end of file
+ 'sortMethod': 'directed'}}}
+
+def InstallRequire():
+ from IPython.display import display, HTML
+ # This script manually loads RequireJS so that logica/vis.js can work
+ display(HTML('''
+
+
+ '''))
+
diff --git a/examples/graph/tgdk/README.md b/examples/graph/tgdk/README.md
new file mode 100644
index 0000000..eb13ae9
--- /dev/null
+++ b/examples/graph/tgdk/README.md
@@ -0,0 +1,96 @@
+# Benchmark Artifacts for "Logica-TGD: Transforming Graph Databases Logically"
+
+This directory contains reproducible benchmark notebooks for the paper:
+
+> **Logica-TGD: Transforming Graph Databases Logically**
+> Evgeny Skvortsov, Yilin Xia, Bertram Ludäscher, Shawn Bowers
+> *TGDK, 2026*
+
+## Benchmarks
+
+We compare four systems on graph computation problems (transitive closure,
+pairwise distances, same generation):
+
+- **Logica** — compiling to DuckDB SQL
+- **Soufflé** — Datalog engine with parallel evaluation
+- **DuckPGQ** — DuckDB extension implementing SQL/PGQ (Cypher-style queries)
+- **Nemo** — single-threaded Rust rule engine (for the Nemo column only)
+
+All benchmarks were run on a Google Cloud **c2d-standard-32** instance
+(32 vCPUs, 128 GB RAM) using Logica 1.3.1415926535897, DuckDB 1.3.2,
+Soufflé 2.4, and Nemo 0.10.0.
+
+### Main notebooks
+
+| Notebook | Description |
+|----------|-------------|
+| `benchmark_logica.ipynb` | Logica benchmarks (all problems). **Run this first** — it generates input data (CSV files and `graphs.db`) used by the other notebooks. |
+| `benchmark_souffle.ipynb` | Soufflé benchmarks (compiled mode) |
+| `benchmark_cypher.ipynb` | DuckPGQ / Cypher benchmarks |
+
+### Auxiliary materials
+
+| File | Description |
+|------|-------------|
+| `auxiliary/benchmark_souffle_interpreted.ipynb` | Soufflé benchmarks in interpreted mode (used in the original submission) |
+| `auxiliary/benchmark_logica_with_output_sizes.ipynb` | Logica notebook computing output sizes for the table in the paper |
+| `auxiliary/souffle_compiled_vs_interpreted.md` | Comparison of Soufflé compiled vs. interpreted modes |
+
+## Reproducing the results
+
+1. Install Jupyter Notebook:
+ ```
+ python3 -m pip install notebook
+ ```
+
+2. Install DuckDB:
+ ```
+ python3 -m pip install duckdb
+ ```
+
+3. Install Soufflé (v2.4 was used) by following the instructions at
+ [souffle-lang.github.io](https://souffle-lang.github.io/install).
+
+4. Clone this repository:
+ ```
+ git clone https://github.com/EvgSkv/logica
+ ```
+
+5. Start the notebook server from the repository root, so that Logica
+ is importable:
+ ```
+ cd logica
+ python3 -m notebook examples/graph/tgdk
+ ```
+ Alternatively, install Logica with `python3 -m pip install logica` and start
+ the notebook from anywhere.
+
+6. Run the notebooks starting with `benchmark_logica.ipynb` — it
+ generates the input data (CSV files and `graphs.db`) used by the
+ Soufflé and DuckPGQ notebooks. Then proceed to `benchmark_souffle.ipynb`
+ and `benchmark_cypher.ipynb`.
+
+For the Nemo comparison, see the [Nemo section](#nemo-comparison) below.
+
+## Nemo comparison
+
+| File | Description |
+|------|-------------|
+| `benchmark_and_collect.py` | Runs all TC and SG benchmarks on both Logica and Nemo, collects wall/CPU times and fact counts into `benchmark_results.txt` (ASCII table) and `benchmark_results.csv`. Generates the `.l` and `.nemo` programs from templates. |
+| `tc_g1k.l`, `tc_g1k.nemo` | Example Logica and Nemo programs for transitive closure (shown for reference — the script regenerates all sizes). |
+| `sg_tree7.l`, `sg_tree7.nemo` | Example Logica and Nemo programs for same generation. |
+| `benchmark_results.txt` | Output of `benchmark_and_collect.py` from our run. |
+
+To run the Nemo comparison:
+
+1. Install Nemo 0.10.0 (see [nemo rule engine](https://github.com/knowsys/nemo)).
+ The `nmo` binary must be on `PATH` (we invoke it as `nemo` in the script —
+ adjust the command there if your binary is named `nmo`).
+2. Make sure the CSV inputs (`g1k.csv`..`g5k.csv`, `tree7.csv`..`tree12.csv`)
+ are present in the same directory. They are produced by running
+ `benchmark_logica.ipynb`.
+3. Run the script from this directory:
+ ```
+ python3 benchmark_and_collect.py
+ ```
+ It writes `benchmark_results.txt` and `benchmark_results.csv`.
diff --git a/examples/graph/tgdk/all_programs.pdf b/examples/graph/tgdk/all_programs.pdf
new file mode 100644
index 0000000..6150b8c
Binary files /dev/null and b/examples/graph/tgdk/all_programs.pdf differ
diff --git a/examples/graph/tgdk/auxiliary/benchmark_logica_with_output_sizes.ipynb b/examples/graph/tgdk/auxiliary/benchmark_logica_with_output_sizes.ipynb
new file mode 100644
index 0000000..15a94f8
--- /dev/null
+++ b/examples/graph/tgdk/auxiliary/benchmark_logica_with_output_sizes.ipynb
@@ -0,0 +1,6929 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "017fd848-8cee-4dc8-b15e-75cabe7ad092",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Welcome to simple Souffle graph benchmarking.\n",
+ "Behold the power of The Machine:\n",
+ "CPUs: 32 / RAM: 125Gi\n"
+ ]
+ }
+ ],
+ "source": [
+ "!echo 'Welcome to simple Souffle graph benchmarking.'\n",
+ "!echo 'Behold the power of The Machine:'\n",
+ "!echo \"CPUs: $(nproc) / RAM: $(free -h | awk '/^Mem:/ {print $2}')\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "34c208d1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from logica.common import benchmarking"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "82fbd480",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test_items = ['a', 'b', 'c']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "03b9c31d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running a.\n",
+ "a\n",
+ "Running b.\n",
+ "b\n",
+ "Running c.\n",
+ "c\n",
+ " === Timing for Test Problem ===\n",
+ "+---------+------------------------+\n",
+ "| problem | time |\n",
+ "+---------+------------------------+\n",
+ "| a | 0.00022841000100015663 |\n",
+ "| b | 0.00019157000133418478 |\n",
+ "| c | 0.00020624000171665102 |\n",
+ "+---------+------------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop (\"Test Problem\", test_items)\n",
+ "print(\"{loop_parameter}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "ab7a2777",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " === Timing for Test Problem ===\n",
+ "+---------+------------------------+\n",
+ "| problem | time |\n",
+ "+---------+------------------------+\n",
+ "| a | 0.00022841000100015663 |\n",
+ "| b | 0.00019157000133418478 |\n",
+ "| c | 0.00020624000171665102 |\n",
+ "+---------+------------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(benchmarking.reports[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "66effb9f-ea00-444d-814e-f18491b5b70d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Could not import google.cloud.bigquery.\n",
+ "Could not import google.cloud.auth.\n",
+ "Could not import google.colab.widgets.\n"
+ ]
+ }
+ ],
+ "source": [
+ "from logica import colab_logica"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "4b1a898b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mG_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mG\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 15 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 10 | \n",
+ " 76 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 77 | \n",
+ " 42 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 0 | \n",
+ " 23 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 84 | \n",
+ " 67 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 77 | \n",
+ " 34 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 46 | \n",
+ " 55 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 96 | \n",
+ " 49 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 75 | \n",
+ " 85 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 21 | \n",
+ " 27 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 6 | \n",
+ " 20 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 47 | \n",
+ " 13 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 67 | \n",
+ " 55 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 15 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 31 | \n",
+ " 35 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 4 | \n",
+ " 85 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 15 | \n",
+ " 37 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 0 | \n",
+ " 57 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 95 | \n",
+ " 92 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 4 | \n",
+ " 95 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 41 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 36 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 72 | \n",
+ " 86 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 94 | \n",
+ " 83 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 9 | \n",
+ " 27 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 31 | \n",
+ " 91 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 21 | \n",
+ " 97 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 16 | \n",
+ " 9 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 64 | \n",
+ " 72 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 18 | \n",
+ " 91 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 970 | \n",
+ " 89 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " | 971 | \n",
+ " 17 | \n",
+ " 21 | \n",
+ "
\n",
+ " \n",
+ " | 972 | \n",
+ " 89 | \n",
+ " 54 | \n",
+ "
\n",
+ " \n",
+ " | 973 | \n",
+ " 22 | \n",
+ " 35 | \n",
+ "
\n",
+ " \n",
+ " | 974 | \n",
+ " 56 | \n",
+ " 72 | \n",
+ "
\n",
+ " \n",
+ " | 975 | \n",
+ " 76 | \n",
+ " 29 | \n",
+ "
\n",
+ " \n",
+ " | 976 | \n",
+ " 91 | \n",
+ " 31 | \n",
+ "
\n",
+ " \n",
+ " | 977 | \n",
+ " 16 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 978 | \n",
+ " 7 | \n",
+ " 79 | \n",
+ "
\n",
+ " \n",
+ " | 979 | \n",
+ " 96 | \n",
+ " 26 | \n",
+ "
\n",
+ " \n",
+ " | 980 | \n",
+ " 67 | \n",
+ " 88 | \n",
+ "
\n",
+ " \n",
+ " | 981 | \n",
+ " 25 | \n",
+ " 68 | \n",
+ "
\n",
+ " \n",
+ " | 982 | \n",
+ " 69 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 983 | \n",
+ " 27 | \n",
+ " 68 | \n",
+ "
\n",
+ " \n",
+ " | 984 | \n",
+ " 30 | \n",
+ " 64 | \n",
+ "
\n",
+ " \n",
+ " | 985 | \n",
+ " 18 | \n",
+ " 74 | \n",
+ "
\n",
+ " \n",
+ " | 986 | \n",
+ " 92 | \n",
+ " 23 | \n",
+ "
\n",
+ " \n",
+ " | 987 | \n",
+ " 26 | \n",
+ " 97 | \n",
+ "
\n",
+ " \n",
+ " | 988 | \n",
+ " 51 | \n",
+ " 62 | \n",
+ "
\n",
+ " \n",
+ " | 989 | \n",
+ " 64 | \n",
+ " 24 | \n",
+ "
\n",
+ " \n",
+ " | 990 | \n",
+ " 88 | \n",
+ " 22 | \n",
+ "
\n",
+ " \n",
+ " | 991 | \n",
+ " 95 | \n",
+ " 91 | \n",
+ "
\n",
+ " \n",
+ " | 992 | \n",
+ " 1 | \n",
+ " 26 | \n",
+ "
\n",
+ " \n",
+ " | 993 | \n",
+ " 80 | \n",
+ " 62 | \n",
+ "
\n",
+ " \n",
+ " | 994 | \n",
+ " 55 | \n",
+ " 90 | \n",
+ "
\n",
+ " \n",
+ " | 995 | \n",
+ " 44 | \n",
+ " 29 | \n",
+ "
\n",
+ " \n",
+ " | 996 | \n",
+ " 57 | \n",
+ " 17 | \n",
+ "
\n",
+ " \n",
+ " | 997 | \n",
+ " 84 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 998 | \n",
+ " 28 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 999 | \n",
+ " 33 | \n",
+ " 63 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mS_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mS\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 168000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ G7c (16 ms) \n",
+ "║╥ ▚ G5k (51 ms) \n",
+ "║║ ▚ G (5 ms) \n",
+ "║║╥ ▚ G1k (16 ms) \n",
+ "║║║╥ ▚ G3k (33 ms) \n",
+ "║║║║╥ ▚ G2k (24 ms) \n",
+ "║║║║║╥ ▚ G6c (12 ms) \n",
+ "║║║║║║╥ ▚ G5c (11 ms) \n",
+ "║║║║║║║╥ ▚ G4k (41 ms) \n",
+ "╨╨╨╨╨╨╨╨ ▚ S (1 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "%%logica G,S\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "N() = 100;\n",
+ "D() = 10;\n",
+ "\n",
+ "GStep1(a, b, i:) distinct :-\n",
+ " a = NaturalHash(\"a-\" ++ ToString(i)) % N(),\n",
+ " b = NaturalHash(\"b-\" ++ ToString(i)) % N(),\n",
+ " a != b,\n",
+ " i in Range(ToInt64(N() * D() * 1.1));\n",
+ "\n",
+ "I() = l[N() * D()] :-\n",
+ " l = Array{ i -> i :- GStep1(i:) };\n",
+ "\n",
+ "G(a, b) :-\n",
+ " GStep1(a, b, i:),\n",
+ " i < I();\n",
+ "\n",
+ "\n",
+ "@Ground(G5c, \"db.G5c\", copy_to_file: \"data/g5c.csv\");\n",
+ "G5c := G(N: 500);\n",
+ "@Ground(G6c, \"db.G6c\", copy_to_file: \"data/g6c.csv\");\n",
+ "G6c := G(N: 600);\n",
+ "@Ground(G7c, \"db.G7c\", copy_to_file: \"data/g7c.csv\");\n",
+ "G7c := G(N: 700);\n",
+ "\n",
+ "@Ground(G1k, \"db.G1k\", copy_to_file: \"data/g1k.csv\");\n",
+ "G1k := G(N: 1000);\n",
+ "@Ground(G2k, \"db.G2k\", copy_to_file: \"data/g2k.csv\");\n",
+ "G2k := G(N: 2000);\n",
+ "@Ground(G3k, \"db.G3k\", copy_to_file: \"data/g3k.csv\");\n",
+ "G3k := G(N: 3000);\n",
+ "@Ground(G4k, \"db.G4k\", copy_to_file: \"data/g4k.csv\");\n",
+ "G4k := G(N: 4000);\n",
+ "@Ground(G5k, \"db.G5k\", copy_to_file: \"data/g5k.csv\");\n",
+ "G5k := G(N: 5000);\n",
+ "\n",
+ "S() += 1 :- G5c() | G6c() | G7c() | G1k() | G2k() | G3k() | G4k() | G5k();\n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "ca1e7236",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "graphs = ['G1k', 'G2k', 'G3k', 'G4k', 'G5k']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "76ee2a9f",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mTree_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTree\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 00 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 0 | \n",
+ " 01 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 00 | \n",
+ " 000 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 000 | \n",
+ " 0000 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 000 | \n",
+ " 0001 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 000 | \n",
+ " 0002 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 000 | \n",
+ " 0003 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 0001 | \n",
+ " 00010 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 0001 | \n",
+ " 00011 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 0001 | \n",
+ " 00012 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 0121 | \n",
+ " 01210 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 0101 | \n",
+ " 01010 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 0122 | \n",
+ " 01220 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 0122 | \n",
+ " 01221 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 0122 | \n",
+ " 01222 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 0120 | \n",
+ " 01200 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 0120 | \n",
+ " 01201 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 0120 | \n",
+ " 01202 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 0120 | \n",
+ " 01203 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 0002 | \n",
+ " 00020 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 011 | \n",
+ " 0110 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 0100 | \n",
+ " 01000 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 0110 | \n",
+ " 01100 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 0110 | \n",
+ " 01101 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 0000 | \n",
+ " 00000 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 012 | \n",
+ " 0120 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 012 | \n",
+ " 0121 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 012 | \n",
+ " 0122 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 010 | \n",
+ " 0100 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 010 | \n",
+ " 0101 | \n",
+ "
\n",
+ " \n",
+ " | 30 | \n",
+ " 01 | \n",
+ " 010 | \n",
+ "
\n",
+ " \n",
+ " | 31 | \n",
+ " 01 | \n",
+ " 011 | \n",
+ "
\n",
+ " \n",
+ " | 32 | \n",
+ " 01 | \n",
+ " 012 | \n",
+ "
\n",
+ " \n",
+ " | 33 | \n",
+ " 0003 | \n",
+ " 00030 | \n",
+ "
\n",
+ " \n",
+ " | 34 | \n",
+ " 0003 | \n",
+ " 00031 | \n",
+ "
\n",
+ " \n",
+ " | 35 | \n",
+ " 0003 | \n",
+ " 00032 | \n",
+ "
\n",
+ " \n",
+ " | 36 | \n",
+ " 0003 | \n",
+ " 00033 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mNumNodes_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mNumNodes\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " tree5 | \n",
+ " tree6 | \n",
+ " tree7 | \n",
+ " tree8 | \n",
+ " tree9 | \n",
+ " tree10 | \n",
+ " tree11 | \n",
+ " tree12 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 37 | \n",
+ " 85 | \n",
+ " 206 | \n",
+ " 505 | \n",
+ " 1257 | \n",
+ " 3152 | \n",
+ " 7793 | \n",
+ " 19456 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ InnerTree_ifr0_f11 (0 ms) \n",
+ "║╥ ▚ InnerTree_ifr0_f14 (0 ms) \n",
+ "║║╥ ▚ InnerTree_ifr0_f9 (0 ms) \n",
+ "║║║╥ ▚ InnerTree_ifr0_f10 (0 ms) \n",
+ "║║╨║╥ ▚ InnerTree_ifr1_f9 (2 ms) \n",
+ "║║╥║║ ▚ InnerTree_ifr0 (0 ms) \n",
+ "║║║║║╥ ▚ InnerTree_ifr0_f13 (0 ms) \n",
+ "║║║║╨║╥ ▚ InnerTree_ifr2_f9 (12 ms) 15 / 15\n",
+ "║║║║╥║║ ▚ InnerTree_ifr0_f12 (0 ms) \n",
+ "║╨║║║║║╥ ▚ InnerTree_ifr1_f14 (1 ms) \n",
+ "║╥║║║║║║ ▚ InnerTree_ifr0_f7 (0 ms) \n",
+ "╨║║║║║║║╥ ▚ InnerTree_ifr1_f11 (1 ms) \n",
+ "╥║║║║║║║║ ▚ InnerTree_ifr0_f8 (0 ms) \n",
+ "║║╨║║║║║║╥ ▚ InnerTree_ifr1 (1 ms) \n",
+ "║║╥║║║║║╨║ ▚ InnerTree_ifr2_f11 (2 ms) 15 / 15\n",
+ "║║║║║╨║║╥║ ▚ InnerTree_ifr1_f13 (1 ms) \n",
+ "║║║╨║╥║║║║ ▚ InnerTree_ifr1_f10 (1 ms) \n",
+ "║║║╥║║╨║║║ ▚ InnerTree_ifr3_f9 (12 ms) 15 / 15\n",
+ "║║║║╨║╥║║║ ▚ InnerTree_ifr1_f12 (1 ms) \n",
+ "║║║╨╥║║║║║ ▚ InnerTree_f9 (13 ms) \n",
+ "║║║╥║║║║╨║ ▚ InnerTree_ifr2_f13 (2 ms) 15 / 15\n",
+ "║║║║║╨║║╥║ ▚ InnerTree_ifr2_f10 (2 ms) 15 / 15\n",
+ "║║╨║║╥║║║║ ▚ InnerTree_ifr3_f11 (2 ms) 15 / 15\n",
+ "║║╥║║║║╨║║ ▚ InnerTree_ifr2_f14 (2 ms) 15 / 15\n",
+ "║╨║║║║║╥║║ ▚ InnerTree_ifr1_f7 (1 ms) \n",
+ "║╥║║║║╨║║║ ▚ InnerTree_ifr2_f12 (2 ms) 15 / 15\n",
+ "╨║║║║║╥║║║ ▚ InnerTree_ifr1_f8 (1 ms) \n",
+ "╥║║║║║║║║╨ ▚ InnerTree_ifr2 (2 ms) 15 / 15\n",
+ "║║╨║║║║║║╥ ▚ InnerTree_ifr3_f14 (2 ms) 15 / 15\n",
+ "║║╥║║║╨║║║ ▚ InnerTree_ifr2_f8 (6 ms) 15 / 15\n",
+ "╨║║║║║╥║║║ ▚ InnerTree_ifr3 (2 ms) 15 / 15\n",
+ "╥║║║║║║║║╨ ▚ InnerTree_f14 (2 ms) \n",
+ "║║║║╨║║║║╥ ▚ Tree12 (16 ms) \n",
+ "║║║║╥╨║║║║ ▚ InnerTree_f11 (2 ms) \n",
+ "║║║║║╥║╨║║ ▚ InnerTree_ifr2_f7 (3 ms) 15 / 15\n",
+ "║║║║║║║╥╨║ ▚ InnerTree_ifr3_f10 (2 ms) 15 / 15\n",
+ "║║║║║║║╨╥║ ▚ InnerTree_f10 (2 ms) \n",
+ "║║║║║║╨╥║║ ▚ InnerTree (2 ms) \n",
+ "║║║╨║║╥║║║ ▚ InnerTree_ifr3_f13 (2 ms) 15 / 15\n",
+ "║║╨╥║║║║║║ ▚ InnerTree_ifr3_f8 (6 ms) 15 / 15\n",
+ "║║╥║╨║║║║║ ▚ Tree6 (4 ms) \n",
+ "║║║╨╥║║║║║ ▚ InnerTree_f8 (6 ms) \n",
+ "║╨║╥║║║║║║ ▚ InnerTree_ifr3_f12 (2 ms) 15 / 15\n",
+ "║ ║║║║║╨║║ ▚ Tree (0 ms) \n",
+ "╨╥║║║║║ ║║ ▚ Tree9 (6 ms) \n",
+ "╥║║║║║║ ╨║ ▚ Tree5 (3 ms) \n",
+ "║║║║╨║║╥ ║ ▚ Tree11 (8 ms) \n",
+ "║║║║╥╨║║ ║ ▚ InnerTree_ifr3_f7 (4 ms) 15 / 15\n",
+ "║║║╨║╥║║ ║ ▚ InnerTree_f12 (2 ms) \n",
+ "║║║╥║║╨║ ║ ▚ InnerTree_f13 (2 ms) \n",
+ "║║║║║╨╥║ ║ ▚ Tree7 (4 ms) \n",
+ "║║║║╨╥║║ ║ ▚ InnerTree_f7 (4 ms) \n",
+ "║║║╨╥║║║ ║ ▚ Tree8 (4 ms) \n",
+ "║║║╥║╨║║ ║ ▚ Tree10 (5 ms) \n",
+ "╨╨╨╨╨ ╨╨ ╨ ▚ NumNodes (12 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "%%logica Tree, NumNodes\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "Depth() = 5;\n",
+ "DegreeRange(1, 5);\n",
+ "\n",
+ "InnerTree(x, y) :-\n",
+ " (x = \"0\" | InnerTree(something, x)),\n",
+ " Length(x) < Depth(),\n",
+ " DegreeRange(d1, d2),\n",
+ " d = NaturalHash(\"d-\" ++ x) % (d2 - d1) + d1,\n",
+ " i in Range(d),\n",
+ " y = x ++ ToString(i);\n",
+ "\n",
+ "# Creating a non-recursive face, so we can customly ground it.\n",
+ "Tree(x, y) :- InnerTree(x, y);\n",
+ "\n",
+ "@Ground(Tree5, \"db.Tree5\", copy_to_file: \"data/tree5.csv\");\n",
+ "Tree5 := Tree(Depth: 5);\n",
+ "@Ground(Tree6, \"db.Tree6\", copy_to_file: \"data/tree6.csv\");\n",
+ "Tree6 := Tree(Depth: 6);\n",
+ "@Ground(Tree7, \"db.Tree7\", copy_to_file: \"data/tree7.csv\");\n",
+ "Tree7 := Tree(Depth: 7);\n",
+ "@Ground(Tree8, \"db.Tree8\", copy_to_file: \"data/tree8.csv\");\n",
+ "Tree8 := Tree(Depth: 8);\n",
+ "@Ground(Tree9, \"db.Tree9\", copy_to_file: \"data/tree9.csv\");\n",
+ "Tree9 := Tree(Depth: 9);\n",
+ "@Ground(Tree10, \"db.Tree10\", copy_to_file: \"data/tree10.csv\");\n",
+ "Tree10 := Tree(Depth: 10);\n",
+ "@Ground(Tree11, \"db.Tree11\", copy_to_file: \"data/tree11.csv\");\n",
+ "Tree11 := Tree(Depth: 11);\n",
+ "@Ground(Tree12, \"db.Tree12\", copy_to_file: \"data/tree12.csv\");\n",
+ "Tree12 := Tree(Depth: 12);\n",
+ "\n",
+ "NumNodes(tree5: Sum{ 1 :- Tree5()},\n",
+ " tree6: Sum{ 1 :- Tree6()},\n",
+ " tree7: Sum{ 1 :- Tree7()},\n",
+ " tree8: Sum{ 1 :- Tree8()},\n",
+ " tree9: Sum{ 1 :- Tree9()},\n",
+ " tree10: Sum{ 1 :- Tree10()},\n",
+ " tree11: Sum{ 1 :- Tree11()},\n",
+ " tree12: Sum{ 1 :- Tree12()}\n",
+ " );\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "79e9c6b3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "trees = ['Tree7', 'Tree8', 'Tree9', 'Tree10', 'Tree11', 'Tree12']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "386a189b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running G1k.\n",
+ "Query is stored at \u001b[1mTC_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTC\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 403 | \n",
+ " 288 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 150 | \n",
+ " 58 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 192 | \n",
+ " 467 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 592 | \n",
+ " 505 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 236 | \n",
+ " 257 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 811 | \n",
+ " 623 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 753 | \n",
+ " 82 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 911 | \n",
+ " 322 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 236 | \n",
+ " 9 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 991 | \n",
+ " 698 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 836 | \n",
+ " 198 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 687 | \n",
+ " 754 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 983 | \n",
+ " 78 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 94 | \n",
+ " 42 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 858 | \n",
+ " 770 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 112 | \n",
+ " 999 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 84 | \n",
+ " 360 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 480 | \n",
+ " 324 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 280 | \n",
+ " 617 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 628 | \n",
+ " 482 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 360 | \n",
+ " 779 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 13 | \n",
+ " 657 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 30 | \n",
+ " 111 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 558 | \n",
+ " 987 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 951 | \n",
+ " 835 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 79 | \n",
+ " 238 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 355 | \n",
+ " 263 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 186 | \n",
+ " 416 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 90 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 384 | \n",
+ " 864 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 999970 | \n",
+ " 986 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999971 | \n",
+ " 852 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999972 | \n",
+ " 94 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999973 | \n",
+ " 232 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999974 | \n",
+ " 424 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999975 | \n",
+ " 367 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999976 | \n",
+ " 688 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999977 | \n",
+ " 741 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999978 | \n",
+ " 143 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999979 | \n",
+ " 458 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999980 | \n",
+ " 520 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999981 | \n",
+ " 270 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999982 | \n",
+ " 430 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999983 | \n",
+ " 746 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999984 | \n",
+ " 861 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999985 | \n",
+ " 844 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999986 | \n",
+ " 705 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999987 | \n",
+ " 399 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999988 | \n",
+ " 965 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999989 | \n",
+ " 356 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999990 | \n",
+ " 391 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999991 | \n",
+ " 134 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999992 | \n",
+ " 633 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999993 | \n",
+ " 897 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999994 | \n",
+ " 657 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999995 | \n",
+ " 65 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999996 | \n",
+ " 444 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999997 | \n",
+ " 251 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999998 | \n",
+ " 994 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ " | 999999 | \n",
+ " 545 | \n",
+ " 595 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mTCSize_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTCSize\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1000000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G1k (input data) \n",
+ "╨╥ ▚ TC_ifr0 (3 ms) \n",
+ "╥╨ ▚ TC_ifr1 (12 ms) \n",
+ "╨╥╥ ▚ TC_ifr2 (80 ms) \n",
+ "╥╨║╥╥ ▚ TC_ifr3 (104 ms) \n",
+ "╨╥║║║╥╥ ▚ TC_ifr4 (112 ms) 2 / ∞ / stop.\n",
+ "╥╨║║║║║╥ ▚ TC_ifr5 (103 ms) 2 / ∞ / stop.\n",
+ "║╥║╨║║║║ ▚ PrevTC_ifr4 (4 ms) 2 / ∞ / stop.\n",
+ "║║║ ║╨║║ ▚ PrevTC_ifr5 (5 ms) 2 / ∞ / stop.\n",
+ "║║╨╥║ ║║ ▚ PrevTC_ifr3 (5 ms) \n",
+ "╨║ ║║ ║║ ▚ TC (98 ms) \n",
+ " ║ ╨╨ ║║ ▚ Done_ifr4 (40 ms) 2 / ∞ / stop.\n",
+ " ╨ ╨║ ▚ Done_ifr5 (47 ms) 2 / ∞ / stop.\n",
+ "╥ ╨ ▚ ⤓TC (112 ms) \n",
+ "╨ ▚ TCSize (1 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running G2k.\n",
+ "Query is stored at \u001b[1mTC_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTC\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1268 | \n",
+ " 353 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1020 | \n",
+ " 288 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1198 | \n",
+ " 1118 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 855 | \n",
+ " 1148 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1266 | \n",
+ " 504 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 427 | \n",
+ " 479 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1194 | \n",
+ " 474 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 528 | \n",
+ " 331 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 954 | \n",
+ " 54 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 517 | \n",
+ " 1792 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 1374 | \n",
+ " 753 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 697 | \n",
+ " 660 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 762 | \n",
+ " 1049 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 443 | \n",
+ " 402 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 737 | \n",
+ " 808 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 982 | \n",
+ " 548 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 1494 | \n",
+ " 1749 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 1374 | \n",
+ " 1899 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 627 | \n",
+ " 1208 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 1938 | \n",
+ " 647 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 1298 | \n",
+ " 1048 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 170 | \n",
+ " 1965 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 1608 | \n",
+ " 1273 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 700 | \n",
+ " 1677 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 1993 | \n",
+ " 1817 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 125 | \n",
+ " 1532 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 199 | \n",
+ " 750 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 413 | \n",
+ " 1049 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 872 | \n",
+ " 18 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 116 | \n",
+ " 1188 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 3999970 | \n",
+ " 1001 | \n",
+ " 1595 | \n",
+ "
\n",
+ " \n",
+ " | 3999971 | \n",
+ " 1836 | \n",
+ " 1595 | \n",
+ "
\n",
+ " \n",
+ " | 3999972 | \n",
+ " 353 | \n",
+ " 1595 | \n",
+ "
\n",
+ " \n",
+ " | 3999973 | \n",
+ " 1376 | \n",
+ " 1913 | \n",
+ "
\n",
+ " \n",
+ " | 3999974 | \n",
+ " 1664 | \n",
+ " 1913 | \n",
+ "
\n",
+ " \n",
+ " | 3999975 | \n",
+ " 418 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | 3999976 | \n",
+ " 1107 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | 3999977 | \n",
+ " 288 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | 3999978 | \n",
+ " 49 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | 3999979 | \n",
+ " 141 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | 3999980 | \n",
+ " 599 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | 3999981 | \n",
+ " 1195 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | 3999982 | \n",
+ " 518 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | 3999983 | \n",
+ " 964 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | 3999984 | \n",
+ " 1685 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | 3999985 | \n",
+ " 1351 | \n",
+ " 484 | \n",
+ "
\n",
+ " \n",
+ " | 3999986 | \n",
+ " 383 | \n",
+ " 484 | \n",
+ "
\n",
+ " \n",
+ " | 3999987 | \n",
+ " 204 | \n",
+ " 484 | \n",
+ "
\n",
+ " \n",
+ " | 3999988 | \n",
+ " 1194 | \n",
+ " 484 | \n",
+ "
\n",
+ " \n",
+ " | 3999989 | \n",
+ " 1587 | \n",
+ " 484 | \n",
+ "
\n",
+ " \n",
+ " | 3999990 | \n",
+ " 787 | \n",
+ " 1038 | \n",
+ "
\n",
+ " \n",
+ " | 3999991 | \n",
+ " 1716 | \n",
+ " 1038 | \n",
+ "
\n",
+ " \n",
+ " | 3999992 | \n",
+ " 88 | \n",
+ " 1038 | \n",
+ "
\n",
+ " \n",
+ " | 3999993 | \n",
+ " 1927 | \n",
+ " 1038 | \n",
+ "
\n",
+ " \n",
+ " | 3999994 | \n",
+ " 1082 | \n",
+ " 1038 | \n",
+ "
\n",
+ " \n",
+ " | 3999995 | \n",
+ " 0 | \n",
+ " 1038 | \n",
+ "
\n",
+ " \n",
+ " | 3999996 | \n",
+ " 918 | \n",
+ " 1038 | \n",
+ "
\n",
+ " \n",
+ " | 3999997 | \n",
+ " 1046 | \n",
+ " 1306 | \n",
+ "
\n",
+ " \n",
+ " | 3999998 | \n",
+ " 1268 | \n",
+ " 1306 | \n",
+ "
\n",
+ " \n",
+ " | 3999999 | \n",
+ " 432 | \n",
+ " 1306 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mTCSize_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTCSize\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4000000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G2k (input data) \n",
+ "╨╥ ▚ TC_ifr0 (4 ms) \n",
+ "╥╨ ▚ TC_ifr1 (22 ms) \n",
+ "╨╥╥ ▚ TC_ifr2 (105 ms) \n",
+ "╥╨║╥╥ ▚ TC_ifr3 (185 ms) \n",
+ "╨╥║║║╥╥ ▚ TC_ifr4 (219 ms) 3 / ∞ / stop.\n",
+ "╥╨║║║║║╥ ▚ TC_ifr5 (234 ms) 3 / ∞ / stop.\n",
+ "║╥║╨║║║║ ▚ PrevTC_ifr4 (10 ms) 3 / ∞ / stop.\n",
+ "║║║ ║╨║║ ▚ PrevTC_ifr5 (8 ms) 3 / ∞ / stop.\n",
+ "║║╨╥║ ║║ ▚ PrevTC_ifr3 (5 ms) \n",
+ "╨║ ║║ ║║ ▚ TC (263 ms) \n",
+ " ║ ╨╨ ║║ ▚ Done_ifr4 (64 ms) 3 / ∞ / stop.\n",
+ " ╨ ╨║ ▚ Done_ifr5 (64 ms) 2 / ∞ / stop.\n",
+ "╥ ╨ ▚ ⤓TC (220 ms) \n",
+ "╨ ▚ TCSize (2 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running G3k.\n",
+ "Query is stored at \u001b[1mTC_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTC\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 724 | \n",
+ " 413 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2763 | \n",
+ " 2176 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1893 | \n",
+ " 1116 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1644 | \n",
+ " 452 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 895 | \n",
+ " 2210 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 2765 | \n",
+ " 2940 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1968 | \n",
+ " 2515 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 136 | \n",
+ " 262 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 553 | \n",
+ " 1141 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 1910 | \n",
+ " 383 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 2794 | \n",
+ " 437 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 524 | \n",
+ " 365 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 2028 | \n",
+ " 362 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 560 | \n",
+ " 478 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 1391 | \n",
+ " 2116 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 1589 | \n",
+ " 474 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 953 | \n",
+ " 142 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 1481 | \n",
+ " 1521 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 2960 | \n",
+ " 392 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 1999 | \n",
+ " 2895 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 1951 | \n",
+ " 2733 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 2937 | \n",
+ " 2373 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 2043 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 2980 | \n",
+ " 423 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 2249 | \n",
+ " 1577 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 1436 | \n",
+ " 1430 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 708 | \n",
+ " 746 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 1400 | \n",
+ " 487 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 1161 | \n",
+ " 1325 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 107 | \n",
+ " 1858 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 8999970 | \n",
+ " 2840 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999971 | \n",
+ " 1781 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999972 | \n",
+ " 2306 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999973 | \n",
+ " 1196 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999974 | \n",
+ " 707 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999975 | \n",
+ " 1118 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999976 | \n",
+ " 1932 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999977 | \n",
+ " 2885 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999978 | \n",
+ " 1002 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999979 | \n",
+ " 1336 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999980 | \n",
+ " 621 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999981 | \n",
+ " 52 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999982 | \n",
+ " 2354 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999983 | \n",
+ " 1808 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999984 | \n",
+ " 1227 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999985 | \n",
+ " 454 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999986 | \n",
+ " 678 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999987 | \n",
+ " 499 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999988 | \n",
+ " 312 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999989 | \n",
+ " 1913 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999990 | \n",
+ " 372 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999991 | \n",
+ " 138 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999992 | \n",
+ " 2852 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999993 | \n",
+ " 1204 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999994 | \n",
+ " 2134 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999995 | \n",
+ " 315 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999996 | \n",
+ " 1952 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999997 | \n",
+ " 1869 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999998 | \n",
+ " 1458 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ " | 8999999 | \n",
+ " 427 | \n",
+ " 2248 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mTCSize_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTCSize\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 9000000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G3k (input data) \n",
+ "╨╥ ▚ TC_ifr0 (6 ms) \n",
+ "╥╨ ▚ TC_ifr1 (31 ms) \n",
+ "╨╥╥ ▚ TC_ifr2 (91 ms) \n",
+ "╥╨║╥╥ ▚ TC_ifr3 (228 ms) \n",
+ "╨╥║║║╥╥ ▚ TC_ifr4 (446 ms) 3 / ∞ / stop.\n",
+ "╥╨║║║║║╥ ▚ TC_ifr5 (445 ms) 3 / ∞ / stop.\n",
+ "║╥║╨║║║║ ▚ PrevTC_ifr4 (16 ms) 3 / ∞ / stop.\n",
+ "║║║ ║╨║║ ▚ PrevTC_ifr5 (19 ms) 3 / ∞ / stop.\n",
+ "║║╨╥║ ║║ ▚ PrevTC_ifr3 (12 ms) \n",
+ "╨║ ║║ ║║ ▚ TC (486 ms) \n",
+ " ║ ╨╨ ║║ ▚ Done_ifr4 (151 ms) 3 / ∞ / stop.\n",
+ " ╨ ╨║ ▚ Done_ifr5 (151 ms) 2 / ∞ / stop.\n",
+ "╥ ╨ ▚ ⤓TC (447 ms) \n",
+ "╨ ▚ TCSize (2 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running G4k.\n",
+ "Query is stored at \u001b[1mTC_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTC\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1211 | \n",
+ " 3123 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2603 | \n",
+ " 1156 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1367 | \n",
+ " 3875 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 388 | \n",
+ " 3276 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1538 | \n",
+ " 3707 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 2592 | \n",
+ " 1505 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 408 | \n",
+ " 2591 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 3677 | \n",
+ " 3750 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 3504 | \n",
+ " 1767 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 1070 | \n",
+ " 2430 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 2985 | \n",
+ " 1652 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 2100 | \n",
+ " 2746 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 162 | \n",
+ " 1198 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 2974 | \n",
+ " 3467 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 2719 | \n",
+ " 1163 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 3538 | \n",
+ " 3945 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 46 | \n",
+ " 1557 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 3970 | \n",
+ " 2381 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 2137 | \n",
+ " 2278 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 1408 | \n",
+ " 1307 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 2031 | \n",
+ " 922 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 784 | \n",
+ " 2610 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 1477 | \n",
+ " 1769 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 3250 | \n",
+ " 857 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 3790 | \n",
+ " 1644 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 3821 | \n",
+ " 1912 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 1650 | \n",
+ " 163 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 1671 | \n",
+ " 3839 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 2111 | \n",
+ " 3578 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 1690 | \n",
+ " 1566 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 15999970 | \n",
+ " 708 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999971 | \n",
+ " 1716 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999972 | \n",
+ " 2298 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999973 | \n",
+ " 847 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999974 | \n",
+ " 1919 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999975 | \n",
+ " 2325 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999976 | \n",
+ " 2336 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999977 | \n",
+ " 1335 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999978 | \n",
+ " 1685 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999979 | \n",
+ " 192 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999980 | \n",
+ " 1543 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999981 | \n",
+ " 1758 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999982 | \n",
+ " 787 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999983 | \n",
+ " 44 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999984 | \n",
+ " 964 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999985 | \n",
+ " 1555 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999986 | \n",
+ " 3124 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999987 | \n",
+ " 1645 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999988 | \n",
+ " 2779 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999989 | \n",
+ " 921 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999990 | \n",
+ " 3267 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999991 | \n",
+ " 1621 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999992 | \n",
+ " 2430 | \n",
+ " 473 | \n",
+ "
\n",
+ " \n",
+ " | 15999993 | \n",
+ " 457 | \n",
+ " 1446 | \n",
+ "
\n",
+ " \n",
+ " | 15999994 | \n",
+ " 1946 | \n",
+ " 1446 | \n",
+ "
\n",
+ " \n",
+ " | 15999995 | \n",
+ " 3843 | \n",
+ " 1446 | \n",
+ "
\n",
+ " \n",
+ " | 15999996 | \n",
+ " 3055 | \n",
+ " 1446 | \n",
+ "
\n",
+ " \n",
+ " | 15999997 | \n",
+ " 1578 | \n",
+ " 1446 | \n",
+ "
\n",
+ " \n",
+ " | 15999998 | \n",
+ " 3298 | \n",
+ " 1446 | \n",
+ "
\n",
+ " \n",
+ " | 15999999 | \n",
+ " 156 | \n",
+ " 1191 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mTCSize_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTCSize\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 16000000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G4k (input data) \n",
+ "╨╥ ▚ TC_ifr0 (7 ms) \n",
+ "╥╨ ▚ TC_ifr1 (42 ms) \n",
+ "╨╥╥ ▚ TC_ifr2 (100 ms) \n",
+ "╥╨║╥╥ ▚ TC_ifr3 (300 ms) \n",
+ "╨╥║║║╥╥ ▚ TC_ifr4 (730 ms) 3 / ∞ / stop.\n",
+ "╥╨║║║║║╥ ▚ TC_ifr5 (678 ms) 3 / ∞ / stop.\n",
+ "║╥║╨║║║║ ▚ PrevTC_ifr4 (41 ms) 3 / ∞ / stop.\n",
+ "║║║ ║╨║║ ▚ PrevTC_ifr5 (25 ms) 3 / ∞ / stop.\n",
+ "║║╨╥║ ║║ ▚ PrevTC_ifr3 (16 ms) \n",
+ "╨║ ║║ ║║ ▚ TC (824 ms) \n",
+ " ║ ╨╨ ║║ ▚ Done_ifr4 (220 ms) 3 / ∞ / stop.\n",
+ " ╨ ╨║ ▚ Done_ifr5 (224 ms) 2 / ∞ / stop.\n",
+ "╥ ╨ ▚ ⤓TC (773 ms) \n",
+ "╨ ▚ TCSize (3 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running G5k.\n",
+ "Query is stored at \u001b[1mTC_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTC\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 2444 | \n",
+ " 3295 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2825 | \n",
+ " 3878 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 2291 | \n",
+ " 4755 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1441 | \n",
+ " 2485 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 3232 | \n",
+ " 3402 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 68 | \n",
+ " 2112 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1465 | \n",
+ " 4165 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 3771 | \n",
+ " 2751 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 2650 | \n",
+ " 2449 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 4657 | \n",
+ " 2284 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 404 | \n",
+ " 4667 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 4013 | \n",
+ " 386 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 4046 | \n",
+ " 1005 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 1731 | \n",
+ " 4595 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 271 | \n",
+ " 1549 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 1303 | \n",
+ " 1502 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 3895 | \n",
+ " 149 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 2490 | \n",
+ " 1305 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 3571 | \n",
+ " 1090 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 2473 | \n",
+ " 1602 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 3451 | \n",
+ " 744 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 1137 | \n",
+ " 3455 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 1741 | \n",
+ " 1668 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 3105 | \n",
+ " 800 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 735 | \n",
+ " 2373 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 2677 | \n",
+ " 3513 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 4379 | \n",
+ " 4228 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 577 | \n",
+ " 799 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 4318 | \n",
+ " 137 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 1859 | \n",
+ " 3504 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 24994970 | \n",
+ " 3927 | \n",
+ " 4622 | \n",
+ "
\n",
+ " \n",
+ " | 24994971 | \n",
+ " 267 | \n",
+ " 4622 | \n",
+ "
\n",
+ " \n",
+ " | 24994972 | \n",
+ " 3970 | \n",
+ " 4622 | \n",
+ "
\n",
+ " \n",
+ " | 24994973 | \n",
+ " 3443 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 24994974 | \n",
+ " 894 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 24994975 | \n",
+ " 1766 | \n",
+ " 702 | \n",
+ "
\n",
+ " \n",
+ " | 24994976 | \n",
+ " 2156 | \n",
+ " 702 | \n",
+ "
\n",
+ " \n",
+ " | 24994977 | \n",
+ " 3368 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 24994978 | \n",
+ " 2143 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 24994979 | \n",
+ " 3895 | \n",
+ " 702 | \n",
+ "
\n",
+ " \n",
+ " | 24994980 | \n",
+ " 2092 | \n",
+ " 702 | \n",
+ "
\n",
+ " \n",
+ " | 24994981 | \n",
+ " 1543 | \n",
+ " 4690 | \n",
+ "
\n",
+ " \n",
+ " | 24994982 | \n",
+ " 2209 | \n",
+ " 702 | \n",
+ "
\n",
+ " \n",
+ " | 24994983 | \n",
+ " 3200 | \n",
+ " 702 | \n",
+ "
\n",
+ " \n",
+ " | 24994984 | \n",
+ " 4260 | \n",
+ " 4690 | \n",
+ "
\n",
+ " \n",
+ " | 24994985 | \n",
+ " 1010 | \n",
+ " 702 | \n",
+ "
\n",
+ " \n",
+ " | 24994986 | \n",
+ " 299 | \n",
+ " 760 | \n",
+ "
\n",
+ " \n",
+ " | 24994987 | \n",
+ " 3886 | \n",
+ " 4690 | \n",
+ "
\n",
+ " \n",
+ " | 24994988 | \n",
+ " 3671 | \n",
+ " 933 | \n",
+ "
\n",
+ " \n",
+ " | 24994989 | \n",
+ " 1644 | \n",
+ " 933 | \n",
+ "
\n",
+ " \n",
+ " | 24994990 | \n",
+ " 1104 | \n",
+ " 1174 | \n",
+ "
\n",
+ " \n",
+ " | 24994991 | \n",
+ " 2713 | \n",
+ " 1174 | \n",
+ "
\n",
+ " \n",
+ " | 24994992 | \n",
+ " 1351 | \n",
+ " 1174 | \n",
+ "
\n",
+ " \n",
+ " | 24994993 | \n",
+ " 3219 | \n",
+ " 933 | \n",
+ "
\n",
+ " \n",
+ " | 24994994 | \n",
+ " 1081 | \n",
+ " 933 | \n",
+ "
\n",
+ " \n",
+ " | 24994995 | \n",
+ " 2454 | \n",
+ " 933 | \n",
+ "
\n",
+ " \n",
+ " | 24994996 | \n",
+ " 1259 | \n",
+ " 3632 | \n",
+ "
\n",
+ " \n",
+ " | 24994997 | \n",
+ " 1302 | \n",
+ " 3632 | \n",
+ "
\n",
+ " \n",
+ " | 24994998 | \n",
+ " 2496 | \n",
+ " 933 | \n",
+ "
\n",
+ " \n",
+ " | 24994999 | \n",
+ " 2442 | \n",
+ " 933 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mTCSize_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTCSize\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 24995000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G5k (input data) \n",
+ "╨╥ ▚ TC_ifr0 (8 ms) \n",
+ "╥╨ ▚ TC_ifr1 (50 ms) \n",
+ "╨╥╥ ▚ TC_ifr2 (109 ms) \n",
+ "╥╨║╥╥ ▚ TC_ifr3 (391 ms) \n",
+ "╨╥║║║╥╥ ▚ TC_ifr4 (1094 ms) 3 / ∞ / stop.\n",
+ "╥╨║║║║║╥ ▚ TC_ifr5 (1066 ms) 3 / ∞ / stop.\n",
+ "║╥║╨║║║║ ▚ PrevTC_ifr4 (46 ms) 3 / ∞ / stop.\n",
+ "║║║ ║╨║║ ▚ PrevTC_ifr5 (87 ms) 3 / ∞ / stop.\n",
+ "║║╨╥║ ║║ ▚ PrevTC_ifr3 (18 ms) \n",
+ "╨║ ║║ ║║ ▚ TC (1168 ms) \n",
+ " ║ ╨╨ ║║ ▚ Done_ifr4 (345 ms) 3 / ∞ / stop.\n",
+ " ╨ ╨║ ▚ Done_ifr5 (331 ms) 3 / ∞ / stop.\n",
+ "╥ ╨ ▚ ⤓TC (1077 ms) \n",
+ "╨ ▚ TCSize (4 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ " === Timing for Transitive Closure ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 1.7456023790000472 |\n",
+ "| G2k | 3.2657229699980235 |\n",
+ "| G3k | 5.309176804999879 |\n",
+ "| G4k | 8.26903399799994 |\n",
+ "| G5k | 12.238729950000561 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop (\"Transitive Closure\", graphs)\n",
+ "%%logica TC, TCSize\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "G(a, b) :- db.{loop_parameter}(a, b);\n",
+ "\n",
+ "@Recursive(TC, ∞, stop: Done);\n",
+ "TC(a, b) distinct :- G(a, b);\n",
+ "TC(a, c) distinct :- TC(a, b), G(b, c);\n",
+ "\n",
+ "PrevTC(a, b) :- TC(a, b);\n",
+ "\n",
+ "Done() :- TC(a, b) => PrevTC(a, b);\n",
+ "\n",
+ "TCSize() += 1 :- TC();"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "32f35ff1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running G1k.\n",
+ "Query is stored at \u001b[1mD_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mD\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 327 | \n",
+ " 192 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 212 | \n",
+ " 365 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 629 | \n",
+ " 433 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 102 | \n",
+ " 358 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 947 | \n",
+ " 212 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 826 | \n",
+ " 777 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 683 | \n",
+ " 738 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 694 | \n",
+ " 958 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 187 | \n",
+ " 454 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 95 | \n",
+ " 6 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 782 | \n",
+ " 794 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 952 | \n",
+ " 956 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 843 | \n",
+ " 275 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 429 | \n",
+ " 975 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 997 | \n",
+ " 916 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 649 | \n",
+ " 286 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 700 | \n",
+ " 942 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 930 | \n",
+ " 780 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 785 | \n",
+ " 840 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 912 | \n",
+ " 458 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 857 | \n",
+ " 490 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 921 | \n",
+ " 124 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 430 | \n",
+ " 310 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 12 | \n",
+ " 749 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 860 | \n",
+ " 879 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 697 | \n",
+ " 508 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 390 | \n",
+ " 105 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 129 | \n",
+ " 549 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 209 | \n",
+ " 968 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 838 | \n",
+ " 480 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 999970 | \n",
+ " 218 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999971 | \n",
+ " 382 | \n",
+ " 352 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 999972 | \n",
+ " 528 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999973 | \n",
+ " 40 | \n",
+ " 352 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 999974 | \n",
+ " 460 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999975 | \n",
+ " 717 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999976 | \n",
+ " 935 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999977 | \n",
+ " 748 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999978 | \n",
+ " 822 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999979 | \n",
+ " 120 | \n",
+ " 352 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 999980 | \n",
+ " 105 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999981 | \n",
+ " 15 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999982 | \n",
+ " 952 | \n",
+ " 352 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 999983 | \n",
+ " 31 | \n",
+ " 352 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 999984 | \n",
+ " 207 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999985 | \n",
+ " 694 | \n",
+ " 352 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 999986 | \n",
+ " 249 | \n",
+ " 352 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 999987 | \n",
+ " 738 | \n",
+ " 352 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 999988 | \n",
+ " 257 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999989 | \n",
+ " 710 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999990 | \n",
+ " 718 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999991 | \n",
+ " 706 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999992 | \n",
+ " 806 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999993 | \n",
+ " 682 | \n",
+ " 352 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 999994 | \n",
+ " 256 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999995 | \n",
+ " 262 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999996 | \n",
+ " 672 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999997 | \n",
+ " 886 | \n",
+ " 352 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 999998 | \n",
+ " 891 | \n",
+ " 352 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 999999 | \n",
+ " 957 | \n",
+ " 352 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mDSize_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mDSize\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1000000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G1k (input data) \n",
+ "╨╥ ▚ D_ifr0 (4 ms) \n",
+ "╥╨ ▚ D_ifr1 (16 ms) \n",
+ "╨╥╥ ▚ D_ifr2 (99 ms) \n",
+ "╥╨║╥╥ ▚ D_ifr3 (127 ms) \n",
+ "║╥╨║║ ▚ PrevD_ifr3 (4 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (46 ms) 2 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevD_ifr4 (5 ms) 2 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ D_ifr4 (162 ms) 2 / ∞ / stop.\n",
+ "║╨║║╥╥ ▚ D_ifr5 (130 ms) 2 / ∞ / stop.\n",
+ "║╥║║╨║ ▚ ⤓D (137 ms) \n",
+ "╨║╨║ ║ ▚ Done_ifr5 (44 ms) 2 / ∞ / stop.\n",
+ " ║ ╨ ║ ▚ PrevD_ifr5 (4 ms) 2 / ∞ / stop.\n",
+ " ╨ ║ ▚ DSize (1 ms) \n",
+ " ╨ ▚ D (124 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running G2k.\n",
+ "Query is stored at \u001b[1mD_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mD\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1014 | \n",
+ " 1677 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 130 | \n",
+ " 1664 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1045 | \n",
+ " 212 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 752 | \n",
+ " 583 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 806 | \n",
+ " 924 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 100 | \n",
+ " 746 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1617 | \n",
+ " 1191 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 1697 | \n",
+ " 609 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 1974 | \n",
+ " 264 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 164 | \n",
+ " 1006 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 1255 | \n",
+ " 1852 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 638 | \n",
+ " 231 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 670 | \n",
+ " 1983 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 78 | \n",
+ " 94 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 1062 | \n",
+ " 1633 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 1848 | \n",
+ " 205 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 666 | \n",
+ " 568 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 1157 | \n",
+ " 887 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 1419 | \n",
+ " 1440 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 1853 | \n",
+ " 1097 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 523 | \n",
+ " 1552 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 1182 | \n",
+ " 964 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 1317 | \n",
+ " 297 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 372 | \n",
+ " 1853 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 448 | \n",
+ " 823 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 1876 | \n",
+ " 280 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 255 | \n",
+ " 515 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 1771 | \n",
+ " 579 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 985 | \n",
+ " 1965 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 312 | \n",
+ " 1971 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 3999970 | \n",
+ " 1393 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999971 | \n",
+ " 784 | \n",
+ " 1306 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3999972 | \n",
+ " 991 | \n",
+ " 1306 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 3999973 | \n",
+ " 689 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999974 | \n",
+ " 123 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999975 | \n",
+ " 1167 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999976 | \n",
+ " 1674 | \n",
+ " 1306 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3999977 | \n",
+ " 166 | \n",
+ " 1306 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3999978 | \n",
+ " 1847 | \n",
+ " 1306 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3999979 | \n",
+ " 1320 | \n",
+ " 1306 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3999980 | \n",
+ " 1571 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999981 | \n",
+ " 880 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999982 | \n",
+ " 1241 | \n",
+ " 1306 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 3999983 | \n",
+ " 309 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999984 | \n",
+ " 650 | \n",
+ " 1306 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3999985 | \n",
+ " 1035 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999986 | \n",
+ " 1364 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999987 | \n",
+ " 735 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999988 | \n",
+ " 336 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999989 | \n",
+ " 917 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999990 | \n",
+ " 375 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999991 | \n",
+ " 1272 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999992 | \n",
+ " 100 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999993 | \n",
+ " 840 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999994 | \n",
+ " 429 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999995 | \n",
+ " 1690 | \n",
+ " 1306 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3999996 | \n",
+ " 1676 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999997 | \n",
+ " 1520 | \n",
+ " 1306 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3999998 | \n",
+ " 1902 | \n",
+ " 1306 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3999999 | \n",
+ " 1738 | \n",
+ " 1306 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mDSize_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mDSize\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4000000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G2k (input data) \n",
+ "╨╥ ▚ D_ifr0 (6 ms) \n",
+ "╥╨ ▚ D_ifr1 (27 ms) \n",
+ "╨╥╥ ▚ D_ifr2 (139 ms) \n",
+ "╥╨║╥╥ ▚ D_ifr3 (197 ms) \n",
+ "║╥╨║║ ▚ PrevD_ifr3 (7 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (76 ms) 3 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevD_ifr4 (7 ms) 3 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ D_ifr4 (290 ms) 3 / ∞ / stop.\n",
+ "║╨║║╥╥ ▚ D_ifr5 (299 ms) 3 / ∞ / stop.\n",
+ "╨ ╨║║║ ▚ Done_ifr5 (79 ms) 2 / ∞ / stop.\n",
+ " ╨║║ ▚ PrevD_ifr5 (9 ms) 3 / ∞ / stop.\n",
+ "╥ ╨║ ▚ ⤓D (284 ms) \n",
+ "║ ╨ ▚ D (321 ms) \n",
+ "╨ ▚ DSize (2 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running G3k.\n",
+ "Query is stored at \u001b[1mD_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mD\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1750 | \n",
+ " 1922 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2503 | \n",
+ " 2646 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 899 | \n",
+ " 603 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 422 | \n",
+ " 2926 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 130 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 272 | \n",
+ " 514 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1670 | \n",
+ " 311 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 1423 | \n",
+ " 2663 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 595 | \n",
+ " 1272 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 635 | \n",
+ " 2978 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 2208 | \n",
+ " 1816 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 1283 | \n",
+ " 1108 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 2901 | \n",
+ " 1450 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 685 | \n",
+ " 754 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 1259 | \n",
+ " 63 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 2681 | \n",
+ " 404 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 2624 | \n",
+ " 1081 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 1771 | \n",
+ " 2379 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 474 | \n",
+ " 2795 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 1559 | \n",
+ " 771 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 1798 | \n",
+ " 1484 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 1537 | \n",
+ " 1294 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 2737 | \n",
+ " 1963 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 2382 | \n",
+ " 1092 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 1803 | \n",
+ " 1615 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 2867 | \n",
+ " 2612 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 93 | \n",
+ " 618 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 2056 | \n",
+ " 932 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 1764 | \n",
+ " 1093 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 88 | \n",
+ " 1379 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 8999970 | \n",
+ " 2963 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999971 | \n",
+ " 682 | \n",
+ " 2248 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 8999972 | \n",
+ " 1019 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999973 | \n",
+ " 738 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999974 | \n",
+ " 1172 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999975 | \n",
+ " 1300 | \n",
+ " 2248 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999976 | \n",
+ " 1073 | \n",
+ " 2248 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999977 | \n",
+ " 1354 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999978 | \n",
+ " 364 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999979 | \n",
+ " 1566 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999980 | \n",
+ " 1486 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999981 | \n",
+ " 2997 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999982 | \n",
+ " 2682 | \n",
+ " 2248 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999983 | \n",
+ " 149 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999984 | \n",
+ " 2565 | \n",
+ " 2248 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 8999985 | \n",
+ " 40 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999986 | \n",
+ " 1224 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999987 | \n",
+ " 2036 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999988 | \n",
+ " 2712 | \n",
+ " 2248 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999989 | \n",
+ " 1689 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999990 | \n",
+ " 1303 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999991 | \n",
+ " 2709 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999992 | \n",
+ " 2519 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999993 | \n",
+ " 2330 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999994 | \n",
+ " 930 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999995 | \n",
+ " 2710 | \n",
+ " 2248 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 8999996 | \n",
+ " 2213 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999997 | \n",
+ " 1979 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999998 | \n",
+ " 382 | \n",
+ " 2248 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999999 | \n",
+ " 2611 | \n",
+ " 2839 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mDSize_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mDSize\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 9000000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G3k (input data) \n",
+ "╨╥ ▚ D_ifr0 (6 ms) \n",
+ "╥╨ ▚ D_ifr1 (38 ms) \n",
+ "╨╥╥ ▚ D_ifr2 (112 ms) \n",
+ "╥╨║╥╥ ▚ D_ifr3 (318 ms) \n",
+ "║╥╨║║ ▚ PrevD_ifr3 (7 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (156 ms) 3 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevD_ifr4 (24 ms) 3 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ D_ifr4 (614 ms) 3 / ∞ / stop.\n",
+ "║╨║║╥╥ ▚ D_ifr5 (582 ms) 3 / ∞ / stop.\n",
+ "╨ ╨║║║ ▚ Done_ifr5 (164 ms) 2 / ∞ / stop.\n",
+ " ╨║║ ▚ PrevD_ifr5 (17 ms) 3 / ∞ / stop.\n",
+ "╥ ╨║ ▚ ⤓D (601 ms) \n",
+ "║ ╨ ▚ D (619 ms) \n",
+ "╨ ▚ DSize (2 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running G4k.\n",
+ "Query is stored at \u001b[1mD_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mD\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 564 | \n",
+ " 2174 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2810 | \n",
+ " 3532 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 2194 | \n",
+ " 1045 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 154 | \n",
+ " 1475 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1792 | \n",
+ " 177 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 2498 | \n",
+ " 129 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 184 | \n",
+ " 517 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 2731 | \n",
+ " 2684 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 595 | \n",
+ " 1039 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 1451 | \n",
+ " 1654 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 2950 | \n",
+ " 3511 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 1196 | \n",
+ " 3268 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 3279 | \n",
+ " 3529 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 911 | \n",
+ " 2278 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 2528 | \n",
+ " 2331 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 1087 | \n",
+ " 357 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 1094 | \n",
+ " 2507 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 1925 | \n",
+ " 3728 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 604 | \n",
+ " 1760 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 929 | \n",
+ " 1213 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 3922 | \n",
+ " 2210 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 3066 | \n",
+ " 1345 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 952 | \n",
+ " 3601 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 1197 | \n",
+ " 2543 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 662 | \n",
+ " 2512 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 1322 | \n",
+ " 1353 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 3556 | \n",
+ " 1520 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 264 | \n",
+ " 2154 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 1971 | \n",
+ " 2876 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 670 | \n",
+ " 73 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 15999970 | \n",
+ " 671 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999971 | \n",
+ " 3657 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999972 | \n",
+ " 252 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999973 | \n",
+ " 506 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999974 | \n",
+ " 1725 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999975 | \n",
+ " 380 | \n",
+ " 3822 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999976 | \n",
+ " 3652 | \n",
+ " 3822 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999977 | \n",
+ " 1930 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999978 | \n",
+ " 1512 | \n",
+ " 3822 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999979 | \n",
+ " 2777 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999980 | \n",
+ " 2267 | \n",
+ " 3822 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999981 | \n",
+ " 2129 | \n",
+ " 3516 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999982 | \n",
+ " 2104 | \n",
+ " 1191 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999983 | \n",
+ " 2746 | \n",
+ " 1191 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999984 | \n",
+ " 3033 | \n",
+ " 1191 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999985 | \n",
+ " 3083 | \n",
+ " 1191 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999986 | \n",
+ " 3393 | \n",
+ " 1191 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999987 | \n",
+ " 1687 | \n",
+ " 1191 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999988 | \n",
+ " 1800 | \n",
+ " 1191 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999989 | \n",
+ " 1204 | \n",
+ " 845 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999990 | \n",
+ " 1384 | \n",
+ " 845 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999991 | \n",
+ " 2375 | \n",
+ " 845 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999992 | \n",
+ " 312 | \n",
+ " 845 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999993 | \n",
+ " 3864 | \n",
+ " 845 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999994 | \n",
+ " 630 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999995 | \n",
+ " 1414 | \n",
+ " 3822 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15999996 | \n",
+ " 2033 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999997 | \n",
+ " 999 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999998 | \n",
+ " 2610 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15999999 | \n",
+ " 2970 | \n",
+ " 3822 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mDSize_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mDSize\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 16000000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G4k (input data) \n",
+ "╨╥ ▚ D_ifr0 (8 ms) \n",
+ "╥╨ ▚ D_ifr1 (48 ms) \n",
+ "╨╥╥ ▚ D_ifr2 (122 ms) \n",
+ "╥╨║╥╥ ▚ D_ifr3 (368 ms) \n",
+ "║╥╨║║ ▚ PrevD_ifr3 (9 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (215 ms) 3 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevD_ifr4 (27 ms) 3 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ D_ifr4 (1021 ms) 3 / ∞ / stop.\n",
+ "║╨║║╥╥ ▚ D_ifr5 (986 ms) 3 / ∞ / stop.\n",
+ "║╥║║╨║ ▚ ⤓D (956 ms) \n",
+ "╨║╨║ ║ ▚ Done_ifr5 (253 ms) 2 / ∞ / stop.\n",
+ " ║ ╨ ║ ▚ PrevD_ifr5 (42 ms) 3 / ∞ / stop.\n",
+ " ╨ ║ ▚ DSize (4 ms) \n",
+ " ╨ ▚ D (1169 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running G5k.\n",
+ "Query is stored at \u001b[1mD_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mD\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 2924 | \n",
+ " 4006 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 3076 | \n",
+ " 2764 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3997 | \n",
+ " 2957 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 3686 | \n",
+ " 2237 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1581 | \n",
+ " 77 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 4895 | \n",
+ " 458 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 3374 | \n",
+ " 2950 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 738 | \n",
+ " 470 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 2123 | \n",
+ " 2622 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 863 | \n",
+ " 594 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 1553 | \n",
+ " 988 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 4030 | \n",
+ " 4892 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 3933 | \n",
+ " 403 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 1084 | \n",
+ " 4626 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 584 | \n",
+ " 3328 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 2069 | \n",
+ " 3863 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 1024 | \n",
+ " 3241 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 3754 | \n",
+ " 2839 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 1975 | \n",
+ " 4940 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 722 | \n",
+ " 752 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 4364 | \n",
+ " 1467 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 3519 | \n",
+ " 1627 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 719 | \n",
+ " 1968 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 3141 | \n",
+ " 1025 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 2925 | \n",
+ " 3099 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 896 | \n",
+ " 1110 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 4113 | \n",
+ " 1739 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 4803 | \n",
+ " 1987 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 4318 | \n",
+ " 1374 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 3603 | \n",
+ " 397 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 24994970 | \n",
+ " 1699 | \n",
+ " 1174 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994971 | \n",
+ " 220 | \n",
+ " 1174 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994972 | \n",
+ " 3106 | \n",
+ " 1174 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994973 | \n",
+ " 1550 | \n",
+ " 3691 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994974 | \n",
+ " 3391 | \n",
+ " 1174 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994975 | \n",
+ " 3759 | \n",
+ " 1174 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994976 | \n",
+ " 2620 | \n",
+ " 6 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994977 | \n",
+ " 3186 | \n",
+ " 6 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 24994978 | \n",
+ " 1347 | \n",
+ " 1174 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994979 | \n",
+ " 2534 | \n",
+ " 2447 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994980 | \n",
+ " 934 | \n",
+ " 2447 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994981 | \n",
+ " 3820 | \n",
+ " 2447 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994982 | \n",
+ " 2284 | \n",
+ " 2447 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994983 | \n",
+ " 2758 | \n",
+ " 2447 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994984 | \n",
+ " 2854 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994985 | \n",
+ " 2529 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994986 | \n",
+ " 3571 | \n",
+ " 4155 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 24994987 | \n",
+ " 2619 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994988 | \n",
+ " 2712 | \n",
+ " 933 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994989 | \n",
+ " 465 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994990 | \n",
+ " 2877 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994991 | \n",
+ " 943 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994992 | \n",
+ " 3405 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994993 | \n",
+ " 170 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994994 | \n",
+ " 4005 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994995 | \n",
+ " 1518 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994996 | \n",
+ " 1930 | \n",
+ " 4155 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994997 | \n",
+ " 1790 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994998 | \n",
+ " 3826 | \n",
+ " 4155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994999 | \n",
+ " 1645 | \n",
+ " 2155 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mDSize_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mDSize\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 24995000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G5k (input data) \n",
+ "╨╥ ▚ D_ifr0 (9 ms) \n",
+ "╥╨ ▚ D_ifr1 (60 ms) \n",
+ "╨╥╥ ▚ D_ifr2 (136 ms) \n",
+ "╥╨║╥╥ ▚ D_ifr3 (459 ms) \n",
+ "║╥╨║║ ▚ PrevD_ifr3 (15 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (363 ms) 3 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevD_ifr4 (74 ms) 3 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ D_ifr4 (1414 ms) 3 / ∞ / stop.\n",
+ "║╨║║╥╥ ▚ D_ifr5 (1411 ms) 3 / ∞ / stop.\n",
+ "╨ ╨║║║ ▚ Done_ifr5 (385 ms) 3 / ∞ / stop.\n",
+ " ╨║║ ▚ PrevD_ifr5 (49 ms) 3 / ∞ / stop.\n",
+ "╥ ╨║ ▚ ⤓D (1442 ms) \n",
+ "║ ╨ ▚ D (1479 ms) \n",
+ "╨ ▚ DSize (5 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ " === Timing for Pairwise Distances ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 2.270142572997429 |\n",
+ "| G2k | 3.8740923719997227 |\n",
+ "| G3k | 6.949681735000922 |\n",
+ "| G4k | 10.555769121001504 |\n",
+ "| G5k | 15.13741886400021 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop (\"Pairwise Distances\", graphs)\n",
+ "%%logica D, DSize\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "G(a, b) :- db.{loop_parameter}(a, b);\n",
+ "\n",
+ "@Recursive(D, ∞, stop: Done);\n",
+ "D(a, b) Min= 1 :- G(a, b);\n",
+ "D(a, c) Min= D(a, b) + 1 :- G(b, c);\n",
+ "\n",
+ "PrevD(a, b) :- D(a, b);\n",
+ "\n",
+ "Done() :- D(a, b) => PrevD(a, b);\n",
+ "\n",
+ "DSize() += 1 :- D();"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "63926341-f70d-4705-81a1-0ee95b08d829",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from logica.common import graph\n",
+ "graph.InstallRequire()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "89203d0d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "\n",
+ "graph.DirectedGraph(Tree)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9e0fd233",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "6a7e84b3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running Tree7.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 17506 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 17507 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree7 (input data) \n",
+ "╨║╥ ▚ SG_ifr0 (4 ms) \n",
+ " ╨║ ▚ SGGold (5 ms) \n",
+ "╥ ╨ ▚ SG_ifr1 (7 ms) \n",
+ "╨╥╥ ▚ SG_ifr2 (4 ms) \n",
+ "╥╨║╥╥ ▚ SG_ifr3 (53 ms) \n",
+ "╨╥║║║ ▚ PrevSG_ifr4 (3 ms) 3 / ∞ / stop.\n",
+ "╥║║╨║╥╥ ▚ SG_ifr4 (10 ms) 3 / ∞ / stop.\n",
+ "║║╨╥║║║ ▚ PrevSG_ifr3 (57 ms) \n",
+ "╨║╥║║║║ ▚ SG_ifr5 (7 ms) 3 / ∞ / stop.\n",
+ " ║║║║╨║ ▚ PrevSG_ifr5 (4 ms) 3 / ∞ / stop.\n",
+ " ║║╨╨ ║ ▚ Done_ifr4 (2 ms) 3 / ∞ / stop.\n",
+ " ╨║ ╨ ▚ Done_ifr5 (2 ms) 2 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (294 ms) \n",
+ "╨ ▚ SGCheck (1 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running Tree8.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 106907 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 106908 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree8 (input data) \n",
+ "╨║╥ ▚ SG_ifr0 (4 ms) \n",
+ " ╨║ ▚ SGGold (6 ms) \n",
+ "╥ ╨ ▚ SG_ifr1 (4 ms) \n",
+ "╨╥╥ ▚ SG_ifr2 (6 ms) \n",
+ "╥╨║╥╥ ▚ SG_ifr3 (8 ms) \n",
+ "╨╥║║║ ▚ PrevSG_ifr4 (17 ms) 4 / ∞ / stop.\n",
+ "╥║║╨║╥╥ ▚ SG_ifr4 (29 ms) 3 / ∞ / stop.\n",
+ "║║╨╥║║║ ▚ PrevSG_ifr3 (2 ms) \n",
+ "╨║╥║║║║ ▚ SG_ifr5 (44 ms) 3 / ∞ / stop.\n",
+ " ║║║║╨║ ▚ PrevSG_ifr5 (18 ms) 3 / ∞ / stop.\n",
+ " ║║╨╨ ║ ▚ Done_ifr4 (2 ms) 3 / ∞ / stop.\n",
+ " ╨║ ╨ ▚ Done_ifr5 (3 ms) 3 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (27 ms) \n",
+ "╨ ▚ SGCheck (1 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running Tree9.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 672411 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 672412 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree9 (input data) \n",
+ "╨║╥ ▚ SG_ifr0 (5 ms) \n",
+ " ╨║ ▚ SGGold (6 ms) \n",
+ "╥ ╨ ▚ SG_ifr1 (6 ms) \n",
+ "╨╥╥ ▚ SG_ifr2 (9 ms) \n",
+ "╥╨║╥╥ ▚ SG_ifr3 (16 ms) \n",
+ "╨╥║║║ ▚ PrevSG_ifr4 (10 ms) 4 / ∞ / stop.\n",
+ "╥║║╨║╥╥ ▚ SG_ifr4 (88 ms) 4 / ∞ / stop.\n",
+ "║║╨╥║║║ ▚ PrevSG_ifr3 (5 ms) \n",
+ "╨║╥║║║║ ▚ SG_ifr5 (86 ms) 4 / ∞ / stop.\n",
+ " ║║║║╨║ ▚ PrevSG_ifr5 (13 ms) 4 / ∞ / stop.\n",
+ " ║║╨╨ ║ ▚ Done_ifr4 (2 ms) 4 / ∞ / stop.\n",
+ " ╨║ ╨ ▚ Done_ifr5 (2 ms) 3 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (81 ms) \n",
+ "╨ ▚ SGCheck (1 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running Tree10.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4263436 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4263437 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree10 (input data) \n",
+ "╨║╥ ▚ SG_ifr0 (6 ms) \n",
+ " ╨║ ▚ SGGold (8 ms) \n",
+ "╥ ╨ ▚ SG_ifr1 (10 ms) \n",
+ "╨╥╥ ▚ SG_ifr2 (18 ms) \n",
+ "╥╨║╥╥ ▚ SG_ifr3 (38 ms) \n",
+ "╨╥║║║ ▚ PrevSG_ifr4 (21 ms) 5 / ∞ / stop.\n",
+ "╥║║╨║╥╥ ▚ SG_ifr4 (92 ms) 4 / ∞ / stop.\n",
+ "║║╨╥║║║ ▚ PrevSG_ifr3 (11 ms) \n",
+ "╨║╥║║║║ ▚ SG_ifr5 (89 ms) 4 / ∞ / stop.\n",
+ " ║║║║╨║ ▚ PrevSG_ifr5 (22 ms) 4 / ∞ / stop.\n",
+ " ║║╨╨ ║ ▚ Done_ifr4 (4 ms) 4 / ∞ / stop.\n",
+ " ╨║ ╨ ▚ Done_ifr5 (6 ms) 4 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (91 ms) \n",
+ "╨ ▚ SGCheck (2 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running Tree11.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 25802317 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 25802318 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree11 (input data) \n",
+ "╨║╥ ▚ SG_ifr0 (10 ms) \n",
+ " ╨║ ▚ SGGold (18 ms) \n",
+ "╥ ╨ ▚ SG_ifr1 (19 ms) \n",
+ "╨╥╥ ▚ SG_ifr2 (39 ms) \n",
+ "╥╨║╥╥ ▚ SG_ifr3 (78 ms) \n",
+ "╨╥║║║ ▚ PrevSG_ifr4 (112 ms) 5 / ∞ / stop.\n",
+ "╥║║╨║╥╥ ▚ SG_ifr4 (392 ms) 5 / ∞ / stop.\n",
+ "║║╨╥║║║ ▚ PrevSG_ifr3 (11 ms) \n",
+ "╨║╥║║║║ ▚ SG_ifr5 (398 ms) 5 / ∞ / stop.\n",
+ " ║║║║╨║ ▚ PrevSG_ifr5 (108 ms) 5 / ∞ / stop.\n",
+ " ║║╨╨ ║ ▚ Done_ifr4 (28 ms) 5 / ∞ / stop.\n",
+ " ╨║ ╨ ▚ Done_ifr5 (28 ms) 4 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (392 ms) \n",
+ "╨ ▚ SGCheck (4 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running Tree12.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 161827886 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 161827887 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree12 (input data) \n",
+ "╨║╥ ▚ SG_ifr0 (18 ms) \n",
+ " ╨║ ▚ SGGold (78 ms) \n",
+ "╥ ╨ ▚ SG_ifr1 (41 ms) \n",
+ "╨╥╥ ▚ SG_ifr2 (80 ms) \n",
+ "╥╨║╥╥ ▚ SG_ifr3 (136 ms) \n",
+ "╨╥║║║ ▚ PrevSG_ifr4 (786 ms) 6 / ∞ / stop.\n",
+ "╥║║╨║╥╥ ▚ SG_ifr4 (2362 ms) 5 / ∞ / stop.\n",
+ "║║╨╥║║║ ▚ PrevSG_ifr3 (24 ms) \n",
+ "╨║╥║║║║ ▚ SG_ifr5 (2384 ms) 5 / ∞ / stop.\n",
+ " ║║║║╨║ ▚ PrevSG_ifr5 (783 ms) 5 / ∞ / stop.\n",
+ " ║║╨╨ ║ ▚ Done_ifr4 (179 ms) 5 / ∞ / stop.\n",
+ " ╨║ ╨ ▚ Done_ifr5 (181 ms) 5 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (2140 ms) \n",
+ "╨ ▚ SGCheck (24 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ " === Timing for Same Generation ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| Tree7 | 1.4477802029978193 |\n",
+ "| Tree8 | 1.3823529130022507 |\n",
+ "| Tree9 | 1.5115272420007386 |\n",
+ "| Tree10 | 1.9040136679977877 |\n",
+ "| Tree11 | 4.701103225001134 |\n",
+ "| Tree12 | 20.051564998000686 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop (\"Same Generation\", trees)\n",
+ "%%logica SGCheck, SGGold\n",
+ "\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "Tree(x, y) :- db.{loop_parameter}(x, y);\n",
+ "#Tree(x, y) :- db.Tree12(x, y);\n",
+ "\n",
+ "Node(x) distinct :- x in [a, b], Tree(a, b), Str(x);\n",
+ "\n",
+ "# Tree(\"a\", \"b\");\n",
+ "# Tree(\"a\", \"c\");\n",
+ "# Tree(\"c\", \"d\");\n",
+ "\n",
+ "@Recursive(SG, ∞, stop: Done);\n",
+ "SG(x, y) distinct :- Tree(a, x), Tree(a, y);\n",
+ "SG(x, y) distinct :- SG(a, b), Tree(a, x), Tree(b, y);\n",
+ "PrevSG(x, y) :- SG(x, y);\n",
+ "Done() :- Sum{ 1 :- SG(x, y) } == Sum{ 1 :- PrevSG(x, y) };\n",
+ " \n",
+ "SGCheck() += 1 :- SG();\n",
+ "SGGold() += 1 :- Node(a), Node(b), Length(a) == Length(b);\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "358436aa",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'a': 0.00022841000100015663,\n",
+ " 'b': 0.00019157000133418478,\n",
+ " 'c': 0.00020624000171665102,\n",
+ " 'G1k': 2.270142572997429,\n",
+ " 'G2k': 3.8740923719997227,\n",
+ " 'G3k': 6.949681735000922,\n",
+ " 'G4k': 10.555769121001504,\n",
+ " 'G5k': 15.13741886400021,\n",
+ " 'Tree7': 1.2040877750005166,\n",
+ " 'Tree8': 0.9793701880007575,\n",
+ " 'Tree9': 1.5164861519988335,\n",
+ " 'Tree10': 1.8636865869993926,\n",
+ " 'Tree11': 4.7414349719983875,\n",
+ " 'Tree12': 19.595385920998524}"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "benchmarking.timing"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "77ff5dec",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running Tree7.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 17507 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 17507 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree7 (input data) \n",
+ "╨║║ ▚ SGGold (8 ms) \n",
+ "╥╨║ ▚ Gen_ifr0 (7 ms) \n",
+ "║╥╨╥ ▚ Gen_ifr1 (10 ms) \n",
+ "╨║╥║ ▚ NextGen_ifr1 (3 ms) \n",
+ "╥╨╨║╥ ▚ Gen_ifr2 (9 ms) \n",
+ "╨╥ ║║ ▚ NextGen_ifr3 (3 ms) \n",
+ "╥║ ╨║ ▚ NextGen_ifr2 (3 ms) \n",
+ "╨║╥╥╨ ▚ Gen_ifr3 (5 ms) \n",
+ "╥║╨║ ▚ NextGen_ifr4 (3 ms) \n",
+ "║╨╥╨╥╥ ▚ Gen_ifr4 (4 ms) \n",
+ "╨╥╨╥║║╥╥ ▚ Gen_ifr5 (5 ms) \n",
+ "╥║ ║╨║║║ ▚ PrevGen_ifr5 (0 ms) \n",
+ "╨╨ ║ ║║║ ▚ Done_ifr6 (5 ms) 2 / ∞ / stop.\n",
+ "╥ ║ ╨║║ ▚ NextGen_ifr5 (2 ms) \n",
+ "║╥ ╨ ║║ ▚ NextGen_ifr6 (2 ms) 3 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (0 ms) 3 / ∞ / stop.\n",
+ "╨║║╥╥╥╥╨ ▚ Gen_ifr6 (4 ms) 3 / ∞ / stop.\n",
+ " ║╨╨║║║ ▚ Done_ifr7 (7 ms) 2 / ∞ / stop.\n",
+ "╥╨ ╨║║ ▚ Gen_ifr7 (5 ms) 2 / ∞ / stop.\n",
+ "║ ╨║ ▚ PrevGen_ifr7 (0 ms) 2 / ∞ / stop.\n",
+ "║╥ ╨ ▚ NextGen_ifr7 (2 ms) 2 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (4 ms) \n",
+ " ╨ ▚ SGCheck (3 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running Tree8.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 106908 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 106908 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree8 (input data) \n",
+ "╨║║╥╥ ▚ Gen_ifr1 (6 ms) \n",
+ " ╨║║║ ▚ SGGold (9 ms) \n",
+ "╥ ╨║║ ▚ Gen_ifr0 (5 ms) \n",
+ "║╥ ╨║ ▚ NextGen_ifr2 (4 ms) \n",
+ "╨║╥ ║ ▚ NextGen_ifr1 (3 ms) \n",
+ "╥║╨╥╨ ▚ Gen_ifr2 (6 ms) \n",
+ "╨║╥║ ▚ NextGen_ifr3 (3 ms) \n",
+ "╥╨║╨╥ ▚ Gen_ifr3 (6 ms) \n",
+ "╨╥║ ║ ▚ NextGen_ifr4 (3 ms) \n",
+ "╥║╨╥╨╥ ▚ Gen_ifr4 (13 ms) \n",
+ "╨╨╥║╥║╥╥ ▚ Gen_ifr5 (5 ms) \n",
+ "╥ ║╨║║║║ ▚ PrevGen_ifr5 (0 ms) \n",
+ "╨ ╨ ║║║║ ▚ Done_ifr6 (5 ms) 2 / ∞ / stop.\n",
+ "╥ ║╨║║ ▚ NextGen_ifr5 (3 ms) \n",
+ "║╥ ╨ ║║ ▚ NextGen_ifr6 (2 ms) 3 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (0 ms) 3 / ∞ / stop.\n",
+ "╨║║╥╥╥╥╨ ▚ Gen_ifr6 (6 ms) 3 / ∞ / stop.\n",
+ " ║╨╨║║║ ▚ Done_ifr7 (5 ms) 3 / ∞ / stop.\n",
+ "╥╨ ╨║║ ▚ Gen_ifr7 (14 ms) 3 / ∞ / stop.\n",
+ "║ ╨║ ▚ PrevGen_ifr7 (0 ms) 3 / ∞ / stop.\n",
+ "║╥ ╨ ▚ NextGen_ifr7 (2 ms) 2 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (4 ms) \n",
+ " ╨ ▚ SGCheck (2 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running Tree9.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 672412 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 672412 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree9 (input data) \n",
+ "╨║║ ▚ SGGold (7 ms) \n",
+ "╥╨║ ▚ Gen_ifr0 (6 ms) \n",
+ "║╥╨╥ ▚ Gen_ifr1 (7 ms) \n",
+ "╨║╥║ ▚ NextGen_ifr1 (3 ms) \n",
+ "╥╨╨║╥ ▚ Gen_ifr2 (6 ms) \n",
+ "╨╥ ║║ ▚ NextGen_ifr3 (5 ms) \n",
+ "╥║ ╨║ ▚ NextGen_ifr2 (4 ms) \n",
+ "╨║╥╥╨ ▚ Gen_ifr3 (7 ms) \n",
+ "╥║╨║ ▚ NextGen_ifr4 (3 ms) \n",
+ "║╨╥╨╥╥ ▚ Gen_ifr4 (6 ms) \n",
+ "╨╥╨╥║║╥╥ ▚ Gen_ifr5 (6 ms) \n",
+ "╥║ ║╨║║║ ▚ PrevGen_ifr5 (0 ms) \n",
+ "╨╨ ║ ║║║ ▚ Done_ifr6 (5 ms) 3 / ∞ / stop.\n",
+ "╥ ║ ╨║║ ▚ NextGen_ifr5 (3 ms) \n",
+ "║╥ ╨ ║║ ▚ NextGen_ifr6 (3 ms) 4 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (0 ms) 4 / ∞ / stop.\n",
+ "╨║║╥╥╥╥╨ ▚ Gen_ifr6 (5 ms) 4 / ∞ / stop.\n",
+ " ║╨╨║║║ ▚ Done_ifr7 (6 ms) 3 / ∞ / stop.\n",
+ "╥╨ ╨║║ ▚ Gen_ifr7 (5 ms) 3 / ∞ / stop.\n",
+ "║ ╨║ ▚ PrevGen_ifr7 (0 ms) 3 / ∞ / stop.\n",
+ "║╥ ╨ ▚ NextGen_ifr7 (2 ms) 3 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (5 ms) \n",
+ " ╨ ▚ SGCheck (4 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running Tree10.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4263437 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4263437 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree10 (input data) \n",
+ "╨║║╥ ▚ Gen_ifr0 (7 ms) \n",
+ "╥╨║║╥ ▚ Gen_ifr1 (14 ms) \n",
+ "║╥║╨║ ▚ NextGen_ifr1 (5 ms) \n",
+ "╨╨║╥║╥ ▚ Gen_ifr2 (7 ms) \n",
+ "╥ ║╨║║ ▚ NextGen_ifr3 (5 ms) \n",
+ "║ ╨ ║║ ▚ SGGold (8 ms) \n",
+ "║╥ ╨║ ▚ NextGen_ifr2 (4 ms) \n",
+ "║╨╥╥ ╨ ▚ Gen_ifr3 (10 ms) \n",
+ "║╥╨║ ▚ NextGen_ifr4 (4 ms) \n",
+ "╨║╥╨╥╥ ▚ Gen_ifr4 (6 ms) \n",
+ "╥╨╨╥║║╥╥ ▚ Gen_ifr5 (6 ms) \n",
+ "║╥ ║╨║║║ ▚ PrevGen_ifr5 (1 ms) \n",
+ "╨╨ ║ ║║║ ▚ Done_ifr6 (5 ms) 3 / ∞ / stop.\n",
+ "╥ ║ ╨║║ ▚ NextGen_ifr5 (5 ms) \n",
+ "║╥ ╨ ║║ ▚ NextGen_ifr6 (3 ms) 4 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (1 ms) 4 / ∞ / stop.\n",
+ "╨║║╥╥╥╥╨ ▚ Gen_ifr6 (6 ms) 4 / ∞ / stop.\n",
+ " ║╨╨║║║ ▚ Done_ifr7 (5 ms) 4 / ∞ / stop.\n",
+ "╥╨ ╨║║ ▚ Gen_ifr7 (6 ms) 4 / ∞ / stop.\n",
+ "║ ╨║ ▚ PrevGen_ifr7 (1 ms) 4 / ∞ / stop.\n",
+ "║╥ ╨ ▚ NextGen_ifr7 (3 ms) 3 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (5 ms) \n",
+ " ╨ ▚ SGCheck (18 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running Tree11.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 25802318 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 25802318 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree11 (input data) \n",
+ "╨║║╥ ▚ Gen_ifr0 (27 ms) \n",
+ "╥╨║║╥ ▚ Gen_ifr1 (9 ms) \n",
+ "║╥║╨║ ▚ NextGen_ifr1 (5 ms) \n",
+ "╨╨║╥║╥ ▚ Gen_ifr2 (9 ms) \n",
+ "╥ ║╨║║ ▚ NextGen_ifr3 (6 ms) \n",
+ "║ ╨ ║║ ▚ SGGold (18 ms) \n",
+ "║╥ ╨║ ▚ NextGen_ifr2 (5 ms) \n",
+ "║╨╥╥ ╨ ▚ Gen_ifr3 (8 ms) \n",
+ "║╥╨║ ▚ NextGen_ifr4 (5 ms) \n",
+ "╨║╥╨╥╥ ▚ Gen_ifr4 (8 ms) \n",
+ "╥╨╨╥║║╥╥ ▚ Gen_ifr5 (8 ms) \n",
+ "║╥ ║╨║║║ ▚ PrevGen_ifr5 (2 ms) \n",
+ "╨╨ ║ ║║║ ▚ Done_ifr6 (6 ms) 4 / ∞ / stop.\n",
+ "╥ ║ ╨║║ ▚ NextGen_ifr5 (4 ms) \n",
+ "║╥ ╨ ║║ ▚ NextGen_ifr6 (4 ms) 5 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (1 ms) 5 / ∞ / stop.\n",
+ "╨║║╥╥╥╥╨ ▚ Gen_ifr6 (14 ms) 5 / ∞ / stop.\n",
+ " ║╨╨║║║ ▚ Done_ifr7 (7 ms) 4 / ∞ / stop.\n",
+ "╥╨ ╨║║ ▚ Gen_ifr7 (7 ms) 4 / ∞ / stop.\n",
+ "║ ╨║ ▚ PrevGen_ifr7 (1 ms) 4 / ∞ / stop.\n",
+ "║╥ ╨ ▚ NextGen_ifr7 (4 ms) 4 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (7 ms) \n",
+ " ╨ ▚ SGCheck (100 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Running Tree12.\n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 161827887 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 161827887 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree12 (input data) \n",
+ "╨║║ ▚ SGGold (78 ms) \n",
+ "╥╨║ ▚ Gen_ifr0 (13 ms) \n",
+ "║╥╨╥ ▚ Gen_ifr1 (12 ms) \n",
+ "╨║╥║ ▚ NextGen_ifr1 (11 ms) \n",
+ "╥╨╨║╥ ▚ Gen_ifr2 (15 ms) \n",
+ "╨╥ ║║ ▚ NextGen_ifr3 (10 ms) \n",
+ "╥║ ╨║ ▚ NextGen_ifr2 (10 ms) \n",
+ "╨║╥╥╨ ▚ Gen_ifr3 (13 ms) \n",
+ "╥║╨║ ▚ NextGen_ifr4 (10 ms) \n",
+ "║╨╥╨╥╥ ▚ Gen_ifr4 (11 ms) \n",
+ "╨╥╨╥║║╥╥ ▚ Gen_ifr5 (17 ms) \n",
+ "╥║ ║╨║║║ ▚ PrevGen_ifr5 (4 ms) \n",
+ "╨╨ ║ ║║║ ▚ Done_ifr6 (11 ms) 4 / ∞ / stop.\n",
+ "╥ ║ ╨║║ ▚ NextGen_ifr5 (7 ms) \n",
+ "║╥ ╨ ║║ ▚ NextGen_ifr6 (6 ms) 5 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (3 ms) 5 / ∞ / stop.\n",
+ "╨║║╥╥╥╥╨ ▚ Gen_ifr6 (9 ms) 5 / ∞ / stop.\n",
+ " ║╨╨║║║ ▚ Done_ifr7 (11 ms) 5 / ∞ / stop.\n",
+ "╥╨ ╨║║ ▚ Gen_ifr7 (11 ms) 5 / ∞ / stop.\n",
+ "║ ╨║ ▚ PrevGen_ifr7 (3 ms) 5 / ∞ / stop.\n",
+ "║╥ ╨ ▚ NextGen_ifr7 (7 ms) 4 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (10 ms) \n",
+ " ╨ ▚ SGCheck (644 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ " === Timing for Same Generation Logica-style ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| Tree7 | 1.1043042769997555 |\n",
+ "| Tree8 | 1.0176126980004483 |\n",
+ "| Tree9 | 1.0705868459990597 |\n",
+ "| Tree10 | 1.1368336560008174 |\n",
+ "| Tree11 | 1.2924413349974202 |\n",
+ "| Tree12 | 2.0945264440015308 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop (\"Same Generation Logica-style\", trees)\n",
+ "%%logica SGCheck, SGGold\n",
+ "\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "Tree(x, y) :- db.{loop_parameter}(x, y);\n",
+ "#Tree(x, y) :- db.Tree7(x, y);\n",
+ "\n",
+ "Node(x) distinct :- x in [a, b], Tree(a, b), Str(x);\n",
+ "# Tree(\"a\", \"b\");\n",
+ "# Tree(\"a\", \"c\");\n",
+ "# Tree(\"c\", \"d\");\n",
+ "\n",
+ "\n",
+ "@Recursive(Gen, ∞, stop: Done);\n",
+ "Gen(x) Min= x :- Node(x);\n",
+ "NextGen(Gen(x)) Min= Gen(y) :- Tree(x, y);\n",
+ "Gen(y) Min= NextGen(Gen(x)) :- Tree(x, y);\n",
+ "\n",
+ "PrevGen(x) = Gen(x);\n",
+ "Done() :- Gen(x) => Gen(x) = PrevGen(x);\n",
+ "\n",
+ "SG(x, y) :- Gen(x) = Gen(y);\n",
+ " \n",
+ "\n",
+ "SGCheck() += 1 :- SG();\n",
+ "SGGold() += 1 :- Node(a), Node(b), Length(a) == Length(b);\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "0c1556ee",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'a': 0.00022841000100015663,\n",
+ " 'b': 0.00019157000133418478,\n",
+ " 'c': 0.00020624000171665102,\n",
+ " 'G1k': 2.270142572997429,\n",
+ " 'G2k': 3.8740923719997227,\n",
+ " 'G3k': 6.949681735000922,\n",
+ " 'G4k': 10.555769121001504,\n",
+ " 'G5k': 15.13741886400021,\n",
+ " 'Tree7': 1.1043042769997555,\n",
+ " 'Tree8': 1.0176126980004483,\n",
+ " 'Tree9': 1.0705868459990597,\n",
+ " 'Tree10': 1.1368336560008174,\n",
+ " 'Tree11': 1.2924413349974202,\n",
+ " 'Tree12': 2.0945264440015308}"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "benchmarking.timing"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "ad8b4061-3a67-4523-884b-6bf465d0fc3e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " === Timing for Test Problem ===\n",
+ "+---------+------------------------+\n",
+ "| problem | time |\n",
+ "+---------+------------------------+\n",
+ "| a | 0.00022841000100015663 |\n",
+ "| b | 0.00019157000133418478 |\n",
+ "| c | 0.00020624000171665102 |\n",
+ "+---------+------------------------+\n",
+ " === Timing for Transitive Closure ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 1.7456023790000472 |\n",
+ "| G2k | 3.2657229699980235 |\n",
+ "| G3k | 5.309176804999879 |\n",
+ "| G4k | 8.26903399799994 |\n",
+ "| G5k | 12.238729950000561 |\n",
+ "+---------+--------------------+\n",
+ " === Timing for Pairwise Distances ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 2.270142572997429 |\n",
+ "| G2k | 3.8740923719997227 |\n",
+ "| G3k | 6.949681735000922 |\n",
+ "| G4k | 10.555769121001504 |\n",
+ "| G5k | 15.13741886400021 |\n",
+ "+---------+--------------------+\n",
+ " === Timing for Same Generation ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| Tree7 | 1.2040877750005166 |\n",
+ "| Tree8 | 0.9793701880007575 |\n",
+ "| Tree9 | 1.5164861519988335 |\n",
+ "| Tree10 | 1.8636865869993926 |\n",
+ "| Tree11 | 4.7414349719983875 |\n",
+ "| Tree12 | 19.595385920998524 |\n",
+ "+---------+--------------------+\n",
+ " === Timing for Same Generation Logica-style ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| Tree7 | 1.1043042769997555 |\n",
+ "| Tree8 | 1.0176126980004483 |\n",
+ "| Tree9 | 1.0705868459990597 |\n",
+ "| Tree10 | 1.1368336560008174 |\n",
+ "| Tree11 | 1.2924413349974202 |\n",
+ "| Tree12 | 2.0945264440015308 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "for report in benchmarking.reports:\n",
+ " print(report)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6d444dae",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/examples/graph/tgdk/auxiliary/benchmark_souffle_interpreted.ipynb b/examples/graph/tgdk/auxiliary/benchmark_souffle_interpreted.ipynb
new file mode 100644
index 0000000..4e14861
--- /dev/null
+++ b/examples/graph/tgdk/auxiliary/benchmark_souffle_interpreted.ipynb
@@ -0,0 +1,408 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "adda8767-8b74-41c5-ad8c-408a44ec6eb3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Welcome to simple Souffle graph benchmarking.\n",
+ "Behold the power of The Machine:\n",
+ "CPUs: 32 / RAM: 125Gi\n"
+ ]
+ }
+ ],
+ "source": [
+ "!echo 'Welcome to simple Souffle graph benchmarking.'\n",
+ "!echo 'Behold the power of The Machine:'\n",
+ "!echo \"CPUs: $(nproc) / RAM: $(free -h | awk '/^Mem:/ {print $2}')\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "id": "2cd6a572-f3d7-4582-9714-bfb07d954d83",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "/home/evgenys/graph_bench\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pwd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "id": "b3f66ffc-41ae-401c-91a1-45f3d1d25397",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "benchmark_logica.ipynb\t sg_for_tree10.s sg_tree11.csv tc_g3k.csv\n",
+ "benchmark_souffle.ipynb sg_for_tree11.csv.s sg_tree12.csv tc_g4k.csv\n",
+ "g1k.csv\t\t\t sg_for_tree11.s sg_tree7.csv tc_g5k.csv\n",
+ "g2k.csv\t\t\t sg_for_tree12.csv.s sg_tree8.csv tree10.csv\n",
+ "g3k.csv\t\t\t sg_for_tree12.s sg_tree9.csv tree11.csv\n",
+ "g4k.csv\t\t\t sg_for_tree7.csv.s tc_for_g1k.s tree12.csv\n",
+ "g5c.csv\t\t\t sg_for_tree7.s tc_for_g2k.s tree5.csv\n",
+ "g5k.csv\t\t\t sg_for_tree8.csv.s tc_for_g3k.s tree7.csv\n",
+ "graph_bench\t\t sg_for_tree8.s tc_for_g4k.s tree8.csv\n",
+ "graphs.db\t\t sg_for_tree9.csv.s tc_for_g5k.s tree9.csv\n",
+ "logica\t\t\t sg_for_tree9.s tc_g1k.csv\n",
+ "sg_for_tree10.csv.s\t sg_tree10.csv\t tc_g2k.csv\n"
+ ]
+ }
+ ],
+ "source": [
+ "!ls"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "id": "6593033e-4c5c-4881-abdf-405fcb3790ff",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from IPython.core.magic import register_cell_magic\n",
+ "from IPython import get_ipython\n",
+ "import time\n",
+ "from logica.common import sqlite3_logica\n",
+ "import pandas\n",
+ "\n",
+ "timing = {}\n",
+ "\n",
+ "reports = []\n",
+ "\n",
+ "@register_cell_magic\n",
+ "def loop(line, cell):\n",
+ " global timing\n",
+ " local_timing = {}\n",
+ " ip = get_ipython()\n",
+ " # Evaluate the line to get the list (e.g., \"my_files\")\n",
+ " problem_name, should_time, iterator = ip.ev(line) \n",
+ " \n",
+ " for item in iterator:\n",
+ " # Inject 'item' into global namespace so the inner magic sees it\n",
+ " ip.user_ns['loop_parameter'] = item \n",
+ " # Run the content as a new cell execution\n",
+ " start_time = time.perf_counter()\n",
+ " ip.run_cell(cell.replace('{loop_parameter}', item))\n",
+ " end_time = time.perf_counter()\n",
+ " elapsed = end_time - start_time\n",
+ " if should_time:\n",
+ " timing[item] = elapsed\n",
+ " local_timing[item] = elapsed\n",
+ " if should_time:\n",
+ " report = (' === Timing for %s ===\\n' % problem_name) + (\n",
+ " sqlite3_logica.DataframeAsArtisticTable(pandas.DataFrame({'problem': list(local_timing.keys()),\n",
+ " 'time': list(local_timing.values())})))\n",
+ " reports.append(report)\n",
+ " print(report)\n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "id": "439f043d-fa84-491c-af11-e681e0aabe87",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "graphs = ['g1k', 'g2k', 'g3k', 'g4k', 'g5k']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "id": "afb9d20e-33a0-494e-8b49-97e784beed74",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Overwriting tc_for_g1k.s\n",
+ "Overwriting tc_for_g2k.s\n",
+ "Overwriting tc_for_g3k.s\n",
+ "Overwriting tc_for_g4k.s\n",
+ "Overwriting tc_for_g5k.s\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('writing TC programs', False, graphs)\n",
+ "%%writefile tc_for_{loop_parameter}.s\n",
+ "\n",
+ ".decl g(a:number,b:number)\n",
+ ".decl tc(a:number, b:number)\n",
+ ".decl result(a:number, b:number)\n",
+ "\n",
+ ".input g(filename=\"{loop_parameter}.csv\",delimiter=\",\",headers=true)\n",
+ "\n",
+ "tc(a, b) :- g(a, b).\n",
+ "tc(a, c) :- tc(a, b), g(b, c).\n",
+ "\n",
+ "result(a, b) :- tc(a, b).\n",
+ "\n",
+ ".output result(filename=\"tc_{loop_parameter}.csv\",delimiter=\",\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "id": "13829dc3-07c0-4c68-b0f8-f5889f540b04",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "benchmark_logica.ipynb\t sg_for_tree10.s sg_tree11.csv tc_g3k.csv\n",
+ "benchmark_souffle.ipynb sg_for_tree11.csv.s sg_tree12.csv tc_g4k.csv\n",
+ "g1k.csv\t\t\t sg_for_tree11.s sg_tree7.csv tc_g5k.csv\n",
+ "g2k.csv\t\t\t sg_for_tree12.csv.s sg_tree8.csv tree10.csv\n",
+ "g3k.csv\t\t\t sg_for_tree12.s sg_tree9.csv tree11.csv\n",
+ "g4k.csv\t\t\t sg_for_tree7.csv.s tc_for_g1k.s tree12.csv\n",
+ "g5c.csv\t\t\t sg_for_tree7.s tc_for_g2k.s tree5.csv\n",
+ "g5k.csv\t\t\t sg_for_tree8.csv.s tc_for_g3k.s tree7.csv\n",
+ "graph_bench\t\t sg_for_tree8.s tc_for_g4k.s tree8.csv\n",
+ "graphs.db\t\t sg_for_tree9.csv.s tc_for_g5k.s tree9.csv\n",
+ "logica\t\t\t sg_for_tree9.s tc_g1k.csv\n",
+ "sg_for_tree10.csv.s\t sg_tree10.csv\t tc_g2k.csv\n"
+ ]
+ }
+ ],
+ "source": [
+ "!ls"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "id": "895ab662-b6b1-4c95-b473-1b312d3e2254",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ ".decl g(a:number,b:number)\n",
+ ".decl tc(a:number, b:number)\n",
+ ".decl result(a:number, b:number)\n",
+ "\n",
+ ".input g(filename=\"g2k.csv\",delimiter=\",\",headers=true)\n",
+ "\n",
+ "tc(a, b) :- g(a, b).\n",
+ "tc(a, c) :- tc(a, b), g(b, c).\n",
+ "\n",
+ "result(a, b) :- tc(a, b).\n",
+ "\n",
+ ".output result(filename=\"tc_g2k.csv\",delimiter=\",\")\n"
+ ]
+ }
+ ],
+ "source": [
+ "!cat tc_for_g2k.s"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "id": "8a2bc865-c3d3-4dc5-8234-f375b30e6afa",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running TC for g1k\n",
+ "Running TC for g2k\n",
+ "Running TC for g3k\n",
+ "Running TC for g4k\n",
+ "Running TC for g5k\n",
+ " === Timing for Souffle TC ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| g1k | 0.6723721469998054 |\n",
+ "| g2k | 1.9730765969998174 |\n",
+ "| g3k | 4.463873752999916 |\n",
+ "| g4k | 8.292752597999879 |\n",
+ "| g5k | 13.028028106999955 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('Souffle TC', True, graphs)\n",
+ "!echo 'Running TC for {loop_parameter}'\n",
+ "!souffle tc_for_{loop_parameter}.s --jobs auto"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "id": "03d4a84c-e50a-4787-abce-1532743d6aeb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "trees = ['tree7', 'tree8', 'tree9', 'tree10', 'tree11', 'tree12']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "id": "0f71508a-dbb7-4010-9935-d63edebb7dd6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Overwriting sg_for_tree7.s\n",
+ "Overwriting sg_for_tree8.s\n",
+ "Overwriting sg_for_tree9.s\n",
+ "Overwriting sg_for_tree10.s\n",
+ "Overwriting sg_for_tree11.s\n",
+ "Overwriting sg_for_tree12.s\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('writing SG programs', False, trees)\n",
+ "%%writefile sg_for_{loop_parameter}.s\n",
+ "\n",
+ ".decl g(a:number,b:number)\n",
+ ".decl sg(a:number, b:number)\n",
+ ".decl result(a:number, b:number)\n",
+ "\n",
+ ".input g(filename=\"{loop_parameter}.csv\",delimiter=\",\",headers=true)\n",
+ "\n",
+ "sg(a, b) :- g(x, a), g(x, b).\n",
+ "sg(a, b) :- sg(x, y), g(x, a), g(y, b).\n",
+ "\n",
+ "result(a, b) :- sg(a, b).\n",
+ "\n",
+ ".output result(filename=\"sg_{loop_parameter}.csv\",delimiter=\",\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "id": "f1cd3603-691f-441b-aa5b-0ab96f6e52a5",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running SG for tree7\n",
+ "Running SG for tree8\n",
+ "Running SG for tree9\n",
+ "Running SG for tree10\n",
+ "Running SG for tree11\n",
+ "Running SG for tree12\n",
+ " === Timing for Souffle SG ===\n",
+ "+---------+---------------------+\n",
+ "| problem | time |\n",
+ "+---------+---------------------+\n",
+ "| tree7 | 0.2391701319997992 |\n",
+ "| tree8 | 0.29926064700021016 |\n",
+ "| tree9 | 0.6816575349998857 |\n",
+ "| tree10 | 4.36850722500003 |\n",
+ "| tree11 | 29.756299892000243 |\n",
+ "| tree12 | 175.14233424400027 |\n",
+ "+---------+---------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('Souffle SG', True, trees)\n",
+ "!echo 'Running SG for {loop_parameter}'\n",
+ "!souffle sg_for_{loop_parameter}.s --jobs auto"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "id": "93c37665-ff88-49aa-9b70-8cda98b143cf",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " === Timing for Souffle TC ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| g1k | 0.6723721469998054 |\n",
+ "| g2k | 1.9730765969998174 |\n",
+ "| g3k | 4.463873752999916 |\n",
+ "| g4k | 8.292752597999879 |\n",
+ "| g5k | 13.028028106999955 |\n",
+ "+---------+--------------------+\n",
+ " === Timing for Souffle SG ===\n",
+ "+---------+---------------------+\n",
+ "| problem | time |\n",
+ "+---------+---------------------+\n",
+ "| tree7 | 0.2391701319997992 |\n",
+ "| tree8 | 0.29926064700021016 |\n",
+ "| tree9 | 0.6816575349998857 |\n",
+ "| tree10 | 4.36850722500003 |\n",
+ "| tree11 | 29.756299892000243 |\n",
+ "| tree12 | 175.14233424400027 |\n",
+ "+---------+---------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "for report in reports:\n",
+ " print(report)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a78dd83c-4dbe-4dde-94d5-3034347265b7",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/examples/graph/tgdk/auxiliary/souffle_compiled_vs_interpreted.md b/examples/graph/tgdk/auxiliary/souffle_compiled_vs_interpreted.md
new file mode 100644
index 0000000..f527c86
--- /dev/null
+++ b/examples/graph/tgdk/auxiliary/souffle_compiled_vs_interpreted.md
@@ -0,0 +1,37 @@
+# On Compiled vs. Interpreted Modes of Soufflé
+
+ We additionally compare compiled and interpreted modes of Soufflé
+ and observed a moderate speed up with compiled mode.
+
+ Note that Soufflé reads input from CSV files while Logica reads from
+ DuckDB. We do not consider this a significant factor since input data
+ is very small and the complexity of the problems lies wholly in
+ computing large output.
+
+ Compiled benchmark notebook: `examples/graph/tgdk/benchmark_souffle.ipynb`
+ Interpreted benchmark notebook: `examples/graph/tgdk/auxiliary/benchmark_souffle_interpreted.ipynb`
+
+ **Transitive Closure:**
+
+ | Graph | Interpreted (sec) | Compiled (sec) |
+ |-------|-------------------|----------------|
+ | g1k | 0.67 | 0.58 |
+ | g2k | 1.97 | 1.73 |
+ | g3k | 4.46 | 3.61 |
+ | g4k | 8.29 | 6.98 |
+ | g5k | 13.03 | 10.96 |
+
+ **Same Generation:**
+
+ | Tree | Interpreted (sec) | Compiled (sec) |
+ |--------|-------------------|----------------|
+ | tree7 | 0.24 | 0.24 |
+ | tree8 | 0.30 | 0.29 |
+ | tree9 | 0.68 | 0.62 |
+ | tree10 | 4.37 | 3.94 |
+ | tree11 | 29.76 | 26.25 |
+ | tree12 | 175.14 | 153.46 |
+
+ Environment: Soufflé 2.4, OpenMP enabled, 32-core machine, 125 GB RAM. Compiled
+ mode: `souffle -o program.dl --jobs 32`, execution with `-j 32`.
+ Compilation time excluded from measurements.
diff --git a/examples/graph/tgdk/benchmark_and_collect.py b/examples/graph/tgdk/benchmark_and_collect.py
new file mode 100755
index 0000000..2c8e043
--- /dev/null
+++ b/examples/graph/tgdk/benchmark_and_collect.py
@@ -0,0 +1,196 @@
+#!/usr/bin/env python3
+"""Run all TC/SG benchmarks on Logica and Nemo, collect times into CSV + ASCII table."""
+
+import csv
+import os
+import re
+import resource
+import subprocess
+import sys
+import time
+
+
+BENCHMARKS = [
+ # (problem, dataset, csv_file)
+ ("TC", "g1k", "g1k.csv"),
+ ("TC", "g2k", "g2k.csv"),
+ ("TC", "g3k", "g3k.csv"),
+ ("TC", "g4k", "g4k.csv"),
+ ("TC", "g5k", "g5k.csv"),
+ ("SG", "tree7", "tree7.csv"),
+ ("SG", "tree8", "tree8.csv"),
+ ("SG", "tree9", "tree9.csv"),
+ ("SG", "tree10", "tree10.csv"),
+ ("SG", "tree11", "tree11.csv"),
+ ("SG", "tree12", "tree12.csv"),
+]
+
+
+LOGICA_TEMPLATES = {
+ "TC": '''@Ground(G);
+G(a, b) :- `("{csv}")`(a, b);
+
+@Recursive(TC, ∞, stop: Stop);
+TC(a, b) distinct :- G(a, b);
+TC(a, c) distinct :- TC(a, b), G(b, c);
+
+OldN() += 1 :- TC();
+Stop() :- OldN() == Sum{{1 :- TC()}};
+
+N() += 1 :- TC(a, b);
+''',
+ "SG": '''G(a, b) :- `("{csv}")`(a, b);
+
+@Recursive(SG, -1, stop: Done);
+SG(x, y) distinct :- G(a, x), G(a, y);
+SG(x, y) distinct :- SG(a, b), G(a, x), G(b, y);
+PrevSG(x, y) :- SG(x, y);
+Done() :- Sum{{ 1 :- SG(x, y) }} == Sum{{ 1 :- PrevSG(x, y) }};
+
+N() += 1 :- SG(x, y);
+''',
+}
+
+NEMO_TEMPLATES = {
+ "TC": '''@import edge :- csv{{resource="{csv}", ignore_headers=true}}.
+
+TC(?A, ?B) :- edge(?A, ?B).
+TC(?A, ?C) :- TC(?A, ?B), edge(?B, ?C).
+
+N(#count(?A, ?B)) :- TC(?A, ?B).
+
+@export N :- csv{{resource="n.csv"}}.
+''',
+ "SG": '''@import tree :- csv{{resource="{csv}", ignore_headers=true, format=(string,string)}}.
+
+SG(?X, ?Y) :- tree(?A, ?X), tree(?A, ?Y).
+SG(?X, ?Y) :- SG(?A, ?B), tree(?A, ?X), tree(?B, ?Y).
+
+N(#count(?X, ?Y)) :- SG(?X, ?Y).
+
+@export N :- csv{{resource="n.csv"}}.
+''',
+}
+
+
+def generate_programs(problem, dataset, csv_file):
+ """Write _.l and .nemo files from templates."""
+ base = f"{problem.lower()}_{dataset}"
+ l_file = f"{base}.l"
+ nemo_file = f"{base}.nemo"
+ with open(l_file, "w") as f:
+ f.write(LOGICA_TEMPLATES[problem].format(csv=csv_file))
+ with open(nemo_file, "w") as f:
+ f.write(NEMO_TEMPLATES[problem].format(csv=csv_file))
+ return l_file, nemo_file
+
+
+def run_timed(cmd):
+ """Run a command, return (wall, user, sys, stdout, stderr)."""
+ r0 = resource.getrusage(resource.RUSAGE_CHILDREN)
+ t0 = time.time()
+ proc = subprocess.run(cmd, capture_output=True, text=True)
+ wall = time.time() - t0
+ r1 = resource.getrusage(resource.RUSAGE_CHILDREN)
+ user = r1.ru_utime - r0.ru_utime
+ sys_t = r1.ru_stime - r0.ru_stime
+ return wall, user, sys_t, proc.stdout, proc.stderr
+
+
+def parse_logica_n(stdout):
+ """Extract the N value from Logica's artistic_table output."""
+ # Look for a number inside a table row like "| 12345 |"
+ for line in stdout.splitlines():
+ m = re.match(r"\|\s*(\d+)\s*\|", line)
+ if m:
+ return int(m.group(1))
+ return None
+
+
+def parse_nemo_n(results_path="results/n.csv"):
+ """Nemo writes N to results/n.csv (one number per file)."""
+ try:
+ with open(results_path) as f:
+ line = f.readline().strip().strip('"')
+ return int(line)
+ except (FileNotFoundError, ValueError):
+ return None
+
+
+def run_logica(l_file):
+ cmd = ["python3", "logica/logica.py", l_file, "run_in_terminal", "N"]
+ wall, user, sys_t, out, err = run_timed(cmd)
+ n = parse_logica_n(out)
+ return wall, user + sys_t, n
+
+
+def run_nemo(nemo_file):
+ cmd = ["nemo", nemo_file, "--overwrite-results"]
+ wall, user, sys_t, out, err = run_timed(cmd)
+ n = parse_nemo_n()
+ return wall, user + sys_t, n
+
+
+def ascii_table(rows, header):
+ """Render rows as +---+---+ style table."""
+ all_rows = [header] + [[str(c) for c in r] for r in rows]
+ widths = [max(len(r[i]) for r in all_rows) for i in range(len(header))]
+ sep = "+" + "+".join("-" * (w + 2) for w in widths) + "+"
+ def fmt(r):
+ return "| " + " | ".join(c.ljust(w) for c, w in zip(r, widths)) + " |"
+ lines = [sep, fmt(header), sep]
+ for r in all_rows[1:]:
+ lines.append(fmt(r))
+ lines.append(sep)
+ return "\n".join(lines)
+
+
+def main():
+ os.chdir(os.path.dirname(os.path.abspath(__file__)))
+ os.makedirs("results", exist_ok=True)
+
+ rows = []
+ for problem, dataset, csv_file in BENCHMARKS:
+ print(f"=== {problem} {dataset} ===", flush=True)
+
+ l_file, nemo_file = generate_programs(problem, dataset, csv_file)
+ print(f" Generated: {l_file}, {nemo_file}", flush=True)
+
+ print(f" Logica: {l_file}", flush=True)
+ l_wall, l_cpu, l_n = run_logica(l_file)
+ print(f" wall={l_wall:.2f}s cpu={l_cpu:.2f}s N={l_n}", flush=True)
+
+ print(f" Nemo: {nemo_file}", flush=True)
+ n_wall, n_cpu, n_n = run_nemo(nemo_file)
+ print(f" wall={n_wall:.2f}s cpu={n_cpu:.2f}s N={n_n}", flush=True)
+
+ rows.append([
+ problem, dataset,
+ f"{l_wall:.2f}", f"{l_cpu:.2f}",
+ f"{n_wall:.2f}", f"{n_cpu:.2f}",
+ l_n if l_n is not None else "?",
+ n_n if n_n is not None else "?",
+ ])
+
+ header = ["Problem", "Dataset",
+ "Logica wall", "Logica CPU",
+ "Nemo wall", "Nemo CPU",
+ "Logica N", "Nemo N"]
+
+ with open("benchmark_results.csv", "w", newline="") as f:
+ w = csv.writer(f)
+ w.writerow(header)
+ w.writerows(rows)
+
+ table = ascii_table(rows, header)
+ with open("benchmark_results.txt", "w") as f:
+ f.write(table + "\n")
+
+ print()
+ print(table)
+ print()
+ print("Wrote benchmark_results.csv and benchmark_results.txt")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/graph/tgdk/benchmark_cypher.ipynb b/examples/graph/tgdk/benchmark_cypher.ipynb
new file mode 100644
index 0000000..1cfab6c
--- /dev/null
+++ b/examples/graph/tgdk/benchmark_cypher.ipynb
@@ -0,0 +1,2290 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "23aacbb7-64ba-4277-8bfc-7c52196fedc0",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Could not import google.cloud.bigquery.\n",
+ "Could not import google.cloud.auth.\n",
+ "Could not import google.colab.widgets.\n"
+ ]
+ }
+ ],
+ "source": [
+ "from logica import colab_logica\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "6d7ed7ac-80d3-4756-940a-82380e10dd44",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Welcome to simple Souffle graph benchmarking.\n",
+ "Behold the power of The Machine:\n",
+ "CPUs: 32 / RAM: 125Gi\n"
+ ]
+ }
+ ],
+ "source": [
+ "!echo 'Welcome to simple Souffle graph benchmarking.'\n",
+ "!echo 'Behold the power of The Machine:'\n",
+ "!echo \"CPUs: $(nproc) / RAM: $(free -h | awk '/^Mem:/ {print $2}')\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "7291a019-eda7-446d-a23b-6aa975ee5b08",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create the magic command\n",
+ "from IPython.core.magic import register_line_cell_magic\n",
+ "import duckdb\n",
+ "\n",
+ "@register_line_cell_magic\n",
+ "def run_duckdb(line, cell=None):\n",
+ " \"\"\"\n",
+ " Magic command for DuckDB queries.\n",
+ " Usage:\n",
+ " %run_duckdb SELECT 1 as x;\n",
+ " %%run_duckdb\n",
+ " SELECT * FROM range(10);\n",
+ " \"\"\"\n",
+ " # Create or reuse connection\n",
+ " if 'duckdb_conn' not in globals():\n",
+ " global duckdb_conn\n",
+ " duckdb_conn = duckdb.connect(':memory:')\n",
+ " print('here!')\n",
+ "\n",
+ " query = cell if cell else line\n",
+ "\n",
+ " try:\n",
+ " result = duckdb_conn.execute(query).fetchdf()\n",
+ " return result\n",
+ " except Exception as e:\n",
+ " print(f\"Error: {e}\")\n",
+ " return None\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "b13b2657-9ebd-4361-8d0e-d2ccffe546d7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "here!\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " memlimit | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 100.6 GiB | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 32 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " memlimit\n",
+ "0 100.6 GiB\n",
+ "1 32"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%run_duckdb\n",
+ "SELECT value AS memlimit\n",
+ "FROM duckdb_settings()\n",
+ "WHERE name = 'memory_limit' or name = 'threads';"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "ef8bd896-9722-4431-a034-b2487b7c37c9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Success | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "Empty DataFrame\n",
+ "Columns: [Success]\n",
+ "Index: []"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%run_duckdb\n",
+ "INSTALL duckpgq FROM community;\n",
+ "LOAD duckpgq;\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "3f08e184-c567-45b2-9ef3-ac27c790b4c3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from IPython.core.magic import register_cell_magic\n",
+ "from IPython import get_ipython\n",
+ "import time\n",
+ "from logica.common import sqlite3_logica\n",
+ "import pandas\n",
+ "\n",
+ "timing = {}\n",
+ "\n",
+ "reports = []\n",
+ "\n",
+ "@register_cell_magic\n",
+ "def loop(line, cell):\n",
+ " global timing\n",
+ " local_timing = {}\n",
+ " ip = get_ipython()\n",
+ " # Evaluate the line to get the list (e.g., \"my_files\")\n",
+ " problem_name, iterator = ip.ev(line) \n",
+ " \n",
+ " for item in iterator:\n",
+ " # Inject 'item' into global namespace so the inner magic sees it\n",
+ " print('Running %s.' % item)\n",
+ " ip.user_ns['loop_parameter'] = item \n",
+ " # Run the content as a new cell execution\n",
+ " start_time = time.perf_counter()\n",
+ " ip.run_cell(cell.replace('{loop_parameter}', item))\n",
+ " end_time = time.perf_counter()\n",
+ " elapsed = end_time - start_time\n",
+ " timing[item] = elapsed\n",
+ " local_timing[item] = elapsed\n",
+ " report = (' === Timing for %s === // Cypher //\\n' % problem_name) + (\n",
+ " sqlite3_logica.DataframeAsArtisticTable(pandas.DataFrame({'problem': list(local_timing.keys()),\n",
+ " 'time': list(local_timing.values())})))\n",
+ " reports.append(report)\n",
+ " print(report)\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "c7314961-d306-49ef-bdb8-4d4fb946814f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from IPython.core.magic import register_cell_magic\n",
+ "from IPython import get_ipython\n",
+ "import time\n",
+ "from logica.common import sqlite3_logica\n",
+ "import pandas\n",
+ "import signal\n",
+ "\n",
+ "timing = {}\n",
+ "reports = []\n",
+ "\n",
+ "@register_cell_magic\n",
+ "def loop(line, cell):\n",
+ " global timing\n",
+ " local_timing = {}\n",
+ " ip = get_ipython()\n",
+ " \n",
+ " problem_name, iterator = ip.ev(line) \n",
+ " \n",
+ " # Kill switch state\n",
+ " stop_execution = False \n",
+ " \n",
+ " # 1. Define a container to hold the timeout status\n",
+ " # We use a list/dict so the inner function can mutate it (closure scope hack)\n",
+ " status = {'timed_out': False}\n",
+ "\n",
+ " # 2. The Handler: Sets the flag AND raises hell\n",
+ " def timeout_handler(signum, frame):\n",
+ " status['timed_out'] = True\n",
+ " print('Timeout detected.')\n",
+ " # We raise KeyboardInterrupt because DuckDB respects it better than custom exceptions\n",
+ " raise KeyboardInterrupt(\"Time Limit Exceeded\")\n",
+ "\n",
+ " for item in iterator:\n",
+ " print('Running %s.' % item)\n",
+ " ip.user_ns['loop_parameter'] = item \n",
+ " \n",
+ " # SKIP LOGIC\n",
+ " if stop_execution:\n",
+ " print(f\"Skipping {item} (Previous timeout).\")\n",
+ " timing[item] = 'TIMEOUT (>200s)'\n",
+ " local_timing[item] = 'TIMEOUT (>200s)'\n",
+ " continue\n",
+ "\n",
+ " start_time = time.perf_counter()\n",
+ " \n",
+ " # Reset flag for this run\n",
+ " status['timed_out'] = False\n",
+ " \n",
+ " # Save original handler to restore later\n",
+ " original_handler = signal.getsignal(signal.SIGALRM)\n",
+ " \n",
+ " # Install our handler\n",
+ " signal.signal(signal.SIGALRM, timeout_handler)\n",
+ " signal.alarm(200) # <--- TIMEOUT SETTING\n",
+ " \n",
+ " try:\n",
+ " # Run the cell\n",
+ " result = ip.run_cell(cell.replace('{loop_parameter}', item))\n",
+ " finally:\n",
+ " # DISABLE ALARM IMMEDIATELY\n",
+ " signal.alarm(0)\n",
+ " # Restore original handler\n",
+ " signal.signal(signal.SIGALRM, original_handler)\n",
+ "\n",
+ " end_time = time.perf_counter()\n",
+ " \n",
+ " # 3. CHECK THE FLAG\n",
+ " # We don't care what result.error_in_exec is. If the flag is up, we timed out.\n",
+ " if status['timed_out']:\n",
+ " print(f\"!!! TIMEOUT detected on {item} !!!\")\n",
+ " stop_execution = True\n",
+ " elapsed = 'TIMEOUT (>200s)'\n",
+ " elif result.error_in_exec:\n",
+ " # It failed for some other reason (Syntax error, etc)\n",
+ " # We treat this as a crash, but not necessarily a timeout chain-reaction\n",
+ " print(f\"Error executing {item}: {result.error_in_exec}\")\n",
+ " elapsed = 'ERROR' \n",
+ " else:\n",
+ " elapsed = end_time - start_time\n",
+ " \n",
+ " timing[item] = elapsed\n",
+ " local_timing[item] = elapsed\n",
+ "\n",
+ " report = (' === Timing for %s === // Cypher //\\n' % problem_name) + (\n",
+ " sqlite3_logica.DataframeAsArtisticTable(pandas.DataFrame({'problem': list(local_timing.keys()),\n",
+ " 'time': list(local_timing.values())})))\n",
+ " reports.append(report)\n",
+ " print(report)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "c3a7a9f4-efad-440d-b4cf-a36bdfbc9e11",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " \"version\"() | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " v1.3.2 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " \"version\"()\n",
+ "0 v1.3.2"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%run_duckdb\n",
+ "SELECT version();\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "c7d0f9ea-5873-45a9-8c51-a6cd25e93321",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Success | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "Empty DataFrame\n",
+ "Columns: [Success]\n",
+ "Index: []"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%run_duckdb\n",
+ "-- Step 1: Connect to the material world (The Database)\n",
+ "USE memory;\n",
+ "DETACH DATABASE IF EXISTS graphs;\n",
+ "ATTACH 'graphs.db' as graphs;\n",
+ "USE graphs;"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "a6e68877-3342-49ee-8e13-e9e00dd325b1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "graphs = ['G%dk' % i for i in [1,2,3,4,5]]\n",
+ "#graphs = ['G5c', 'G6c', 'G7c']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "1a73823a-d2b5-439a-ae3d-101e98b0320a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Success | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "Empty DataFrame\n",
+ "Columns: [Success]\n",
+ "Index: []"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%%run_duckdb\n",
+ "INSTALL duckpgq FROM community; \n",
+ "LOAD duckpgq; "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "1a740e0f-36f9-45de-b1f3-0909206cced1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running G1k.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " origin | \n",
+ " destination | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 0 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 997996 | \n",
+ " 999 | \n",
+ " 994 | \n",
+ "
\n",
+ " \n",
+ " | 997997 | \n",
+ " 999 | \n",
+ " 995 | \n",
+ "
\n",
+ " \n",
+ " | 997998 | \n",
+ " 999 | \n",
+ " 996 | \n",
+ "
\n",
+ " \n",
+ " | 997999 | \n",
+ " 999 | \n",
+ " 997 | \n",
+ "
\n",
+ " \n",
+ " | 998000 | \n",
+ " 999 | \n",
+ " 998 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
998001 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " origin destination\n",
+ "0 0 1\n",
+ "1 0 2\n",
+ "2 0 3\n",
+ "3 0 4\n",
+ "4 0 5\n",
+ "... ... ...\n",
+ "997996 999 994\n",
+ "997997 999 995\n",
+ "997998 999 996\n",
+ "997999 999 997\n",
+ "998000 999 998\n",
+ "\n",
+ "[998001 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running G2k.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " origin | \n",
+ " destination | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 0 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 3995996 | \n",
+ " 1999 | \n",
+ " 1994 | \n",
+ "
\n",
+ " \n",
+ " | 3995997 | \n",
+ " 1999 | \n",
+ " 1995 | \n",
+ "
\n",
+ " \n",
+ " | 3995998 | \n",
+ " 1999 | \n",
+ " 1996 | \n",
+ "
\n",
+ " \n",
+ " | 3995999 | \n",
+ " 1999 | \n",
+ " 1997 | \n",
+ "
\n",
+ " \n",
+ " | 3996000 | \n",
+ " 1999 | \n",
+ " 1998 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
3996001 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " origin destination\n",
+ "0 0 1\n",
+ "1 0 2\n",
+ "2 0 3\n",
+ "3 0 4\n",
+ "4 0 5\n",
+ "... ... ...\n",
+ "3995996 1999 1994\n",
+ "3995997 1999 1995\n",
+ "3995998 1999 1996\n",
+ "3995999 1999 1997\n",
+ "3996000 1999 1998\n",
+ "\n",
+ "[3996001 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running G3k.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " origin | \n",
+ " destination | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 0 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 8996995 | \n",
+ " 2999 | \n",
+ " 2994 | \n",
+ "
\n",
+ " \n",
+ " | 8996996 | \n",
+ " 2999 | \n",
+ " 2995 | \n",
+ "
\n",
+ " \n",
+ " | 8996997 | \n",
+ " 2999 | \n",
+ " 2996 | \n",
+ "
\n",
+ " \n",
+ " | 8996998 | \n",
+ " 2999 | \n",
+ " 2997 | \n",
+ "
\n",
+ " \n",
+ " | 8996999 | \n",
+ " 2999 | \n",
+ " 2998 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
8997000 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " origin destination\n",
+ "0 0 1\n",
+ "1 0 2\n",
+ "2 0 3\n",
+ "3 0 4\n",
+ "4 0 5\n",
+ "... ... ...\n",
+ "8996995 2999 2994\n",
+ "8996996 2999 2995\n",
+ "8996997 2999 2996\n",
+ "8996998 2999 2997\n",
+ "8996999 2999 2998\n",
+ "\n",
+ "[8997000 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running G4k.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " origin | \n",
+ " destination | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 0 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 15991996 | \n",
+ " 3999 | \n",
+ " 3994 | \n",
+ "
\n",
+ " \n",
+ " | 15991997 | \n",
+ " 3999 | \n",
+ " 3995 | \n",
+ "
\n",
+ " \n",
+ " | 15991998 | \n",
+ " 3999 | \n",
+ " 3996 | \n",
+ "
\n",
+ " \n",
+ " | 15991999 | \n",
+ " 3999 | \n",
+ " 3997 | \n",
+ "
\n",
+ " \n",
+ " | 15992000 | \n",
+ " 3999 | \n",
+ " 3998 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
15992001 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " origin destination\n",
+ "0 0 1\n",
+ "1 0 2\n",
+ "2 0 3\n",
+ "3 0 4\n",
+ "4 0 5\n",
+ "... ... ...\n",
+ "15991996 3999 3994\n",
+ "15991997 3999 3995\n",
+ "15991998 3999 3996\n",
+ "15991999 3999 3997\n",
+ "15992000 3999 3998\n",
+ "\n",
+ "[15992001 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running G5k.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " origin | \n",
+ " destination | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 0 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 24989996 | \n",
+ " 4999 | \n",
+ " 4994 | \n",
+ "
\n",
+ " \n",
+ " | 24989997 | \n",
+ " 4999 | \n",
+ " 4995 | \n",
+ "
\n",
+ " \n",
+ " | 24989998 | \n",
+ " 4999 | \n",
+ " 4996 | \n",
+ "
\n",
+ " \n",
+ " | 24989999 | \n",
+ " 4999 | \n",
+ " 4997 | \n",
+ "
\n",
+ " \n",
+ " | 24990000 | \n",
+ " 4999 | \n",
+ " 4998 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
24990001 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " origin destination\n",
+ "0 0 1\n",
+ "1 0 2\n",
+ "2 0 3\n",
+ "3 0 4\n",
+ "4 0 5\n",
+ "... ... ...\n",
+ "24989996 4999 4994\n",
+ "24989997 4999 4995\n",
+ "24989998 4999 4996\n",
+ "24989999 4999 4997\n",
+ "24990000 4999 4998\n",
+ "\n",
+ "[24990001 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " === Timing for Transitive Closure === // Cypher //\n",
+ "+---------+---------------------+\n",
+ "| problem | time |\n",
+ "+---------+---------------------+\n",
+ "| G1k | 0.35087310300013996 |\n",
+ "| G2k | 2.1931661440003154 |\n",
+ "| G3k | 7.658980836999945 |\n",
+ "| G4k | 18.23380420300009 |\n",
+ "| G5k | 33.10960333700041 |\n",
+ "+---------+---------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('Transitive Closure', graphs)\n",
+ "%%run_duckdb\n",
+ "\n",
+ "-- Step 2: Ensure the magic is loaded\n",
+ "LOAD duckpgq;\n",
+ "\n",
+ "-- Step 3: Materialize the Vertices\n",
+ "CREATE OR REPLACE TABLE GXk_nodes AS \n",
+ " SELECT DISTINCT col0 AS id FROM {loop_parameter} \n",
+ " UNION \n",
+ " SELECT DISTINCT col1 AS id FROM {loop_parameter};\n",
+ "\n",
+ "-- Step 4: Define the Property Graph\n",
+ "CREATE OR REPLACE PROPERTY GRAPH gXk_graph\n",
+ " VERTEX TABLES (\n",
+ " GXk_nodes LABEL nodes\n",
+ " )\n",
+ " EDGE TABLES (\n",
+ " {loop_parameter} \n",
+ " SOURCE KEY (col0) REFERENCES GXk_nodes (id)\n",
+ " DESTINATION KEY (col1) REFERENCES GXk_nodes (id)\n",
+ " LABEL links\n",
+ " );\n",
+ "\n",
+ "-- Step 5: The Transitive Closure Query\n",
+ "SELECT * FROM GRAPH_TABLE (\n",
+ " gXk_graph\n",
+ " MATCH ANY (start_node:nodes)-[e:links]->{1,}(end_node:nodes)\n",
+ " COLUMNS (\n",
+ " start_node.id AS origin, \n",
+ " end_node.id AS destination\n",
+ " )\n",
+ ") ORDER BY origin, destination;"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "ffed4f43-29d1-4af8-a997-d6e737b471b7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running G1k.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " origin | \n",
+ " destination | \n",
+ " distance | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 0 | \n",
+ " 3 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 997996 | \n",
+ " 999 | \n",
+ " 994 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 997997 | \n",
+ " 999 | \n",
+ " 995 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 997998 | \n",
+ " 999 | \n",
+ " 996 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 997999 | \n",
+ " 999 | \n",
+ " 997 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 998000 | \n",
+ " 999 | \n",
+ " 998 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
998001 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " origin destination distance\n",
+ "0 0 1 4\n",
+ "1 0 2 4\n",
+ "2 0 3 3\n",
+ "3 0 4 4\n",
+ "4 0 5 3\n",
+ "... ... ... ...\n",
+ "997996 999 994 4\n",
+ "997997 999 995 4\n",
+ "997998 999 996 4\n",
+ "997999 999 997 2\n",
+ "998000 999 998 4\n",
+ "\n",
+ "[998001 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running G2k.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " origin | \n",
+ " destination | \n",
+ " distance | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 0 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0 | \n",
+ " 5 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 3995996 | \n",
+ " 1999 | \n",
+ " 1994 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3995997 | \n",
+ " 1999 | \n",
+ " 1995 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3995998 | \n",
+ " 1999 | \n",
+ " 1996 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3995999 | \n",
+ " 1999 | \n",
+ " 1997 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3996000 | \n",
+ " 1999 | \n",
+ " 1998 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
3996001 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " origin destination distance\n",
+ "0 0 1 4\n",
+ "1 0 2 4\n",
+ "2 0 3 4\n",
+ "3 0 4 4\n",
+ "4 0 5 3\n",
+ "... ... ... ...\n",
+ "3995996 1999 1994 4\n",
+ "3995997 1999 1995 4\n",
+ "3995998 1999 1996 3\n",
+ "3995999 1999 1997 4\n",
+ "3996000 1999 1998 4\n",
+ "\n",
+ "[3996001 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running G3k.\n",
+ "Timeout detected.\n",
+ "Error: Query interrupted\n",
+ "!!! TIMEOUT detected on G3k !!!\n",
+ "Running G4k.\n",
+ "Skipping G4k (Previous timeout).\n",
+ "Running G5k.\n",
+ "Skipping G5k (Previous timeout).\n",
+ " === Timing for Distance === // Cypher //\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 14.464675783000075 |\n",
+ "| G2k | 116.94109469400018 |\n",
+ "| G3k | TIMEOUT (>200s) |\n",
+ "| G4k | TIMEOUT (>200s) |\n",
+ "| G5k | TIMEOUT (>200s) |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('Distance', graphs)\n",
+ "%%run_duckdb\n",
+ "\n",
+ "PRAGMA threads=32; -- Or however many you have\n",
+ "PRAGMA memory_limit='32GB'; -- Ensure it's not GC-thrashing\n",
+ "\n",
+ "-- Step 2: Ensure the magic is loaded\n",
+ "LOAD duckpgq;\n",
+ "\n",
+ "-- Step 3: Materialize the Vertices\n",
+ "CREATE OR REPLACE TABLE GXk_nodes AS \n",
+ " SELECT DISTINCT col0 AS id FROM {loop_parameter} \n",
+ " UNION \n",
+ " SELECT DISTINCT col1 AS id FROM {loop_parameter};\n",
+ "\n",
+ "-- Step 4: Define the Property Graph\n",
+ "CREATE OR REPLACE PROPERTY GRAPH gXk_graph\n",
+ " VERTEX TABLES (\n",
+ " GXk_nodes LABEL nodes\n",
+ " )\n",
+ " EDGE TABLES (\n",
+ " {loop_parameter} \n",
+ " SOURCE KEY (col0) REFERENCES GXk_nodes (id)\n",
+ " DESTINATION KEY (col1) REFERENCES GXk_nodes (id)\n",
+ " LABEL links\n",
+ " );\n",
+ "\n",
+ "\n",
+ "-- Step 5: The Transitive Closure Query\n",
+ "SELECT * FROM GRAPH_TABLE (\n",
+ " gXk_graph\n",
+ " MATCH p = ANY SHORTEST (start_node:nodes)-[e:links]->{1,}(end_node:nodes)\n",
+ " COLUMNS (\n",
+ " start_node.id AS origin, \n",
+ " end_node.id AS destination,\n",
+ " path_length(p) as distance\n",
+ "\n",
+ " )\n",
+ ") ORDER BY origin, destination;"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "d5a58e32-4ae2-4cce-83af-68ba451cab24",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#trees = ['Tree5', 'Tree6']\n",
+ "trees = ['Tree%d' % i for i in [7, 8, 9, 10, 11, 12]]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "0317f870-5883-4d54-9560-a73cb97a7e15",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running Tree7.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " node_a | \n",
+ " node_b | \n",
+ " generation | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 00 | \n",
+ " 00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 00 | \n",
+ " 01 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 01 | \n",
+ " 00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 01 | \n",
+ " 01 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 000 | \n",
+ " 000 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 14651 | \n",
+ " 0111312 | \n",
+ " 0111221 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 14652 | \n",
+ " 0111312 | \n",
+ " 0111300 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 14653 | \n",
+ " 0111312 | \n",
+ " 0111310 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 14654 | \n",
+ " 0111312 | \n",
+ " 0111311 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 14655 | \n",
+ " 0111312 | \n",
+ " 0111312 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
14656 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " node_a node_b generation\n",
+ "0 00 00 1\n",
+ "1 00 01 1\n",
+ "2 01 00 1\n",
+ "3 01 01 1\n",
+ "4 000 000 2\n",
+ "... ... ... ...\n",
+ "14651 0111312 0111221 6\n",
+ "14652 0111312 0111300 6\n",
+ "14653 0111312 0111310 6\n",
+ "14654 0111312 0111311 6\n",
+ "14655 0111312 0111312 6\n",
+ "\n",
+ "[14656 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running Tree8.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " node_a | \n",
+ " node_b | \n",
+ " generation | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 00 | \n",
+ " 00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 00 | \n",
+ " 01 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 01 | \n",
+ " 00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 01 | \n",
+ " 01 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 000 | \n",
+ " 000 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 99332 | \n",
+ " 01113121 | \n",
+ " 01113111 | \n",
+ " 7 | \n",
+ "
\n",
+ " \n",
+ " | 99333 | \n",
+ " 01113121 | \n",
+ " 01113112 | \n",
+ " 7 | \n",
+ "
\n",
+ " \n",
+ " | 99334 | \n",
+ " 01113121 | \n",
+ " 01113113 | \n",
+ " 7 | \n",
+ "
\n",
+ " \n",
+ " | 99335 | \n",
+ " 01113121 | \n",
+ " 01113120 | \n",
+ " 7 | \n",
+ "
\n",
+ " \n",
+ " | 99336 | \n",
+ " 01113121 | \n",
+ " 01113121 | \n",
+ " 7 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
99337 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " node_a node_b generation\n",
+ "0 00 00 1\n",
+ "1 00 01 1\n",
+ "2 01 00 1\n",
+ "3 01 01 1\n",
+ "4 000 000 2\n",
+ "... ... ... ...\n",
+ "99332 01113121 01113111 7\n",
+ "99333 01113121 01113112 7\n",
+ "99334 01113121 01113113 7\n",
+ "99335 01113121 01113120 7\n",
+ "99336 01113121 01113121 7\n",
+ "\n",
+ "[99337 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running Tree9.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " node_a | \n",
+ " node_b | \n",
+ " generation | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 00 | \n",
+ " 00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 00 | \n",
+ " 01 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 01 | \n",
+ " 00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 01 | \n",
+ " 01 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 000 | \n",
+ " 000 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 638088 | \n",
+ " 011131210 | \n",
+ " 011131200 | \n",
+ " 8 | \n",
+ "
\n",
+ " \n",
+ " | 638089 | \n",
+ " 011131210 | \n",
+ " 011131201 | \n",
+ " 8 | \n",
+ "
\n",
+ " \n",
+ " | 638090 | \n",
+ " 011131210 | \n",
+ " 011131202 | \n",
+ " 8 | \n",
+ "
\n",
+ " \n",
+ " | 638091 | \n",
+ " 011131210 | \n",
+ " 011131203 | \n",
+ " 8 | \n",
+ "
\n",
+ " \n",
+ " | 638092 | \n",
+ " 011131210 | \n",
+ " 011131210 | \n",
+ " 8 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
638093 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " node_a node_b generation\n",
+ "0 00 00 1\n",
+ "1 00 01 1\n",
+ "2 01 00 1\n",
+ "3 01 01 1\n",
+ "4 000 000 2\n",
+ "... ... ... ...\n",
+ "638088 011131210 011131200 8\n",
+ "638089 011131210 011131201 8\n",
+ "638090 011131210 011131202 8\n",
+ "638091 011131210 011131203 8\n",
+ "638092 011131210 011131210 8\n",
+ "\n",
+ "[638093 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running Tree10.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " node_a | \n",
+ " node_b | \n",
+ " generation | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 00 | \n",
+ " 00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 00 | \n",
+ " 01 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 01 | \n",
+ " 00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 01 | \n",
+ " 01 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 000 | \n",
+ " 000 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 4153713 | \n",
+ " 0111312102 | \n",
+ " 0111312032 | \n",
+ " 9 | \n",
+ "
\n",
+ " \n",
+ " | 4153714 | \n",
+ " 0111312102 | \n",
+ " 0111312033 | \n",
+ " 9 | \n",
+ "
\n",
+ " \n",
+ " | 4153715 | \n",
+ " 0111312102 | \n",
+ " 0111312100 | \n",
+ " 9 | \n",
+ "
\n",
+ " \n",
+ " | 4153716 | \n",
+ " 0111312102 | \n",
+ " 0111312101 | \n",
+ " 9 | \n",
+ "
\n",
+ " \n",
+ " | 4153717 | \n",
+ " 0111312102 | \n",
+ " 0111312102 | \n",
+ " 9 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
4153718 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " node_a node_b generation\n",
+ "0 00 00 1\n",
+ "1 00 01 1\n",
+ "2 01 00 1\n",
+ "3 01 01 1\n",
+ "4 000 000 2\n",
+ "... ... ... ...\n",
+ "4153713 0111312102 0111312032 9\n",
+ "4153714 0111312102 0111312033 9\n",
+ "4153715 0111312102 0111312100 9\n",
+ "4153716 0111312102 0111312101 9\n",
+ "4153717 0111312102 0111312102 9\n",
+ "\n",
+ "[4153718 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running Tree11.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " node_a | \n",
+ " node_b | \n",
+ " generation | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 00 | \n",
+ " 00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 00 | \n",
+ " 01 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 01 | \n",
+ " 00 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 01 | \n",
+ " 01 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 000 | \n",
+ " 000 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 26253114 | \n",
+ " 01113121023 | \n",
+ " 01113121010 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " | 26253115 | \n",
+ " 01113121023 | \n",
+ " 01113121020 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " | 26253116 | \n",
+ " 01113121023 | \n",
+ " 01113121021 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " | 26253117 | \n",
+ " 01113121023 | \n",
+ " 01113121022 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " | 26253118 | \n",
+ " 01113121023 | \n",
+ " 01113121023 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
26253119 rows × 3 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " node_a node_b generation\n",
+ "0 00 00 1\n",
+ "1 00 01 1\n",
+ "2 01 00 1\n",
+ "3 01 01 1\n",
+ "4 000 000 2\n",
+ "... ... ... ...\n",
+ "26253114 01113121023 01113121010 10\n",
+ "26253115 01113121023 01113121020 10\n",
+ "26253116 01113121023 01113121021 10\n",
+ "26253117 01113121023 01113121022 10\n",
+ "26253118 01113121023 01113121023 10\n",
+ "\n",
+ "[26253119 rows x 3 columns]"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running Tree12.\n",
+ "Timeout detected.\n",
+ "Error: Query interrupted\n",
+ "!!! TIMEOUT detected on Tree12 !!!\n",
+ " === Timing for Same Generation === // Cypher //\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| Tree7 | 0.0493318349999754 |\n",
+ "| Tree8 | 0.1653520750005555 |\n",
+ "| Tree9 | 0.5007336210001085 |\n",
+ "| Tree10 | 5.679915114000323 |\n",
+ "| Tree11 | 56.67059351200078 |\n",
+ "| Tree12 | TIMEOUT (>200s) |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('Same Generation', trees)\n",
+ "%%run_duckdb\n",
+ "\n",
+ "LOAD duckpgq;\n",
+ "\n",
+ "-- 1. Setup Nodes\n",
+ "CREATE OR REPLACE TABLE GXk_nodes AS \n",
+ " SELECT DISTINCT col0 AS id FROM {loop_parameter} \n",
+ " UNION \n",
+ " SELECT DISTINCT col1 AS id FROM {loop_parameter};\n",
+ "\n",
+ "-- 2. Setup Graph\n",
+ "CREATE OR REPLACE PROPERTY GRAPH gXk_graph\n",
+ " VERTEX TABLES (\n",
+ " GXk_nodes LABEL nodes\n",
+ " )\n",
+ " EDGE TABLES (\n",
+ " {loop_parameter} \n",
+ " SOURCE KEY (col0) REFERENCES GXk_nodes (id)\n",
+ " DESTINATION KEY (col1) REFERENCES GXk_nodes (id)\n",
+ " LABEL links\n",
+ " );\n",
+ "\n",
+ "-- 3. MATERIALIZE: Save distances to a table\n",
+ "-- We calculate distance for ALL pairs (safest way to avoid crashes)\n",
+ "-- then we filter for root='0' in the next step.\n",
+ "CREATE OR REPLACE TABLE temp_gen_data AS \n",
+ "SELECT * FROM GRAPH_TABLE (\n",
+ " gXk_graph\n",
+ " MATCH p = ANY SHORTEST (start_node:nodes)-[e:links]->+(end_node:nodes)\n",
+ " WHERE start_node.id = '0'\n",
+ " COLUMNS (\n",
+ " start_node.id AS origin, \n",
+ " end_node.id AS destination,\n",
+ " path_length(p) as distance\n",
+ " )\n",
+ ");\n",
+ "\n",
+ "-- 4. ANALYZE: Standard SQL Join on the saved table\n",
+ "-- Now we only care about paths starting from '0' (the root)\n",
+ "WITH root_dists AS (\n",
+ " SELECT destination, distance AS gen\n",
+ " FROM temp_gen_data\n",
+ " WHERE origin = '0'\n",
+ ")\n",
+ "SELECT \n",
+ " r1.destination AS node_a,\n",
+ " r2.destination AS node_b,\n",
+ " r1.gen AS generation\n",
+ "FROM root_dists r1\n",
+ "JOIN root_dists r2 ON r1.gen = r2.gen\n",
+ "ORDER BY generation, node_a, node_b;"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "5fefc9f5-8e32-4366-9a13-25661f4b1868",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " === Timing for Transitive Closure === // Cypher //\n",
+ "+---------+---------------------+\n",
+ "| problem | time |\n",
+ "+---------+---------------------+\n",
+ "| G1k | 0.35087310300013996 |\n",
+ "| G2k | 2.1931661440003154 |\n",
+ "| G3k | 7.658980836999945 |\n",
+ "| G4k | 18.23380420300009 |\n",
+ "| G5k | 33.10960333700041 |\n",
+ "+---------+---------------------+\n",
+ " === Timing for Distance === // Cypher //\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 14.464675783000075 |\n",
+ "| G2k | 116.94109469400018 |\n",
+ "| G3k | TIMEOUT (>200s) |\n",
+ "| G4k | TIMEOUT (>200s) |\n",
+ "| G5k | TIMEOUT (>200s) |\n",
+ "+---------+--------------------+\n",
+ " === Timing for Same Generation === // Cypher //\n",
+ "+---------+----------------------+\n",
+ "| problem | time |\n",
+ "+---------+----------------------+\n",
+ "| Tree5 | 0.037794283000039286 |\n",
+ "| Tree6 | 0.023312870000154362 |\n",
+ "+---------+----------------------+\n",
+ " === Timing for Same Generation === // Cypher //\n",
+ "+---------+----------------------+\n",
+ "| problem | time |\n",
+ "+---------+----------------------+\n",
+ "| Tree5 | 0.025082522000047902 |\n",
+ "| Tree6 | 0.022899162000157958 |\n",
+ "| Tree7 | 0.03014187100006893 |\n",
+ "| Tree8 | 0.08837926799969864 |\n",
+ "| Tree9 | 0.47878834199991616 |\n",
+ "| Tree10 | 5.538905053000235 |\n",
+ "| Tree11 | 56.38546824800005 |\n",
+ "+---------+----------------------+\n",
+ " === Timing for Same Generation === // Cypher //\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| Tree7 | 0.0493318349999754 |\n",
+ "| Tree8 | 0.1653520750005555 |\n",
+ "| Tree9 | 0.5007336210001085 |\n",
+ "| Tree10 | 5.679915114000323 |\n",
+ "| Tree11 | 56.67059351200078 |\n",
+ "| Tree12 | TIMEOUT (>200s) |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "for report in reports:\n",
+ " print(report)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3268fe25-b773-4344-87d5-ecfadf8c6051",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/examples/graph/tgdk/benchmark_logica.ipynb b/examples/graph/tgdk/benchmark_logica.ipynb
new file mode 100644
index 0000000..271e949
--- /dev/null
+++ b/examples/graph/tgdk/benchmark_logica.ipynb
@@ -0,0 +1,6529 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "017fd848-8cee-4dc8-b15e-75cabe7ad092",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Welcome to simple Souffle graph benchmarking.\n",
+ "Behold the power of The Machine:\n",
+ "CPUs: 32 / RAM: 125Gi\n"
+ ]
+ }
+ ],
+ "source": [
+ "!echo 'Welcome to simple Souffle graph benchmarking.'\n",
+ "!echo 'Behold the power of The Machine:'\n",
+ "!echo \"CPUs: $(nproc) / RAM: $(free -h | awk '/^Mem:/ {print $2}')\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "34c208d1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from IPython.core.magic import register_cell_magic\n",
+ "from IPython import get_ipython\n",
+ "import time\n",
+ "from logica.common import sqlite3_logica\n",
+ "import pandas\n",
+ "\n",
+ "timing = {}\n",
+ "\n",
+ "reports = []\n",
+ "\n",
+ "@register_cell_magic\n",
+ "def loop(line, cell):\n",
+ " global timing\n",
+ " local_timing = {}\n",
+ " ip = get_ipython()\n",
+ " # Evaluate the line to get the list (e.g., \"my_files\")\n",
+ " problem_name, iterator = ip.ev(line) \n",
+ " \n",
+ " for item in iterator:\n",
+ " # Inject 'item' into global namespace so the inner magic sees it\n",
+ " ip.user_ns['loop_parameter'] = item \n",
+ " # Run the content as a new cell execution\n",
+ " start_time = time.perf_counter()\n",
+ " ip.run_cell(cell.replace('{loop_parameter}', item))\n",
+ " end_time = time.perf_counter()\n",
+ " elapsed = end_time - start_time\n",
+ " timing[item] = elapsed\n",
+ " local_timing[item] = elapsed\n",
+ " report = (' === Timing for %s ===\\n' % problem_name) + (\n",
+ " sqlite3_logica.DataframeAsArtisticTable(pandas.DataFrame({'problem': list(local_timing.keys()),\n",
+ " 'time': list(local_timing.values())})))\n",
+ " reports.append(report)\n",
+ " print(report)\n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "82fbd480",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "test_items = ['a', 'b', 'c']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "03b9c31d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "a\n",
+ "b\n",
+ "c\n",
+ " === Timing for Test Problem ===\n",
+ "+---------+------------------------+\n",
+ "| problem | time |\n",
+ "+---------+------------------------+\n",
+ "| a | 0.00022014000001036038 |\n",
+ "| b | 0.00017433999994409533 |\n",
+ "| c | 0.00016089000007468712 |\n",
+ "+---------+------------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop (\"Test Problem\", test_items)\n",
+ "print(\"{loop_parameter}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "ab7a2777",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " === Timing for Test Problem ===\n",
+ "+---------+------------------------+\n",
+ "| problem | time |\n",
+ "+---------+------------------------+\n",
+ "| a | 0.00022014000001036038 |\n",
+ "| b | 0.00017433999994409533 |\n",
+ "| c | 0.00016089000007468712 |\n",
+ "+---------+------------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(reports[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "66effb9f-ea00-444d-814e-f18491b5b70d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Could not import google.cloud.bigquery.\n",
+ "Could not import google.cloud.auth.\n",
+ "Could not import google.colab.widgets.\n"
+ ]
+ }
+ ],
+ "source": [
+ "from logica import colab_logica"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "4b1a898b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mG_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mG\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 95 | \n",
+ " 60 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 80 | \n",
+ " 92 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 32 | \n",
+ " 61 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 29 | \n",
+ " 66 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 73 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 61 | \n",
+ " 71 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 46 | \n",
+ " 11 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 80 | \n",
+ " 32 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 10 | \n",
+ " 51 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 85 | \n",
+ " 25 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 76 | \n",
+ " 42 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 75 | \n",
+ " 83 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 5 | \n",
+ " 67 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 47 | \n",
+ " 56 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 3 | \n",
+ " 87 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 86 | \n",
+ " 50 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 11 | \n",
+ " 17 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 71 | \n",
+ " 13 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 9 | \n",
+ " 20 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 94 | \n",
+ " 46 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 60 | \n",
+ " 31 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 74 | \n",
+ " 44 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 70 | \n",
+ " 43 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 37 | \n",
+ " 7 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 1 | \n",
+ " 13 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 78 | \n",
+ " 67 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 0 | \n",
+ " 84 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 81 | \n",
+ " 27 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 72 | \n",
+ " 55 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 57 | \n",
+ " 85 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 970 | \n",
+ " 36 | \n",
+ " 86 | \n",
+ "
\n",
+ " \n",
+ " | 971 | \n",
+ " 57 | \n",
+ " 90 | \n",
+ "
\n",
+ " \n",
+ " | 972 | \n",
+ " 85 | \n",
+ " 22 | \n",
+ "
\n",
+ " \n",
+ " | 973 | \n",
+ " 92 | \n",
+ " 76 | \n",
+ "
\n",
+ " \n",
+ " | 974 | \n",
+ " 81 | \n",
+ " 21 | \n",
+ "
\n",
+ " \n",
+ " | 975 | \n",
+ " 71 | \n",
+ " 86 | \n",
+ "
\n",
+ " \n",
+ " | 976 | \n",
+ " 40 | \n",
+ " 60 | \n",
+ "
\n",
+ " \n",
+ " | 977 | \n",
+ " 18 | \n",
+ " 31 | \n",
+ "
\n",
+ " \n",
+ " | 978 | \n",
+ " 15 | \n",
+ " 81 | \n",
+ "
\n",
+ " \n",
+ " | 979 | \n",
+ " 24 | \n",
+ " 83 | \n",
+ "
\n",
+ " \n",
+ " | 980 | \n",
+ " 53 | \n",
+ " 22 | \n",
+ "
\n",
+ " \n",
+ " | 981 | \n",
+ " 51 | \n",
+ " 60 | \n",
+ "
\n",
+ " \n",
+ " | 982 | \n",
+ " 98 | \n",
+ " 53 | \n",
+ "
\n",
+ " \n",
+ " | 983 | \n",
+ " 33 | \n",
+ " 10 | \n",
+ "
\n",
+ " \n",
+ " | 984 | \n",
+ " 20 | \n",
+ " 58 | \n",
+ "
\n",
+ " \n",
+ " | 985 | \n",
+ " 87 | \n",
+ " 0 | \n",
+ "
\n",
+ " \n",
+ " | 986 | \n",
+ " 33 | \n",
+ " 2 | \n",
+ "
\n",
+ " \n",
+ " | 987 | \n",
+ " 22 | \n",
+ " 61 | \n",
+ "
\n",
+ " \n",
+ " | 988 | \n",
+ " 63 | \n",
+ " 28 | \n",
+ "
\n",
+ " \n",
+ " | 989 | \n",
+ " 0 | \n",
+ " 53 | \n",
+ "
\n",
+ " \n",
+ " | 990 | \n",
+ " 21 | \n",
+ " 95 | \n",
+ "
\n",
+ " \n",
+ " | 991 | \n",
+ " 56 | \n",
+ " 14 | \n",
+ "
\n",
+ " \n",
+ " | 992 | \n",
+ " 22 | \n",
+ " 47 | \n",
+ "
\n",
+ " \n",
+ " | 993 | \n",
+ " 68 | \n",
+ " 50 | \n",
+ "
\n",
+ " \n",
+ " | 994 | \n",
+ " 46 | \n",
+ " 85 | \n",
+ "
\n",
+ " \n",
+ " | 995 | \n",
+ " 95 | \n",
+ " 76 | \n",
+ "
\n",
+ " \n",
+ " | 996 | \n",
+ " 5 | \n",
+ " 28 | \n",
+ "
\n",
+ " \n",
+ " | 997 | \n",
+ " 74 | \n",
+ " 83 | \n",
+ "
\n",
+ " \n",
+ " | 998 | \n",
+ " 74 | \n",
+ " 78 | \n",
+ "
\n",
+ " \n",
+ " | 999 | \n",
+ " 26 | \n",
+ " 11 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mS_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mS\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 168000 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ G4k (46 ms) \n",
+ "║╥ ▚ G7c (14 ms) \n",
+ "║║╥ ▚ G5c (11 ms) \n",
+ "║║║╥ ▚ G5k (53 ms) \n",
+ "║║║║ ▚ G (4 ms) \n",
+ "║║║║╥ ▚ G6c (12 ms) \n",
+ "║║║║║╥ ▚ G1k (16 ms) \n",
+ "║║║║║║╥ ▚ G2k (25 ms) \n",
+ "║║║║║║║╥ ▚ G3k (36 ms) \n",
+ "╨╨╨╨╨╨╨╨ ▚ S (1 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "%%logica G,S\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "N() = 100;\n",
+ "D() = 10;\n",
+ "\n",
+ "GStep1(a, b, i:) distinct :-\n",
+ " a = NaturalHash(\"a-\" ++ ToString(i)) % N(),\n",
+ " b = NaturalHash(\"b-\" ++ ToString(i)) % N(),\n",
+ " a != b,\n",
+ " i in Range(ToInt64(N() * D() * 1.1));\n",
+ "\n",
+ "I() = l[N() * D()] :-\n",
+ " l = Array{ i -> i :- GStep1(i:) };\n",
+ "\n",
+ "G(a, b) :-\n",
+ " GStep1(a, b, i:),\n",
+ " i < I();\n",
+ "\n",
+ "\n",
+ "@Ground(G5c, \"db.G5c\", copy_to_file: \"graph_bench/g5c.csv\");\n",
+ "G5c := G(N: 500);\n",
+ "@Ground(G6c, \"db.G6c\", copy_to_file: \"graph_bench/g6c.csv\");\n",
+ "G6c := G(N: 600);\n",
+ "@Ground(G7c, \"db.G7c\", copy_to_file: \"graph_bench/g7c.csv\");\n",
+ "G7c := G(N: 700);\n",
+ "\n",
+ "@Ground(G1k, \"db.G1k\", copy_to_file: \"graph_bench/g1k.csv\");\n",
+ "G1k := G(N: 1000);\n",
+ "@Ground(G2k, \"db.G2k\", copy_to_file: \"graph_bench/g2k.csv\");\n",
+ "G2k := G(N: 2000);\n",
+ "@Ground(G3k, \"db.G3k\", copy_to_file: \"graph_bench/g3k.csv\");\n",
+ "G3k := G(N: 3000);\n",
+ "@Ground(G4k, \"db.G4k\", copy_to_file: \"graph_bench/g4k.csv\");\n",
+ "G4k := G(N: 4000);\n",
+ "@Ground(G5k, \"db.G5k\", copy_to_file: \"graph_bench/g5k.csv\");\n",
+ "G5k := G(N: 5000);\n",
+ "\n",
+ "S() += 1 :- G5c() | G6c() | G7c() | G1k() | G2k() | G3k() | G4k() | G5k();\n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "ca1e7236",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "graphs = ['G1k', 'G2k', 'G3k', 'G4k', 'G5k']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "76ee2a9f",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mTree_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTree\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 0 | \n",
+ " 00 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 0 | \n",
+ " 01 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 0110 | \n",
+ " 01100 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 0110 | \n",
+ " 01101 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 0110 | \n",
+ " 01102 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 011 | \n",
+ " 0110 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 011 | \n",
+ " 0111 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 00 | \n",
+ " 000 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 0111 | \n",
+ " 01110 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 0111 | \n",
+ " 01111 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 0111 | \n",
+ " 01112 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 0111 | \n",
+ " 01113 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 010 | \n",
+ " 0100 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 01 | \n",
+ " 010 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 01 | \n",
+ " 011 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 0001 | \n",
+ " 00010 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 0001 | \n",
+ " 00011 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 0001 | \n",
+ " 00012 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 000 | \n",
+ " 0000 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 000 | \n",
+ " 0001 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 0000 | \n",
+ " 00000 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 0100 | \n",
+ " 01000 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 0100 | \n",
+ " 01001 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 0100 | \n",
+ " 01002 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 0100 | \n",
+ " 01003 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mNumNodes_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mNumNodes\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " tree5 | \n",
+ " tree6 | \n",
+ " tree7 | \n",
+ " tree8 | \n",
+ " tree9 | \n",
+ " tree10 | \n",
+ " tree11 | \n",
+ " tree12 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 25 | \n",
+ " 68 | \n",
+ " 180 | \n",
+ " 471 | \n",
+ " 1205 | \n",
+ " 3080 | \n",
+ " 7781 | \n",
+ " 19504 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ InnerTree_ifr0_f7 (38 ms) \n",
+ "║╥ ▚ InnerTree_ifr0_f11 (0 ms) \n",
+ "║║╥ ▚ InnerTree_ifr0_f13 (0 ms) \n",
+ "║║║╥ ▚ InnerTree_ifr0_f8 (0 ms) \n",
+ "║║║║╥ ▚ InnerTree_ifr0_f10 (0 ms) \n",
+ "║║║║║╥ ▚ InnerTree_ifr0_f9 (0 ms) \n",
+ "║║╨║║║╥ ▚ InnerTree_ifr1_f13 (60 ms) \n",
+ "║║╥║║║║ ▚ InnerTree_ifr0_f12 (0 ms) \n",
+ "║║║║║║╨╥ ▚ InnerTree_ifr2_f13 (3 ms) 15 / 15\n",
+ "║║║║║║╥║ ▚ InnerTree_ifr0 (0 ms) \n",
+ "║║║║║║║║╥ ▚ InnerTree_ifr0_f14 (0 ms) \n",
+ "║║║║║║║╨║╥ ▚ InnerTree_ifr3_f13 (3 ms) 15 / 15\n",
+ "║║╨║║║║╥║║ ▚ InnerTree_ifr1_f12 (2 ms) \n",
+ "║║╥║║║║╨║║ ▚ InnerTree_ifr2_f12 (2 ms) 15 / 15\n",
+ "║╨║║║║║╥║║ ▚ InnerTree_ifr1_f11 (1 ms) \n",
+ "║╥║║║║║║╨║ ▚ InnerTree_ifr1_f14 (1 ms) \n",
+ "╨║║║║║║║╥║ ▚ InnerTree_ifr1_f7 (1 ms) \n",
+ "╥║║║║╨║║║║ ▚ InnerTree_ifr1_f9 (1 ms) \n",
+ "║║║║║╥║╨║║ ▚ InnerTree_ifr2_f11 (1 ms) 15 / 15\n",
+ "║║║╨║║║╥║║ ▚ InnerTree_ifr1_f8 (1 ms) \n",
+ "║╨║╥║║║║║║ ▚ InnerTree_ifr2_f14 (4 ms) 15 / 15\n",
+ "║╥║║╨║║║║║ ▚ InnerTree_ifr1_f10 (1 ms) \n",
+ "╨║║║╥║║║║║ ▚ InnerTree_ifr2_f9 (56 ms) 15 / 15\n",
+ "╥║╨║║║║║║║ ▚ InnerTree_ifr3_f12 (2 ms) 15 / 15\n",
+ "║║╥║╨║║║║║ ▚ InnerTree_ifr3_f9 (57 ms) 15 / 15\n",
+ "║║║║╥╨║║║║ ▚ InnerTree_ifr3_f11 (2 ms) 15 / 15\n",
+ "║║║║║╥╨║║║ ▚ InnerTree_ifr1 (1 ms) \n",
+ "║║║║║╨╥║║║ ▚ InnerTree_ifr2 (2 ms) 15 / 15\n",
+ "║║║║║╥║║╨║ ▚ InnerTree_ifr2_f7 (10 ms) 15 / 15\n",
+ "║║║║║║║╨╥║ ▚ InnerTree_ifr2_f8 (23 ms) 15 / 15\n",
+ "║║║║║║║╥╨║ ▚ InnerTree_ifr3_f8 (25 ms) 15 / 15\n",
+ "║║╨║║║║║╥║ ▚ InnerTree_f9 (54 ms) \n",
+ "║║╥║║╨║║║║ ▚ InnerTree_ifr3_f7 (10 ms) 15 / 15\n",
+ "║║║║║╥║║║╨ ▚ InnerTree_f13 (3 ms) \n",
+ "║║╨║║║║║║╥ ▚ InnerTree_f7 (10 ms) \n",
+ "║║╥║║║╨║║║ ▚ InnerTree_ifr3 (2 ms) 15 / 15\n",
+ "║║║║╨║╥║║║ ▚ InnerTree_f11 (1 ms) \n",
+ "║║║╨╥║║║║║ ▚ InnerTree_ifr3_f14 (5 ms) 15 / 15\n",
+ "║║║╥║║║║╨║ ▚ Tree12 (16 ms) \n",
+ "║╨║║║║║║╥║ ▚ InnerTree_ifr2_f10 (2 ms) 15 / 15\n",
+ "║╥║║║╨║║║║ ▚ Tree8 (5 ms) \n",
+ "╨║║║║╥║║║║ ▚ InnerTree_f12 (2 ms) \n",
+ "╥║║║║║║║╨║ ▚ InnerTree_ifr3_f10 (2 ms) 15 / 15\n",
+ "║║║║║║║║╥╨ ▚ Tree10 (6 ms) \n",
+ "║║║║║║║╨║╥ ▚ InnerTree_f8 (22 ms) \n",
+ "║║╨║║║║╥║║ ▚ InnerTree (2 ms) \n",
+ "║║╥║║║╨║║║ ▚ Tree6 (4 ms) \n",
+ "╨║║║║║╥║║║ ▚ InnerTree_f10 (1 ms) \n",
+ " ║║║║║║╨║║ ▚ Tree (0 ms) \n",
+ "╥║║║╨║║ ║║ ▚ InnerTree_f14 (5 ms) \n",
+ "║║║║╥║║ ║╨ ▚ Tree11 (9 ms) \n",
+ "║║║║║║╨╥║ ▚ Tree5 (4 ms) \n",
+ "║║║║║╨╥║║ ▚ Tree7 (4 ms) \n",
+ "╨║║║║╥║║║ ▚ Tree9 (5 ms) \n",
+ " ╨╨╨╨╨╨╨╨ ▚ NumNodes (15 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n"
+ ]
+ }
+ ],
+ "source": [
+ "%%logica Tree, NumNodes\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "Depth() = 5;\n",
+ "DegreeRange(1, 5);\n",
+ "\n",
+ "InnerTree(x, y) :-\n",
+ " (x = \"0\" | InnerTree(something, x)),\n",
+ " Length(x) < Depth(),\n",
+ " DegreeRange(d1, d2),\n",
+ " d = NaturalHash(\"d-\" ++ x) % (d2 - d1) + d1,\n",
+ " i in Range(d),\n",
+ " y = x ++ ToString(i);\n",
+ "\n",
+ "# Creating a non-recursive face, so we can customly ground it.\n",
+ "Tree(x, y) :- InnerTree(x, y);\n",
+ "\n",
+ "@Ground(Tree5, \"db.Tree5\", copy_to_file: \"graph_bench/tree5.csv\");\n",
+ "Tree5 := Tree(Depth: 5);\n",
+ "@Ground(Tree6, \"db.Tree6\", copy_to_file: \"graph_bench/tree6.csv\");\n",
+ "Tree6 := Tree(Depth: 6);\n",
+ "@Ground(Tree7, \"db.Tree7\", copy_to_file: \"graph_bench/tree7.csv\");\n",
+ "Tree7 := Tree(Depth: 7);\n",
+ "@Ground(Tree8, \"db.Tree8\", copy_to_file: \"graph_bench/tree8.csv\");\n",
+ "Tree8 := Tree(Depth: 8);\n",
+ "@Ground(Tree9, \"db.Tree9\", copy_to_file: \"graph_bench/tree9.csv\");\n",
+ "Tree9 := Tree(Depth: 9);\n",
+ "@Ground(Tree10, \"db.Tree10\", copy_to_file: \"graph_bench/tree10.csv\");\n",
+ "Tree10 := Tree(Depth: 10);\n",
+ "@Ground(Tree11, \"db.Tree11\", copy_to_file: \"graph_bench/tree11.csv\");\n",
+ "Tree11 := Tree(Depth: 11);\n",
+ "@Ground(Tree12, \"db.Tree12\", copy_to_file: \"graph_bench/tree12.csv\");\n",
+ "Tree12 := Tree(Depth: 12);\n",
+ "\n",
+ "NumNodes(tree5: Sum{ 1 :- Tree5()},\n",
+ " tree6: Sum{ 1 :- Tree6()},\n",
+ " tree7: Sum{ 1 :- Tree7()},\n",
+ " tree8: Sum{ 1 :- Tree8()},\n",
+ " tree9: Sum{ 1 :- Tree9()},\n",
+ " tree10: Sum{ 1 :- Tree10()},\n",
+ " tree11: Sum{ 1 :- Tree11()},\n",
+ " tree12: Sum{ 1 :- Tree12()}\n",
+ " );\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "79e9c6b3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "trees = ['Tree7', 'Tree8', 'Tree9', 'Tree10', 'Tree11', 'Tree12']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "386a189b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mTC_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTC\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 931 | \n",
+ " 419 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 243 | \n",
+ " 80 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 542 | \n",
+ " 14 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 95 | \n",
+ " 159 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 325 | \n",
+ " 567 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 764 | \n",
+ " 632 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 984 | \n",
+ " 756 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 683 | \n",
+ " 783 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 398 | \n",
+ " 110 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 747 | \n",
+ " 944 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 260 | \n",
+ " 618 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 350 | \n",
+ " 317 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 437 | \n",
+ " 270 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 568 | \n",
+ " 935 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 708 | \n",
+ " 132 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 78 | \n",
+ " 885 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 236 | \n",
+ " 114 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 693 | \n",
+ " 820 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 25 | \n",
+ " 193 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 675 | \n",
+ " 49 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 851 | \n",
+ " 586 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 693 | \n",
+ " 123 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 161 | \n",
+ " 213 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 429 | \n",
+ " 411 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 405 | \n",
+ " 955 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 423 | \n",
+ " 285 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 896 | \n",
+ " 766 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 47 | \n",
+ " 575 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 25 | \n",
+ " 649 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 13 | \n",
+ " 576 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 998970 | \n",
+ " 736 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998971 | \n",
+ " 309 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998972 | \n",
+ " 749 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998973 | \n",
+ " 890 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998974 | \n",
+ " 11 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998975 | \n",
+ " 331 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998976 | \n",
+ " 91 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998977 | \n",
+ " 248 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998978 | \n",
+ " 286 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998979 | \n",
+ " 386 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998980 | \n",
+ " 777 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998981 | \n",
+ " 834 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998982 | \n",
+ " 291 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998983 | \n",
+ " 849 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998984 | \n",
+ " 707 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998985 | \n",
+ " 198 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998986 | \n",
+ " 217 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998987 | \n",
+ " 342 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998988 | \n",
+ " 773 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998989 | \n",
+ " 168 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998990 | \n",
+ " 949 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998991 | \n",
+ " 839 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998992 | \n",
+ " 403 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998993 | \n",
+ " 577 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998994 | \n",
+ " 357 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998995 | \n",
+ " 678 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998996 | \n",
+ " 798 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998997 | \n",
+ " 502 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998998 | \n",
+ " 546 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ " | 998999 | \n",
+ " 183 | \n",
+ " 943 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G1k (input data) \n",
+ "╨╥ ▚ TC_ifr0 (2 ms) \n",
+ "╥╨ ▚ TC_ifr1 (8 ms) \n",
+ "╨╥╥ ▚ TC_ifr2 (62 ms) \n",
+ "╥╨║ ▚ PrevTC_ifr3 (2 ms) \n",
+ "║╥╨╥╥ ▚ TC_ifr3 (110 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (41 ms) 3 / ∞ / stop.\n",
+ "╥╥╥╨║ ▚ TC_ifr4 (110 ms) 3 / ∞ / stop.\n",
+ "║║║╥╨ ▚ PrevTC_ifr4 (4 ms) 3 / ∞ / stop.\n",
+ "╨║║║ ▚ PrevTC_ifr5 (4 ms) 3 / ∞ / stop.\n",
+ "╥╨║║ ▚ TC_ifr5 (124 ms) 3 / ∞ / stop.\n",
+ "║ ╨╨ ▚ Done_ifr5 (66 ms) 2 / ∞ / stop.\n",
+ "╨ ▚ TC (120 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ "Query is stored at \u001b[1mTC_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTC\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 571 | \n",
+ " 1979 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 124 | \n",
+ " 1595 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 999 | \n",
+ " 1893 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 180 | \n",
+ " 1194 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1744 | \n",
+ " 1179 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 1234 | \n",
+ " 758 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1627 | \n",
+ " 489 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 1990 | \n",
+ " 239 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 964 | \n",
+ " 894 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 1089 | \n",
+ " 885 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 1460 | \n",
+ " 456 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 352 | \n",
+ " 1535 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 1542 | \n",
+ " 297 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 1780 | \n",
+ " 925 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 1347 | \n",
+ " 328 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 1455 | \n",
+ " 1506 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 1769 | \n",
+ " 755 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 658 | \n",
+ " 551 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 589 | \n",
+ " 906 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 33 | \n",
+ " 802 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 69 | \n",
+ " 1531 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 1336 | \n",
+ " 586 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 987 | \n",
+ " 637 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 6 | \n",
+ " 1663 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 963 | \n",
+ " 727 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 1003 | \n",
+ " 1562 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 1828 | \n",
+ " 232 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 1985 | \n",
+ " 1829 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 1147 | \n",
+ " 1102 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 492 | \n",
+ " 1023 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 3997970 | \n",
+ " 1110 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997971 | \n",
+ " 1287 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997972 | \n",
+ " 497 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997973 | \n",
+ " 932 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997974 | \n",
+ " 620 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997975 | \n",
+ " 1941 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997976 | \n",
+ " 1768 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997977 | \n",
+ " 638 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997978 | \n",
+ " 1455 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997979 | \n",
+ " 1371 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997980 | \n",
+ " 123 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997981 | \n",
+ " 1149 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997982 | \n",
+ " 1597 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997983 | \n",
+ " 1518 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997984 | \n",
+ " 905 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997985 | \n",
+ " 1288 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997986 | \n",
+ " 669 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997987 | \n",
+ " 697 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997988 | \n",
+ " 1327 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997989 | \n",
+ " 1143 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997990 | \n",
+ " 60 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997991 | \n",
+ " 1226 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997992 | \n",
+ " 1626 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997993 | \n",
+ " 1623 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997994 | \n",
+ " 1858 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997995 | \n",
+ " 1963 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997996 | \n",
+ " 1329 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997997 | \n",
+ " 1641 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997998 | \n",
+ " 318 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ " | 3997999 | \n",
+ " 650 | \n",
+ " 1346 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G2k (input data) \n",
+ "╨╥ ▚ TC_ifr0 (2 ms) \n",
+ "╥╨ ▚ TC_ifr1 (15 ms) \n",
+ "╨╥╥ ▚ TC_ifr2 (65 ms) \n",
+ "╥╨║ ▚ PrevTC_ifr3 (5 ms) \n",
+ "║╥╨╥╥ ▚ TC_ifr3 (230 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (90 ms) 3 / ∞ / stop.\n",
+ "╥╥╥╨║ ▚ TC_ifr4 (287 ms) 3 / ∞ / stop.\n",
+ "║║║╥╨ ▚ PrevTC_ifr4 (8 ms) 3 / ∞ / stop.\n",
+ "╨║║║ ▚ PrevTC_ifr5 (9 ms) 3 / ∞ / stop.\n",
+ "╥╨║║ ▚ TC_ifr5 (300 ms) 3 / ∞ / stop.\n",
+ "║ ╨╨ ▚ Done_ifr5 (95 ms) 2 / ∞ / stop.\n",
+ "╨ ▚ TC (329 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ "Query is stored at \u001b[1mTC_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTC\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 826 | \n",
+ " 1104 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1019 | \n",
+ " 2746 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 29 | \n",
+ " 1466 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 626 | \n",
+ " 1711 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2589 | \n",
+ " 2751 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 0 | \n",
+ " 1484 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 2424 | \n",
+ " 1253 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 582 | \n",
+ " 50 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 2764 | \n",
+ " 1192 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 784 | \n",
+ " 861 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 414 | \n",
+ " 1196 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 1434 | \n",
+ " 558 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 1665 | \n",
+ " 1435 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 2195 | \n",
+ " 778 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 332 | \n",
+ " 555 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 2572 | \n",
+ " 1097 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 48 | \n",
+ " 1577 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 1720 | \n",
+ " 1858 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 300 | \n",
+ " 2453 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 1679 | \n",
+ " 2592 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 302 | \n",
+ " 422 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 2069 | \n",
+ " 2526 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 1729 | \n",
+ " 1703 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 2790 | \n",
+ " 119 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 982 | \n",
+ " 1347 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 696 | \n",
+ " 705 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 2373 | \n",
+ " 2673 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 964 | \n",
+ " 1433 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 677 | \n",
+ " 814 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 2772 | \n",
+ " 2613 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 8999970 | \n",
+ " 2467 | \n",
+ " 340 | \n",
+ "
\n",
+ " \n",
+ " | 8999971 | \n",
+ " 1469 | \n",
+ " 516 | \n",
+ "
\n",
+ " \n",
+ " | 8999972 | \n",
+ " 479 | \n",
+ " 516 | \n",
+ "
\n",
+ " \n",
+ " | 8999973 | \n",
+ " 2433 | \n",
+ " 758 | \n",
+ "
\n",
+ " \n",
+ " | 8999974 | \n",
+ " 575 | \n",
+ " 758 | \n",
+ "
\n",
+ " \n",
+ " | 8999975 | \n",
+ " 730 | \n",
+ " 2395 | \n",
+ "
\n",
+ " \n",
+ " | 8999976 | \n",
+ " 2104 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999977 | \n",
+ " 2737 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999978 | \n",
+ " 2250 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999979 | \n",
+ " 1817 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999980 | \n",
+ " 1928 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999981 | \n",
+ " 2396 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999982 | \n",
+ " 1044 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999983 | \n",
+ " 573 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999984 | \n",
+ " 2938 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999985 | \n",
+ " 1721 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999986 | \n",
+ " 1618 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999987 | \n",
+ " 257 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999988 | \n",
+ " 1256 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999989 | \n",
+ " 1682 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999990 | \n",
+ " 2465 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999991 | \n",
+ " 225 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999992 | \n",
+ " 1596 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999993 | \n",
+ " 2663 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999994 | \n",
+ " 1202 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999995 | \n",
+ " 1607 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999996 | \n",
+ " 2763 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999997 | \n",
+ " 1772 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999998 | \n",
+ " 1890 | \n",
+ " 668 | \n",
+ "
\n",
+ " \n",
+ " | 8999999 | \n",
+ " 1598 | \n",
+ " 559 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G3k (input data) \n",
+ "╨╥ ▚ TC_ifr0 (3 ms) \n",
+ "╥╨ ▚ TC_ifr1 (23 ms) \n",
+ "╨╥╥ ▚ TC_ifr2 (98 ms) \n",
+ "╥╨║ ▚ PrevTC_ifr3 (6 ms) \n",
+ "║╥╨╥╥ ▚ TC_ifr3 (308 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (165 ms) 3 / ∞ / stop.\n",
+ "╥╥╥╨║ ▚ TC_ifr4 (724 ms) 3 / ∞ / stop.\n",
+ "║║║╥╨ ▚ PrevTC_ifr4 (55 ms) 3 / ∞ / stop.\n",
+ "╨║║║ ▚ PrevTC_ifr5 (35 ms) 3 / ∞ / stop.\n",
+ "╥╨║║ ▚ TC_ifr5 (724 ms) 3 / ∞ / stop.\n",
+ "║ ╨╨ ▚ Done_ifr5 (209 ms) 2 / ∞ / stop.\n",
+ "╨ ▚ TC (840 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ "Query is stored at \u001b[1mTC_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTC\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 371 | \n",
+ " 3577 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 3324 | \n",
+ " 2395 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1781 | \n",
+ " 2812 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 2131 | \n",
+ " 1370 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 3460 | \n",
+ " 2456 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 1523 | \n",
+ " 2905 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 3632 | \n",
+ " 3018 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 3328 | \n",
+ " 2277 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 1658 | \n",
+ " 1025 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 348 | \n",
+ " 2770 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 2209 | \n",
+ " 1426 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 492 | \n",
+ " 2806 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 3905 | \n",
+ " 560 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 1532 | \n",
+ " 789 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 1916 | \n",
+ " 2119 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 2693 | \n",
+ " 714 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 209 | \n",
+ " 24 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 1568 | \n",
+ " 2338 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 2841 | \n",
+ " 329 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 508 | \n",
+ " 3593 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 1794 | \n",
+ " 3321 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 1423 | \n",
+ " 1285 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 2922 | \n",
+ " 1036 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 2264 | \n",
+ " 2438 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 3062 | \n",
+ " 3534 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 3238 | \n",
+ " 1891 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 2012 | \n",
+ " 1557 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 2546 | \n",
+ " 1303 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 2678 | \n",
+ " 2558 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 1769 | \n",
+ " 2290 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 15995970 | \n",
+ " 371 | \n",
+ " 1214 | \n",
+ "
\n",
+ " \n",
+ " | 15995971 | \n",
+ " 839 | \n",
+ " 986 | \n",
+ "
\n",
+ " \n",
+ " | 15995972 | \n",
+ " 2173 | \n",
+ " 3799 | \n",
+ "
\n",
+ " \n",
+ " | 15995973 | \n",
+ " 3305 | \n",
+ " 3799 | \n",
+ "
\n",
+ " \n",
+ " | 15995974 | \n",
+ " 45 | \n",
+ " 2686 | \n",
+ "
\n",
+ " \n",
+ " | 15995975 | \n",
+ " 659 | \n",
+ " 2981 | \n",
+ "
\n",
+ " \n",
+ " | 15995976 | \n",
+ " 2743 | \n",
+ " 926 | \n",
+ "
\n",
+ " \n",
+ " | 15995977 | \n",
+ " 3298 | \n",
+ " 2686 | \n",
+ "
\n",
+ " \n",
+ " | 15995978 | \n",
+ " 2904 | \n",
+ " 3477 | \n",
+ "
\n",
+ " \n",
+ " | 15995979 | \n",
+ " 1289 | \n",
+ " 978 | \n",
+ "
\n",
+ " \n",
+ " | 15995980 | \n",
+ " 2657 | \n",
+ " 978 | \n",
+ "
\n",
+ " \n",
+ " | 15995981 | \n",
+ " 228 | \n",
+ " 978 | \n",
+ "
\n",
+ " \n",
+ " | 15995982 | \n",
+ " 1193 | \n",
+ " 978 | \n",
+ "
\n",
+ " \n",
+ " | 15995983 | \n",
+ " 2060 | \n",
+ " 978 | \n",
+ "
\n",
+ " \n",
+ " | 15995984 | \n",
+ " 190 | \n",
+ " 978 | \n",
+ "
\n",
+ " \n",
+ " | 15995985 | \n",
+ " 3871 | \n",
+ " 3914 | \n",
+ "
\n",
+ " \n",
+ " | 15995986 | \n",
+ " 89 | \n",
+ " 3136 | \n",
+ "
\n",
+ " \n",
+ " | 15995987 | \n",
+ " 3645 | \n",
+ " 3136 | \n",
+ "
\n",
+ " \n",
+ " | 15995988 | \n",
+ " 2768 | \n",
+ " 3136 | \n",
+ "
\n",
+ " \n",
+ " | 15995989 | \n",
+ " 111 | \n",
+ " 3136 | \n",
+ "
\n",
+ " \n",
+ " | 15995990 | \n",
+ " 3932 | \n",
+ " 3136 | \n",
+ "
\n",
+ " \n",
+ " | 15995991 | \n",
+ " 397 | \n",
+ " 3136 | \n",
+ "
\n",
+ " \n",
+ " | 15995992 | \n",
+ " 1860 | \n",
+ " 3136 | \n",
+ "
\n",
+ " \n",
+ " | 15995993 | \n",
+ " 3019 | \n",
+ " 3136 | \n",
+ "
\n",
+ " \n",
+ " | 15995994 | \n",
+ " 119 | \n",
+ " 702 | \n",
+ "
\n",
+ " \n",
+ " | 15995995 | \n",
+ " 1904 | \n",
+ " 978 | \n",
+ "
\n",
+ " \n",
+ " | 15995996 | \n",
+ " 1038 | \n",
+ " 2981 | \n",
+ "
\n",
+ " \n",
+ " | 15995997 | \n",
+ " 340 | \n",
+ " 3799 | \n",
+ "
\n",
+ " \n",
+ " | 15995998 | \n",
+ " 3287 | \n",
+ " 3799 | \n",
+ "
\n",
+ " \n",
+ " | 15995999 | \n",
+ " 812 | \n",
+ " 3799 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G4k (input data) \n",
+ "╨╥ ▚ TC_ifr0 (4 ms) \n",
+ "╥╨ ▚ TC_ifr1 (28 ms) \n",
+ "╨╥╥ ▚ TC_ifr2 (95 ms) \n",
+ "╥╨║ ▚ PrevTC_ifr3 (11 ms) \n",
+ "║╥╨╥╥ ▚ TC_ifr3 (442 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (287 ms) 3 / ∞ / stop.\n",
+ "╥╥╥╨║ ▚ TC_ifr4 (1332 ms) 3 / ∞ / stop.\n",
+ "║║║╥╨ ▚ PrevTC_ifr4 (58 ms) 3 / ∞ / stop.\n",
+ "╨║║║ ▚ PrevTC_ifr5 (50 ms) 3 / ∞ / stop.\n",
+ "╥╨║║ ▚ TC_ifr5 (1351 ms) 3 / ∞ / stop.\n",
+ "║ ╨╨ ▚ Done_ifr5 (360 ms) 3 / ∞ / stop.\n",
+ "╨ ▚ TC (1457 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ "Query is stored at \u001b[1mTC_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mTC\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4140 | \n",
+ " 727 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 4906 | \n",
+ " 4627 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 622 | \n",
+ " 3981 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 686 | \n",
+ " 3233 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2964 | \n",
+ " 1894 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 3544 | \n",
+ " 3842 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 2554 | \n",
+ " 1365 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 1831 | \n",
+ " 1809 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 2434 | \n",
+ " 4558 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 1868 | \n",
+ " 3756 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 1182 | \n",
+ " 4961 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 2862 | \n",
+ " 3790 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 2590 | \n",
+ " 2458 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 2421 | \n",
+ " 3195 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 2751 | \n",
+ " 764 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 2679 | \n",
+ " 1592 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 3794 | \n",
+ " 4229 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 4424 | \n",
+ " 2324 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 869 | \n",
+ " 2755 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 148 | \n",
+ " 4249 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 3025 | \n",
+ " 193 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 3217 | \n",
+ " 1899 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 3707 | \n",
+ " 1282 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 475 | \n",
+ " 2214 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 88 | \n",
+ " 858 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 264 | \n",
+ " 2354 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 1519 | \n",
+ " 1066 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 4946 | \n",
+ " 4335 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 1496 | \n",
+ " 201 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 1970 | \n",
+ " 4070 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 24994970 | \n",
+ " 1619 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994971 | \n",
+ " 4608 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994972 | \n",
+ " 1213 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994973 | \n",
+ " 4318 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994974 | \n",
+ " 2086 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994975 | \n",
+ " 774 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994976 | \n",
+ " 899 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994977 | \n",
+ " 3169 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994978 | \n",
+ " 2655 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994979 | \n",
+ " 4450 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994980 | \n",
+ " 4591 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994981 | \n",
+ " 376 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994982 | \n",
+ " 2176 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994983 | \n",
+ " 4880 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994984 | \n",
+ " 1026 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994985 | \n",
+ " 3514 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994986 | \n",
+ " 3650 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994987 | \n",
+ " 1093 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994988 | \n",
+ " 4575 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994989 | \n",
+ " 3369 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994990 | \n",
+ " 1472 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994991 | \n",
+ " 2797 | \n",
+ " 4684 | \n",
+ "
\n",
+ " \n",
+ " | 24994992 | \n",
+ " 4528 | \n",
+ " 72 | \n",
+ "
\n",
+ " \n",
+ " | 24994993 | \n",
+ " 2844 | \n",
+ " 4427 | \n",
+ "
\n",
+ " \n",
+ " | 24994994 | \n",
+ " 4880 | \n",
+ " 4427 | \n",
+ "
\n",
+ " \n",
+ " | 24994995 | \n",
+ " 1628 | \n",
+ " 72 | \n",
+ "
\n",
+ " \n",
+ " | 24994996 | \n",
+ " 4491 | \n",
+ " 4427 | \n",
+ "
\n",
+ " \n",
+ " | 24994997 | \n",
+ " 3679 | \n",
+ " 378 | \n",
+ "
\n",
+ " \n",
+ " | 24994998 | \n",
+ " 4614 | \n",
+ " 378 | \n",
+ "
\n",
+ " \n",
+ " | 24994999 | \n",
+ " 3407 | \n",
+ " 378 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G5k (input data) \n",
+ "╨╥ ▚ TC_ifr0 (4 ms) \n",
+ "╥╨ ▚ TC_ifr1 (36 ms) \n",
+ "╨╥╥ ▚ TC_ifr2 (114 ms) \n",
+ "╥╨║ ▚ PrevTC_ifr3 (16 ms) \n",
+ "║╥╨╥╥ ▚ TC_ifr3 (584 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (426 ms) 3 / ∞ / stop.\n",
+ "╥╥╥╨║ ▚ TC_ifr4 (2174 ms) 3 / ∞ / stop.\n",
+ "║║║╥╨ ▚ PrevTC_ifr4 (42 ms) 3 / ∞ / stop.\n",
+ "╨║║║ ▚ PrevTC_ifr5 (56 ms) 3 / ∞ / stop.\n",
+ "╥╨║║ ▚ TC_ifr5 (2160 ms) 3 / ∞ / stop.\n",
+ "║ ╨╨ ▚ Done_ifr5 (497 ms) 3 / ∞ / stop.\n",
+ "╨ ▚ TC (2427 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " === Timing for Transitive Closure ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 1.8763943879999943 |\n",
+ "| G2k | 3.617054680000024 |\n",
+ "| G3k | 7.230493697999918 |\n",
+ "| G4k | 12.564421521999975 |\n",
+ "| G5k | 19.55763669199996 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop (\"Transitive Closure\", graphs)\n",
+ "%%logica TC\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "G(a, b) :- db.{loop_parameter}(a, b);\n",
+ "\n",
+ "@Recursive(TC, ∞, stop: Done);\n",
+ "TC(a, b) distinct :- G(a, b);\n",
+ "TC(a, c) distinct :- TC(a, b), G(b, c);\n",
+ "\n",
+ "PrevTC(a, b) :- TC(a, b);\n",
+ "\n",
+ "Done() :- TC(a, b) => PrevTC(a, b);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "32f35ff1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mD_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mD\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 471 | \n",
+ " 966 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 399 | \n",
+ " 731 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 969 | \n",
+ " 313 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 630 | \n",
+ " 953 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 41 | \n",
+ " 215 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 861 | \n",
+ " 679 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 558 | \n",
+ " 186 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 472 | \n",
+ " 89 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 416 | \n",
+ " 15 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 706 | \n",
+ " 999 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 486 | \n",
+ " 815 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 980 | \n",
+ " 699 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 646 | \n",
+ " 285 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 779 | \n",
+ " 68 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 616 | \n",
+ " 252 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 902 | \n",
+ " 563 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 776 | \n",
+ " 874 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 925 | \n",
+ " 652 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 725 | \n",
+ " 762 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 286 | \n",
+ " 846 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 926 | \n",
+ " 452 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 220 | \n",
+ " 30 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 390 | \n",
+ " 806 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 996 | \n",
+ " 454 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 898 | \n",
+ " 90 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 866 | \n",
+ " 27 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 546 | \n",
+ " 303 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 816 | \n",
+ " 115 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 174 | \n",
+ " 246 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 952 | \n",
+ " 536 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 998970 | \n",
+ " 353 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998971 | \n",
+ " 725 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998972 | \n",
+ " 548 | \n",
+ " 320 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 998973 | \n",
+ " 843 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998974 | \n",
+ " 324 | \n",
+ " 320 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 998975 | \n",
+ " 7 | \n",
+ " 320 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 998976 | \n",
+ " 85 | \n",
+ " 320 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 998977 | \n",
+ " 179 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998978 | \n",
+ " 45 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998979 | \n",
+ " 649 | \n",
+ " 320 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 998980 | \n",
+ " 364 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998981 | \n",
+ " 898 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998982 | \n",
+ " 280 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998983 | \n",
+ " 517 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998984 | \n",
+ " 974 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998985 | \n",
+ " 31 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998986 | \n",
+ " 624 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998987 | \n",
+ " 532 | \n",
+ " 320 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 998988 | \n",
+ " 121 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998989 | \n",
+ " 205 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998990 | \n",
+ " 781 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998991 | \n",
+ " 6 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998992 | \n",
+ " 765 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998993 | \n",
+ " 729 | \n",
+ " 320 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 998994 | \n",
+ " 668 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998995 | \n",
+ " 49 | \n",
+ " 320 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 998996 | \n",
+ " 172 | \n",
+ " 320 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 998997 | \n",
+ " 659 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998998 | \n",
+ " 578 | \n",
+ " 320 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 998999 | \n",
+ " 219 | \n",
+ " 320 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G1k (input data) \n",
+ "╨╥ ▚ D_ifr0 (3 ms) \n",
+ "╥╨ ▚ D_ifr1 (11 ms) \n",
+ "╨╥╥ ▚ D_ifr2 (91 ms) \n",
+ "╥╨║ ▚ PrevD_ifr3 (3 ms) \n",
+ "║╥╨╥╥ ▚ D_ifr3 (120 ms) \n",
+ "║╨╥║║ ▚ PrevD_ifr4 (4 ms) 3 / ∞ / stop.\n",
+ "╨ ║╨║ ▚ Done_ifr4 (46 ms) 2 / ∞ / stop.\n",
+ "╥╥║╥╨ ▚ D_ifr4 (149 ms) 3 / ∞ / stop.\n",
+ "╨║║║╥ ▚ D_ifr5 (162 ms) 3 / ∞ / stop.\n",
+ " ╨║║║ ▚ PrevD_ifr5 (11 ms) 3 / ∞ / stop.\n",
+ " ║║╨ ▚ D (139 ms) \n",
+ " ╨╨ ▚ Done_ifr5 (38 ms) 2 / ∞ / stop.\n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ "Query is stored at \u001b[1mD_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mD\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 136 | \n",
+ " 843 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1379 | \n",
+ " 864 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 589 | \n",
+ " 1751 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 784 | \n",
+ " 859 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1012 | \n",
+ " 898 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 591 | \n",
+ " 827 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 309 | \n",
+ " 942 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 379 | \n",
+ " 1439 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 1169 | \n",
+ " 204 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 1433 | \n",
+ " 1216 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 435 | \n",
+ " 615 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 1084 | \n",
+ " 1929 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 278 | \n",
+ " 468 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 1881 | \n",
+ " 1571 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 481 | \n",
+ " 1423 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 777 | \n",
+ " 404 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 1052 | \n",
+ " 1277 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 1402 | \n",
+ " 1219 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 1131 | \n",
+ " 1823 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 1733 | \n",
+ " 1082 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 527 | \n",
+ " 1923 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 1381 | \n",
+ " 1354 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 1323 | \n",
+ " 1991 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 822 | \n",
+ " 1951 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 575 | \n",
+ " 1828 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 1527 | \n",
+ " 507 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 864 | \n",
+ " 1052 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 959 | \n",
+ " 1778 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 885 | \n",
+ " 57 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 765 | \n",
+ " 1219 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 3997970 | \n",
+ " 1389 | \n",
+ " 210 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3997971 | \n",
+ " 1160 | \n",
+ " 586 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3997972 | \n",
+ " 625 | \n",
+ " 210 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3997973 | \n",
+ " 380 | \n",
+ " 66 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997974 | \n",
+ " 53 | \n",
+ " 66 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997975 | \n",
+ " 1045 | \n",
+ " 66 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997976 | \n",
+ " 208 | \n",
+ " 66 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997977 | \n",
+ " 941 | \n",
+ " 66 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3997978 | \n",
+ " 1996 | \n",
+ " 66 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997979 | \n",
+ " 1635 | \n",
+ " 584 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3997980 | \n",
+ " 380 | \n",
+ " 584 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997981 | \n",
+ " 656 | \n",
+ " 584 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 3997982 | \n",
+ " 1548 | \n",
+ " 584 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997983 | \n",
+ " 196 | \n",
+ " 584 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997984 | \n",
+ " 954 | \n",
+ " 584 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997985 | \n",
+ " 1841 | \n",
+ " 584 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997986 | \n",
+ " 1162 | \n",
+ " 66 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997987 | \n",
+ " 372 | \n",
+ " 66 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3997988 | \n",
+ " 254 | \n",
+ " 66 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997989 | \n",
+ " 1945 | \n",
+ " 66 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3997990 | \n",
+ " 922 | \n",
+ " 66 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997991 | \n",
+ " 589 | \n",
+ " 66 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997992 | \n",
+ " 1720 | \n",
+ " 469 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997993 | \n",
+ " 415 | \n",
+ " 469 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997994 | \n",
+ " 1898 | \n",
+ " 469 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997995 | \n",
+ " 1650 | \n",
+ " 469 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997996 | \n",
+ " 1374 | \n",
+ " 469 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997997 | \n",
+ " 1541 | \n",
+ " 469 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 3997998 | \n",
+ " 1475 | \n",
+ " 469 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 3997999 | \n",
+ " 1100 | \n",
+ " 469 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G2k (input data) \n",
+ "╨╥ ▚ D_ifr0 (3 ms) \n",
+ "╥╨ ▚ D_ifr1 (18 ms) \n",
+ "╨╥╥ ▚ D_ifr2 (110 ms) \n",
+ "╥╨║ ▚ PrevD_ifr3 (5 ms) \n",
+ "║╥╨╥╥ ▚ D_ifr3 (237 ms) \n",
+ "║╨╥║║ ▚ PrevD_ifr4 (24 ms) 3 / ∞ / stop.\n",
+ "╨ ║╨║ ▚ Done_ifr4 (99 ms) 2 / ∞ / stop.\n",
+ "╥╥║╥╨ ▚ D_ifr4 (384 ms) 3 / ∞ / stop.\n",
+ "╨║║║╥ ▚ D_ifr5 (392 ms) 3 / ∞ / stop.\n",
+ " ╨║║║ ▚ PrevD_ifr5 (8 ms) 3 / ∞ / stop.\n",
+ " ║║╨ ▚ D (408 ms) \n",
+ " ╨╨ ▚ Done_ifr5 (107 ms) 2 / ∞ / stop.\n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ "Query is stored at \u001b[1mD_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mD\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 275 | \n",
+ " 978 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2774 | \n",
+ " 2995 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 2184 | \n",
+ " 754 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 985 | \n",
+ " 539 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2037 | \n",
+ " 1007 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 2774 | \n",
+ " 2141 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1366 | \n",
+ " 691 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 482 | \n",
+ " 1963 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 2054 | \n",
+ " 1596 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 1231 | \n",
+ " 2948 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 649 | \n",
+ " 2151 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 1480 | \n",
+ " 588 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 324 | \n",
+ " 1013 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 2460 | \n",
+ " 456 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 2883 | \n",
+ " 766 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 2296 | \n",
+ " 701 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 1150 | \n",
+ " 2412 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 190 | \n",
+ " 2642 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 1586 | \n",
+ " 3 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 1379 | \n",
+ " 22 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 1624 | \n",
+ " 734 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 947 | \n",
+ " 2536 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 1098 | \n",
+ " 1689 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 527 | \n",
+ " 2923 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 1319 | \n",
+ " 818 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 2760 | \n",
+ " 2097 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 264 | \n",
+ " 1354 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 2269 | \n",
+ " 155 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 2316 | \n",
+ " 1910 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 2844 | \n",
+ " 1818 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 8999970 | \n",
+ " 1669 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999971 | \n",
+ " 1113 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999972 | \n",
+ " 1533 | \n",
+ " 224 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999973 | \n",
+ " 2810 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999974 | \n",
+ " 2427 | \n",
+ " 224 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999975 | \n",
+ " 2529 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999976 | \n",
+ " 1221 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999977 | \n",
+ " 402 | \n",
+ " 224 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999978 | \n",
+ " 501 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999979 | \n",
+ " 269 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999980 | \n",
+ " 773 | \n",
+ " 224 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999981 | \n",
+ " 1091 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999982 | \n",
+ " 2453 | \n",
+ " 2584 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999983 | \n",
+ " 2813 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999984 | \n",
+ " 927 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999985 | \n",
+ " 2921 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999986 | \n",
+ " 1610 | \n",
+ " 2584 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999987 | \n",
+ " 1868 | \n",
+ " 2584 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999988 | \n",
+ " 1897 | \n",
+ " 2584 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999989 | \n",
+ " 309 | \n",
+ " 224 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999990 | \n",
+ " 1687 | \n",
+ " 224 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999991 | \n",
+ " 1939 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999992 | \n",
+ " 1642 | \n",
+ " 224 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999993 | \n",
+ " 2206 | \n",
+ " 559 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999994 | \n",
+ " 923 | \n",
+ " 559 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999995 | \n",
+ " 196 | \n",
+ " 559 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999996 | \n",
+ " 1481 | \n",
+ " 559 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 8999997 | \n",
+ " 313 | \n",
+ " 559 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999998 | \n",
+ " 2306 | \n",
+ " 559 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 8999999 | \n",
+ " 2265 | \n",
+ " 389 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G3k (input data) \n",
+ "╨╥ ▚ D_ifr0 (4 ms) \n",
+ "╥╨ ▚ D_ifr1 (29 ms) \n",
+ "╨╥╥ ▚ D_ifr2 (120 ms) \n",
+ "╥╨║ ▚ PrevD_ifr3 (6 ms) \n",
+ "║╥╨╥╥ ▚ D_ifr3 (343 ms) \n",
+ "║╨╥║║ ▚ PrevD_ifr4 (16 ms) 3 / ∞ / stop.\n",
+ "╨ ║╨║ ▚ Done_ifr4 (192 ms) 2 / ∞ / stop.\n",
+ "╥╥║╥╨ ▚ D_ifr4 (927 ms) 3 / ∞ / stop.\n",
+ "╨║║║╥ ▚ D_ifr5 (941 ms) 3 / ∞ / stop.\n",
+ " ╨║║║ ▚ PrevD_ifr5 (20 ms) 3 / ∞ / stop.\n",
+ " ║║╨ ▚ D (995 ms) \n",
+ " ╨╨ ▚ Done_ifr5 (167 ms) 2 / ∞ / stop.\n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ "Query is stored at \u001b[1mD_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mD\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1826 | \n",
+ " 1104 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 59 | \n",
+ " 1395 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 2471 | \n",
+ " 2966 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 3210 | \n",
+ " 84 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2774 | \n",
+ " 995 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 3781 | \n",
+ " 1142 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 2982 | \n",
+ " 1367 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 1755 | \n",
+ " 175 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 3812 | \n",
+ " 507 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 2230 | \n",
+ " 1068 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 2159 | \n",
+ " 2322 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 77 | \n",
+ " 3112 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 325 | \n",
+ " 567 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 764 | \n",
+ " 632 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 2744 | \n",
+ " 273 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 3486 | \n",
+ " 2815 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 2781 | \n",
+ " 1680 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 3729 | \n",
+ " 977 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 3266 | \n",
+ " 3864 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 2316 | \n",
+ " 2858 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 2985 | \n",
+ " 2141 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 2043 | \n",
+ " 669 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 3425 | \n",
+ " 1606 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 3785 | \n",
+ " 3867 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 2056 | \n",
+ " 3230 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 3792 | \n",
+ " 1743 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 98 | \n",
+ " 3959 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 2408 | \n",
+ " 3631 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 1946 | \n",
+ " 2013 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 3567 | \n",
+ " 1160 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 15995970 | \n",
+ " 344 | \n",
+ " 3346 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995971 | \n",
+ " 3314 | \n",
+ " 3346 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995972 | \n",
+ " 819 | \n",
+ " 3346 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995973 | \n",
+ " 1882 | \n",
+ " 3346 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995974 | \n",
+ " 2655 | \n",
+ " 471 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995975 | \n",
+ " 716 | \n",
+ " 471 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995976 | \n",
+ " 1827 | \n",
+ " 3387 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995977 | \n",
+ " 3972 | \n",
+ " 3387 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995978 | \n",
+ " 219 | \n",
+ " 978 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995979 | \n",
+ " 3675 | \n",
+ " 2909 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995980 | \n",
+ " 614 | \n",
+ " 3136 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995981 | \n",
+ " 3945 | \n",
+ " 3136 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995982 | \n",
+ " 2500 | \n",
+ " 3136 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995983 | \n",
+ " 1575 | \n",
+ " 1105 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995984 | \n",
+ " 3042 | \n",
+ " 3346 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995985 | \n",
+ " 1004 | \n",
+ " 3346 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995986 | \n",
+ " 323 | \n",
+ " 3346 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995987 | \n",
+ " 3328 | \n",
+ " 2037 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995988 | \n",
+ " 2268 | \n",
+ " 2037 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995989 | \n",
+ " 2234 | \n",
+ " 3346 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995990 | \n",
+ " 1083 | \n",
+ " 3346 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995991 | \n",
+ " 2456 | \n",
+ " 3346 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995992 | \n",
+ " 3067 | \n",
+ " 3346 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995993 | \n",
+ " 2028 | \n",
+ " 3346 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 15995994 | \n",
+ " 2330 | \n",
+ " 3346 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995995 | \n",
+ " 3769 | \n",
+ " 3346 | \n",
+ " 6 | \n",
+ "
\n",
+ " \n",
+ " | 15995996 | \n",
+ " 788 | \n",
+ " 3346 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995997 | \n",
+ " 1305 | \n",
+ " 3346 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 15995998 | \n",
+ " 3600 | \n",
+ " 3346 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 15995999 | \n",
+ " 1241 | \n",
+ " 3346 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G4k (input data) \n",
+ "╨╥ ▚ D_ifr0 (4 ms) \n",
+ "╥╨ ▚ D_ifr1 (37 ms) \n",
+ "╨╥╥ ▚ D_ifr2 (120 ms) \n",
+ "╥╨║ ▚ PrevD_ifr3 (10 ms) \n",
+ "║╥╨╥╥ ▚ D_ifr3 (498 ms) \n",
+ "║╨╥║║ ▚ PrevD_ifr4 (26 ms) 3 / ∞ / stop.\n",
+ "╨ ║╨║ ▚ Done_ifr4 (274 ms) 2 / ∞ / stop.\n",
+ "╥╥║╥╨ ▚ D_ifr4 (1803 ms) 3 / ∞ / stop.\n",
+ "╨║║║╥ ▚ D_ifr5 (1666 ms) 3 / ∞ / stop.\n",
+ " ╨║║║ ▚ PrevD_ifr5 (46 ms) 3 / ∞ / stop.\n",
+ " ║║╨ ▚ D (1864 ms) \n",
+ " ╨╨ ▚ Done_ifr5 (319 ms) 3 / ∞ / stop.\n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ "Query is stored at \u001b[1mD_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mD\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " col0 | \n",
+ " col1 | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 2379 | \n",
+ " 4010 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 781 | \n",
+ " 967 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1978 | \n",
+ " 3870 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4233 | \n",
+ " 1699 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1286 | \n",
+ " 2476 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 1348 | \n",
+ " 474 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 1916 | \n",
+ " 3457 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 7 | \n",
+ " 2125 | \n",
+ " 3540 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 8 | \n",
+ " 2381 | \n",
+ " 2207 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 9 | \n",
+ " 2707 | \n",
+ " 2646 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 10 | \n",
+ " 384 | \n",
+ " 333 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 11 | \n",
+ " 2663 | \n",
+ " 2428 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 12 | \n",
+ " 1750 | \n",
+ " 3449 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 13 | \n",
+ " 1145 | \n",
+ " 2176 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 14 | \n",
+ " 4553 | \n",
+ " 499 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 15 | \n",
+ " 4125 | \n",
+ " 297 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 16 | \n",
+ " 1758 | \n",
+ " 1210 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 17 | \n",
+ " 4517 | \n",
+ " 1094 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 18 | \n",
+ " 3440 | \n",
+ " 2037 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 19 | \n",
+ " 2124 | \n",
+ " 1961 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 20 | \n",
+ " 4365 | \n",
+ " 1182 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 21 | \n",
+ " 379 | \n",
+ " 1068 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 22 | \n",
+ " 3995 | \n",
+ " 4642 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 23 | \n",
+ " 1939 | \n",
+ " 2534 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 24 | \n",
+ " 2052 | \n",
+ " 3014 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 25 | \n",
+ " 4798 | \n",
+ " 2626 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 26 | \n",
+ " 2936 | \n",
+ " 3287 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 27 | \n",
+ " 3605 | \n",
+ " 1707 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 28 | \n",
+ " 817 | \n",
+ " 974 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | 29 | \n",
+ " 4124 | \n",
+ " 1913 | \n",
+ " 1 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 24994970 | \n",
+ " 4290 | \n",
+ " 2418 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994971 | \n",
+ " 1613 | \n",
+ " 978 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994972 | \n",
+ " 3418 | \n",
+ " 978 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994973 | \n",
+ " 3811 | \n",
+ " 2340 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994974 | \n",
+ " 1317 | \n",
+ " 2340 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994975 | \n",
+ " 833 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994976 | \n",
+ " 3530 | \n",
+ " 378 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994977 | \n",
+ " 3076 | \n",
+ " 378 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994978 | \n",
+ " 1981 | \n",
+ " 378 | \n",
+ " 3 | \n",
+ "
\n",
+ " \n",
+ " | 24994979 | \n",
+ " 4205 | \n",
+ " 378 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994980 | \n",
+ " 1202 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994981 | \n",
+ " 383 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994982 | \n",
+ " 2811 | \n",
+ " 378 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994983 | \n",
+ " 1697 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994984 | \n",
+ " 2259 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994985 | \n",
+ " 2189 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994986 | \n",
+ " 751 | \n",
+ " 378 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994987 | \n",
+ " 1810 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994988 | \n",
+ " 3200 | \n",
+ " 378 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994989 | \n",
+ " 384 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994990 | \n",
+ " 1631 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994991 | \n",
+ " 736 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994992 | \n",
+ " 365 | \n",
+ " 378 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994993 | \n",
+ " 1450 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994994 | \n",
+ " 4704 | \n",
+ " 378 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ " | 24994995 | \n",
+ " 2250 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994996 | \n",
+ " 1738 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994997 | \n",
+ " 3523 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994998 | \n",
+ " 1306 | \n",
+ " 378 | \n",
+ " 5 | \n",
+ "
\n",
+ " \n",
+ " | 24994999 | \n",
+ " 1137 | \n",
+ " 378 | \n",
+ " 4 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥ ▚ db.G5k (input data) \n",
+ "╨╥ ▚ D_ifr0 (10 ms) \n",
+ "╥╨ ▚ D_ifr1 (47 ms) \n",
+ "╨╥╥ ▚ D_ifr2 (164 ms) \n",
+ "╥╨║ ▚ PrevD_ifr3 (21 ms) \n",
+ "║╥╨╥╥ ▚ D_ifr3 (675 ms) \n",
+ "║╨╥║║ ▚ PrevD_ifr4 (64 ms) 3 / ∞ / stop.\n",
+ "╨ ║╨║ ▚ Done_ifr4 (449 ms) 2 / ∞ / stop.\n",
+ "╥╥║╥╨ ▚ D_ifr4 (2923 ms) 3 / ∞ / stop.\n",
+ "╨║║║╥ ▚ D_ifr5 (2815 ms) 3 / ∞ / stop.\n",
+ " ╨║║║ ▚ PrevD_ifr5 (105 ms) 3 / ∞ / stop.\n",
+ " ║║╨ ▚ D (3091 ms) \n",
+ " ╨╨ ▚ Done_ifr5 (498 ms) 3 / ∞ / stop.\n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " === Timing for Pairwise Distances ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 2.099346245999982 |\n",
+ "| G2k | 4.338347781999914 |\n",
+ "| G3k | 8.60555926699999 |\n",
+ "| G4k | 15.257616865000045 |\n",
+ "| G5k | 23.63516611 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop (\"Pairwise Distances\", graphs)\n",
+ "%%logica D\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "G(a, b) :- db.{loop_parameter}(a, b);\n",
+ "\n",
+ "@Recursive(D, ∞, stop: Done);\n",
+ "D(a, b) Min= 1 :- G(a, b);\n",
+ "D(a, c) Min= D(a, b) + 1 :- G(b, c);\n",
+ "\n",
+ "PrevD(a, b) :- D(a, b);\n",
+ "\n",
+ "Done() :- D(a, b) => PrevD(a, b);"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "89203d0d",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from logica.common import graph\n",
+ "\n",
+ "graph.DirectedGraph(Tree)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9e0fd233",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "6a7e84b3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 14656 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 14657 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree7 (input data) \n",
+ "╨║ ▚ SGGold (14 ms) \n",
+ "╥╨ ▚ SG_ifr0 (2 ms) \n",
+ "╨╥ ▚ SG_ifr1 (19 ms) \n",
+ "╥╨╥ ▚ SG_ifr2 (3 ms) \n",
+ "╨╥║╥╥ ▚ SG_ifr3 (8 ms) \n",
+ "╥║╨║║ ▚ PrevSG_ifr3 (1 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (1 ms) 3 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevSG_ifr4 (2 ms) 3 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ SG_ifr4 (6 ms) 3 / ∞ / stop.\n",
+ "║╨║║╥ ▚ SG_ifr5 (6 ms) 3 / ∞ / stop.\n",
+ "╨ ╨║║ ▚ Done_ifr5 (1 ms) 2 / ∞ / stop.\n",
+ " ╨║ ▚ PrevSG_ifr5 (2 ms) 3 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (5 ms) \n",
+ "╨ ▚ SGCheck (1 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 99337 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 99338 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree8 (input data) \n",
+ "╨║ ▚ SGGold (5 ms) \n",
+ "╥╨ ▚ SG_ifr0 (2 ms) \n",
+ "╨╥ ▚ SG_ifr1 (8 ms) \n",
+ "╥╨╥ ▚ SG_ifr2 (4 ms) \n",
+ "╨╥║╥╥ ▚ SG_ifr3 (7 ms) \n",
+ "╥║╨║║ ▚ PrevSG_ifr3 (2 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (1 ms) 3 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevSG_ifr4 (16 ms) 3 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ SG_ifr4 (28 ms) 3 / ∞ / stop.\n",
+ "╨╨║║ ▚ Done_ifr5 (2 ms) 3 / ∞ / stop.\n",
+ "╥ ╨║ ▚ SG_ifr5 (27 ms) 3 / ∞ / stop.\n",
+ "║ ╨ ▚ PrevSG_ifr5 (15 ms) 3 / ∞ / stop.\n",
+ "╨╥ ▚ SG (28 ms) \n",
+ " ╨ ▚ SGCheck (1 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 638093 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 638094 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree9 (input data) \n",
+ "╨║ ▚ SGGold (21 ms) \n",
+ "╥╨ ▚ SG_ifr0 (2 ms) \n",
+ "╨╥ ▚ SG_ifr1 (4 ms) \n",
+ "╥╨╥ ▚ SG_ifr2 (9 ms) \n",
+ "╨╥║╥╥ ▚ SG_ifr3 (15 ms) \n",
+ "╥║╨║║ ▚ PrevSG_ifr3 (5 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (2 ms) 4 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevSG_ifr4 (11 ms) 4 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ SG_ifr4 (92 ms) 4 / ∞ / stop.\n",
+ "║╨║║╥ ▚ SG_ifr5 (88 ms) 4 / ∞ / stop.\n",
+ "╨ ╨║║ ▚ Done_ifr5 (2 ms) 3 / ∞ / stop.\n",
+ " ╨║ ▚ PrevSG_ifr5 (39 ms) 4 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (97 ms) \n",
+ "╨ ▚ SGCheck (1 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4153718 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4153719 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree10 (input data) \n",
+ "╨║ ▚ SGGold (21 ms) \n",
+ "╥╨ ▚ SG_ifr0 (4 ms) \n",
+ "╨╥ ▚ SG_ifr1 (8 ms) \n",
+ "╥╨╥ ▚ SG_ifr2 (17 ms) \n",
+ "╨╥║╥╥ ▚ SG_ifr3 (47 ms) \n",
+ "╥║╨║║ ▚ PrevSG_ifr3 (11 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (5 ms) 4 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevSG_ifr4 (24 ms) 4 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ SG_ifr4 (132 ms) 4 / ∞ / stop.\n",
+ "║╨║║╥ ▚ SG_ifr5 (223 ms) 4 / ∞ / stop.\n",
+ "╨ ╨║║ ▚ Done_ifr5 (5 ms) 4 / ∞ / stop.\n",
+ " ╨║ ▚ PrevSG_ifr5 (26 ms) 4 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (142 ms) \n",
+ "╨ ▚ SGCheck (2 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 26253119 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 26253120 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree11 (input data) \n",
+ "╨║ ▚ SGGold (40 ms) \n",
+ "╥╨ ▚ SG_ifr0 (6 ms) \n",
+ "╨╥ ▚ SG_ifr1 (22 ms) \n",
+ "╥╨╥ ▚ SG_ifr2 (40 ms) \n",
+ "╨╥║╥╥ ▚ SG_ifr3 (82 ms) \n",
+ "╥║╨║║ ▚ PrevSG_ifr3 (12 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (24 ms) 5 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevSG_ifr4 (174 ms) 5 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ SG_ifr4 (842 ms) 5 / ∞ / stop.\n",
+ "║╨║║╥ ▚ SG_ifr5 (796 ms) 5 / ∞ / stop.\n",
+ "╨ ╨║║ ▚ Done_ifr5 (14 ms) 4 / ∞ / stop.\n",
+ " ╨║ ▚ PrevSG_ifr5 (173 ms) 5 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (535 ms) \n",
+ "╨ ▚ SGCheck (5 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 163681848 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 163681849 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥ ▚ db.Tree12 (input data) \n",
+ "╨║ ▚ SGGold (137 ms) \n",
+ "╥╨ ▚ SG_ifr0 (16 ms) \n",
+ "╨╥ ▚ SG_ifr1 (39 ms) \n",
+ "╥╨╥ ▚ SG_ifr2 (89 ms) \n",
+ "╨╥║╥╥ ▚ SG_ifr3 (81 ms) \n",
+ "╥║╨║║ ▚ PrevSG_ifr3 (30 ms) \n",
+ "╨╨ ║║ ▚ Done_ifr4 (154 ms) 5 / ∞ / stop.\n",
+ "╥ ╨║ ▚ PrevSG_ifr4 (1173 ms) 5 / ∞ / stop.\n",
+ "║╥╥╥╨ ▚ SG_ifr4 (5607 ms) 5 / ∞ / stop.\n",
+ "║╨║║╥ ▚ SG_ifr5 (5309 ms) 5 / ∞ / stop.\n",
+ "╨ ╨║║ ▚ Done_ifr5 (137 ms) 5 / ∞ / stop.\n",
+ " ╨║ ▚ PrevSG_ifr5 (1030 ms) 5 / ∞ / stop.\n",
+ "╥ ╨ ▚ SG (5311 ms) \n",
+ "╨ ▚ SGCheck (19 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ " === Timing for Same Generation ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| Tree7 | 0.7857960700000604 |\n",
+ "| Tree8 | 0.9151512260000345 |\n",
+ "| Tree9 | 1.6111061390000714 |\n",
+ "| Tree10 | 2.1807925879999175 |\n",
+ "| Tree11 | 7.708316269999955 |\n",
+ "| Tree12 | 37.75424764900015 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop (\"Same Generation\", trees)\n",
+ "%%logica SGCheck, SGGold\n",
+ "\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "Tree(x, y) :- db.{loop_parameter}(x, y);\n",
+ "#Tree(x, y) :- db.Tree12(x, y);\n",
+ "\n",
+ "Node(x) distinct :- x in [a, b], Tree(a, b), Str(x);\n",
+ "\n",
+ "# Tree(\"a\", \"b\");\n",
+ "# Tree(\"a\", \"c\");\n",
+ "# Tree(\"c\", \"d\");\n",
+ "\n",
+ "@Recursive(SG, ∞, stop: Done);\n",
+ "SG(x, y) distinct :- Tree(a, x), Tree(a, y);\n",
+ "SG(x, y) distinct :- SG(a, b), Tree(a, x), Tree(b, y);\n",
+ "PrevSG(x, y) :- SG(x, y);\n",
+ "Done() :- Sum{ 1 :- SG(x, y) } == Sum{ 1 :- PrevSG(x, y) };\n",
+ " \n",
+ "SGCheck() += 1 :- SG();\n",
+ "SGGold() += 1 :- Node(a), Node(b), Length(a) == Length(b);\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "358436aa",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'a': 0.00022921100003259198,\n",
+ " 'b': 0.0001869599999508864,\n",
+ " 'c': 0.00017046899995420972,\n",
+ " 'G1k': 2.099346245999982,\n",
+ " 'G2k': 4.338347781999914,\n",
+ " 'G3k': 8.60555926699999,\n",
+ " 'G4k': 15.257616865000045,\n",
+ " 'G5k': 23.63516611,\n",
+ " 'Tree7': 0.7857960700000604,\n",
+ " 'Tree8': 0.9151512260000345,\n",
+ " 'Tree9': 1.6111061390000714,\n",
+ " 'Tree10': 2.1807925879999175,\n",
+ " 'Tree11': 7.708316269999955,\n",
+ " 'Tree12': 37.75424764900015}"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "timing"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "34201228",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'a': 0.00022921100003259198,\n",
+ " 'b': 0.0001869599999508864,\n",
+ " 'c': 0.00017046899995420972,\n",
+ " 'G1k': 2.099346245999982,\n",
+ " 'G2k': 4.338347781999914,\n",
+ " 'G3k': 8.60555926699999,\n",
+ " 'G4k': 15.257616865000045,\n",
+ " 'G5k': 23.63516611,\n",
+ " 'Tree7': 0.7857960700000604,\n",
+ " 'Tree8': 0.9151512260000345,\n",
+ " 'Tree9': 1.6111061390000714,\n",
+ " 'Tree10': 2.1807925879999175,\n",
+ " 'Tree11': 7.708316269999955,\n",
+ " 'Tree12': 37.75424764900015}"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "timing"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "77ff5dec",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 14657 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 14657 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree7 (input data) \n",
+ "╨║║╥ ▚ Gen_ifr0 (5 ms) \n",
+ "╥╨║║╥ ▚ Gen_ifr1 (3 ms) \n",
+ "║ ╨║║ ▚ SGGold (4 ms) \n",
+ "╨╥ ║║ ▚ NextGen_ifr2 (2 ms) \n",
+ "╥║ ╨║ ▚ NextGen_ifr1 (2 ms) \n",
+ "╨║╥╥╨ ▚ Gen_ifr2 (30 ms) \n",
+ "╥╨╨║╥ ▚ Gen_ifr3 (13 ms) \n",
+ "╨╥ ║║ ▚ NextGen_ifr4 (2 ms) \n",
+ "╥║ ╨║ ▚ NextGen_ifr3 (2 ms) \n",
+ "╨║╥╥╨╥ ▚ Gen_ifr4 (3 ms) \n",
+ "╥╨╨║╥║╥╥ ▚ Gen_ifr5 (15 ms) \n",
+ "╨╥ ║║║║║ ▚ NextGen_ifr6 (2 ms) 3 / ∞ / stop.\n",
+ "╥║ ╨║║║║ ▚ NextGen_ifr5 (2 ms) \n",
+ "║║╥ ║╨║║ ▚ PrevGen_ifr5 (0 ms) \n",
+ "║║╨ ╨ ║║ ▚ Done_ifr6 (23 ms) 3 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (0 ms) 3 / ∞ / stop.\n",
+ "╨║║╥╥╥╥╨ ▚ Gen_ifr6 (3 ms) 3 / ∞ / stop.\n",
+ " ║╨╨║║║ ▚ Done_ifr7 (3 ms) 2 / ∞ / stop.\n",
+ "╥╨ ╨║║ ▚ Gen_ifr7 (3 ms) 3 / ∞ / stop.\n",
+ "║ ╨║ ▚ PrevGen_ifr7 (0 ms) 3 / ∞ / stop.\n",
+ "║╥ ╨ ▚ NextGen_ifr7 (1 ms) 3 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (9 ms) \n",
+ " ╨ ▚ SGCheck (1 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 99338 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 99338 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree8 (input data) \n",
+ "╨║║╥ ▚ Gen_ifr0 (17 ms) \n",
+ "╥╨║║╥ ▚ Gen_ifr1 (27 ms) \n",
+ "║ ╨║║ ▚ SGGold (6 ms) \n",
+ "╨╥ ║║ ▚ NextGen_ifr2 (2 ms) \n",
+ "╥║ ╨║ ▚ NextGen_ifr1 (2 ms) \n",
+ "╨║╥╥╨ ▚ Gen_ifr2 (6 ms) \n",
+ "╥╨╨║╥ ▚ Gen_ifr3 (4 ms) \n",
+ "╨╥ ║║ ▚ NextGen_ifr4 (2 ms) \n",
+ "╥║ ╨║ ▚ NextGen_ifr3 (2 ms) \n",
+ "╨║╥╥╨╥ ▚ Gen_ifr4 (3 ms) \n",
+ "╥╨╨║╥║╥╥ ▚ Gen_ifr5 (26 ms) \n",
+ "╨╥ ║║║║║ ▚ NextGen_ifr6 (2 ms) 3 / ∞ / stop.\n",
+ "╥║ ╨║║║║ ▚ NextGen_ifr5 (2 ms) \n",
+ "║║╥ ║╨║║ ▚ PrevGen_ifr5 (0 ms) \n",
+ "║║╨ ╨ ║║ ▚ Done_ifr6 (3 ms) 3 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (0 ms) 3 / ∞ / stop.\n",
+ "╨║║╥╥╥╥╨ ▚ Gen_ifr6 (3 ms) 3 / ∞ / stop.\n",
+ " ║╨╨║║║ ▚ Done_ifr7 (20 ms) 3 / ∞ / stop.\n",
+ "╥╨ ╨║║ ▚ Gen_ifr7 (3 ms) 3 / ∞ / stop.\n",
+ "║ ╨║ ▚ PrevGen_ifr7 (0 ms) 3 / ∞ / stop.\n",
+ "║╥ ╨ ▚ NextGen_ifr7 (2 ms) 3 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (20 ms) \n",
+ " ╨ ▚ SGCheck (2 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 638094 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 638094 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree9 (input data) \n",
+ "╨║║╥╥ ▚ Gen_ifr1 (5 ms) \n",
+ " ╨║║║ ▚ SGGold (24 ms) \n",
+ "╥ ║╨║ ▚ NextGen_ifr2 (3 ms) \n",
+ "║╥╨ ║ ▚ Gen_ifr0 (4 ms) \n",
+ "║╨╥ ║ ▚ NextGen_ifr1 (3 ms) \n",
+ "║╥╨╥╨ ▚ Gen_ifr2 (6 ms) \n",
+ "╨╨╥║╥ ▚ Gen_ifr3 (4 ms) \n",
+ "╥ ╨║║ ▚ NextGen_ifr4 (3 ms) \n",
+ "║╥ ╨║ ▚ NextGen_ifr3 (2 ms) \n",
+ "║╨╥╥╨╥ ▚ Gen_ifr4 (4 ms) \n",
+ "╨╥╨║╥║╥╥ ▚ Gen_ifr5 (4 ms) \n",
+ "╥╨ ║║║║║ ▚ NextGen_ifr6 (2 ms) 4 / ∞ / stop.\n",
+ "║╥ ╨║║║║ ▚ NextGen_ifr5 (2 ms) \n",
+ "║║╥ ║╨║║ ▚ PrevGen_ifr5 (0 ms) \n",
+ "║║╨ ╨ ║║ ▚ Done_ifr6 (4 ms) 4 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (0 ms) 4 / ∞ / stop.\n",
+ "║╨║╥╥╥╥╨ ▚ Gen_ifr6 (5 ms) 4 / ∞ / stop.\n",
+ "║ ╨╨║║║ ▚ Done_ifr7 (4 ms) 3 / ∞ / stop.\n",
+ "╨╥ ╨║║ ▚ Gen_ifr7 (4 ms) 4 / ∞ / stop.\n",
+ " ║ ╨║ ▚ PrevGen_ifr7 (0 ms) 4 / ∞ / stop.\n",
+ "╥║ ╨ ▚ NextGen_ifr7 (2 ms) 4 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (10 ms) \n",
+ " ╨ ▚ SGCheck (4 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4153719 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 4153719 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree10 (input data) \n",
+ "╨║║╥ ▚ Gen_ifr0 (5 ms) \n",
+ "╥╨║║╥ ▚ Gen_ifr1 (6 ms) \n",
+ "║ ╨║║ ▚ SGGold (11 ms) \n",
+ "╨╥ ║║ ▚ NextGen_ifr2 (3 ms) \n",
+ "╥║ ╨║ ▚ NextGen_ifr1 (3 ms) \n",
+ "╨║╥╥╨ ▚ Gen_ifr2 (7 ms) \n",
+ "╥╨╨║╥ ▚ Gen_ifr3 (7 ms) \n",
+ "╨╥ ║║ ▚ NextGen_ifr4 (3 ms) \n",
+ "╥║ ╨║ ▚ NextGen_ifr3 (3 ms) \n",
+ "╨║╥╥╨╥ ▚ Gen_ifr4 (6 ms) \n",
+ "╥╨╨║╥║╥╥ ▚ Gen_ifr5 (18 ms) \n",
+ "╨╥ ║║║║║ ▚ NextGen_ifr6 (3 ms) 4 / ∞ / stop.\n",
+ "╥║ ╨║║║║ ▚ NextGen_ifr5 (3 ms) \n",
+ "║║╥ ║╨║║ ▚ PrevGen_ifr5 (1 ms) \n",
+ "║║╨ ╨ ║║ ▚ Done_ifr6 (6 ms) 4 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (1 ms) 4 / ∞ / stop.\n",
+ "╨║║╥╥╥╥╨ ▚ Gen_ifr6 (6 ms) 4 / ∞ / stop.\n",
+ " ║╨╨║║║ ▚ Done_ifr7 (5 ms) 4 / ∞ / stop.\n",
+ "╥╨ ╨║║ ▚ Gen_ifr7 (6 ms) 4 / ∞ / stop.\n",
+ "║ ╨║ ▚ PrevGen_ifr7 (1 ms) 4 / ∞ / stop.\n",
+ "║╥ ╨ ▚ NextGen_ifr7 (2 ms) 4 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (8 ms) \n",
+ " ╨ ▚ SGCheck (21 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 26253120 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 26253120 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree11 (input data) \n",
+ "╨║║╥╥ ▚ Gen_ifr1 (9 ms) \n",
+ " ╨║║║ ▚ SGGold (46 ms) \n",
+ "╥ ║╨║ ▚ NextGen_ifr2 (5 ms) \n",
+ "║╥╨ ║ ▚ Gen_ifr0 (9 ms) \n",
+ "║╨╥ ║ ▚ NextGen_ifr1 (5 ms) \n",
+ "║╥╨╥╨ ▚ Gen_ifr2 (18 ms) \n",
+ "╨╨╥║╥ ▚ Gen_ifr3 (11 ms) \n",
+ "╥ ╨║║ ▚ NextGen_ifr4 (5 ms) \n",
+ "║╥ ╨║ ▚ NextGen_ifr3 (5 ms) \n",
+ "║╨╥╥╨╥ ▚ Gen_ifr4 (12 ms) \n",
+ "╨╥╨║╥║╥╥ ▚ Gen_ifr5 (11 ms) \n",
+ "╥╨ ║║║║║ ▚ NextGen_ifr6 (4 ms) 5 / ∞ / stop.\n",
+ "║╥ ╨║║║║ ▚ NextGen_ifr5 (6 ms) \n",
+ "║║╥ ║╨║║ ▚ PrevGen_ifr5 (1 ms) \n",
+ "║║╨ ╨ ║║ ▚ Done_ifr6 (7 ms) 5 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (1 ms) 5 / ∞ / stop.\n",
+ "║╨║╥╥╥╥╨ ▚ Gen_ifr6 (20 ms) 5 / ∞ / stop.\n",
+ "║ ╨╨║║║ ▚ Done_ifr7 (6 ms) 4 / ∞ / stop.\n",
+ "╨╥ ╨║║ ▚ Gen_ifr7 (9 ms) 5 / ∞ / stop.\n",
+ " ║ ╨║ ▚ PrevGen_ifr7 (1 ms) 5 / ∞ / stop.\n",
+ "╥║ ╨ ▚ NextGen_ifr7 (5 ms) 5 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (11 ms) \n",
+ " ╨ ▚ SGCheck (127 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ "Query is stored at \u001b[1mSGCheck_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGCheck\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 163681849 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Query is stored at \u001b[1mSGGold_sql\u001b[0m variable.\n",
+ "The following table is stored at \u001b[1mSGGold\u001b[0m variable.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " \n",
+ " | \n",
+ " logica_value | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 163681849 | \n",
+ "
\n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "╥╥╥ ▚ db.Tree12 (input data) \n",
+ "╨║║╥╥ ▚ Gen_ifr1 (25 ms) \n",
+ " ╨║║║ ▚ SGGold (118 ms) \n",
+ "╥ ║╨║ ▚ NextGen_ifr2 (8 ms) \n",
+ "║╥╨ ║ ▚ Gen_ifr0 (23 ms) \n",
+ "║╨╥ ║ ▚ NextGen_ifr1 (9 ms) \n",
+ "║╥╨╥╨ ▚ Gen_ifr2 (18 ms) \n",
+ "╨╨╥║╥ ▚ Gen_ifr3 (23 ms) \n",
+ "╥ ╨║║ ▚ NextGen_ifr4 (7 ms) \n",
+ "║╥ ╨║ ▚ NextGen_ifr3 (7 ms) \n",
+ "║╨╥╥╨╥ ▚ Gen_ifr4 (18 ms) \n",
+ "╨╥╨║╥║╥╥ ▚ Gen_ifr5 (24 ms) \n",
+ "╥╨ ║║║║║ ▚ NextGen_ifr6 (7 ms) 5 / ∞ / stop.\n",
+ "║╥ ╨║║║║ ▚ NextGen_ifr5 (8 ms) \n",
+ "║║╥ ║╨║║ ▚ PrevGen_ifr5 (5 ms) \n",
+ "║║╨ ╨ ║║ ▚ Done_ifr6 (11 ms) 5 / ∞ / stop.\n",
+ "║║╥ ╨║ ▚ PrevGen_ifr6 (4 ms) 5 / ∞ / stop.\n",
+ "║╨║╥╥╥╥╨ ▚ Gen_ifr6 (24 ms) 5 / ∞ / stop.\n",
+ "║ ╨╨║║║ ▚ Done_ifr7 (10 ms) 5 / ∞ / stop.\n",
+ "╨╥ ╨║║ ▚ Gen_ifr7 (18 ms) 5 / ∞ / stop.\n",
+ " ║ ╨║ ▚ PrevGen_ifr7 (3 ms) 5 / ∞ / stop.\n",
+ "╥║ ╨ ▚ NextGen_ifr7 (7 ms) 5 / ∞ / stop.\n",
+ "╨╨╥ ▚ Gen (24 ms) \n",
+ " ╨ ▚ SGCheck (788 ms) \n",
+ "[ Execution complete. ]
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " \n",
+ " \n",
+ " === Timing for Same Generation Logica-style ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| Tree7 | 1.0253999930000646 |\n",
+ "| Tree8 | 1.1346653619998506 |\n",
+ "| Tree9 | 1.048337869000079 |\n",
+ "| Tree10 | 1.2038090660000762 |\n",
+ "| Tree11 | 1.4260789869999826 |\n",
+ "| Tree12 | 2.5498552100000325 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop (\"Same Generation Logica-style\", trees)\n",
+ "%%logica SGCheck, SGGold\n",
+ "\n",
+ "\n",
+ "@AttachDatabase(\"db\", \"graphs.db\");\n",
+ "\n",
+ "Tree(x, y) :- db.{loop_parameter}(x, y);\n",
+ "#Tree(x, y) :- db.Tree7(x, y);\n",
+ "\n",
+ "Node(x) distinct :- x in [a, b], Tree(a, b), Str(x);\n",
+ "# Tree(\"a\", \"b\");\n",
+ "# Tree(\"a\", \"c\");\n",
+ "# Tree(\"c\", \"d\");\n",
+ "\n",
+ "\n",
+ "@Recursive(Gen, ∞, stop: Done);\n",
+ "Gen(x) Min= x :- Node(x);\n",
+ "NextGen(Gen(x)) Min= Gen(y) :- Tree(x, y);\n",
+ "Gen(y) Min= NextGen(Gen(x)) :- Tree(x, y);\n",
+ "\n",
+ "PrevGen(x) = Gen(x);\n",
+ "Done() :- Gen(x) => Gen(x) = PrevGen(x);\n",
+ "\n",
+ "SG(x, y) :- Gen(x) = Gen(y);\n",
+ " \n",
+ "\n",
+ "SGCheck() += 1 :- SG();\n",
+ "SGGold() += 1 :- Node(a), Node(b), Length(a) == Length(b);\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "0c1556ee",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'a': 0.00015937499999996163,\n",
+ " 'b': 0.0001060420000000839,\n",
+ " 'c': 9.687500000010729e-05,\n",
+ " 'G1k': 1.5715949169999988,\n",
+ " 'G2k': 4.012602374999993,\n",
+ " 'G3k': 7.555930625000002,\n",
+ " 'G4k': 17.507719375000008,\n",
+ " 'G5k': 27.752416333,\n",
+ " 'Tree7': 4.729736041999985,\n",
+ " 'Tree8': 0.8861973330000126,\n",
+ " 'Tree9': 0.9397843750000163,\n",
+ " 'Tree10': 0.9565629169999852,\n",
+ " 'Tree11': 1.3457253750000007,\n",
+ " 'Tree12': 2.0904798330000176}"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "timing"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "ad8b4061-3a67-4523-884b-6bf465d0fc3e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " === Timing for Test Problem ===\n",
+ "+---------+------------------------+\n",
+ "| problem | time |\n",
+ "+---------+------------------------+\n",
+ "| a | 0.00022921100003259198 |\n",
+ "| b | 0.0001869599999508864 |\n",
+ "| c | 0.00017046899995420972 |\n",
+ "+---------+------------------------+\n",
+ " === Timing for Transitive Closure ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 0.8889665329999161 |\n",
+ "| G2k | 0.6444625069999574 |\n",
+ "| G3k | 0.691283713999951 |\n",
+ "| G4k | 0.6476772670000628 |\n",
+ "| G5k | 0.6453234560000283 |\n",
+ "+---------+--------------------+\n",
+ " === Timing for Transitive Closure ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 1.8763943879999943 |\n",
+ "| G2k | 3.617054680000024 |\n",
+ "| G3k | 7.230493697999918 |\n",
+ "| G4k | 12.564421521999975 |\n",
+ "| G5k | 19.55763669199996 |\n",
+ "+---------+--------------------+\n",
+ " === Timing for Pairwise Distances ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| G1k | 2.099346245999982 |\n",
+ "| G2k | 4.338347781999914 |\n",
+ "| G3k | 8.60555926699999 |\n",
+ "| G4k | 15.257616865000045 |\n",
+ "| G5k | 23.63516611 |\n",
+ "+---------+--------------------+\n",
+ " === Timing for Same Generation ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| Tree7 | 0.7857960700000604 |\n",
+ "| Tree8 | 0.9151512260000345 |\n",
+ "| Tree9 | 1.6111061390000714 |\n",
+ "| Tree10 | 2.1807925879999175 |\n",
+ "| Tree11 | 7.708316269999955 |\n",
+ "| Tree12 | 37.75424764900015 |\n",
+ "+---------+--------------------+\n",
+ " === Timing for Same Generation Logica-style ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| Tree7 | 1.0253999930000646 |\n",
+ "| Tree8 | 1.1346653619998506 |\n",
+ "| Tree9 | 1.048337869000079 |\n",
+ "| Tree10 | 1.2038090660000762 |\n",
+ "| Tree11 | 1.4260789869999826 |\n",
+ "| Tree12 | 2.5498552100000325 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "for report in reports:\n",
+ " print(report)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6d444dae",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/examples/graph/tgdk/benchmark_results.txt b/examples/graph/tgdk/benchmark_results.txt
new file mode 100644
index 0000000..b0844fc
--- /dev/null
+++ b/examples/graph/tgdk/benchmark_results.txt
@@ -0,0 +1,15 @@
++---------+---------+-------------+------------+-----------+----------+-----------+-----------+
+| Problem | Dataset | Logica wall | Logica CPU | Nemo wall | Nemo CPU | Logica N | Nemo N |
++---------+---------+-------------+------------+-----------+----------+-----------+-----------+
+| TC | g1k | 1.71 | 9.06 | 3.35 | 3.35 | 1000000 | 1000000 |
+| TC | g2k | 2.93 | 37.81 | 14.87 | 14.87 | 4000000 | 4000000 |
+| TC | g3k | 4.53 | 66.86 | 36.40 | 36.40 | 9000000 | 9000000 |
+| TC | g4k | 6.55 | 105.75 | 70.53 | 70.52 | 16000000 | 16000000 |
+| TC | g5k | 9.91 | 162.22 | 116.35 | 116.34 | 24995000 | 24995000 |
+| SG | tree7 | 1.13 | 4.00 | 0.02 | 0.02 | 17506 | 17506 |
+| SG | tree8 | 1.40 | 4.48 | 0.11 | 0.11 | 106907 | 106907 |
+| SG | tree9 | 1.98 | 6.46 | 0.99 | 0.99 | 672411 | 672411 |
+| SG | tree10 | 2.50 | 15.77 | 5.93 | 5.93 | 4263436 | 4263436 |
+| SG | tree11 | 6.00 | 85.04 | 38.10 | 38.10 | 25802317 | 25802317 |
+| SG | tree12 | 24.99 | 453.25 | 276.70 | 276.69 | 161827886 | 161827886 |
++---------+---------+-------------+------------+-----------+----------+-----------+-----------+
diff --git a/examples/graph/tgdk/benchmark_souffle.ipynb b/examples/graph/tgdk/benchmark_souffle.ipynb
new file mode 100644
index 0000000..da6cd40
--- /dev/null
+++ b/examples/graph/tgdk/benchmark_souffle.ipynb
@@ -0,0 +1,521 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "adda8767-8b74-41c5-ad8c-408a44ec6eb3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Welcome to simple Souffle graph benchmarking.\n",
+ "Behold the power of The Machine:\n",
+ "CPUs: 32 / RAM: 125Gi\n"
+ ]
+ }
+ ],
+ "source": [
+ "!echo 'Welcome to simple Souffle graph benchmarking.'\n",
+ "!echo 'Behold the power of The Machine:'\n",
+ "!echo \"CPUs: $(nproc) / RAM: $(free -h | awk '/^Mem:/ {print $2}')\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "6593033e-4c5c-4881-abdf-405fcb3790ff",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from logica.common import benchmarking"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "21e3bad5-a0c8-4413-984f-c5b0979851ea",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Overwriting greeting.s\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%writefile greeting.s\n",
+ "\n",
+ ".decl greeting(a:number)\n",
+ "\n",
+ "greeting(42).\n",
+ "\n",
+ ".output greeting(filename=\"greeting.csv\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "7255a7eb-021b-45a4-b4e6-01759b441a2b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!souffle -o greeting greeting.s --jobs=32"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "d571f113-8b89-4650-b8f1-097831406eda",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!./greeting --jobs=32"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "84e77460-0ee4-4040-821d-68bbe2c58fc6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "42\n"
+ ]
+ }
+ ],
+ "source": [
+ "!cat greeting.csv"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "439f043d-fa84-491c-af11-e681e0aabe87",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "graphs = ['g1k', 'g2k', 'g3k', 'g4k', 'g5k']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "afb9d20e-33a0-494e-8b49-97e784beed74",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running g1k.\n",
+ "Overwriting tc_for_g1k.s\n",
+ "Running g2k.\n",
+ "Overwriting tc_for_g2k.s\n",
+ "Running g3k.\n",
+ "Overwriting tc_for_g3k.s\n",
+ "Running g4k.\n",
+ "Overwriting tc_for_g4k.s\n",
+ "Running g5k.\n",
+ "Overwriting tc_for_g5k.s\n",
+ " === Timing for writing TC programs (no printing) ===\n",
+ "+---------+------------------------+\n",
+ "| problem | time |\n",
+ "+---------+------------------------+\n",
+ "| g1k | 0.0007397800000035204 |\n",
+ "| g2k | 0.0005148500022187363 |\n",
+ "| g3k | 0.0006926200003363192 |\n",
+ "| g4k | 0.00047869999980321154 |\n",
+ "| g5k | 0.000721950000297511 |\n",
+ "+---------+------------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('writing TC programs (no printing)', graphs)\n",
+ "%%writefile tc_for_{loop_parameter}.s\n",
+ "\n",
+ ".decl g(a:number,b:number)\n",
+ ".decl tc(a:number, b:number)\n",
+ ".decl result(a:number, b:number)\n",
+ "\n",
+ ".input g(filename=\"data/{loop_parameter}.csv\",delimiter=\",\",headers=true)\n",
+ "\n",
+ "tc(a, b) :- g(a, b).\n",
+ "tc(a, c) :- tc(a, b), g(b, c).\n",
+ "\n",
+ "result(a, b) :- tc(a, b).\n",
+ "\n",
+ ".output result(filename=\"output/tc_{loop_parameter}.csv\",delimiter=\",\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "13829dc3-07c0-4c68-b0f8-f5889f540b04",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "CheckStop.ipynb\t\t\t sg_for_tree10\tsouffleYQ498Q\n",
+ "Duck.ipynb\t\t\t sg_for_tree10.cpp\tsouffleYQ498Q.cpp\n",
+ "Friendster.ipynb\t\t sg_for_tree10.s\tsoufflejjk9QY.cpp\n",
+ "Untitled.ipynb\t\t\t sg_for_tree11\tsouffleu7CP2K.cpp\n",
+ "benchmark_cypher.ipynb\t\t sg_for_tree11.cpp\ttc_for_g1k\n",
+ "benchmark_cypher_2026.ipynb\t sg_for_tree11.s\ttc_for_g1k.cpp\n",
+ "benchmark_logica.ipynb\t\t sg_for_tree12\ttc_for_g1k.s\n",
+ "benchmark_logica_golden.ipynb\t sg_for_tree12.cpp\ttc_for_g2k\n",
+ "benchmark_souffle_compiled.ipynb sg_for_tree12.s\ttc_for_g2k.cpp\n",
+ "benchmark_souffle_compiled_v0.ipynb sg_for_tree7\ttc_for_g2k.s\n",
+ "benchmark_souffle_error1.ipynb\t sg_for_tree7.cpp\ttc_for_g3k\n",
+ "data\t\t\t\t sg_for_tree7.s\ttc_for_g3k.cpp\n",
+ "ddata\t\t\t\t sg_for_tree8\ttc_for_g3k.s\n",
+ "graphs.db\t\t\t sg_for_tree8.cpp\ttc_for_g4k\n",
+ "greeting\t\t\t sg_for_tree8.s\ttc_for_g4k.cpp\n",
+ "greeting.cpp\t\t\t sg_for_tree9\ttc_for_g4k.s\n",
+ "greeting.csv\t\t\t sg_for_tree9.cpp\ttc_for_g5k\n",
+ "greeting.s\t\t\t sg_for_tree9.s\ttc_for_g5k.cpp\n",
+ "logica\t\t\t\t soufflePgAm86\ttc_for_g5k.s\n",
+ "output\t\t\t\t soufflePgAm86.cpp\n"
+ ]
+ }
+ ],
+ "source": [
+ "!ls"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "895ab662-b6b1-4c95-b473-1b312d3e2254",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ ".decl g(a:number,b:number)\n",
+ ".decl tc(a:number, b:number)\n",
+ ".decl result(a:number, b:number)\n",
+ "\n",
+ ".input g(filename=\"data/g2k.csv\",delimiter=\",\",headers=true)\n",
+ "\n",
+ "tc(a, b) :- g(a, b).\n",
+ "tc(a, c) :- tc(a, b), g(b, c).\n",
+ "\n",
+ "result(a, b) :- tc(a, b).\n",
+ "\n",
+ ".output result(filename=\"output/tc_g2k.csv\",delimiter=\",\")\n"
+ ]
+ }
+ ],
+ "source": [
+ "!cat tc_for_g2k.s"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "81649ba9-b964-40dc-8843-3dacd6957fde",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running g1k.\n",
+ "Compiling TC for g1k\n",
+ "Running g2k.\n",
+ "Compiling TC for g2k\n",
+ "Running g3k.\n",
+ "Compiling TC for g3k\n",
+ "Running g4k.\n",
+ "Compiling TC for g4k\n",
+ "Running g5k.\n",
+ "Compiling TC for g5k\n",
+ " === Timing for Souffle TC compilation (no printing) ===\n",
+ "+---------+-------------------+\n",
+ "| problem | time |\n",
+ "+---------+-------------------+\n",
+ "| g1k | 8.22428700599994 |\n",
+ "| g2k | 8.165414749000774 |\n",
+ "| g3k | 8.193714494998858 |\n",
+ "| g4k | 8.172577630997694 |\n",
+ "| g5k | 8.208656769002118 |\n",
+ "+---------+-------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('Souffle TC compilation (no printing)', graphs)\n",
+ "!echo 'Compiling TC for {loop_parameter}'\n",
+ "!souffle -o tc_for_{loop_parameter} tc_for_{loop_parameter}.s --jobs=32"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "8a2bc865-c3d3-4dc5-8234-f375b30e6afa",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running g1k.\n",
+ "Running TC for g1k\n",
+ "Running g2k.\n",
+ "Running TC for g2k\n",
+ "Running g3k.\n",
+ "Running TC for g3k\n",
+ "Running g4k.\n",
+ "Running TC for g4k\n",
+ "Running g5k.\n",
+ "Running TC for g5k\n",
+ " === Timing for Souffle TC ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| g1k | 0.5846970810016501 |\n",
+ "| g2k | 1.7279465979991073 |\n",
+ "| g3k | 3.6051718210001127 |\n",
+ "| g4k | 6.9848356940019585 |\n",
+ "| g5k | 10.963885921999463 |\n",
+ "+---------+--------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('Souffle TC', graphs)\n",
+ "!echo 'Running TC for {loop_parameter}'\n",
+ "!./tc_for_{loop_parameter} --jobs=32"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "03d4a84c-e50a-4787-abce-1532743d6aeb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "trees = ['tree7', 'tree8', 'tree9', 'tree10', 'tree11', 'tree12']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "0f71508a-dbb7-4010-9935-d63edebb7dd6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running tree7.\n",
+ "Overwriting sg_for_tree7.s\n",
+ "Running tree8.\n",
+ "Overwriting sg_for_tree8.s\n",
+ "Running tree9.\n",
+ "Overwriting sg_for_tree9.s\n",
+ "Running tree10.\n",
+ "Overwriting sg_for_tree10.s\n",
+ "Running tree11.\n",
+ "Overwriting sg_for_tree11.s\n",
+ "Running tree12.\n",
+ "Overwriting sg_for_tree12.s\n",
+ " === Timing for writing SG programs (no printing) ===\n",
+ "+---------+-----------------------+\n",
+ "| problem | time |\n",
+ "+---------+-----------------------+\n",
+ "| tree7 | 0.0007509299975936301 |\n",
+ "| tree8 | 0.0013110099971527234 |\n",
+ "| tree9 | 0.0004975899973942433 |\n",
+ "| tree10 | 0.0011515900005178992 |\n",
+ "| tree11 | 0.0004915899990010075 |\n",
+ "| tree12 | 0.0004921899999317247 |\n",
+ "+---------+-----------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('writing SG programs (no printing)', trees)\n",
+ "%%writefile sg_for_{loop_parameter}.s\n",
+ "\n",
+ ".decl g(a:number,b:number)\n",
+ ".decl sg(a:number, b:number)\n",
+ ".decl result(a:number, b:number)\n",
+ "\n",
+ ".input g(filename=\"data/{loop_parameter}.csv\",delimiter=\",\",headers=true)\n",
+ "\n",
+ "sg(a, b) :- g(x, a), g(x, b).\n",
+ "sg(a, b) :- sg(x, y), g(x, a), g(y, b).\n",
+ "\n",
+ "result(a, b) :- sg(a, b).\n",
+ "\n",
+ ".output result(filename=\"output/sg_{loop_parameter}.csv\",delimiter=\",\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "46709f62-1381-47a2-9bc1-63900594d753",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running tree7.\n",
+ "Compiling SG for tree7\n",
+ "Running tree8.\n",
+ "Compiling SG for tree8\n",
+ "Running tree9.\n",
+ "Compiling SG for tree9\n",
+ "Running tree10.\n",
+ "Compiling SG for tree10\n",
+ "Running tree11.\n",
+ "Compiling SG for tree11\n",
+ "Running tree12.\n",
+ "Compiling SG for tree12\n",
+ " === Timing for Souffle SG (no printing) ===\n",
+ "+---------+-------------------+\n",
+ "| problem | time |\n",
+ "+---------+-------------------+\n",
+ "| tree7 | 8.222603951002384 |\n",
+ "| tree8 | 8.230292177999218 |\n",
+ "| tree9 | 8.189364300000307 |\n",
+ "| tree10 | 8.23189467499833 |\n",
+ "| tree11 | 8.253699183998833 |\n",
+ "| tree12 | 8.205137580000155 |\n",
+ "+---------+-------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('Souffle SG (no printing)', trees)\n",
+ "!echo 'Compiling SG for {loop_parameter}'\n",
+ "!souffle -o sg_for_{loop_parameter} sg_for_{loop_parameter}.s --jobs=32"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "f1cd3603-691f-441b-aa5b-0ab96f6e52a5",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Running tree7.\n",
+ "Running SG for tree7\n",
+ "Running tree8.\n",
+ "Running SG for tree8\n",
+ "Running tree9.\n",
+ "Running SG for tree9\n",
+ "Running tree10.\n",
+ "Running SG for tree10\n",
+ "Running tree11.\n",
+ "Running SG for tree11\n",
+ "Running tree12.\n",
+ "Running SG for tree12\n",
+ " === Timing for Souffle SG ===\n",
+ "+---------+---------------------+\n",
+ "| problem | time |\n",
+ "+---------+---------------------+\n",
+ "| tree7 | 0.23662728600174887 |\n",
+ "| tree8 | 0.2900902710025548 |\n",
+ "| tree9 | 0.6229411210006219 |\n",
+ "| tree10 | 3.9400528480000503 |\n",
+ "| tree11 | 26.254120573001273 |\n",
+ "| tree12 | 153.464254110997 |\n",
+ "+---------+---------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%loop ('Souffle SG', trees)\n",
+ "!echo 'Running SG for {loop_parameter}'\n",
+ "!./sg_for_{loop_parameter} --jobs=32"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "93c37665-ff88-49aa-9b70-8cda98b143cf",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " === Timing for Souffle TC ===\n",
+ "+---------+--------------------+\n",
+ "| problem | time |\n",
+ "+---------+--------------------+\n",
+ "| g1k | 0.5846970810016501 |\n",
+ "| g2k | 1.7279465979991073 |\n",
+ "| g3k | 3.6051718210001127 |\n",
+ "| g4k | 6.9848356940019585 |\n",
+ "| g5k | 10.963885921999463 |\n",
+ "+---------+--------------------+\n",
+ " === Timing for Souffle SG ===\n",
+ "+---------+---------------------+\n",
+ "| problem | time |\n",
+ "+---------+---------------------+\n",
+ "| tree7 | 0.23662728600174887 |\n",
+ "| tree8 | 0.2900902710025548 |\n",
+ "| tree9 | 0.6229411210006219 |\n",
+ "| tree10 | 3.9400528480000503 |\n",
+ "| tree11 | 26.254120573001273 |\n",
+ "| tree12 | 153.464254110997 |\n",
+ "+---------+---------------------+\n"
+ ]
+ }
+ ],
+ "source": [
+ "for report in benchmarking.reports:\n",
+ " if '(no printing)' not in report:\n",
+ " print(report)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a78dd83c-4dbe-4dde-94d5-3034347265b7",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/examples/graph/tgdk/sg_tree7.l b/examples/graph/tgdk/sg_tree7.l
new file mode 100644
index 0000000..bcd8e20
--- /dev/null
+++ b/examples/graph/tgdk/sg_tree7.l
@@ -0,0 +1,9 @@
+G(a, b) :- `("tree7.csv")`(a, b);
+
+@Recursive(SG, -1, stop: Done);
+SG(x, y) distinct :- G(a, x), G(a, y);
+SG(x, y) distinct :- SG(a, b), G(a, x), G(b, y);
+PrevSG(x, y) :- SG(x, y);
+Done() :- Sum{ 1 :- SG(x, y) } == Sum{ 1 :- PrevSG(x, y) };
+
+N() += 1 :- SG(x, y);
diff --git a/examples/graph/tgdk/sg_tree7.nemo b/examples/graph/tgdk/sg_tree7.nemo
new file mode 100644
index 0000000..24cdeb8
--- /dev/null
+++ b/examples/graph/tgdk/sg_tree7.nemo
@@ -0,0 +1,8 @@
+@import tree :- csv{resource="tree7.csv", ignore_headers=true, format=(string,string)}.
+
+SG(?X, ?Y) :- tree(?A, ?X), tree(?A, ?Y).
+SG(?X, ?Y) :- SG(?A, ?B), tree(?A, ?X), tree(?B, ?Y).
+
+N(#count(?X, ?Y)) :- SG(?X, ?Y).
+
+@export N :- csv{resource="n.csv"}.
diff --git a/examples/graph/tgdk/tc_g1k.l b/examples/graph/tgdk/tc_g1k.l
new file mode 100644
index 0000000..97430be
--- /dev/null
+++ b/examples/graph/tgdk/tc_g1k.l
@@ -0,0 +1,11 @@
+@Ground(G);
+G(a, b) :- `("g1k.csv")`(a, b);
+
+@Recursive(TC, ∞, stop: Stop);
+TC(a, b) distinct :- G(a, b);
+TC(a, c) distinct :- TC(a, b), G(b, c);
+
+OldN() += 1 :- TC();
+Stop() :- OldN() == Sum{1 :- TC()};
+
+N() += 1 :- TC(a, b);
diff --git a/examples/graph/tgdk/tc_g1k.nemo b/examples/graph/tgdk/tc_g1k.nemo
new file mode 100644
index 0000000..7536f41
--- /dev/null
+++ b/examples/graph/tgdk/tc_g1k.nemo
@@ -0,0 +1,8 @@
+@import edge :- csv{resource="g1k.csv", ignore_headers=true}.
+
+TC(?A, ?B) :- edge(?A, ?B).
+TC(?A, ?C) :- TC(?A, ?B), edge(?B, ?C).
+
+N(#count(?A, ?B)) :- TC(?A, ?B).
+
+@export N :- csv{resource="n.csv"}.