Skip to main content

eqbool

Python package CI C/C++ CI PyPI Python License: MIT

Testing boolean expressions for equivalence.

eqbool is a C++ and Python rewrite of code originally developed as part of a symbolic gate-level Z80 simulator in pure Python, where increasingly complex Boolean expressions representing gate states need to be repeatedly checked for equivalence. Z3 and several other existing libraries were tried and quickly proven too slow for such use, so a custom solution had to be developed.

The library is specifically designed to reduce overall equivalence-check times by simplifying expressions in ways that never increase the diversity of SAT clauses.

Where equivalence cannot be trivially established via simplifications, eqbool uses the CaDiCaL solver. As the workload is very many small solves rather than a few hard ones, the bundled CaDiCaL version is chosen by measuring on traces of real runs, and is not necessarily the latest release.

#include "eqbool.h"

int main() {
    eqbool::term_set<std::string> terms;
    eqbool::eqbool_context eqbools(terms);
    eqbool::order_context orders(eqbools);
    using eqbool::eqbool;

    eqbool eqfalse = eqbools.get_false();
    eqbool eqtrue = eqbools.get_true();

    // Constants are evaluated and eliminated right away.
    assert((eqfalse | ~eqfalse) == eqtrue);

    // Expressions get simplified on construction.
    eqbool a = eqbools.get(terms.add("a"));
    eqbool b = eqbools.get(terms.add("b"));
    assert((~b | ~eqbools.ifelse(a, b, ~b)) == (~a | ~b));

    // Identical, but differently spelled expressions are uniquified.
    eqbool c = eqbools.get(terms.add("c"));
    assert(((a | b) | c) == (a | (b | c)));

    // Speed is king, so simplifications that require deep traversals,
    // restructuring of existing nodes and increasing the diversity of
    // SAT clauses are intentionally omitted.
    eqbool d = eqbools.get(terms.add("d"));
    eqbool e1 = a & ((b | c) | (~a | ((~b | (d | ~c)) & (c | ~b))));
    eqbool e2 = a;
    assert(!eqbools.is_trivially_equiv(e1, e2));

    // The equivalence can still be established using SAT.
    assert(eqbools.is_equiv(e1, e2));

    // From there on, the expressions are considered identical.
    assert(eqbools.is_trivially_equiv(e1, e2));

    // They then can be propagated to their simplest known forms.
    assert(e1 != e2);

    e1.propagate();
    e2.propagate();
    assert(e1 == e2);

    // Order terms are ordinary terms stating that one of two
    // given values comes before the other; the opposite order
    // is the negation of the same term.
    eqbool a_b = eqbools.get(terms.add("a<b"));
    eqbool b_c = eqbools.get(terms.add("b<c"));
    eqbool a_c = eqbools.get(terms.add("a<c"));
    orders.register_order(a_b, terms.add("a"), terms.add("b"));
    orders.register_order(b_c, terms.add("b"), terms.add("c"));
    orders.register_order(a_c, terms.add("a"), terms.add("c"));

    // Orderings whose terms chain into a cycle are impossible.
    assert(orders.is_never(a_b & b_c & ~a_c));
    assert(orders.is_possible(a_b & b_c));

    // Under consistent orders, spelling out the ordering
    // implied by transitivity changes nothing...
    assert(orders.is_equiv(a_b & b_c, a_b & b_c & a_c));

    // ...but as plain propositions the two expressions differ,
    // and the order context never confuses the two views.
    assert(!eqbools.is_equiv(a_b & b_c, a_b & b_c & a_c));
}

example.cpp

In Python

pip install eqbool
import eqbool


