Skip to main content

Logic programming for AI agents: Datalog-family language compiling to optimized SQL

Project description

Synalog

Beta PyPI Downloads Discord CI Documentation License: Apache-2.0 Ask DeepWiki

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 *Node and *Edge rules 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 *Node concepts and relationships as *Edge concepts, 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 PROGRAM passes the program text inline, like python -c.
  • --engine overrides the program's @Engine annotation (default duckdb).
  • --limit / --offset paginate the result.
  • --csv (with run) prints results as CSV instead of the rendered table.
  • --search REGEX (with print/run) keeps only rows where some column matches the regular expression REGEX, e.g. synalog program.l run Customers --search "(?i)acme". In the interactive session the same is .search Customers (?i)acme.
  • run executes locally on duckdb (needs pip install duckdb), sqlite (stdlib), or psql (needs pip install psycopg and --dsn or SYNALOG_PSQL_DSN). For other engines, use print and run the SQL with your own client. pip install 'synalog[run]' pulls in the duckdb and psycopg drivers.
  • import path.to.file.Pred; statements resolve path/to/file.l against 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 an http(s) URL) converts an OWL/RDF ontology into a Synalog knowledge graph — classes become *Node concepts, properties *Edge concepts, and individuals facts. See Ontologies.
  • synalog init scaffolds a project (uvx synalog init runs it without installing; it asks for a name and description): a starter program importing a reusable lib/ module, sample data in data/, 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 ToStringSubstr 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

Synalog vs Python Logica: speedup by SQL engine

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

synalog-0.2.0.tar.gz (1.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

synalog-0.2.0-cp314-cp314t-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.14tWindows x86-64

synalog-0.2.0-cp314-cp314t-win32.whl (1.3 MB view details)

Uploaded CPython 3.14tWindows x86

synalog-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

synalog-0.2.0-cp314-cp314t-musllinux_1_2_i686.whl (1.9 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ i686

synalog-0.2.0-cp314-cp314t-musllinux_1_2_armv7l.whl (1.9 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARMv7l

synalog-0.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

synalog-0.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

synalog-0.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.7 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ s390x

synalog-0.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ppc64le

synalog-0.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.6 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARMv7l

synalog-0.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

synalog-0.2.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl (1.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.5+ i686

synalog-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

synalog-0.2.0-cp314-cp314t-macosx_10_12_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.14tmacOS 10.12+ x86-64

synalog-0.2.0-cp310-abi3-win_arm64.whl (1.3 MB view details)

Uploaded CPython 3.10+Windows ARM64

synalog-0.2.0-cp310-abi3-win_amd64.whl (1.5 MB view details)

Uploaded CPython 3.10+Windows x86-64

synalog-0.2.0-cp310-abi3-win32.whl (1.3 MB view details)

Uploaded CPython 3.10+Windows x86

synalog-0.2.0-cp310-abi3-musllinux_1_2_x86_64.whl (1.9 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ x86-64

synalog-0.2.0-cp310-abi3-musllinux_1_2_i686.whl (1.9 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ i686

synalog-0.2.0-cp310-abi3-musllinux_1_2_armv7l.whl (1.9 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARMv7l

synalog-0.2.0-cp310-abi3-musllinux_1_2_aarch64.whl (1.8 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

synalog-0.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

synalog-0.2.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.7 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ s390x

synalog-0.2.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.8 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ppc64le

synalog-0.2.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.6 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARMv7l

synalog-0.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

synalog-0.2.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl (1.8 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.5+ i686

synalog-0.2.0-cp310-abi3-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

synalog-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

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

Hashes for synalog-0.2.0.tar.gz
Algorithm Hash digest
SHA256 152ff5299b8050689723b473d33a29c9e349cbbe78340037eeb4cfb0d5a35103
MD5 b6e7b58c9ab20f62914092e5067a8144
BLAKE2b-256 0538de14809278372d8dda72456d282b011da1aa9e5b6007a515979fc5b0d2f2

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 fef513aa7a73480c3d6c070c93dd9f4ce88664dc8ad24f62c165edb32107b756
MD5 9d795e0522e84cae11045d28ae215deb
BLAKE2b-256 623822ee2d8bd425225b9f222e56d8851a4dbb88bb0bf104b4fcfb7a72ab1d66

See more details on using hashes here.

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

Hashes for synalog-0.2.0-cp314-cp314t-win32.whl
Algorithm Hash digest
SHA256 710a41087309be660aee6d4a9825944b6e2841e6ef1d760b689b4c927bf29e5e
MD5 be643a356e160d46da37489660ff1850
BLAKE2b-256 0178e23386fa8693fa0a62bd6b24935b9150a23b9588620e95fe42d4bbfdd4da

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 db15bed391a27b45661069e65627dcd87256abb85d1bd75253e66425503117ec
MD5 1ca70988502b7bb28528cddef600b60e
BLAKE2b-256 2647ea797ead0d226f0ecd212b8dc57119487c4e3df8030b4ddc9a2da0fbf373

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 1db33065513bae220411229b2e5ff8f513ac97523ec27e9810e76a7efe7bceba
MD5 8d9ea8d2b124a1f7cef0a650dc05cd32
BLAKE2b-256 175556acb683e9c0133a568cd46be4f0d42bb90298a3004a5a463c2c2231b8fd

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 31e9f8c19a2e02f830ac7bdcdb0da2319f4ea18df8f8bbead89395db4210f8ec
MD5 169198d7b3e2601a0a61d4098d6db281
BLAKE2b-256 801a49d4b4a247773b9201882b6fabbb34e09d2f11018c3b1425fdd92f5d5198

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7b7721ac0d854ce3893b8e3e69ca22cd24eca7a9a0ea6d2f6ed8c19ebea08fe1
MD5 1a78d5755adb52cdcc3b7448df39420f
BLAKE2b-256 eff2a0136d1df39fef1b2d058446f0bc70916448f8ad012f3e89a06aadff463a

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8b0b2d4dd37ba0549d487d5352921f79d5deac7b31d40341767318a262e7281d
MD5 ffb00c7a5825ba37138558b8c33fcb0c
BLAKE2b-256 bff2d6a1bdfbd880fff0966f4db1581a7b632e657866b22d6a50fb06ec0243a6

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 cfd9a79a9450791f0d9825fa72949e51908ac6b84332df11593b32da0532847e
MD5 5283f901b6d532df86bcc31045edf72d
BLAKE2b-256 3f174b415ddc1dac091c2f042673bd1a218b5a41f816b074e413666e81d05f05

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 cd5938ce986cd80d55aa81d9ec5775e0cbcaf7db1ba6111ef19579a1b5f78fb3
MD5 0bca5f19159d48d4d521f491adc28bf8
BLAKE2b-256 5c303b93a665e979b9a3249c61c5db48fc6230ecc64363325a8b9b00a5a924d2

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 bdb6fd39aeace7ee412ef8ef72c96627360dfa7cf86d1ab54124d1f4ca3e0379
MD5 795b48b1350035a86104ba693a3a8785
BLAKE2b-256 dda9f6bc291970effccd9efb905a87e33a1ed006774e289056c11c36b6720ab5

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 76852c8469403c1ea2fca1c83d8b29c95d1309c003bc95550ca184ce1ce0b245
MD5 0b5814b156e06e5f08eedc7f898bace9
BLAKE2b-256 ab7232b6ec57ecd982b33c9cb65032bb015c3aef6dddf35e597349f2f77e1a3c

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 662039dc8017af23d02c0b952fd3114d2636870b8cceeb46d9854b8242ba6089
MD5 338e06046924f36d3b1f4c419d41f388
BLAKE2b-256 2d4eae16c1cf14be8e7aa2ea5fd6dd26dbdfaaab916c3eed2ffa418fac54bbf8

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f6b8b7e4d32e2b3046e73325ab9947af7a5c8eac28da34698fb26967d0ce3536
MD5 921feef5fc87e45b420cf1685353412c
BLAKE2b-256 a1232439ce3f1b61f1a89d4b39a5f944d9c9ad80d6bf95a1328ef765b1d35d31

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp314-cp314t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp314-cp314t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d72dcd6a1b5c8a6bfc1d63f22edf9171931fd63e140892356d27b13ea3cbe1dc
MD5 3e32f5711e7b6bd426be94d29e67c994
BLAKE2b-256 0ca96778c5326a86602dbff1b4951d262dbcf7d488ce145099f4714de4977c89

See more details on using hashes here.

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

Hashes for synalog-0.2.0-cp310-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 314a8fef379d9189a39cfbdaf2db0641796aa646f8fc3e1e25f7ee4260da9384
MD5 7a54c698de4e9cb4210e6007e0935cef
BLAKE2b-256 88f5d8424557b8eec7ed7a762a9e2cd544099215d0618526a0db50d22e73900f

See more details on using hashes here.

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

Hashes for synalog-0.2.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 177e935a7fe1755236f832f557acce568189d3d81915b879195f257925ebec25
MD5 82d2c1be3db4620e677676c32537bd71
BLAKE2b-256 5a778337d1f547bce3fbed7163a2a1af0b9c023a3938098d5a573026b59109e0

See more details on using hashes here.

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

Hashes for synalog-0.2.0-cp310-abi3-win32.whl
Algorithm Hash digest
SHA256 2a74ff3c1ab4c6f5c4399a7b31df3b1c5bf0104ee093d7bf78735c785365652e
MD5 24ad961e8784bd7bd4a6f8c7e051396c
BLAKE2b-256 e31b6aad1b3124e057515100ec5c207f6375558a36046357bed371858b0dd86a

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 53018d32f628fb07514957f77eaaa8ba759377ef6fbba7f4f784ae7969bceea4
MD5 ae569fc2e0e840d58a732caeac54c383
BLAKE2b-256 37f2c397fb53b932c4b7e9b1b06e35b5ec6d091173b054c04920d5ec564b6952

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 48db16e84744e3456924ffd7c3580d4e65e6a7187a1ce7b37904bbb33b01b631
MD5 f259f16c20cd4be84f4ba0b0142c27ee
BLAKE2b-256 2c153d5e3287495a221f5c8a12b2ff92723cab07c57008116370cbffe5e30867

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 8f9e9cdd688d9eea9eca50f8c015450787b51712a2c3cabbbc920c2939935321
MD5 9bfaab00fd6520c3cad7657d5b16295a
BLAKE2b-256 5de0562856d16d98fe84074c57ed9ff491182ae9f2ef350e9a54aaf9c188b5f1

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e7d4e8e6c75f2a25e6c4be2e340d32de82376bbb7316c83177d442a531e21f30
MD5 bc031364260c5eac1c0f7f54abd006b5
BLAKE2b-256 4b6555a5177070f8c575f6c8840689441b2c02e689c5774524e0c3ba913e8814

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 abeaabe0e259678498c51e67878879519bd7fe47fee2de87fd920ee0511adc66
MD5 873d49545c07aa62524743ffd7631ca8
BLAKE2b-256 5749a6a86eb4cc3d8ebecb0288514f7c5d9efe4313f8bee55722f281c1eb4063

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 5c122f6c7870314ddc2325bdf2d5ceaf0721b06b7cca5cab5c29e69423a78b7f
MD5 9694f93660892efc3b0aa5d9409e4e48
BLAKE2b-256 ff4f38f3e3b06f77fe3898d06de3527c3f0aa42192b716d293dbb8264b457d39

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 c81c8c9ce84389fbd78ec99cd2882c1967268d1b30030f98f664e4ddfc3a107f
MD5 1e36781fb74ca09657b435d5915c1a12
BLAKE2b-256 b2b80c0fbedaf09502fc6adfaa689a364428434f880cbf3d9e8ceed555e78f01

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 486efc7b9f38ced4f0a3446c47bc36140e301ec92dd5f5189720f964b47b55c6
MD5 e08f0cb9f3287a2762e80533463d852b
BLAKE2b-256 d4c3e465c51bcb75d7d3c51afb453e72fadb827d41520d98565733b1636b3f00

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fa75ac170ca3d517b90369d18f324c6bbdbca0e92901615c9ce16f45ba2017dc
MD5 294e7e8cd32aaac758621dead116cb62
BLAKE2b-256 3512088fc004459a56118e4aae4fd009c0b0fddca4f1def3e38a59f40362f62b

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 b5ff47498a1a72d986b0dc77c17538f2789501c76eeb8fdfdb49cbbb2a87d813
MD5 0c8a4ef34487414df45b88d06094a62a
BLAKE2b-256 ffc1532d6fdd6372395b55f8ba77df22cd858307493ffc3bbec5b750fc320cb0

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4c74758477a263f0db7094cb6106087b844cfc30479507eefd170501d202601
MD5 fe00a6964b3228bd5400a44cb17b13ff
BLAKE2b-256 cc531d114d4145a8e3c79b4ba5d74af79eb3d1adb3920a44dfc94a90a075842c

See more details on using hashes here.

File details

Details for the file synalog-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for synalog-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2a8171bb0c9bb35ebb36face25093ab945fd0ab72117c8f30da9348dcf18243b
MD5 47095d1ef6a33b7a35497aa03008582f
BLAKE2b-256 ebc05ad34b5e79cf65c5644f80bfd22ac5d6e986698dcf8de78d04f829cf7c31

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page