Skip to content

arbitrary-number/arbitrary-number-java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ ArbitraryNumberV2: Symbolic Arithmetic Framework for High-Precision, Explainable AI

✨ Overview

We introduce ArbitraryNumberV2, a symbolic number representation that outperforms both floating-point and classical rational number systems in precision, explainability, and extensibility. This representation powers novel machine learning workflows with exact intermediate computations, allowing breakthroughs in areas previously constrained by floating-point limitations.

Philosophical Shift: Arbitrary numbers are not just representations of operations β€” they are numbers. They are fully valid numerical entities, expressed in a symbolic yet exact way, capable of being collapsed into traditional formats (e.g., base-10) or expanded for distributed computation.


πŸ’‘ Key Innovations

1. Exact Arithmetic Without Evaluation

  • Numbers like 1/3 + 1/2 remain unevaluated until needed.
  • Supports deferred simplification, enabling symbolic optimization and lossless computation.

2. AST-Based Number Representation

  • Every number is backed by an Abstract Syntax Tree (AST) composed of terms and operations.

  • Example:

    { "op": "DIVIDE", "args": [ { "op": "POWER", "args": [ "e", "x" ] }, { "op": "ADD", "args": [ "exp1", "exp2", "exp3" ] } ] }

3. Native Support for Complex Operations

  • Includes ADD, SUBTRACT, MULTIPLY, DIVIDE, POWER, LOG, and symbolic VARIABLEs.
  • Negative powers, roots, and exponential/log operations are all expressible and fully auditable.

4. Explainable AI (XAI) Support

  • Symbolic computation is transparently serializable to JSON ASTs.
  • Facilitates traceability in neural networks and softmax functions.

πŸ§ͺ Demonstrated Use Case: Symbolic Softmax

Problem:

Traditional floating-point softmax breaks for extreme values due to overflow:

Input Double-Precision Output
x1 = 0.001 ~0.00000
x2 = 1.0 ~0.00000
x3 = 1000 NaN (overflow)

Symbolic Softmax Output:

Using ArbitraryNumberV2 with the LogSumExp trick, the same inputs yield:

Symbolic Input Softmax Result Explanation
1 * (1/100) 0 Exact
1 * (1/20) 0 Exact
1 * (1000/1) 1 Exact

βœ… No overflow, no NaN, no underflow β€” just pure math.


πŸ“ˆ Implications for ML Research

πŸ”¬ Research Benefits:

  • Symbolic reasoning for neural networks.
  • High-precision inference and gradient computation.
  • Full audit trail for AI predictions (XAI compliance).
  • Lossless softmax, even under extreme data regimes.

πŸ’» Deployment Potential:

  • Targeted for both CPUs and GPUs (via concurrent/distributed evaluation).
  • Easily integrable into Python/Java/C++ ML pipelines.
  • Can extend to graph neural networks, symbolic regression, and causal models.

🧠 Philosophical Note

A number does not cease to be a number just because it is represented by a structure.

The ArbitraryNumberV2 representation treats symbolic numbers as first-class numerical citizens β€” making it not just an implementation trick, but a foundational shift in how we think about numerical computation.


πŸ›  Future Work

  • Graphviz .dot visualization for symbolic ASTs
  • Differentiable symbolic backpropagation
  • CUDA-based symbolic math execution
  • Tensor interface for ArbitraryNumberV2
  • Integration with GGUF or ONNX runtime

πŸ§ͺ How to Run

mvn clean install
java -jar target/arbitrary-number-demo.jar

Or use as a library:

ArbitraryNumberV2 x = ArbitraryNumberV2.term(1, 1, 3);
ArbitraryNumberV2 y = ArbitraryNumberV2.term(1, 1, 2);
ArbitraryNumberV2 sum = ArbitraryNumberV2.add(x, y);
System.out.println(sum.toJson().toString(2));

πŸ‘₯ Authors and Acknowledgements

The Arbitrary Number Project Team

πŸ“œ License

Apache 2.0 License

πŸ“Ž Appendix: Sample AST JSON Output for Softmax Computation

