1959 Commits

Author SHA1 Message Date
Glen Whitney
a2fd057831
fix(simplify): Array and object simplification (#2382)
* fix(simplify): Allow simplify to work in arrays, objects, and indexing

  Mostly ArrayNode, ObjectNode, AccessorNode, and IndexNode nodes are
  simply transparent to simplification -- they simply allow it to occur
  within subexpressions. Then main exception is that if an array or object
  is indexed by a constant, the expression can be replaced by the
  corresponding subitem, e.g. `[3,4,5][2]` simplifies to `4`.

  This at least partially resolves #1913 (see my latest comment there).

* fix(simplify): Resolve operations on constant arrays

  This involves allowing ArrayNodes containing only constant entries
  to temporarily convert to Matrix type inside of simplifyConstant, so that
  function and operator calls can occur on them.
  I also had to add a special case for the function `size` because
  it can be computed even on symbolic arrays, since the result depends
  only on the shape, not the entries.

  Deals with additional cases of #1913; unclear if there are remaining
  aspects of that issue on which further work is desirable.

* chore: fix alphabetization of dependencies

  And restores inadvertent deletion of a blank line.

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2022-01-15 19:43:04 +01:00
Glen Whitney
84c3abdbbb
fix(simplify): Improve collection of nonconstant like terms (#2384)
The key is that the rule-matching engine is optimized for finding matches
  on the lefts of terms, but the central term-collection rule
  `n1*n3 + n2*n3 -> (n1+n2)*n3` was written with the key common term rightmost.
  Reversing this rule to `n3*n1 + n3*n2 -> n3*(n1+n2)` therefore does most
  of the work of improving like-term collection. It also better corresponds
  to typical mathematical presentation: common terms tend to be pulled out
  to the left in common practice.

  Floating constants to the right of a product initially (before they are
  moved back to the left for human-preferred output) and ensuring that
  negations are subsumed into constants whenever possible did the rest.

  Also, rule context was not being propagated into the simplification
  engine; this commit corrects that.

  Resolves #1179.
  Resolves #1290.

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2022-01-15 11:47:43 +01:00
thetazero
7beac55201
add invmod (modular multiplicative inverse) (#2368)
* add invmod (modular multiplicative inverse)

* implement (most) suggestions

* style error

* fix NaN tests

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2022-01-15 11:40:46 +01:00
Glen Whitney
4a1bd3bf3a
fix(simplify): Leave string constants as strings. (#2372)
* fix(simplify): Leave string constants as strings.

  Note that because the `size` built-in function called on a string returns
  a Matrix, which is represented in math.js expressions as an Array, this
  commit has to add ArrayNode as a dependency of `simplify` (and hence
  also of `rationalize`).

  In addition, it requires changing the handling of ArrayNodes
  and AccessorNodes in `simplifyConstant` from "unimplemented" to just a
  pass-through (since a full implementation of simplification in Arrays and
  indexing seemed beyond the scope of this change, but `simplify` must not
  throw an error on `size("foo")`). Hence, this commit also adds skipped unit
  tests for some expressions with arrays and indexing that should ultimately
  simplify.

  It also removes the skip on the test group "should not change the value of
  numbers when converting to fractions (3)" since all of those tests already
  appear to pass.

  Resolves #2152.

  Changes the behavior in #1913 from throwing an error to allowing Arrays and
  indexes but not simplifying inside them.

* chore: Fix lint and remove explanatory comment
2022-01-12 21:16:21 +01:00
Jos de Jong
189712b3f2 Fix linting issue 2021-12-29 14:11:04 +01:00
Jos de Jong
75b568e313 Add a unit test getting a subset with non-consecutive index from a Sparsematrix (see #2367) 2021-12-29 14:00:26 +01:00
Jos de Jong
e3656c014b Change old SparseMatrix set subset unit test results, adjust indexes instead (see #2367) 2021-12-29 13:58:05 +01:00
Alfonso Valenciana
e84a1edfda
Update subset for sparse matrix (#2367)
The method for replacing a subset in a sparse matrix is changed in order to take into account the indexes used as arguments, solving an issue where non-consecutive indexes would give a different result compared to the one given when using a dense matrix.

Unit tests are added for this issue and 2 other tests are changed in order to correctly display the result of this operation.

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-12-29 13:51:46 +01:00
thetazero
24a215fe0e
add fraction support to intersect.js (#2329)
* add fraction support to intersect.js

* Refactor as per josdejong's suggestions

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-12-29 13:40:41 +01:00
Jos de Jong
e8a50259e7 Remove redundant piece 0*? in regex (see #2363) 2021-12-29 13:29:39 +01:00
Hyeonjong
43e705e7f6
Add simplify rule (#2365)
* Add simplify rule (Fix #2156)

* Add some tests

* Add more tests

* Fix simplify rule
2021-12-29 13:19:30 +01:00
Bartosz Leoniak
ccd6ad9aaf
refactor(gamma function): use lanczos approximation with comments (#2364)
* refactor(gamma function): use lanczos approximation with comments

* tests: additional checks for specific numbers

* tests: check for value close to re(0.5)
2021-12-19 17:59:39 +01:00
Bartosz Leoniak
d2583b0d67
fix(gamma function): use reflection formula to handle negative values (#2362)
* fix(gamma function): use reflection formula to handle negative values

* lint
2021-12-15 11:33:04 +01:00
Ramesh Vijayaraghavan
c7f4c53483
Support for Percentage Operation (#2304)
* Support for Percentage Operation

* Fixed Style issue

* Added Test case to check for modulo followed by pi

* Support for % addition and % subtraction

* Fixed Documentation comment

* Support - Should not calculate mod for negative divisor

* Updated Docs

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-09-22 11:45:37 +02:00
Jos de Jong
ed0fe9678e Fix #2319: make the API of Parser.evaluate consistent with math.evaluate: support a list with expressions as input 2021-09-20 21:42:36 +02:00
Jos de Jong
db39237c0f Update browser versions in browserstack tests 2021-09-15 12:24:40 +02:00
Michal Grňo
4dbf40460b
Fix intersect not returning null for matrix input (#2270)
* refactored intersect, fixed it not returning null for matrix input

* intersect: improved flattening algorithm, added tests

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-07-07 09:16:22 +02:00
davidtranhq
f79fec6db5
Fix ArrayNode.toTex(): Remove the row delimiter on the last row (#2267)
* fix toTex(): remove row delimiter on the last row

* remove row delimiter on the last row (use map and join instead of forEach)

* fix ArrayNode.toTex() unit tests incorrectly expecting a row delimiter on the last row

* added toTex() tests for nested cases

* fixed ArrayNode.toTex() for nested cases

* removed redunant variable
2021-07-03 12:10:22 +02:00
Jos de Jong
9ba193ce8a Update history, remove a redundant config setting 2021-06-23 15:24:05 +02:00
Michal Grňo
b4eed8ee92
Fix Decimal prototype pollution (#2244)
* changed BigNumber to a class that extends Decimal.clone(...)

* it works... if you patch decimal.js

* added a test that checks if sum of Decimals works

* minor improvement of code quality

* updated Decimal.js to 10.3

* removed the optional chaining operator to keep compat w/ Node 12

* removed try/catch from isBigNumber

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-06-23 15:23:08 +02:00
Jos de Jong
6f804cb882 Revert to mocha@8.4.0, mocha@9.0.1 causes some of the unit tests to fail on IE 11 2021-06-23 15:01:08 +02:00
Jos de Jong
645c80e9bb Use configured mocha timeout in karma tests 2021-06-23 13:07:03 +02:00
Jos de Jong
4d841e4572 Create a mocha config file, define global timeout of 10 seconds 2021-06-23 11:03:08 +02:00
Jos de Jong
1469ddf381 Fix linting issue, update history and authors 2021-06-23 10:51:14 +02:00
Jos de Jong
c8742d18cf Fix #2253: expression parser throwing an error when accessing nested object properties named e 2021-06-23 10:35:17 +02:00
Jos de Jong
827373521d Give unit test more time to run (for IE) 2021-06-05 11:32:13 +02:00
Michal Grno
0dfc1482ac fix linting issues 2021-06-03 02:49:26 +02:00
Michal Grno
c99f3a0160 added a test for inverse iteration 2021-06-03 02:49:26 +02:00
Jos de Jong
e051cae156 Do not use Object.entries for now (gives IE11 error, babel transpilation missing I suppose) 2021-05-19 16:34:19 +02:00
jhugman
e80995d52d
Add support for scopes with get and set methods (#2166)
* Add support for scopes with get and set methods

* Fix build for node v12

* Fixup cli and parser tests

* Add tests for simplify and evaluate

* Add example for a custom scope object

* Function calls need child scopes

* Transitionary step: Separate Safe and Scope Property calls

* Renamed identifiers in FunctionNode

* Evaluate with ObjectScopeWrapper

* Simplify tests passing

* Assume all scopes are map-like. Except parser

* Remove isMapLike check in customs.*SafeProperty() methods

* Change MapLike to Map

* Move keywords from an Object to a Set

* Move ScopeProperty functions in to scope.js

* Removed deprecation warning

* Rename scope.js to map.js

* Rename ScopeProperty to MapProperty

* Add tests and docs for map.js

* Put back the micro-optimization of function calls

* Use Map in the parser

* Called scope methods directly in cli.js

* Coercing of scope into a Map is done in Node, not evaluate

* Move createSubScope to its own file

* Fixup following self-review

* Add scope docs

* Final self-review changes

* Address reviewer comments

* Remove MapProperty witness marks

* Converted broken benchmark possibly lost in a rebase

* Use bare map as scope in benchmark

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-05-16 13:33:01 +02:00
Jos de Jong
7ed12ccd70 Upgrade to fraction.js@4.1.0, and integrate support for pow of rational exponents 2021-05-16 10:22:36 +02:00
Jos de Jong
410f5348ea Fix benchmarks not running (must load as CommonJS files) 2021-05-12 11:39:19 +02:00
Michal Grňo
435a6a0879
Fix “AIAO-MIMO” of my previous PRs (#2210)
* fix aiao-mimo of eigs(m)

* fix aiao-mimo of matrixFromFunction
2021-05-12 10:34:40 +02:00
Michal Grňo
d7a5693e91
Matrix creation and conversion methods (#2155)
* made dense and sparse matrices iterable, fixed #1184

* added matrixFromFunction, fixes #2153

* added tests for matrixFromFunction

* added matrixFromRows

* added matrixFromColumns

* added rows() and columns() for dense matrix

* improved sparse documentation a tiny bit

* fix linting issues

* added matrixFromRow/Column to seealso of row and column

* removed unnecessary duplication from matrixFromRows/Columns

* added babel runtime

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-05-09 10:26:16 +02:00
Michal Grňo
9e8deb5c86
General eigenproblem algorithm (#1743)
* split the eigs function into multiple algorithms

* moved checks and coersions to eigs.js, made them more robust

* fix little bugs, make im and re more robust

* Implemented matrix balancing algorithm

* fix typos

* a draft of reduction to Hessenberg matrix

* finished implementation of reduction to Hessenberg

* fix Hessenberg elimination for complex numbers

* implemented non-shifted explicit QR algorithm for real matrices

* implemented vector computation, won't work untill usolve is fixed

* refactored to match yarn lint

* some minor changes

* solve merge conflicts

* refactored and re-fixed #1789

* some old uncommited changes

* fix small problems introduced by merging

* done some polishing

* improved jsdoc description of eigs

* little changes in jsdoc

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-04-18 10:52:51 +02:00
Jos de Jong
e6af8ec92a Fix #2167: typo in error message 2021-04-14 10:07:55 +02:00
Jos de Jong
c6cbf55389 Fix #2150, #660: give a clear error "Error: Undefined function ..." instead when
evaluating a non-existing function, and expose internal functions `FunctionNode.onUndefinedFunction(name)` and `SymbolNode.onUndefinedSymbol(name)`
2021-04-10 13:38:04 +02:00
Viktor
91141bbbb6
Miller–Rabin primality test (#2139)
* Miller–Rabin primality test

* add tests for some big numbers

* Update isPrime.js

* Update isPrime.js

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-04-10 10:14:16 +02:00
Colin Holzman
90e15c6d95
Support for parsing non decimal numbers with radix point (#2122)
* Basic untested support for parsing non decimal numbers with radix point.

* Added some documentation for function parseNonDecimalWithRadix.

* Renamed variable in BigNumber constructor.

Not related to current feature branch but is a good change.

* Improved some variable and function names in number.js and fixed an error when parsing octal numbers with radix point.

* Added some tests and fixed linter issues.

* Added some documentation on new syntax.

* Added more tests.

* Added more tests for edge cases.
2021-03-10 09:01:08 +01:00
Jos de Jong
67a9878073 Revert "Configure default timeout for mocha tests as 10 seconds"
This reverts commit f812e662
2021-02-03 19:01:15 +01:00
Jos de Jong
f812e66252 Configure default timeout for mocha tests as 10 seconds 2021-02-03 17:58:37 +01:00
Josef Wittmann
928a950f02
Remove Duplication (#2093)
* Remove customString duplication in Node

* Extract last dimension change in transform

* Add unit tests to lastDimToZeroBase

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-01-31 11:13:51 +01:00
Josef Wittmann
bf0eedfdd5
Implement count based on size (#2092)
* Implement count based on size

Closes #2085

* Improve count implementation

Co-authored-by: Jos de Jong <wjosdejong@gmail.com>
2021-01-31 11:02:26 +01:00
Quentin Truong
02d36c1177
Check for equal number of arguments in simplify (#2090)
* Check for equal number of arguments when simplifying non-associative nodes

* Use === instead of ==

* Run linter and remove trailing space
2021-01-27 11:10:14 +01:00
Jos de Jong
6fc5d0e39b Fix merge conflicts 2021-01-24 11:03:55 +01:00
Jos de Jong
c56000228f Upgrade to webpack@4.46.0. Some fixes in integration tests, and better logging. 2021-01-16 15:51:12 +01:00
Colin Holzman
d12f3a5fac
Word size suffix and BigNumber support for bin oct hex literals (#1996)
* added support for word size suffix in getToken

* start modifying number(string) to support word size suffix for signed integers

* word size suffixes for Number

* initial support for BigNumber

* fix linter issues

* remove unused variable

* start extending bitwise operators for Number for values greater than 32 bits

* Revert "start extending bitwise operators for Number for values greater than 32 bits"

This reverts commit 6fac1a7b10665a221ab5de521c08fa9fcf959eb1.

* add a test for 53 bit literal

* added an optional second argument to bin, oct, and hex to allow formatting signed numbers with custom word size

* removed size checks

* Attempted to extend bin, oct, hex format functions to work with BigNumber, but not working fully.

Apparently Decimal.js toString method doesn't take a base parameter like js number does. I guess I have to do the formatting myself.

* Added n2base function to do formatting for BigNumber.

* Added check for zero in n2base.

* Removed old failing tests.

* Added some tests (failing).

* Extended 'format' function with 'base' and 'wordSize' options and changed 'bin', 'oct', and 'hex' to use 'format' function.

* Fixed lint issues.

* Fixed issues related to the merge.

* Corrected a test.

* Fixed bignumber formatter.

* Added tests for math.format with 'base' and 'wordSize' options.

* Fixed lint issue.

* Changed 'base' option to 'bin', 'oct', and 'hex' values for 'notation' option of 'format' function.

* Added word size suffix to the output of format, bin, oct, and hex.

* Updated documentation.
2021-01-06 09:46:58 +01:00
Josef Wittmann
dcab05272a
Add numpy-like reshape wildcard 2020-12-31 09:49:25 +01:00
Josef Wittmann
e62bff8506
Add Julia-like reshape wildcard (wip)
Problem: The parser tries to find `end` for the wildcard.
2020-12-31 09:19:42 +01:00
Flaviu Tamas
a3360d316b
Improve performance of _findUnit (#2065)
* Add unit parser benchmark

* Add LRU to memoize function

* Memoize _findUnit

This fixes some performance issues in my heavily-unit-parsing app.
Another idea might be to do an index of reversed unit names, and search
in that, but this is much easier to implement and still should provide
an improvement in the majority of cases (since I'd imagine that most
users tend to prefer a few units at a time, depending on their
application).

* Optimize memoize function

This should be just a little bit faster than before by using Maps, which
have less overhead than javascript objects.
2020-12-24 09:10:53 +01:00