Skip to content

dedoussis/algebrain

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

92 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Algebrain 🧠

Build Status Coverage Status

Combuter Algebra System focusing on symbolic transformations.

100% writen in typescript.

Parser generated using ANTLR4.

Note: Algebrain is still at a very early and unstable stage.

Install

$ npm install algebrain

Usage

Expressions

import Algebrain from "algebrain";

const expr = Algebrain.parse("(3^2)*1.6+5/(y-12.34)");
// Your string expression is now a tree of nodes:
//  +
//  β”œβ”€β”€ *
//  β”‚   β”œβ”€β”€ 1.6
//  β”‚   └── ^
//  β”‚       β”œβ”€β”€ 3
//  β”‚       └── 2
//  └── /
//      β”œβ”€β”€ 5
//      └── -
//          β”œβ”€β”€ y
//          └── 12.34

const evaluated = expr.evaluate();
// Evaluated tree of the following form:
// +
// β”œβ”€β”€ 14.4
// └── /
//     β”œβ”€β”€ 5
//     └── -
//         β”œβ”€β”€ y
//         └── 12.34

console.log(`My evaluated expression is: ${evaluated}`);
// > My evaluated expression is: 14.4+5/(y-12.34)

Under the hood, the above parsing uses an extensive API for structuring algebraic expressions:

// Algebrain heavily relies on the immutable package for persistent data structures
import { List } from "immutable";
import { Operator, Num, Symbol, OperatorSymbol } from "algebrain";

// The above expression: 14.4+5/(y-12.34), is constructed as:
const expr = new Operator(OperatorSymbol.Plus, List([
    new Num(14.4),
    new Operator(OperatorSymbol.Div, List([
        new Num(5),
        new Operator(OperatorSymbol.Minus, List([
            new Symbol("y"),
            new Num(12.34)
        ]))
    ]))
]));

console.log(expr.toString());
// > 14.4+5/(y-12.34)

Transformations

By exploiting the concept of rewriting rules, Algebrain enables the use of custom transformations, that can be entirely developed and compiled within its environment.

import Algebrain, { Transformation } from "algebrain";

const rules = [
    Algebrain.parse("fib(0)=0"),
    Algebrain.parse("fib(1)=1"),
    Algebrain.parse("fib($a)=fib($a-1)+fib($a-2) if const($a)"),
];

const fibonacci = new Transformation("fib", rules);

const expr = Algebrain.parse("fib(15)");

console.log(`The 15th term of fibonacci is: ${expr.transform(fibonacci)}`);
// > The 15h term of fibonacci is 610

Interpreter - The execution framework of Algebrain

Similar to any traditional Computer Algebra System, Algebrain provides a progamming language and an intepreter. Every Algebrain statement or expression, when parsed, results to an object implementing the Executable interface.

✍️ more documentation to come...

Web UI

There is a web-app client that materiliases a friendly interface for exploring algebrain at https://algebrain.io

The source repo of the React app can be found here.

Develop

# Linting
npm run lint

# Unit tests w/ coverage thresholds
npm run test

# Compile typescript
npm run build

# Please commit through the following npm scripts
npm run precommit
npm run commit