{
  "op": "DIVIDE",
  "args": [
    {
      "op": "POWER",
      "args": [
        {
          "op": "TERM",
          "coefficient": "1",
          "numerator": "271828",
          "denominator": "100000"
        },
        {
          "op": "SUBTRACT",
          "args": [
            {
              "op": "TERM",
              "coefficient": "1",
              "numerator": "1",
              "denominator": "100"
            },
            {
              "op": "TERM",
              "coefficient": "1",
              "numerator": "1000",
              "denominator": "1"
            }
          ]
        }
      ]
    },
    {
      "op": "ADD",
      "args": [
        {
          "op": "POWER",
          "args": [
            {
              "op": "TERM",
              "coefficient": "1",
              "numerator": "271828",
              "denominator": "100000"
            },
            {
              "op": "SUBTRACT",
              "args": [
                {
                  "op": "TERM",
                  "coefficient": "1",
                  "numerator": "1",
                  "denominator": "100"
                },
                {
                  "op": "TERM",
                  "coefficient": "1",
                  "numerator": "1000",
                  "denominator": "1"
                }
              ]
            }
          ]
        },
        {
          "op": "POWER",
          "args": [
            {
              "op": "TERM",
              "coefficient": "1",
              "numerator": "271828",
              "denominator": "100000"
            },
            {
              "op": "SUBTRACT",
              "args": [
                {
                  "op": "TERM",
                  "coefficient": "1",
                  "numerator": "1",
                  "denominator": "20"
                },
                {
                  "op": "TERM",
                  "coefficient": "1",
                  "numerator": "1000",
                  "denominator": "1"
                }
              ]
            }
          ]
        },
        {
          "op": "POWER",
          "args": [
            {
              "op": "TERM",
              "coefficient": "1",
              "numerator": "271828",
              "denominator": "100000"
            },
            {
              "op": "SUBTRACT",
              "args": [
                {
                  "op": "TERM",
                  "coefficient": "1",
                  "numerator": "1000",
                  "denominator": "1"
                },
                {
                  "op": "TERM",
                  "coefficient": "1",
                  "numerator": "1000",
                  "denominator": "1"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

πŸ“Ž Appendix 2: Java Test Case for Symbolic Softmax Demonstration

(Symbolic Softmax with Explainable AST (JSON))

package com.github.arbitrary_number;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONObject;
import org.junit.jupiter.api.Test;

import com.github.arbitrary_number.ArbitraryNumberV2;

public class SymbolicSoftmaxExplainableTest {

    @Test
    public void testExplainableSoftmaxWithAST() {
        // Define extreme input values as symbolic terms
        ArbitraryNumberV2 x1 = ArbitraryNumberV2.term(BigInteger.ONE, BigInteger.ONE, BigInteger.valueOf(100));
        ArbitraryNumberV2 x2 = ArbitraryNumberV2.term(BigInteger.ONE, BigInteger.ONE, BigInteger.valueOf(20));
        ArbitraryNumberV2 x3 = ArbitraryNumberV2.term(BigInteger.ONE, BigInteger.valueOf(1000), BigInteger.ONE);

        List<ArbitraryNumberV2> inputs = List.of(x1, x2, x3);

        // Find max(x)
        ArbitraryNumberV2 max = x1;
        for (ArbitraryNumberV2 x : inputs) {
            if (x.evaluate(10).compareTo(max.evaluate(10)) > 0) {
                max = x;
            }
        }

        // Define symbolic constant for 'e'
        ArbitraryNumberV2 e = ArbitraryNumberV2.term(BigInteger.ONE, BigInteger.valueOf(271828), BigInteger.valueOf(100000));

        // Compute exp(xi - max) for each input
        List<ArbitraryNumberV2> expShifted = new ArrayList<>();
        for (ArbitraryNumberV2 x : inputs) {
            ArbitraryNumberV2 shifted = ArbitraryNumberV2.subtract(x, max);
            ArbitraryNumberV2 exp = ArbitraryNumberV2.power(e, shifted);
            expShifted.add(exp);
        }

        // Compute sum of exponentials
        ArbitraryNumberV2 sumExp = expShifted.get(0);
        for (int i = 1; i < expShifted.size(); i++) {
            sumExp = ArbitraryNumberV2.add(sumExp, expShifted.get(i));
        }

        // Compute softmax and export each AST
        System.out.println("Symbolic Softmax with Explainable AST (JSON):");
        for (int i = 0; i < inputs.size(); i++) {
            ArbitraryNumberV2 numerator = expShifted.get(i);
            ArbitraryNumberV2 softmax = ArbitraryNumberV2.divide(numerator, sumExp);

            // Evaluate to high precision
            BigDecimal value = softmax.evaluate(50);

            // Print result
            System.out.printf("  Input x%d = %s  --> Softmax = %s\n", i + 1, inputs.get(i), value.toPlainString());

            // Export AST as JSON
            JSONObject astJson = softmax.toJson();
            System.out.println("    AST JSON:");
            System.out.println(astJson.toString(2));
        }
    }
}

About

Arbitrary Number Java Implementation

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages