A Python package for automated mathematical conjecturing
Project description
TxGraffiti: Automated Conjecture Generation Library for Python
TxGraffiti is a Python package for building, evaluating, and refining mathematical conjectures over tabular data (e.g., graph invariants). It provides a clean, composable API for:
- Numeric expressions (
Property): lift columns or constants into first‑class objects supporting+, -, *, /, **. - Boolean predicates (
Predicate): define row‑wise tests and combine them with∧,∨, and¬. - Inequalities (
Inequality): comparePropertyobjects to generate rich, named predicates, with helper methods for slack and touch counts. - Implications (
Conjecture): express and verify if a hypothesis implies a conclusion, with methods for accuracy, counterexample extraction, and more.
This repo will evolve into a full framework for:
- Conjecture generation via linear programming and heuristic filtering.
- Conjecture ranking using sharpness, significance, and geometric scores.
- Counterexample search integrated into a feedback loop (Optimist–Pessimist agents).
- Dataset management for known mathematical objects (graphs, polytopes, integers, etc.).
- Notebook examples showcasing end‑to‑end workflows from data to publishable conjectures.
Installation
pip install txgraffiti # coming soon
# or
git clone https://github.com/RandyRDavila/txgraffiti2.git
cd txgraffiti2
pip install -e .
Quickstart
Below we give examples of the basic functionality of txgraffiti using included sample datasets.
Graph Theory Sample Data Example
Below is a minimal example of using txgraffiti on a built in dataset of precomputed values on simple, connected, and nontrivial graphs.
from txgraffiti.playground import ConjecturePlayground # the main class for finding conjectures
from txgraffiti.generators import convex_hull, linear_programming, ratios # methods for producing inequalities
from txgraffiti.heuristics import morgan, dalmatian # heuristics to reduce number of statements accepted.
from txgraffiti.processing import remove_duplicates, sort_by_touch_count # post processing for removal and sorting of conjectures.
from txgraffiti.example_data import graph_data # bundled toy dataset
# 2) Instantiate your playground
# object_symbol will be used when you pretty-print "∀ G.connected: …"
ai = ConjecturePlayground(
graph_data,
object_symbol='G'
)
# 3) (Optional) define any custom predicates
regular = (ai.max_degree == ai.min_degree)
cubic = regular & (ai.max_degree == 3)
# 4) Run discovery
ai.discover(
methods = [convex_hull, linear_programming, ratios],
features = ['order', 'matching_number', 'min_degree'],
target = 'independence_number',
hypothesis = [ai.connected & ai.bipartite,
ai.connected & regular],
heuristics = [morgan, dalmatian],
post_processors = [remove_duplicates, sort_by_touch_count],
)
# 5) Print your top conjectures
for idx, conj in enumerate(ai.conjectures[:10], start=1):
# wrap in ∀-notation for readability and conversion to Lean4
formula = ai.forall(conj)
print(f"Conjecture {idx}. {formula}\n")
The output of the above code should look something like the following:
Conjecture 1. ∀ G: ((connected) ∧ (bipartite)) → (independence_number == ((-1 * matching_number) + order))
Conjecture 2. ∀ G: ((connected) ∧ (max_degree == min_degree) ∧ (bipartite)) → (independence_number == matching_number)
Integer Sample Data Example
Next, we conjecture on the built in integer dataset.
from txgraffiti.playground import ConjecturePlayground
from txgraffiti.generators import convex_hull, linear_programming, ratios
from txgraffiti.heuristics import morgan, dalmatian
from txgraffiti.processing import remove_duplicates, sort_by_touch_count
from txgraffiti.example_data import integer_data # bundled toy dataset
# 2) Instantiate your playground
# object_symbol will be used when you pretty-print "∀ G.connected: …"
ai = ConjecturePlayground(
integer_data,
object_symbol='n.PositiveInteger'
)
ai.discover(
methods = [convex_hull, linear_programming, ratios],
features = ['sum_divisors', 'divisor_count', 'totient', 'prime_factor_count'],
target = 'collatz_steps',
hypothesis = [ai.is_square, ai.is_fibonacci, ai.is_power_of_two],
heuristics = [morgan, dalmatian],
post_processors = [remove_duplicates, sort_by_touch_count],
)
# 5) Print your top conjectures
for idx, conj in enumerate(ai.conjectures[:10], start=1):
# wrap in ∀-notation for readability
formula = ai.forall(conj)
print(f"Conjecture {idx}. {formula}\n")
The output of the above code should look something like the following:
Conjecture 1. ∀ n.PositiveInteger: ((is_power_of_two) ∧ (is_fibonacci)) → (collatz_steps == prime_factor_count)
Conjecture 2. ∀ n.PositiveInteger: (is_square) → (collatz_steps >= (((17/8 * divisor_count) + -17/8) + (-9/8 * prime_factor_count)))
Conjecture 3. ∀ n.PositiveInteger: (is_square) → (collatz_steps <= (((((-17/10 * sum_divisors) + -391/8) + (1887/40 * divisor_count)) + (34/5 * totient)) + (-1847/40 * prime_factor_count)))
Conjecture 4. ∀ n.PositiveInteger: (is_power_of_two) → (collatz_steps <= prime_factor_count)
Conjecture 5. ∀ n.PositiveInteger: (is_square) → (collatz_steps >= prime_factor_count)
Conjecture 6. ∀ n.PositiveInteger: (is_fibonacci) → (collatz_steps >= prime_factor_count)
Testing
Run the existing pytest suite:
pytest -q
Contributions, issues, and suggestions are very welcome! See CONTRIBUTING.md for guidelines.
Authors
© 2025 Randy Davila and Jillian Eddy. Licensed under MIT.
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 Distribution
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 txgraffiti-0.1.1.tar.gz.
File metadata
- Download URL: txgraffiti-0.1.1.tar.gz
- Upload date:
- Size: 26.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e556d0065d1ffeb59c31321499cbcd450bbf7a783549d3a3887191b11b27ee54
|
|
| MD5 |
b3607714b4bf8c2b0dc7b3f4e766ff03
|
|
| BLAKE2b-256 |
0bd16bbec4b5187a42aae38783bcbb8a392ce0cc5810ef12fd0ad20000b1e0d6
|
Provenance
The following attestation bundles were made for txgraffiti-0.1.1.tar.gz:
Publisher:
release.yml on RandyRDavila/TxGraffiti2
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
txgraffiti-0.1.1.tar.gz -
Subject digest:
e556d0065d1ffeb59c31321499cbcd450bbf7a783549d3a3887191b11b27ee54 - Sigstore transparency entry: 268370329
- Sigstore integration time:
-
Permalink:
RandyRDavila/TxGraffiti2@ed78cec2727b70d10ce8c0e4bd38696da3dec1b3 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/RandyRDavila
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ed78cec2727b70d10ce8c0e4bd38696da3dec1b3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file txgraffiti-0.1.1-py3-none-any.whl.
File metadata
- Download URL: txgraffiti-0.1.1-py3-none-any.whl
- Upload date:
- Size: 30.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6083cd419671cff929d1f2b2bfae8ffc2d5ca6ac1b156e1b090e3c253495326
|
|
| MD5 |
8f2def8bf226a7d32fa61fc2e7d6dd51
|
|
| BLAKE2b-256 |
a678146d611288bc7ee45f02091f4a18b9e1d2a7439aa4ec81c9145c03e7dc4f
|
Provenance
The following attestation bundles were made for txgraffiti-0.1.1-py3-none-any.whl:
Publisher:
release.yml on RandyRDavila/TxGraffiti2
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
txgraffiti-0.1.1-py3-none-any.whl -
Subject digest:
a6083cd419671cff929d1f2b2bfae8ffc2d5ca6ac1b156e1b090e3c253495326 - Sigstore transparency entry: 268370337
- Sigstore integration time:
-
Permalink:
RandyRDavila/TxGraffiti2@ed78cec2727b70d10ce8c0e4bd38696da3dec1b3 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/RandyRDavila
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ed78cec2727b70d10ce8c0e4bd38696da3dec1b3 -
Trigger Event:
push
-
Statement type: