Skip to main content

A Python package for automated mathematical conjecturing

Project description

TxGraffiti: Automated Conjecture Generation in Python

PyPI version Documentation Status Build Status License codecov


TxGraffiti is a Python package for automated mathematical conjecture generation.

It uncovers patterns, equalities, and inequalities in structured datasets by forming symbolic expressions and proposing data-backed conjectures. While originally developed to explore graph-theoretic invariants, TxGraffiti is domain-agnostic and can be applied to any tabular data where mathematical relationships may be discovered.

Built on principles from the Graffiti family of programs, TxGraffiti blends logic, optimization, and heuristics to create meaningful, testable mathematical statements. It is designed for:

  • 📐 Mathematicians exploring new bounds and relationships
  • 📊 Data scientists modeling symbolic structure in tabular data
  • 🤖 AI researchers studying machine-driven discovery
  • 📚 Educators demonstrating the intersection of math and computation

The system combines symbolic logic, heuristic filtering, and optimization techniques to produce clear, interpretable conjectures—making it a powerful tool for researchers, educators, and AI-assisted discovery.


Features

  • Work with properties (numeric features), predicates (boolean tests), and inequalities
  • Automatically generate conjectures using convex hull, LP, and ratio methods
  • Apply heuristics to reduce noise and prioritize meaningful conjectures
  • Compose logical hypotheses and filter conjectures by truth and significance
  • Use built-in datasets on graphs and integers, or plug in your own
  • Export results to Lean4, search for counterexamples, and iterate

📦 Installation

Install the latest release from PyPI:

pip install txgraffiti

To install the development version from source:

git clone https://github.com/RandyRDavila/TxGraffiti2.git
cd TxGraffiti2

# Optional: create and activate a virtual environment
python -m venv .venv
source .venv/bin/activate   # On Windows, use: .venv\Scripts\activate

# Install the package in editable mode with development dependencies
pip install -e .[dev]

TxGraffiti requires Python 3.8 or later.


Example: Graph Theory Conjectures

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  # main interface for discovery
from txgraffiti.generators    import convex_hull, ratios
from txgraffiti.heuristics    import morgan_accept, dalmatian_accept
from txgraffiti.processing    import remove_duplicates, sort_by_touch_count
from txgraffiti.example_data  import graph_data            # bundled toy dataset

# 1. Instantiate your playground
ai = ConjecturePlayground(
    graph_data,
    object_symbol='G'  # used in pretty-printing: ∀ G: ...
)

# 2. (Optional) Define custom predicates
regular = (ai.max_degree == ai.min_degree)
cubic   = regular & (ai.max_degree == 3)

# 3. Run conjecture discovery
ai.discover(
    methods         = [convex_hull, ratios],
    features        = ['order', 'matching_number', 'min_degree'],
    target          = 'independence_number',
    hypothesis      = [ai.connected & ai.bipartite,
                       ai.connected & regular],
    heuristics      = [morgan_accept, dalmatian_accept],
    post_processors = [remove_duplicates, sort_by_touch_count],
)

# 4. Print your top conjectures
for idx, conj in enumerate(ai.conjectures[:10], start=1):
    print(f"Conjecture {idx}. {ai.forall(conj)}\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)

Example: Integer Dataset

Next, we conjecture on the built in integer dataset.

from txgraffiti.playground    import ConjecturePlayground
from txgraffiti.generators    import convex_hull, ratios
from txgraffiti.heuristics    import morgan_accept, dalmatian_accept
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, 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_accept, dalmatian_accept],
    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

Contributing

Contributions, ideas, and suggestions are welcome! To get involved:

  1. Fork the repository
  2. Create a new branch
  3. Submit a pull request

See CONTRIBUTING.md for details.


License

This project is licensed under the MIT License. See the LICENSE file for details.


Authors

  • Randy Davila, PhD – Lead developer

  • Jillian Eddy – Co-developer, logic design

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

txgraffiti-0.3.10.tar.gz (3.7 MB view details)

Uploaded Source

Built Distribution

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

txgraffiti-0.3.10-py3-none-any.whl (4.1 MB view details)

Uploaded Python 3

File details

Details for the file txgraffiti-0.3.10.tar.gz.

File metadata

  • Download URL: txgraffiti-0.3.10.tar.gz
  • Upload date:
  • Size: 3.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for txgraffiti-0.3.10.tar.gz
Algorithm Hash digest
SHA256 cd025e040d86c78799295daecf7434dbb871b200d96fdee88aa63b22aad2d743
MD5 a0bfbf7b9b039efa394d12ad5d52ff3f
BLAKE2b-256 744cc23cfa079c0418587bedb2cb52fadff90b4814e75784f608052ede4df10d

See more details on using hashes here.

Provenance

The following attestation bundles were made for txgraffiti-0.3.10.tar.gz:

Publisher: release.yml on RandyRDavila/TxGraffiti2

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file txgraffiti-0.3.10-py3-none-any.whl.

File metadata

  • Download URL: txgraffiti-0.3.10-py3-none-any.whl
  • Upload date:
  • Size: 4.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for txgraffiti-0.3.10-py3-none-any.whl
Algorithm Hash digest
SHA256 12dddf71e0854838e843da3c09ec1074a1bf1266b9bc90115c23a7c2fd8e90cc
MD5 9375c3de438c0bce1b277073f06ed1fd
BLAKE2b-256 115f72396f26878e1d203b1725a63ef2bfb8c86a65347bcbe4d780a9a9ba127b

See more details on using hashes here.

Provenance

The following attestation bundles were made for txgraffiti-0.3.10-py3-none-any.whl:

Publisher: release.yml on RandyRDavila/TxGraffiti2

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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