Software Open Access

CppTransport 2018.1

Seery, David

2018.1 release of the CppTransport platform for computation of correlation functions generated during an inflationary epoch in the early universe.

2018.1 includes major new features:

  • Supports models with a nontrivial field-space metric
  • Fully supports integration using arbitrary floating-point types, including doublelong double or multiprecision types such as MPFR, either directly or via a Boost.Multiprecision wrapper
  • New email reporting options during computation
  • Improved code generation
  • Performance improvements and bug fixes, especially in the translator
  • More substantial library of background quantities, including the eta parameter and the mass spectrum

In addition, the database schema for integration data containers has been adjusted slightly. If you encounter the error

SQLite error: no such column: cpu_brand

(normally issued when generating an HTML report) then your repository requires upgrading to the new format. To do so, use the --upgrade flag. Upgrading need be performed only once and leaves the repository backwards-compatible with older versions of CppTransport. While it is possible to use old-format databases with CppTransport 2018.1 if you are not using HTML reports, we recommend that you upgrade all databases.

Platform improvements – translator

  • Major rewrite of the translator front-end to modernize the code-base. Much of this code dated back to 2013. This restructuring makes the parser simpler, more robust and easier to extend
  • Algebra layer now distinguishes between real and complex fields (although currently all fields are real), meaning that operations like abs(x) now work as expected
  • New lagrangian option allows selection of canonical of nontrivial-metric models. New metric keyword allows specification of the metric in a similar way to the potential
  • The translator now understands index variances (ie. covariant or contravariant) and performs validation of these between left- and right-hand sides of indexed expressions
  • Enforces that left-hand side indices occur only once, so that the expression represents a valid tensor assignment
  • Add require_version construct (as part of a new top-level metadata block) to enforce a minimum CppTransport version when processing .model files
  • Improved handling of directives (such as $IF or $SET). These must now appear on a single line by themselves to avoid ambiguity when unrolling indices, and their indices are validated more carefully
  • Report resources that are not used before they are reassigned. This can help catch unnecessary computation when developing templates
  • New replacement rules for the metric and Riemann tensor combinations needed in models with a nontrivial metric. Also new resource labels for these combinations
  • New $MOMENTA replacement rule allows access to the momentum vector. Previously, only $FIELDS and $COORDINATES were available, giving access to the field vector or the full phase-space coordinate vector, respectively
  • Distinguishes resources with different index variance assignments and can reposition these indices on-the-fly as needed. A command-line switch --Wreposition can be used to identify when on-the-fly repositioning occurs, possibly signalling that the computation can be speeded up by caching the result as a new resource
  • Now applies common-subexpression-elimination to code deposited as part of a lambda function. In most cases this will improve efficiency and reduce the code size
  • New command-line switch --Wdevelop provides developer warnings to assist in constructing templates, but allows these warnings to be suppressed in production use. These warnings include unroll-policy violations, enabling easy identification of functions where insufficient resources are available for roll-up to occur
  • Performance profile data is no longer reported unless explicitly enabled with --profile switch. Profiling data is now reported from the lambda manager
  • Improved handling of roll-up or unroll specifiers, and improved handling of roll-up conflicts
  • Improved context information supplied with error or warning reports. To prevent error reports becoming unreadable, processing is now aborted if too many errors occur
  • Enables new adaptive Adams-Bashforth-Moulton stepper from odeint-v2, although its performance is not yet tested
  • The build process will now download and build GiNaC automatically if a system-wide install is not found
  • The odeint-v2 library is downloaded direct from its git repository rather than relying on a version bundled with Boost. This means we can be more aggressive about moving forward as odeint-v2 develops
  • Builds are now tested by continuous integration using Travis.CI. Builds correctly with Clang, Intel C++ 18 and GCC v6
  • Old, deprecated transport-objects code removed

Platform improvements – runtime

  • Supports models with nontrivial field-space metric
  • Track and report average load for master node and worker processes. Also, track and report database performance in inserts-per-second. This may help in spotting performance degradation or other issues during long running jobs
  • Progress reports can now be generated at fixed time intervals or percentage intervals, rather than being fixed at 10%, 20% ... 90% of the complete task. This is done using new --report-interval and --report-percentage command-line switches. Report intervals can now be specified in seconds, minutes, hours or days rather than just minutes
  • Progress reports are now written to a separate log file rather than being mixed in with general logging for the master process
  • Add option to email progress reports during execution (use --report-email to specify one or more email addresses, and --report-when to specify when reports should be issued). Dispatch is done using a separate CppTransport-sendmail script. New CMake variables EMAIL_SMTP_SERVEREMAIL_FROM and EMAIL_PASSWORD can be specified at build configuration time to set up the script automatically, or a suitable script can be provided separately
  • Detects a number of common integration problems
  • Computations may be vetted for std::nan and std::inf by defining CPPTRANSPORT_STRICT_FP_TEST. If detected, the integration is flagged as failed
  • Implements new derived products for mass spectrum and eta parameter
  • Failed integration and post-integration groups are now committed by default, rather than being moved to the failure cache. This allows their results to be re-used as the seed for a later integration (perhaps with a different stepper). The pre-2018.1 behaviour can be restored using the command-line switch --reject-failed
  • Calculate and report estimated total CPU time during work
  • CPU type is recorded in worker information table. To support this the database format has been updated. If you need to upgrade a repository to the new format, use the --upgrade switch. Upgrading need be done only once and leaves the repository backwards-compatible with older versions of CppTransport
  • Time intervals can now be measured in days and weeks, not just seconds, minutes and hours (eg. for checkpoint interval)
  • Improved general logging, now tagged with timestamps and severity levels

Bug fixes – translator

  • The mass matrix M was previously computed incorrectly. At some point, the formula for M was replaced by the formula for the scale-matrix (confusingly also called M) defined in Eq. (3.2b) of arXiv:1210.7800 (b5d7674c)
  • Fix major bug with use-counting in common-subexpression-elimination. Previously, use-counting was not applied recursively to the arguments of special functions. Instead, the cpp_cse implementation simply printed these using GiNaC's own C++ formatting. As a result, required variables might not be deposited to the temporary pool (f7d8a28c)
  • Fix major bug which could lead to incorrect expression output because of bracketing problems (1b4de464)
  • GiNaC functions are now mapped to their C++ versions more correctly. Not all functions are implemented, although most of them are available in Boost.Math and could be included in future (f7d8a28c)

Bug fixes – runtime

  • --include command-line switch to specify include path was unintentionally ignored in configuration files (a4aebd1b)
  • The Planck mass M_P was not available in code to compute the potential derivatives, leading to compilation errors in models that required it (0375f4b2)
  • The runtime platform was not properly agnostic regarding the floating point data type (d2e561d31b0ad972b24e53683849785923862fbe)
  • u3 derived product was computed using an incorrect momentum configuration (74138ca7)
  • Some index-manipulation functions such as SPECIES and FLATTEN were declared in the global transport namespace, leading to symbol collisions and compilation errors on any attempt to use two or more models simultaneously. These symbols should be declared in a model-local namespace and imported as needed (ec4162bb)
  • Tidy up formatting of tabulated output to remove unneeded trailing spaces
  • Detection of terminal width did not always work correctly (25ede97e)
  • CppTransport no longer uses which to locate the Python, dot, and CppTransport-sendmail executables. This causes a fork which can cause trouble if CppTransport is being used under OpenMPI (1f82131b)


Files (1.2 MB)
Name Size
1.2 MB Download
All versions This version
Views 136136
Downloads 4040
Data volume 49.0 MB49.0 MB
Unique views 120120
Unique downloads 3939


Cite as