Logic programming for AI agents: Datalog-family language compiling to optimized SQL
Project description
Synalog
Logic programming for AI agents: Datalog-family language compiling to optimized SQL
Synalog is a logic programming language from the Datalog family — a fork of Logica with the entire engine (parser, compiler and verifier) rewritten in Rust. It compiles to optimized SQL and ships as a Python package built on PyO3: parsing is ~86.7x faster and compilation ~13.7x faster than the original Python implementation, so validating and compiling a program is effectively instant.
Synalog was built for the AI agents era. The main idea is to give an agent a dynamic semantic layer over its data — a layer of named concepts and rules that the agent both reads from and writes to at inference time. Unlike a traditional BI semantic layer, which is modeled once by humans and frozen, Synalog's layer is authored on the fly: the agent extracts entities and relationships into knowledge graphs, derives meaning with composable logical rules, and reasons over time with temporal reasoning — accumulating all of it as structured, reusable memory.
What the agent gains
A raw table is just rows; an agent has to re-interpret what they mean on every query. Synalog turns that meaning into a layer the agent owns:
- A shared vocabulary over raw tables — instead of re-deriving "who is an active customer" or "what counts as revenue" in every query, the agent defines it once as a named concept and reuses it everywhere. The semantic layer is the agent's interface to the data.
- Instant knowledge-graph construction from raw tables — a handful of
*Nodeand*Edgerules turn existing relational tables into a traversable knowledge graph, with no ETL pipeline, no separate graph database, and no data movement. The graph is virtual: it compiles to SQL that runs directly on the source tables. - Knowledge graphs the agent can traverse — model entities as
*Nodeconcepts and relationships as*Edgeconcepts, then follow connections (composition, inverse, symmetric, recursive chains) without writing fragile join logic. See Knowledge graphs. - Recursion and transitive reasoning — transitive closures and graph traversals (org charts, taxonomies, bills of materials, referral chains, shortest paths) that are impossible to write correctly in raw SQL come out as a base case plus a recursive case, with the verifier guaranteeing termination.
- Logical rules that compose — rules build on other rules, so knowledge accumulates instead of being re-derived. Complex questions decompose into small named predicates the agent can inspect, reuse, and combine.
- Temporal reasoning — time-aware rules and edges (validity windows, "active today", overlap, point-in-time joins) let the agent answer when, not just what — reasoning that is notoriously error-prone to express directly in SQL.
- Dynamic, not static — the layer evolves as the agent learns. New rules extend the vocabulary at runtime; the rule base itself becomes the agent's long-term memory over structured data.
- Auditable reasoning — every derived fact traces back through named rules, giving full lineage from answer to source tables.
- Compile-time verification — a formal verifier catches structural errors before any SQL touches a database, so a self-authored rule that parses but is unsound is rejected up front. See Verification.
- A fast Rust engine — check and compile sit inside the agent's inner loop (every generated rule is validated, every query compiled, often several times per step). The Rust core makes that loop cost milliseconds instead of seconds. See Benchmark.
Because SQL engines are better optimized than logic programming engines, Synalog compiles into optimized SQL that runs on SQLite, DuckDB, BigQuery, PostgreSQL, Presto, Trino and Databricks — efficiently scaling to petabytes of data. See Supported engines.
Full documentation: https://synalinks.github.io/synalog/
At a glance
import duckdb
import synalog
source = """
@Engine("duckdb");
Employee(name: "Alice", department: "Engineering", salary: 75000);
Employee(name: "Bob", department: "Marketing", salary: 65000);
Employee(name: "Charlie", department: "Engineering", salary: 80000);
@OrderBy(EngineeringTeam, "name");
EngineeringTeam(name:, salary:) :- Employee(name:, department: "Engineering", salary:);
"""
errors = synalog.check(source)
assert errors == []
sql = synalog.compile(source, "EngineeringTeam")
rows = duckdb.sql(sql).fetchall()
# [('Alice', 75000), ('Charlie', 80000)]
Installation
pip install synalog
Or with uv: uv add synalog (or uv pip install synalog). The CLI also runs without installing via uvx synalog, or uvx --from 'synalog[run]' synalog to include the duckdb and psycopg drivers.
Requires Python 3.10+. Wheels are published for Linux (x86_64, aarch64, armv7, s390x, ppc64le; glibc and musl), Windows (x64, x86, aarch64) and macOS (x86_64, aarch64).
Quick start
import synalog
source = """
@Engine("duckdb");
Employee(name: "Alice", department: "Engineering", salary: 75000);
Employee(name: "Bob", department: "Marketing", salary: 65000);
Employee(name: "Charlie", department: "Engineering", salary: 80000);
@OrderBy(EngineeringTeam, "name");
EngineeringTeam(name:, salary:) :- Employee(name:, department: "Engineering", salary:);
"""
errors = synalog.check(source)
assert errors == []
sql = synalog.compile(source, "EngineeringTeam")
print(sql)
You can then execute the SQL with any database driver (sqlite3, duckdb, psycopg, google-cloud-bigquery, etc.).
Command-line interface
Installing the package also installs a synalog command (also available as python -m synalog):
synalog program.l parse # print the AST as JSON
synalog program.l check # validate; exit 1 on errors
synalog program.l print Predicate # print compiled SQL
synalog program.l run Predicate # execute and print a table
synalog program.l run Predicate --csv # execute and print CSV
$ synalog program.l run EngineeringTeam
+---------+--------+
| name | salary |
+---------+--------+
| Alice | 75000 |
| Charlie | 80000 |
+---------+--------+
2 rows
-as the file reads the program from stdin;-c PROGRAMpasses the program text inline, likepython -c.--engineoverrides the program's@Engineannotation (defaultduckdb).--limit/--offsetpaginate the result.--csv(withrun) prints results as CSV instead of the rendered table.--search REGEX(withprint/run) keeps only rows where some column matches the regular expressionREGEX, e.g.synalog program.l run Customers --search "(?i)acme". In the interactive session the same is.search Customers (?i)acme.runexecutes locally onduckdb(needspip install duckdb),sqlite(stdlib), orpsql(needspip install psycopgand--dsnorSYNALOG_PSQL_DSN). For other engines, useprintand run the SQL with your own client.pip install 'synalog[run]'pulls in the duckdb and psycopg drivers.import path.to.file.Pred;statements resolvepath/to/file.lagainst the program file's directory, then the current directory; pass--import-root DIR(repeatable) to search elsewhere.--load TABLE=PATH(repeatable) loads a csv/tsv/json/jsonl/parquet file as a table before running, e.g.synalog senior.l run Senior --load employees=employees.csv.synalog import ontology.owl(or anhttp(s)URL) converts an OWL/RDF ontology into a Synalog knowledge graph — classes become*Nodeconcepts, properties*Edgeconcepts, and individuals facts. See Ontologies.synalog initscaffolds a project (uvx synalog initruns it without installing; it asks for a name and description): a starter program importing a reusablelib/module, sample data indata/, and agent instructions (AGENTS.md,CLAUDE.md,.agents/skills/synalog/SKILL.md) so coding agents know how to use Synalog.
Running synalog with no arguments starts an interactive session, in the spirit of python (the options above, e.g. --engine or --load, apply to it too):
$ synalog
Synalog 0.1.0 on duckdb — type .help for help
>>> Employee(name: "Alice", salary: 75000);
>>> Employee(name: "Bob", salary: 65000);
>>> Total(t? += salary) distinct :- Employee(salary:);
>>> Total
+--------+
| t |
+--------+
| 140000 |
+--------+
1 row
Type a rule ending in ; to add it to the session program (it is validated first, and rejected with an error if invalid), or a predicate name to compile and run it. .help lists the session commands (.show, .sql <Pred>, .engine <name>, .load <table> <path>, .clear, .exit).
Python API
parse(source, file_name=None, engine=None, import_root=None) -> str
Parse source and return the AST as a JSON string.
ast = synalog.parse(source)
compile(source, predicate, limit=None, offset=None, engine=None, import_root=None) -> str
Compile a single predicate to SQL. limit is combined with the @Limit directive: actual = min(limit, @Limit).
sql = synalog.compile(source, "TopCustomers", limit=20, offset=40)
search(source, predicate, pattern, limit=None, offset=None, engine=None, import_root=None) -> str
Compile a predicate to SQL that keeps only rows where some column matches the regular expression pattern (the per-column conditions are OR-ed, each column cast to text). The regex is evaluated by the target engine's native operator (~ on PostgreSQL, REGEXP on SQLite, regexp_matches on DuckDB, REGEXP_LIKE elsewhere) — it is not a SQL LIKE pattern. limit/offset apply to the filtered rows.
sql = synalog.search(source, "Customers", "(?i)acme", limit=20)
compile_all(source, engine=None, import_root=None) -> dict[str, str]
Compile every defined predicate in the program. Returns a mapping predicate_name -> sql.
sqls = synalog.compile_all(source)
for name, sql in sqls.items():
print(name, sql)
check(source, engine=None, import_root=None) -> list[str]
Run structural validation. Returns a list of error messages; empty if the program is valid.
errors = synalog.check(source)
if errors:
for e in errors:
print(e)
All of these functions accept an optional engine keyword that overrides the program's @Engine annotation (one of sqlite, duckdb, bigquery, psql, presto, trino, databricks; default duckdb) and an optional import_root keyword listing directories where import statements look up .l files (default: the current directory). They raise ValueError on syntax or compilation errors.
Language overview
By convention, a Synalog program is organized into three sections: tables, concepts and rules. Tables map external data sources (a database table is referenced by its lowercase database name and mapped once to a PascalCase predicate). Concepts extract entities and relationships from tables. Rules derive new data from concepts. The section headers are plain comments — the structure is a convention, not syntax.
# Tables — read-only mappings of database tables
Orders(customer_id:, product_id:, amount:, status:) :-
orders(customer_id:, product_id:, amount:, status:);
# Concepts — extract entities and relationships
@OrderBy(CustomerNode, "customer_id");
CustomerNode(customer_id:) distinct :- Orders(customer_id:);
@OrderBy(PurchasedEdge, "customer_id");
PurchasedEdge(customer_id:, product_id:) distinct :- Orders(customer_id:, product_id:);
# Rules — derive insights from concepts
@OrderBy(CustomerSpend, "total", "DESC");
CustomerSpend(customer_id:, total? += amount) distinct :- Orders(customer_id:, amount:);
Named arguments
Synalog uses named arguments only (no positional arguments). The left side of : is the column name, the right side is the variable:
# column "amount" bound to variable "total"
Orders(amount: total)
# shorthand: column and variable share the same name
Orders(amount:)
Variables and expressions
Variables are defined with ==. Arithmetic, string and comparison operators are supported:
OrderWithTax(order_id:, total:) :-
Orders(order_id:, amount:),
total == amount * 1.10;
Operators: +, -, *, /, ^ (power), % (modulo), ++ (string concat), ==, !=, <, >, <=, >=, &&, ||, !, in, is null, is not null.
Aggregation
Aggregation uses the distinct keyword and special operators in the rule head:
# Sum
Revenue(total? += amount) distinct :- Orders(amount:);
# Count
OrderCount(n? += 1) distinct :- Orders(order_id:);
# Min / Max
Cheapest(min_price? Min= price) distinct :- Products(price:);
Priciest(max_price? Max= price) distinct :- Products(price:);
# Average
AvgOrder(avg? Avg= amount) distinct :- Orders(amount:);
# Collect into list / set
AllNames(names? List= name) distinct :- Users(name:);
UniqueNames(names? Set= name) distinct :- Users(name:);
# Value with max/min key
TopSeller(name? ArgMax= name -> revenue) distinct :- Sales(name:, revenue:);
Logical operators
# Conjunction (AND) — comma
Result(x:, y:) :- TableA(x:), TableB(x:, y:);
# Disjunction (OR) — pipe
Combined(x:) distinct :- SourceA(x:) | SourceB(x:);
# Negation (NOT) — tilde
Inactive(user_id:) :- Users(user_id:), ~Logins(user_id:);
Multiple rule definitions for the same predicate combine results (union):
HighValue(user_id:) :- Orders(user_id:, amount:), amount > 10000;
HighValue(user_id:) :- Referrals(user_id:, tier: "vip");
Conditionals
OrderSize(order_id:, size:) :-
Orders(order_id:, amount:),
size == (if amount > 1000 then "large"
else if amount > 100 then "medium"
else "small");
Directives
Directives control predicate behavior and must be placed before the rule definition:
@OrderBy(TopCustomers, "total", "DESC");
@Limit(TopCustomers, 10);
TopCustomers(customer_id:, total? += amount) distinct :- Orders(customer_id:, amount:);
| Directive | Purpose |
|---|---|
@OrderBy(Pred, col1, ...) |
Sort order. Append "DESC" for descending |
@Limit(Pred, n) |
Maximum number of rows |
@Recursive(Pred, n) |
Allow recursion with iteration limit |
@Ground(Pred) |
Force materialization before dependents |
@Engine(name) |
Target SQL engine |
Functors
Functors let you reuse predicate logic by parameterizing input predicates:
# Define a reusable pattern
@OrderBy(SegmentRevenue, "segment_id");
SegmentRevenue(segment_id:, total? += amount) distinct :-
Segment(segment_id:, user_id:),
Orders(user_id:, amount:);
# Apply to different segments
EnterpriseRevenue := SegmentRevenue(Segment: EnterpriseCustomers);
SMBRevenue := SegmentRevenue(Segment: SMBCustomers);
Recursion
Recursive predicates compute transitive closures — for example, finding all managers above an employee:
@Recursive(AllManagers, 20);
# Base case: direct manager
AllManagers(employee_id:, manager_id:) :- Employees(employee_id:, manager_id:);
# Recursive case: manager's managers
AllManagers(employee_id:, manager_id:) :-
AllManagers(employee_id:, intermediate:),
Employees(employee_id: intermediate, manager_id:);
Useful for: referral chains, org charts, product taxonomies, bill of materials.
Shortest paths
Find shortest paths in weighted graphs using Min= aggregation:
ShippingCost("warehouse_main") = 0;
ShippingCost(destination) Min= cost :-
ShippingRoutes(origin: "warehouse_main", destination:, cost:);
ShippingCost(destination) Min= ShippingCost(hub) + cost :-
ShippingCost(hub),
ShippingRoutes(origin: hub, destination:, cost:);
Temporal data
When working with timestamps or dates, always convert to string first:
@OrderBy(MonthlyOrders, "month");
MonthlyOrders(month:, count? += 1) distinct :-
Orders(created_at:),
month == Substr(ToString(created_at), 1, 7);
# Filter by date range
RecentOrders(order_id:) :-
Orders(order_id:, created_at:),
ToString(created_at) >= "2024-01-01";
Today(date:) (today's date as "YYYY-MM-DD") and Now(timestamp:) (the current instant as the engine's native timestamp) are built-in concepts. They are inlined per dialect by the compiler — no runtime table needed, so they work on every engine. Now is the most precise value; derive coarser parts (date, time, hour) from it through the ToString → Substr pipeline. Join against Today whenever a rule needs "today":
@OrderBy(ThisMonthOrders, "order_id");
ThisMonthOrders(order_id:, created_at:) :-
Orders(order_id:, created_at:),
Today(date:),
Substr(ToString(created_at), 1, 7) == Substr(date, 1, 7);
They are reserved names: you cannot redefine, extend, or update them.
Built-in functions
String: Substr, Length, Upper, Lower, Split, Join, Like, Format
Array: Size, Element, ArrayConcat, Range
Math: Abs, Floor, Ceil, Round, Sqrt, Log, Exp, Sin, Cos
Type casting: ToInt64, ToFloat64, ToString
Other: Coalesce, IsNull
Built-in concepts: Today(date:) — today's date as "YYYY-MM-DD"; Now(timestamp:) — current instant as a native timestamp (see Temporal data above).
Supported engines
| Engine | @Engine value |
Notes |
|---|---|---|
| DuckDB | duckdb |
Default engine |
| SQLite | sqlite |
|
| PostgreSQL | psql |
|
| BigQuery | bigquery |
|
| Trino | trino |
|
| Presto | presto |
|
| Databricks | databricks |
Double-quoted string literals |
Each engine has its own SQL dialect for string literals, array syntax, GROUP BY style, record construction, regex matching, and standard library functions.
Benchmark
The Rust core is benchmarked against the original Python Logica implementation on every program of the compiler test suite (504 programs across 6 engines). Both run in-process — Synalog through the same PyO3 extension that pip install synalog ships — so the numbers measure exactly what a Python caller gets:
| Python Logica | Synalog (Rust) | Speedup | |
|---|---|---|---|
| Parse | 13.4 s | 0.15 s | 87x |
| Compile | 61.3 s | 5.2 s | 13x |
| Verify | — | 0.16 s | Rust-only |
Speedup is the geometric mean of per-program speedups (every program weighted equally). Parsing is uniformly ~85–88x faster; compilation ranges from ~11x (trino, presto) to ~19x (duckdb). Verification — safety, stratification, recursion and reserved-name checks — is a Synalog-specific pass with no standalone Python equivalent. Per-engine tables and methodology are on the Benchmark page; reproduce with python3 benchmark.py.
Verification
Unlike Logica, which lets the database raise errors at execution time, Synalog embeds a formal verifier that catches issues at compile time.
| Check | What it detects |
|---|---|
| Safety | Head variables not bound in the body |
| Safe negation | Negated variables without a positive occurrence |
| Safe aggregation | Aggregated variables not bound outside the aggregate |
| Stratification | Negative recursion cycles |
| Arity | Predicates used with inconsistent argument counts |
| Recursion | Missing base cases, trivial loops, unbounded recursion without @Recursive |
| Reserved names | Rules that redefine a built-in library predicate (Num, Str, ArgMin, Today, Now, ...) |
Unsafe SqlExpr |
User rules that reach for the raw-SQL escape hatch |
errors = synalog.check(bad_source)
for e in errors:
print(e)
# Unbound variable 'y' in head of rule: Test(x:, y:) :- Numbers(x:)
Differences with Datalog and Logica
Named attributes only
Synalog doesn't support positional attributes like Logica or Datalog — it only uses named attributes, which reduce agent mistakes. This feature is optional in Logica; we made it mandatory.
In Synalog, the compiled SQL uses actual column names, not col{i} format, making it compatible with existing database schemas.
Pagination
Pagination is critical for AI agents with limited context windows. It also avoids loading large amounts of data into memory, enabling use on memory-constrained cloud infrastructure.
Synalog applies pagination at compile time via the limit and offset arguments of compile(). The limit is combined with the @Limit directive: actual_limit = min(limit, @Limit).
Compile-time verification
Synalog embeds a formal verifier that catches structural errors before any SQL is generated. This prevents agents from producing programs that parse correctly but fail at execution time — a common failure mode when working with SQL directly.
Building from source
The project uses maturin to build the Python wheel from the Rust crate.
pip install maturin
maturin develop --release # install into the active venv
maturin build --release # produce a wheel in target/wheels/
Run the Rust test suite:
cargo test
Run specific test groups:
cargo test --lib # unit tests
cargo test --test compiler_tests # compiler golden tests (all engines)
cargo test --test parser_tests # parser golden tests (all engines)
cargo test --test verifier_tests # verifier tests (all engines)
cargo test --test search_tests # search feature tests (all engines)
Golden test generation
Golden SQL files are generated by the Python Logica compiler to serve as the reference:
cd tests/compiler_tests && python3 generate_expected_sql.py
cd tests/parser_tests && python3 generate_expected_json.py
Requires pip install logica.
Project structure
src/
lib.rs # Public API: parser, compiler, verifier, errors
errors.rs # Unified error types with help messages
python.rs # PyO3 bindings (the _synalog extension module)
parser/
parse.rs # Logica syntax -> JSON AST
rewrite.rs # AST rewrites (aggregation, multi-body)
json.rs # Custom JSON implementation
compiler/
universe.rs # LogicaProgram: AST -> SQL compilation
annotations.rs # @OrderBy, @Limit, @Recursive, etc.
dialects.rs # Engine-specific SQL generation
expr_translate.rs # Expression -> SQL translation
rule_translate.rs # Rule -> SQL translation
functors.rs # Functor expansion (@Make)
concertina.rs # Multi-predicate execution orchestration
type_inference/ # Type checking subsystem
verifier/
mod.rs # Validation entry point
safety.rs # Variable binding checks
stratification.rs # Negative cycle detection
arity.rs # Argument count consistency
recursion.rs # Recursion safety checks
reserved.rs # Reserved predicate name check
python/
synalog/__init__.py # Python package wrapper
synalog/cli.py # The synalog command (one-shot + REPL)
synalog/runners.py # Local SQL runners (duckdb, sqlite, psql)
tests/
compiler_tests/ # Golden SQL tests per engine
parser_tests/ # Golden JSON tests per engine
verifier_tests/ # Negative verification tests per engine
cli/ # CLI tests (pytest)
search_tests.rs # Search feature integration tests
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file synalog-0.2.0.tar.gz.
File metadata
- Download URL: synalog-0.2.0.tar.gz
- Upload date:
- Size: 1.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
152ff5299b8050689723b473d33a29c9e349cbbe78340037eeb4cfb0d5a35103
|
|
| MD5 |
b6e7b58c9ab20f62914092e5067a8144
|
|
| BLAKE2b-256 |
0538de14809278372d8dda72456d282b011da1aa9e5b6007a515979fc5b0d2f2
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-win_amd64.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-win_amd64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.14t, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fef513aa7a73480c3d6c070c93dd9f4ce88664dc8ad24f62c165edb32107b756
|
|
| MD5 |
9d795e0522e84cae11045d28ae215deb
|
|
| BLAKE2b-256 |
623822ee2d8bd425225b9f222e56d8851a4dbb88bb0bf104b4fcfb7a72ab1d66
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-win32.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-win32.whl
- Upload date:
- Size: 1.3 MB
- Tags: CPython 3.14t, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
710a41087309be660aee6d4a9825944b6e2841e6ef1d760b689b4c927bf29e5e
|
|
| MD5 |
be643a356e160d46da37489660ff1850
|
|
| BLAKE2b-256 |
0178e23386fa8693fa0a62bd6b24935b9150a23b9588620e95fe42d4bbfdd4da
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.14t, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db15bed391a27b45661069e65627dcd87256abb85d1bd75253e66425503117ec
|
|
| MD5 |
1ca70988502b7bb28528cddef600b60e
|
|
| BLAKE2b-256 |
2647ea797ead0d226f0ecd212b8dc57119487c4e3df8030b4ddc9a2da0fbf373
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-musllinux_1_2_i686.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-musllinux_1_2_i686.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.14t, musllinux: musl 1.2+ i686
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1db33065513bae220411229b2e5ff8f513ac97523ec27e9810e76a7efe7bceba
|
|
| MD5 |
8d9ea8d2b124a1f7cef0a650dc05cd32
|
|
| BLAKE2b-256 |
175556acb683e9c0133a568cd46be4f0d42bb90298a3004a5a463c2c2231b8fd
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-musllinux_1_2_armv7l.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-musllinux_1_2_armv7l.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.14t, musllinux: musl 1.2+ ARMv7l
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
31e9f8c19a2e02f830ac7bdcdb0da2319f4ea18df8f8bbead89395db4210f8ec
|
|
| MD5 |
169198d7b3e2601a0a61d4098d6db281
|
|
| BLAKE2b-256 |
801a49d4b4a247773b9201882b6fabbb34e09d2f11018c3b1425fdd92f5d5198
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.14t, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7b7721ac0d854ce3893b8e3e69ca22cd24eca7a9a0ea6d2f6ed8c19ebea08fe1
|
|
| MD5 |
1a78d5755adb52cdcc3b7448df39420f
|
|
| BLAKE2b-256 |
eff2a0136d1df39fef1b2d058446f0bc70916448f8ad012f3e89a06aadff463a
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.7 MB
- Tags: CPython 3.14t, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b0b2d4dd37ba0549d487d5352921f79d5deac7b31d40341767318a262e7281d
|
|
| MD5 |
ffb00c7a5825ba37138558b8c33fcb0c
|
|
| BLAKE2b-256 |
bff2d6a1bdfbd880fff0966f4db1581a7b632e657866b22d6a50fb06ec0243a6
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl
- Upload date:
- Size: 1.7 MB
- Tags: CPython 3.14t, manylinux: glibc 2.17+ s390x
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfd9a79a9450791f0d9825fa72949e51908ac6b84332df11593b32da0532847e
|
|
| MD5 |
5283f901b6d532df86bcc31045edf72d
|
|
| BLAKE2b-256 |
3f174b415ddc1dac091c2f042673bd1a218b5a41f816b074e413666e81d05f05
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.14t, manylinux: glibc 2.17+ ppc64le
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd5938ce986cd80d55aa81d9ec5775e0cbcaf7db1ba6111ef19579a1b5f78fb3
|
|
| MD5 |
0bca5f19159d48d4d521f491adc28bf8
|
|
| BLAKE2b-256 |
5c303b93a665e979b9a3249c61c5db48fc6230ecc64363325a8b9b00a5a924d2
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.14t, manylinux: glibc 2.17+ ARMv7l
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bdb6fd39aeace7ee412ef8ef72c96627360dfa7cf86d1ab54124d1f4ca3e0379
|
|
| MD5 |
795b48b1350035a86104ba693a3a8785
|
|
| BLAKE2b-256 |
dda9f6bc291970effccd9efb905a87e33a1ed006774e289056c11c36b6720ab5
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.14t, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76852c8469403c1ea2fca1c83d8b29c95d1309c003bc95550ca184ce1ce0b245
|
|
| MD5 |
0b5814b156e06e5f08eedc7f898bace9
|
|
| BLAKE2b-256 |
ab7232b6ec57ecd982b33c9cb65032bb015c3aef6dddf35e597349f2f77e1a3c
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.14t, manylinux: glibc 2.5+ i686
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
662039dc8017af23d02c0b952fd3114d2636870b8cceeb46d9854b8242ba6089
|
|
| MD5 |
338e06046924f36d3b1f4c419d41f388
|
|
| BLAKE2b-256 |
2d4eae16c1cf14be8e7aa2ea5fd6dd26dbdfaaab916c3eed2ffa418fac54bbf8
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.14t, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6b8b7e4d32e2b3046e73325ab9947af7a5c8eac28da34698fb26967d0ce3536
|
|
| MD5 |
921feef5fc87e45b420cf1685353412c
|
|
| BLAKE2b-256 |
a1232439ce3f1b61f1a89d4b39a5f944d9c9ad80d6bf95a1328ef765b1d35d31
|
File details
Details for the file synalog-0.2.0-cp314-cp314t-macosx_10_12_x86_64.whl.
File metadata
- Download URL: synalog-0.2.0-cp314-cp314t-macosx_10_12_x86_64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.14t, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d72dcd6a1b5c8a6bfc1d63f22edf9171931fd63e140892356d27b13ea3cbe1dc
|
|
| MD5 |
3e32f5711e7b6bd426be94d29e67c994
|
|
| BLAKE2b-256 |
0ca96778c5326a86602dbff1b4951d262dbcf7d488ce145099f4714de4977c89
|
File details
Details for the file synalog-0.2.0-cp310-abi3-win_arm64.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-win_arm64.whl
- Upload date:
- Size: 1.3 MB
- Tags: CPython 3.10+, Windows ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
314a8fef379d9189a39cfbdaf2db0641796aa646f8fc3e1e25f7ee4260da9384
|
|
| MD5 |
7a54c698de4e9cb4210e6007e0935cef
|
|
| BLAKE2b-256 |
88f5d8424557b8eec7ed7a762a9e2cd544099215d0618526a0db50d22e73900f
|
File details
Details for the file synalog-0.2.0-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
177e935a7fe1755236f832f557acce568189d3d81915b879195f257925ebec25
|
|
| MD5 |
82d2c1be3db4620e677676c32537bd71
|
|
| BLAKE2b-256 |
5a778337d1f547bce3fbed7163a2a1af0b9c023a3938098d5a573026b59109e0
|
File details
Details for the file synalog-0.2.0-cp310-abi3-win32.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-win32.whl
- Upload date:
- Size: 1.3 MB
- Tags: CPython 3.10+, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a74ff3c1ab4c6f5c4399a7b31df3b1c5bf0104ee093d7bf78735c785365652e
|
|
| MD5 |
24ad961e8784bd7bd4a6f8c7e051396c
|
|
| BLAKE2b-256 |
e31b6aad1b3124e057515100ec5c207f6375558a36046357bed371858b0dd86a
|
File details
Details for the file synalog-0.2.0-cp310-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53018d32f628fb07514957f77eaaa8ba759377ef6fbba7f4f784ae7969bceea4
|
|
| MD5 |
ae569fc2e0e840d58a732caeac54c383
|
|
| BLAKE2b-256 |
37f2c397fb53b932c4b7e9b1b06e35b5ec6d091173b054c04920d5ec564b6952
|
File details
Details for the file synalog-0.2.0-cp310-abi3-musllinux_1_2_i686.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-musllinux_1_2_i686.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ i686
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48db16e84744e3456924ffd7c3580d4e65e6a7187a1ce7b37904bbb33b01b631
|
|
| MD5 |
f259f16c20cd4be84f4ba0b0142c27ee
|
|
| BLAKE2b-256 |
2c153d5e3287495a221f5c8a12b2ff92723cab07c57008116370cbffe5e30867
|
File details
Details for the file synalog-0.2.0-cp310-abi3-musllinux_1_2_armv7l.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-musllinux_1_2_armv7l.whl
- Upload date:
- Size: 1.9 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ ARMv7l
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8f9e9cdd688d9eea9eca50f8c015450787b51712a2c3cabbbc920c2939935321
|
|
| MD5 |
9bfaab00fd6520c3cad7657d5b16295a
|
|
| BLAKE2b-256 |
5de0562856d16d98fe84074c57ed9ff491182ae9f2ef350e9a54aaf9c188b5f1
|
File details
Details for the file synalog-0.2.0-cp310-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.10+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e7d4e8e6c75f2a25e6c4be2e340d32de82376bbb7316c83177d442a531e21f30
|
|
| MD5 |
bc031364260c5eac1c0f7f54abd006b5
|
|
| BLAKE2b-256 |
4b6555a5177070f8c575f6c8840689441b2c02e689c5774524e0c3ba913e8814
|
File details
Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.7 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
abeaabe0e259678498c51e67878879519bd7fe47fee2de87fd920ee0511adc66
|
|
| MD5 |
873d49545c07aa62524743ffd7631ca8
|
|
| BLAKE2b-256 |
5749a6a86eb4cc3d8ebecb0288514f7c5d9efe4313f8bee55722f281c1eb4063
|
File details
Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
- Upload date:
- Size: 1.7 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ s390x
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c122f6c7870314ddc2325bdf2d5ceaf0721b06b7cca5cab5c29e69423a78b7f
|
|
| MD5 |
9694f93660892efc3b0aa5d9409e4e48
|
|
| BLAKE2b-256 |
ff4f38f3e3b06f77fe3898d06de3527c3f0aa42192b716d293dbb8264b457d39
|
File details
Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ ppc64le
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c81c8c9ce84389fbd78ec99cd2882c1967268d1b30030f98f664e4ddfc3a107f
|
|
| MD5 |
1e36781fb74ca09657b435d5915c1a12
|
|
| BLAKE2b-256 |
b2b80c0fbedaf09502fc6adfaa689a364428434f880cbf3d9e8ceed555e78f01
|
File details
Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ ARMv7l
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
486efc7b9f38ced4f0a3446c47bc36140e301ec92dd5f5189720f964b47b55c6
|
|
| MD5 |
e08f0cb9f3287a2762e80533463d852b
|
|
| BLAKE2b-256 |
d4c3e465c51bcb75d7d3c51afb453e72fadb827d41520d98565733b1636b3f00
|
File details
Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa75ac170ca3d517b90369d18f324c6bbdbca0e92901615c9ce16f45ba2017dc
|
|
| MD5 |
294e7e8cd32aaac758621dead116cb62
|
|
| BLAKE2b-256 |
3512088fc004459a56118e4aae4fd009c0b0fddca4f1def3e38a59f40362f62b
|
File details
Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.10+, manylinux: glibc 2.5+ i686
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5ff47498a1a72d986b0dc77c17538f2789501c76eeb8fdfdb49cbbb2a87d813
|
|
| MD5 |
0c8a4ef34487414df45b88d06094a62a
|
|
| BLAKE2b-256 |
ffc1532d6fdd6372395b55f8ba77df22cd858307493ffc3bbec5b750fc320cb0
|
File details
Details for the file synalog-0.2.0-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4c74758477a263f0db7094cb6106087b844cfc30479507eefd170501d202601
|
|
| MD5 |
fe00a6964b3228bd5400a44cb17b13ff
|
|
| BLAKE2b-256 |
cc531d114d4145a8e3c79b4ba5d74af79eb3d1adb3920a44dfc94a90a075842c
|
File details
Details for the file synalog-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: synalog-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.10+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a8171bb0c9bb35ebb36face25093ab945fd0ab72117c8f30da9348dcf18243b
|
|
| MD5 |
47095d1ef6a33b7a35497aa03008582f
|
|
| BLAKE2b-256 |
ebc05ad34b5e79cf65c5644f80bfd22ac5d6e986698dcf8de78d04f829cf7c31
|