Skip to content

Release Notes FORM 5.0.0

jodavies edited this page Jan 27, 2026 · 1 revision

We introduce FORM 5.0.0, a new major release. We have made 50 bug fixes related to features available up to version 4.3.1, and introduced a variety of major and minor new features, which are detailed below.

Changelog - FORM 5.0.0 (2026-01-27)

Added

Diagram generator based on GRACE

  • Added an interface to the graph generator of the GRACE system, enabling graph generation from within FORM scripts (295c9bb, #716, #744)

Arbitrary precision floating-point coefficients

  • Added support for arbitrary precision floating point coefficients and numerical evaluation of common functions and MPL (6a744e8, #532, #680, #724, #725)

FLINT interface

  • Added an interface to the FLINT library, for greatly improved polynomial arithmetic performance (#644).

Other additions

  • Implemented #continuedo to break out of pre-processor #do loops (#443) and (#740).
  • On SortReallocate and #SortReallocate to control the reallocation of the sort buffer at the end of modules (#537).
  • Read-only mode for TableBase, allows the opening of tablebase files without write permissions (#513)
  • To ease debugging efforts, FORM can now print a stack trace on termination on Linux systems, if enabled at compile time and eu-addr2line or addr2line are available (#526).
  • Added support for compression of sort files with Zstandard, resulting in a small performance improvement for heavy disk-based sorts (#541).
  • Added On HumanStats; to include human-readable numbers in the sorting statistics (#678).
  • Added command-line switch -vv to print verbose version information (#780).
  • Added the SubSubVersion_ pre-processor variable, which gives the patch version (#784).

Changed

  • Print a more useful error message in case of MaxTermSize-related crashes (#289).
  • Format Mathematica now encloses dot products (#472) as well as entire expressions (#491) in parentheses. Example:
    V p,q;
    L F = (1 + p.q)^3;
    Format Mathematica;
    P +s;
    .end
    
       F = (
           + 1
           + 3*(p.q)
           + 3*(p.q)^2
           + (p.q)^3
          );
    
    This change avoids problems caused by syntax differences between FORM and Mathematica.
  • FORM now warns when saving expressions with too-long names (over 16 characters), which are truncated in save files (#500, #503, #555).
  • FORM now tries to create the sort file at startup to validate TempSortDir (#527, part of #511).
  • Improved memory allocation for sorting buffers by splitting a large single memory allocation into smaller, individual allocations (#529). This change is intended to ease buffer overrun detection. Unused memory was identified and removed, reducing memory usage (typically 16 MB for sequential FORM and 24 MB per thread for TFORM). The default values for the 3 setup parameters SubLargeSize, SubSmallExtension and SubSmallSize have been updated.
  • In the debug build, FORM now warns when any sort buffer sizes are altered (#529, #590).
  • Enabled deprecation warnings by default for several features (native Windows, 32-bit systems, ParFORM and Checkpoint) (#573). See also #627.
  • Changed Fortran output to append a floating-point suffix to integer literals exceeding 2^31-1, which fixes issues caused by overly large integer literals when using 64-bit Fortran compilers (#584).
  • FORM now always uses "multirun" mode for temporary file names, to avoid clashes when running multiple concurrent FORM jobs with a shared FORMTMP or FORMTMPSORT location (#591).
  • IntoHide; now correctly hides all active expressions at the end of the module. NIntoHide has been added to negate this, similar to Drop/NDrop and Hide/NHide (#671).
  • Warnings due to missed ModuleOptions for the handling of dollar variables in TFORM and ParFORM are now enabled by default, rather than only when On AllWarnings; is set (#649).
  • The default build no longer specifies -march=native to avoid crashes when running FORM on heterogeneous computing clusters (#706).
  • putfirst_ can now be used with tensors (#751).
  • Relaxed placement restrictions for ModuleOption statements controlling the handling of $-variables during parallel execution (#762).
  • A warning is now printed when conflicting dollar-variable moduleoptions are specified (#779).

Fixed

  • Fixed ModuleOption to correctly parse PolyFun f or PolyRatFun f (#473).
  • Fixed a memory error caused by workspace overflow during optimization (#481).
  • Fixed PolyRatFun bugs due to an incorrect clean flag (#482).
  • Fixed a memory error caused by an array index being out of bounds when printing an empty set by On names/On codes (#487).
  • Fixed a memory error in RemoveSpectator after making holes in the spectator array (#488).
  • Fixed crashes in pattern matching when argument wildcards match with more than 8191 arguments (#490, #519).
  • Fixed data races in TFORM thread statistics (#493).
  • Fixed a freeze bug in parsing complex conjugate operators (#502).
  • Fixed a memory leak in the MakeInteger statement associated with handling terms with multiple instances of target functions, which has been present since version 4.2.0 (#509).
  • On Windows, FORM now switches the standard output to binary mode, resolving newline character issues in the output (#511).
  • Fixed incorrect error reporting for buffer overflows in SubSmallExtension (#513).
  • Fixed a bug that could result in termination due to "too small SmallExtension" even when SmallExtension had available space (#513).
  • Fixed possible buffer shortages in sorting function arguments and dollar variables (#515).
  • Fixed bugs in Transform that caused crashes for mulargs when the result size was large (#516).
  • Fixed bugs that led to crashes/nonsense results in TFORM with PolyRatFun (#517).
  • Fixed a bug in ParFORM where the redefine statement failed to handle multiple expressions correctly (#530).
  • Fixed workspace-related issues that caused failures during output optimization with large expressions (#535).
  • Fixed bugs in FactArg that caused crashes when the argument to be factorized or one of the resulting factors was large (#565).
  • Fixed bugs in PolyRatFun that allowed the use of non-symbols (such as vectors, indices and functions) in rational functions, resulting in incorrect results (#570).
  • Fixed wrong signs caused by pattern matching with negative vectors (#583). This bug has been present since version 4.2.0.
  • Fixed isnumerical in the #if instruction (#586).
  • Fixed crashes that occur with Off Compress (#592).
  • Fixed a bug that caused crashes during compression when built without zlib (#593).
  • Fixed rare crashes that occur when loading save files (#594).
  • Fixed a sign handling bug in set element processing where + signs were incorrectly interpreted as unary minus operators (#601).
  • Fixed a crash when using an empty implicitly-declared set (#601).
  • Alleviated lock contention in the load balancing mechanism of TFORM (#613).
  • Fixed typos in error messages for the #breakdo instruction (2319a49).
  • Fixed a memory leak when working inside dollar variables (#652).
  • Fixed missed application of antisymmetric function properties after ChainIn (#657).
  • Fixed a bug when putfirst_ is used on un-equally sized arguments (#658).
  • Fixed missed termination after syntax errors in FindLoop/ReplaceLoop (#660).
  • Fixed incorrect output formatting of FactArg applied to a function of a negative vector (#661).
  • Fixed problems with the #timeout mechanism under TFORM (#672).
  • Fixed a crash when Transform addargs or mulargs is applied to a function with no arguments (#688).
  • Fixed an issue with Repeat when an enclosed Sum creates dummy indices (#689).
  • Fixed a memory leak in the final stage of sorting in the "sub" buffers (#691).
  • Fixed an issue which caused TFORM performance degradation in some benchmarks (#701).
  • Fixed an out-of-bounds read when reading the setup parameters (#714).
  • Fixed a memory leak due to nested #procedure definitions (#722).
  • Fixed a memory leak when a dollar variable is incremented by the pre-processor (#720).
  • Fixed a crash in the tokeniser due to heavy use of bracket substitutions (#731).
  • Fixed infinite loops in the parser after syntax errors (#732).
  • Fixed a bug when using hidden expressions on the RHS when using InParallel; mode (#733).
  • Fixed a bug when using built-in macros in a procedure with an argument-field wildcard (#734).
  • Fixed problems with dummy index renumbering, in combination with Keep Brackets; (#737).
  • Fixed a memory leak when factorised dollar variables are factorised again (#752).
  • Removed stray & characters from warnings (#762).
  • Made warnings for illegal information in number-of-arguments properties of functions non-fatal (#762).
  • Fixed an incorrect error message in the InParallel statement (#762).

Clone this wiki locally