  The efficient computation of Jacobians represents a fundamental challenge in
computational science and engineering. Large-scale modular numerical simulation
programs can be regarded as sequences of evaluations of in our case
differentiable modules with corresponding local Jacobians. The latter are
typically not available. Tangent and adjoint versions of the individual modules
are assumed to be given as results of algorithmic differentiation instead. The
classical (Jacobian) matrix chain product formulation is extended with the
optional evaluation of matrix-free Jacobian-matrix and matrix-Jacobian products
as tangents and adjoints. We propose a dynamic programming algorithm for the
minimization of the computational cost of such generalized Jacobian chain
products without considering constraints on the available persistent system
memory. In other words, the naive evaluation of an adjoint of the entire
simulation program is assumed to be a feasible option. No checkpointing is
required. Under the given assumptions we obtain optimal solutions which improve
the best state of the art methods by factors of up to seven on a set of
randomly generated problem instances of growing size.