def main():
    # Undefined Bool objects have no associated value or context.
    assert eqbool.Bool().is_undef

    ctx = eqbool.Context()
    assert ctx.false | ~ctx.false == ctx.true

    # Terms can be any hashable objects.
    a = ctx.get('a')
    b = ctx.get('b')
    e = ~b | ~ctx.ifelse(a, b, ~b)
    assert e == ~a | ~b

    # Bool values can be verbalised as usual.
    print(e)

    c = ctx.get('c')
    assert (a | b) | c == a | (b | c)

    # In the Python API, all values get propagated automatically, so
    # simple equality can be used to test for trivial equivalence.
    d = ctx.get('d')
    e1 = a & ((b | c) | (~a | ((~b | (d | ~c)) & (c | ~b))))
    e2 = a
    assert e1 != e2

    assert ctx.is_equiv(e1, e2)

    # Bool objects compare by identity, for speed; established
    # equivalences are followed by the underlying node ids.
    assert e1 != e2
    assert e1.id == e2.id

    # Order terms are ordinary terms stating that one of two
    # given values comes before the other; the opposite order is
    # the negation of the same term.
    orders = eqbool.OrderContext(ctx)
    a_b, b_c, a_c = ctx.get('a<b'), ctx.get('b<c'), ctx.get('a<c')
    orders.register_order(a_b, 'a', 'b')
    orders.register_order(b_c, 'b', 'c')
    orders.register_order(a_c, 'a', 'c')

    # Orderings whose terms chain into a cycle are impossible.
    assert orders.is_never(a_b & b_c & ~a_c)
    assert orders.is_possible(a_b & b_c)

    # Under consistent orders, spelling out the ordering implied
    # by transitivity changes nothing...
    assert orders.is_equiv(a_b & b_c, a_b & b_c & a_c)

    # ...but as plain propositions the two expressions differ,
    # and the order context never confuses the two views.
    assert not ctx.is_equiv(a_b & b_c, a_b & b_c & a_c)

example.py

Download files

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

Source Distribution

eqbool-0.4.tar.gz (331.5 kB view details)

Uploaded Source

Built Distributions

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

