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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
0156
11076
27742
3023
48467
57734
64655
79649
87585
92127
10620
114713
126755
13151
143135
15485
161537
17057
189592
19495
204110
21366
227286
239483
24927
253191
262197
27169
286472
291891
.........
9708910
9711721
9728954
9732235
9745672
9757629
9769131
977161
978779
9799626
9806788
9812568
982695
9832768
9843064
9851874
9869223
9872697
9885162
9896424
9908822
9919591
992126
9938062
9945590
9954429
9965717
997845
998285
9993363
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0168000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
0000
1001
200000
30000000
40000001
50000002
60000003
7000100010
8000100011
9000100012
10012101210
11010101010
12012201220
13012201221
14012201222
15012001200
16012001201
17012001202
18012001203
19000200020
200110110
21010001000
22011001100
23011001101
24000000000
250120120
260120121
270120122
280100100
290100101
3001010
3101011
3201012
33000300030
34000300031
35000300032
36000300033
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tree5tree6tree7tree8tree9tree10tree11tree12
0378520650512573152779319456
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
0403288
115058
2192467
3592505
4236257
5811623
675382
7911322
82369
9991698
10836198
11687754
1298378
139442
14858770
15112999
1684360
17480324
18280617
19628482
20360779
2113657
2230111
23558987
24951835
2579238
26355263
27186416
28903
29384864
.........
999970986595
999971852595
99997294595
999973232595
999974424595
999975367595
999976688595
999977741595
999978143595
999979458595
999980520595
999981270595
999982430595
999983746595
999984861595
999985844595
999986705595
999987399595
999988965595
999989356595
999990391595
999991134595
999992633595
999993897595
999994657595
99999565595
999996444595
999997251595
999998994595
999999545595
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
01000000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
01268353
11020288
211981118
38551148
41266504
5427479
61194474
7528331
895454
95171792
101374753
11697660
127621049
13443402
14737808
15982548
1614941749
1713741899
186271208
191938647
2012981048
211701965
2216081273
237001677
2419931817
251251532
26199750
274131049
2887218
291161188
.........
399997010011595
399997118361595
39999723531595
399997313761913
399997416641913
3999975418576
39999761107576
3999977288576
399997849576
3999979141576
3999980599576
39999811195576
3999982518576
3999983964576
39999841685576
39999851351484
3999986383484
3999987204484
39999881194484
39999891587484
39999907871038
399999117161038
3999992881038
399999319271038
399999410821038
399999501038
39999969181038
399999710461306
399999812681306
39999994321306
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
04000000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
0724413
127632176
218931116
31644452
48952210
527652940
619682515
7136262
85531141
91910383
102794437
11524365
122028362
13560478
1413912116
151589474
16953142
1714811521
182960392
1919992895
2019512733
2129372373
222043668
232980423
2422491577
2514361430
26708746
271400487
2811611325
291071858
.........
899997028402248
899997117812248
899997223062248
899997311962248
89999747072248
899997511182248
899997619322248
899997728852248
899997810022248
899997913362248
89999806212248
8999981522248
899998223542248
899998318082248
899998412272248
89999854542248
89999866782248
89999874992248
89999883122248
899998919132248
89999903722248
89999911382248
899999228522248
899999312042248
899999421342248
89999953152248
899999619522248
899999718692248
899999814582248
89999994272248
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
09000000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
012113123
126031156
213673875
33883276
415383707
525921505
64082591
736773750
835041767
910702430
1029851652
1121002746
121621198
1329743467
1427191163
1535383945
16461557
1739702381
1821372278
1914081307
202031922
217842610
2214771769
233250857
2437901644
2538211912
261650163
2716713839
2821113578
2916901566
.........
15999970708473
159999711716473
159999722298473
15999973847473
159999741919473
159999752325473
159999762336473
159999771335473
159999781685473
15999979192473
159999801543473
159999811758473
15999982787473
1599998344473
15999984964473
159999851555473
159999863124473
159999871645473
159999882779473
15999989921473
159999903267473
159999911621473
159999922430473
159999934571446
1599999419461446
1599999538431446
1599999630551446
1599999715781446
1599999832981446
159999991561191
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
016000000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
024443295
128253878
222914755
314412485
432323402
5682112
614654165
737712751
826502449
946572284
104044667
114013386
1240461005
1317314595
142711549
1513031502
163895149
1724901305
1835711090
1924731602
203451744
2111373455
2217411668
233105800
247352373
2526773513
2643794228
27577799
284318137
2918593504
.........
2499497039274622
249949712674622
2499497239704622
2499497334436
249949748946
249949751766702
249949762156702
2499497733686
2499497821436
249949793895702
249949802092702
2499498115434690
249949822209702
249949833200702
2499498442604690
249949851010702
24994986299760
2499498738864690
249949883671933
249949891644933
2499499011041174
2499499127131174
2499499213511174
249949933219933
249949941081933
249949952454933
2499499612593632
2499499713023632
249949982496933
249949992442933
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
024995000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1logica_value
03271921
12123651
26294331
31023581
49472121
58267771
66837381
76949581
81874541
99561
107827941
119529561
128432751
134299751
149979161
156492861
167009421
179307801
187858401
199124581
208574901
219211241
224303101
23127491
248608791
256975081
263901051
271295491
282099681
298384801
............
9999702183524
9999713823523
9999725283524
999973403523
9999744603524
9999757173524
9999769353524
9999777483524
9999788223524
9999791203523
9999801053524
999981153524
9999829523523
999983313522
9999842073524
9999856943523
9999862493523
9999877383523
9999882573524
9999897103524
9999907183524
9999917063524
9999928063524
9999936823523
9999942563524
9999952623524
9999966723524
9999978863524
9999988913523
9999999573523
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
01000000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1logica_value
0101416771
113016641
210452121
37525831
48069241
51007461
6161711911
716976091
819742641
916410061
10125518521
116382311
1267019831
1378941
14106216331
1518482051
166665681
1711578871
18141914401
19185310971
2052315521
2111829641
2213172971
2337218531
244488231
2518762801
262555151
2717715791
2898519651
2931219711
............
3999970139313065
399997178413064
399997299113066
399997368913065
399997412313065
3999975116713065
3999976167413064
399997716613064
3999978184713064
3999979132013064
3999980157113065
399998188013065
3999982124113066
399998330913065
399998465013064
3999985103513065
3999986136413065
399998773513065
399998833613065
399998991713065
399999037513065
3999991127213065
399999210013065
399999384013065
399999442913065
3999995169013064
3999996167613065
3999997152013065
3999998190213064
3999999173813063
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
04000000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1logica_value
0175019221
1250326461
28996031
342229261
413021
52725141
616703111
7142326631
859512721
963529781
10220818161
11128311081
12290114501
136857541
141259631
1526814041
16262410811
17177123791
1847427951
1915597711
20179814841
21153712941
22273719631
23238210921
24180316151
25286726121
26936181
2720569321
28176410931
298813791
............
8999970296322485
899997168222486
8999972101922485
899997373822485
8999974117222485
8999975130022484
8999976107322484
8999977135422485
899997836422485
8999979156622485
8999980148622485
8999981299722485
8999982268222484
899998314922485
8999984256522486
89999854022485
8999986122422485
8999987203622485
8999988271222484
8999989168922485
8999990130322485
8999991270922485
8999992251922485
8999993233022485
899999493022485
8999995271022486
8999996221322485
8999997197922485
899999838222485
8999999261128394
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
09000000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1logica_value
056421741
1281035321
2219410451
315414751
417921771
524981291
61845171
7273126841
859510391
9145116541
10295035111
11119632681
12327935291
1391122781
14252823311
1510873571
16109425071
17192537281
1860417601
1992912131
20392222101
21306613451
2295236011
23119725431
2466225121
25132213531
26355615201
2726421541
28197128761
29670731
............
1599997067138225
15999971365738225
1599997225238225
1599997350638225
15999974172538225
1599997538038224
15999976365238224
15999977193038225
15999978151238224
15999979277738225
15999980226738224
15999981212935164
15999982210411915
15999983274611914
15999984303311914
15999985308311914
15999986339311915
15999987168711915
15999988180011915
1599998912048455
1599999013848454
1599999123758455
159999923128454
1599999338648454
1599999463038225
15999995141438224
15999996203338225
1599999799938225
15999998261038225
15999999297038225
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
016000000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1logica_value
0292440061
1307627641
2399729571
3368622371
41581771
548954581
6337429501
77384701
8212326221
98635941
1015539881
11403048921
1239334031
13108446261
1458433281
15206938631
16102432411
17375428391
18197549401
197227521
20436414671
21351916271
2271919681
23314110251
24292530991
2589611101
26411317391
27480319871
28431813741
2936033971
............
24994970169911744
2499497122011745
24994972310611745
24994973155036914
24994974339111745
24994975375911745
24994976262065
24994977318666
24994978134711745
24994979253424474
2499498093424474
24994981382024475
24994982228424475
24994983275824475
24994984285441555
24994985252941555
24994986357141553
24994987261941555
2499498827129334
2499498946541555
24994990287741555
2499499194341555
24994992340541555
2499499317041555
24994994400541555
24994995151841555
24994996193041554
24994997179041555
24994998382641555
24994999164521555
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
024995000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
017506
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
017507
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0106907
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0106908
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0672411
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0672412
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
04263436
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
04263437
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
025802317
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
025802318
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0161827886
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0161827887
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
017507
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
017507
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0106908
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0106908
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0672412
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0672412
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
04263437
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
04263437
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
025802318
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
025802318
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0161827887
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0161827887
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
memlimit
0100.6 GiB
132
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Success
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\"version\"()
0v1.3.2
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Success
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Success
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
origindestination
001
102
203
304
405
.........
997996999994
997997999995
997998999996
997999999997
998000999998
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
origindestination
001
102
203
304
405
.........
399599619991994
399599719991995
399599819991996
399599919991997
399600019991998
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
origindestination
001
102
203
304
405
.........
899699529992994
899699629992995
899699729992996
899699829992997
899699929992998
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
origindestination
001
102
203
304
405
.........
1599199639993994
1599199739993995
1599199839993996
1599199939993997
1599200039993998
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
origindestination
001
102
203
304
405
.........
2498999649994994
2498999749994995
2498999849994996
2498999949994997
2499000049994998
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
origindestinationdistance
0014
1024
2033
3044
4053
............
9979969999944
9979979999954
9979989999964
9979999999972
9980009999984
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
origindestinationdistance
0014
1024
2034
3044
4053
............
3995996199919944
3995997199919954
3995998199919963
3995999199919974
3996000199919984
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_anode_bgeneration
000001
100011
201001
301011
40000002
............
14651011131201112216
14652011131201113006
14653011131201113106
14654011131201113116
14655011131201113126
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_anode_bgeneration
000001
100011
201001
301011
40000002
............
9933201113121011131117
9933301113121011131127
9933401113121011131137
9933501113121011131207
9933601113121011131217
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_anode_bgeneration
000001
100011
201001
301011
40000002
............
6380880111312100111312008
6380890111312100111312018
6380900111312100111312028
6380910111312100111312038
6380920111312100111312108
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_anode_bgeneration
000001
100011
201001
301011
40000002
............
4153713011131210201113120329
4153714011131210201113120339
4153715011131210201113121009
4153716011131210201113121019
4153717011131210201113121029
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
node_anode_bgeneration
000001
100011
201001
301011
40000002
............
26253114011131210230111312101010
26253115011131210230111312102010
26253116011131210230111312102110
26253117011131210230111312102210
26253118011131210230111312102310
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
09560
18092
23261
32966
4734
56171
64611
78032
81051
98525
107642
117583
12567
134756
14387
158650
161117
177113
18920
199446
206031
217444
227043
23377
24113
257867
26084
278127
287255
295785
.........
9703686
9715790
9728522
9739276
9748121
9757186
9764060
9771831
9781581
9792483
9805322
9815160
9829853
9833310
9842058
985870
986332
9872261
9886328
989053
9902195
9915614
9922247
9936850
9944685
9959576
996528
9977483
9987478
9992611
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0168000
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
0000
1001
2011001100
3011001101
4011001102
50110110
60110111
700000
8011101110
9011101111
10011101112
11011101113
120100100
1301010
1401011
15000100010
16000100011
17000100012
180000000
190000001
20000000000
21010001000
22010001001
23010001002
24010001003
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
tree5tree6tree7tree8tree9tree10tree11tree12
0256818047112053080778119504
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
0931419
124380
254214
395159
4325567
5764632
6984756
7683783
8398110
9747944
10260618
11350317
12437270
13568935
14708132
1578885
16236114
17693820
1825193
1967549
20851586
21693123
22161213
23429411
24405955
25423285
26896766
2747575
2825649
2913576
.........
998970736943
998971309943
998972749943
998973890943
99897411943
998975331943
99897691943
998977248943
998978286943
998979386943
998980777943
998981834943
998982291943
998983849943
998984707943
998985198943
998986217943
998987342943
998988773943
998989168943
998990949943
998991839943
998992403943
998993577943
998994357943
998995678943
998996798943
998997502943
998998546943
998999183943
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
05711979
11241595
29991893
31801194
417441179
51234758
61627489
71990239
8964894
91089885
101460456
113521535
121542297
131780925
141347328
1514551506
161769755
17658551
18589906
1933802
20691531
211336586
22987637
2361663
24963727
2510031562
261828232
2719851829
2811471102
294921023
.........
399797011101346
399797112871346
39979724971346
39979739321346
39979746201346
399797519411346
399797617681346
39979776381346
399797814551346
399797913711346
39979801231346
399798111491346
399798215971346
399798315181346
39979849051346
399798512881346
39979866691346
39979876971346
399798813271346
399798911431346
3997990601346
399799112261346
399799216261346
399799316231346
399799418581346
399799519631346
399799613291346
399799716411346
39979983181346
39979996501346
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
08261104
110192746
2291466
36261711
425892751
501484
624241253
758250
827641192
9784861
104141196
111434558
1216651435
132195778
14332555
1525721097
16481577
1717201858
183002453
1916792592
20302422
2120692526
2217291703
232790119
249821347
25696705
2623732673
279641433
28677814
2927722613
.........
89999702467340
89999711469516
8999972479516
89999732433758
8999974575758
89999757302395
89999762104668
89999772737668
89999782250668
89999791817668
89999801928668
89999812396668
89999821044668
8999983573668
89999842938668
89999851721668
89999861618668
8999987257668
89999881256668
89999891682668
89999902465668
8999991225668
89999921596668
89999932663668
89999941202668
89999951607668
89999962763668
89999971772668
89999981890668
89999991598559
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
03713577
133242395
217812812
321311370
434602456
515232905
636323018
733282277
816581025
93482770
1022091426
114922806
123905560
131532789
1419162119
152693714
1620924
1715682338
182841329
195083593
2017943321
2114231285
2229221036
2322642438
2430623534
2532381891
2620121557
2725461303
2826782558
2917692290
.........
159959703711214
15995971839986
1599597221733799
1599597333053799
15995974452686
159959756592981
159959762743926
1599597732982686
1599597829043477
159959791289978
159959802657978
15995981228978
159959821193978
159959832060978
15995984190978
1599598538713914
15995986893136
1599598736453136
1599598827683136
159959891113136
1599599039323136
159959913973136
1599599218603136
1599599330193136
15995994119702
159959951904978
1599599610382981
159959973403799
1599599832873799
159959998123799
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
04140727
149064627
26223981
36863233
429641894
535443842
625541365
718311809
824344558
918683756
1011824961
1128623790
1225902458
1324213195
142751764
1526791592
1637944229
1744242324
188692755
191484249
203025193
2132171899
2237071282
234752214
2488858
252642354
2615191066
2749464335
281496201
2919704070
.........
2499497016194684
2499497146084684
2499497212134684
2499497343184684
2499497420864684
249949757744684
249949768994684
2499497731694684
2499497826554684
2499497944504684
2499498045914684
249949813764684
2499498221764684
2499498348804684
2499498410264684
2499498535144684
2499498636504684
2499498710934684
2499498845754684
2499498933694684
2499499014724684
2499499127974684
24994992452872
2499499328444427
2499499448804427
24994995162872
2499499644914427
249949973679378
249949984614378
249949993407378
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1logica_value
04719661
13997311
29693131
36309531
4412151
58616791
65581861
7472891
8416151
97069991
104868151
119806991
126462851
13779681
146162521
159025631
167768741
179256521
187257621
192868461
209264521
21220301
223908061
239964541
24898901
25866271
265463031
278161151
281742461
299525361
............
9989703533204
9989717253204
9989725483203
9989738433204
9989743243203
99897573203
998976853203
9989771793204
998978453204
9989796493203
9989803643204
9989818983204
9989822803204
9989835173204
9989849743204
998985313204
9989866243204
9989875323205
9989881213204
9989892053204
9989907813204
99899163204
9989927653204
9989937293205
9989946683204
998995493203
9989961723203
9989976593204
9989985783204
9989992193203
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1logica_value
01368431
113798641
258917511
37848591
410128981
55918271
63099421
737914391
811692041
9143312161
104356151
11108419291
122784681
13188115711
1448114231
157774041
16105212771
17140212191
18113118231
19173310821
2052719231
21138113541
22132319911
2382219511
2457518281
2515275071
2686410521
2795917781
28885571
2976512191
............
399797013892103
399797111605863
39979726252103
3997973380664
399797453664
39979751045664
3997976208664
3997977941663
39979781996664
399797916355845
39979803805844
39979816565845
399798215485844
39979831965844
39979849545844
399798518415844
39979861162664
3997987372663
3997988254664
39979891945663
3997990922664
3997991589664
399799217204694
39979934154694
399799418984694
399799516504694
399799613744694
399799715414693
399799814754694
399799911004694
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1logica_value
02759781
1277429951
221847541
39855391
4203710071
5277421411
613666911
748219631
8205415961
9123129481
1064921511
1114805881
1232410131
1324604561
1428837661
1522967011
16115024121
1719026421
18158631
191379221
2016247341
2194725361
22109816891
2352729231
2413198181
25276020971
2626413541
2722691551
28231619101
29284418181
............
899997016692245
899997111132245
899997215332244
899997328102245
899997424272244
899997525292245
899997612212245
89999774022244
89999785012245
89999792692245
89999807732244
899998110912245
8999982245325844
899998328132245
89999849272245
899998529212245
8999986161025845
8999987186825844
8999988189725844
89999893092244
899999016872244
899999119392245
899999216422245
899999322065595
89999949235594
89999951965594
899999614815595
89999973135594
899999823065594
899999922653894
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1logica_value
0182611041
15913951
2247129661
33210841
427749951
5378111421
6298213671
717551751
838125071
9223010681
10215923221
117731121
123255671
137646321
1427442731
15348628151
16278116801
1737299771
18326638641
19231628581
20298521411
2120436691
22342516061
23378538671
24205632301
25379217431
269839591
27240836311
28194620131
29356711601
............
1599597034433464
15995971331433464
1599597281933465
15995973188233464
1599597426554715
159959757164714
15995976182733875
15995977397233874
159959782199785
15995979367529094
1599598061431365
15995981394531364
15995982250031365
15995983157511055
15995984304233465
15995985100433465
1599598632333464
15995987332820374
15995988226820374
15995989223433465
15995990108333464
15995991245633465
15995992306733465
15995993202833464
15995994233033465
15995995376933466
1599599678833465
15995997130533465
15995998360033463
15995999124133465
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1logica_value
0237940101
17819671
2197838701
3423316991
4128624761
513484741
6191634571
7212535401
8238122071
9270726461
103843331
11266324281
12175034491
13114521761
1445534991
1541252971
16175812101
17451710941
18344020371
19212419611
20436511821
2137910681
22399546421
23193925341
24205230141
25479826261
26293632871
27360517071
288179741
29412419131
............
24994970429024184
2499497116139785
2499497234189785
24994973381123405
24994974131723404
249949758333785
2499497635303784
2499497730763784
2499497819813783
2499497942053784
2499498012023785
249949813833785
2499498228113784
2499498316973785
2499498422593785
2499498521893785
249949867513784
2499498718103785
2499498832003784
249949893843785
2499499016313785
249949917363785
249949923653784
2499499314503785
2499499447043784
2499499522503785
2499499617383785
2499499735233785
2499499813063785
2499499911373784
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
014656
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
014657
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
099337
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
099338
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0638093
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0638094
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
04153718
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
04153719
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
026253119
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
026253120
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0163681848
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0163681849
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
014657
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
014657
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
099338
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
099338
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0638094
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0638094
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
04153719
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
04153719
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
026253120
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
026253120
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0163681849
" + ], + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
0163681849
" + ], + "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"}.