eqbool-0.4-cp313-cp313-musllinux_1_2_x86_64.whl (12.6 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

eqbool-0.4-cp313-cp313-musllinux_1_2_i686.whl (12.6 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

eqbool-0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

eqbool-0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl (11.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686

eqbool-0.4-cp312-cp312-musllinux_1_2_x86_64.whl (12.6 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

eqbool-0.4-cp312-cp312-musllinux_1_2_i686.whl (12.6 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

eqbool-0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

eqbool-0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (11.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686

eqbool-0.4-cp311-cp311-musllinux_1_2_x86_64.whl (12.6 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

eqbool-0.4-cp311-cp311-musllinux_1_2_i686.whl (12.6 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ i686

eqbool-0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

eqbool-0.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (11.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686

eqbool-0.4-cp310-cp310-musllinux_1_2_x86_64.whl (12.6 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

eqbool-0.4-cp310-cp310-musllinux_1_2_i686.whl (12.6 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ i686

eqbool-0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

eqbool-0.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (11.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686

File details

Details for the file eqbool-0.4.tar.gz.

File metadata

  • Download URL: eqbool-0.4.tar.gz
  • Upload date:
  • Size: 331.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for eqbool-0.4.tar.gz
Algorithm Hash digest
SHA256 a354ecb623bee0d27db82b0e38b811db20edfe88a0cf670d145280baf2a87b2f
MD5 7ced94dcffb0d8bd77c6e19a6489206f
BLAKE2b-256 ac73c42b321196ace274033222cdbc65b379ae9e856352fea94cdc5dada40568

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4.tar.gz:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c90702a8c3bbb76ac2ec2846b46233d25b14c240978130d4ca5f47602a2a56a8
MD5 02c4079a00bd0d5757ce36b5c4660225
BLAKE2b-256 5915f4ecb32edad2ae83ef1e9457ad0175facf2950bce4246f742421c609ae07

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

  • Download URL: eqbool-0.4-cp313-cp313-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 12.6 MB
  • Tags: CPython 3.13, musllinux: musl 1.2+ i686
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for eqbool-0.4-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 18dfda435659bb8f28ea36c3c059e6d1d8441d3b7c63089b8f384da492f3af72
MD5 21c976f47a541fd19b9e2c00e8111cf0
BLAKE2b-256 59df62bd32c04988edd561b261546300a9720ae3e224dc8ce0615e63bf6c5a80

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp313-cp313-musllinux_1_2_i686.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7cf039533a0563e7fafe8b7f3f28beabb7dc89c4dea782b0bfa1a277debe30d5
MD5 6baa25715d11127a4a5cb199d3317ad9
BLAKE2b-256 e756a875359275012b1313946b400075dc0040293e417a5093ccacdfacc4e1d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 77fc58cd359a6bc0b6f47aa0fde59767fd3601fe4668e10b233c7ea925b54e31
MD5 457f1569c6447e19534d10f632a4a331
BLAKE2b-256 91f9ce459525aec58ae544bd7790240cafe158c76443ede546ec0995e142546b

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 11f4aba2ce5ff44844ca5e1a1d58628fa2924179ea76f389e86282443338caa7
MD5 26d393f457b6ab15dd120d25a2dce885
BLAKE2b-256 e47558fb053219bef577539c8ec8e8e414ecf1369856b3f7b7563d99692e9983

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

  • Download URL: eqbool-0.4-cp312-cp312-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 12.6 MB
  • Tags: CPython 3.12, musllinux: musl 1.2+ i686
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for eqbool-0.4-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 0dcba2a2914c21af236c33b0c02d9a4edb71c6cf9a15ec80da378a717be7f7a5
MD5 2b058e77552228b7dd96db8b5ed12cc9
BLAKE2b-256 a218f0de3eea2aeac8520a5a468fcce722a59346ed0c678f3948988fed8e2295

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp312-cp312-musllinux_1_2_i686.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c57129091824757003210e278b705ffad96bd19fd2d51db6205479e83b1de66b
MD5 e2d920a5890aa355a931c75f9c7b88f8
BLAKE2b-256 543cca58fc072687e82c1670d90926cfacf2e4ba8dd1b4744f655cbd25858fc5

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a5b08bec036990528228276f751bedcb0bd85a2d41a59ce372cc4d814e4e2c74
MD5 48bba378352dff8744cece39cbde7895
BLAKE2b-256 b3f5f240621a945e48f2582d6c25b8e3dd25e823a4a88fb4853cb3d887b7f2a8

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b181be2183ef89338b85d0cc73430b6831d9ba63df6062b3aaa77a48c21184a7
MD5 ae03c00ca8d976b753fe71130101fe94
BLAKE2b-256 ce13972dbc0faee1b745215963f42288cbc66b94306720e97b2d43e0b770754b

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

  • Download URL: eqbool-0.4-cp311-cp311-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 12.6 MB
  • Tags: CPython 3.11, musllinux: musl 1.2+ i686
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for eqbool-0.4-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 be5dad8d5c5fa2bc7e94c161c8bf674da241d9bfc85eed63e8d4fdec4d571766
MD5 7ffaff0b4402053f6a5851377f9ae549
BLAKE2b-256 8b02e365ddc95353b0f49881af336f0e157b4a53ece8bf8b1eee4bc3e34cc8e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp311-cp311-musllinux_1_2_i686.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cab897d138e12e2e091f11c10d6cc458adcc4be3227bfcad54699d474c47b51e
MD5 187351f52a296d234c35c786dc0a2297
BLAKE2b-256 2701962fa86fdea027177f35fc7bb7f2828e6ed5ef8b88a8d66bb09b367b2374

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7e8d171b356ced12afda23527321af4364f13c97a4316aa35c63317548914a5c
MD5 ceee90dd6157561b14e499781fd6c360
BLAKE2b-256 d7705e89acbff9c5d19c3104b04311f83b32638ec741cc24e8904c0d27648acb

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5487ccf7dd85f649fb6add8d60382bd1ea12b340c0b03a06636e56efd63b968e
MD5 ac0a63c44521bf38baa32fe3ae9907a9
BLAKE2b-256 cf0773e2e7da123aa5714fa34ce12d74c8e8386a584e27d19ebd9afd41f3182e

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

  • Download URL: eqbool-0.4-cp310-cp310-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 12.6 MB
  • Tags: CPython 3.10, musllinux: musl 1.2+ i686
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for eqbool-0.4-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 d292480ffbaff4294a97bc3ae8c9366996a2ac4611b8e180302ccf9dce0f1435
MD5 c060bfe3b1dac252e650131da42cbc09
BLAKE2b-256 fd28493b5cfe53ae4f1916f8fec2075f7694749c5d9301da3e331dc1d0cf7b7d

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp310-cp310-musllinux_1_2_i686.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 844a5d6dd9405f47ba4ad2a45529b5981f00774f39dec590ed8f0b2e8ceda604
MD5 c98007fbc399ba513e424e5ffef585bf
BLAKE2b-256 d7cf7597037c8a3c910eb6972a368e1d92984340e3a24516c155814e879b5915

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on kosarev/eqbool

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

File details

Details for the file eqbool-0.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for eqbool-0.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 18f74ae86da834cbc9018242337caab3a28bc74169da169499528b79c049ff47
MD5 68b60830b5181d5c826b62e84e88ffac
BLAKE2b-256 6d37af4e890163f66175703223db1b490de1e26187569493e6b79a1d73ca69f9

See more details on using hashes here.

Provenance

The following attestation bundles were made for eqbool-0.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: release.yml on kosarev/eqbool

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

Release history Release notifications | RSS feed

0.5

17 files

This release

0.4 This release

17 files

0.3

1 file

0.2

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page