Off-the-shelf optimization packages usually need their vectors in simple generic data structures, such as one-dimensional Fortran arrays. Unfortunately, generic data structures are often inconvenient or unacceptable in the case of complicated vectors or vectors too large to hold in-core. Alternatively, laboratories develop their own in-house optimization software that they adapt to their local data structure and application type. This approach, however, locks a laboratory into a fixed data structure and application style while simultaneously preventing any collaboration with laboratories of a different standard.
Rather than defining a specific data representation, Jest defines the functionality of basic numerical analysis objects, such as vectors, vector spaces, operators, and solvers. Jest's most abstract package, Jam (Java for mathematics), does not contain any implementations but consists of a collection of Java interfaces that assign names and methods to each of Jest's mathematical objects. This interface level ensures that any implementation of an interface will be compatible with any other existing or future Jest object. Consequently, Jam does not impose any implementation detail, such as a vector representation or a subroutine invocation. Instead, Jam's interfaces require all vectors to implement the simple Hilbert vector operations such as addition of two vectors, scaling of a vector, or the computation of the norm of a vector. Similarly, the interfaces require that every operator implements standard methods to image a vector to another vector or to return a reference to the vector space of its domain or range. Jam is not only general by not imposing a specific implementation, it is also extendible by allowing new mathematical object interfaces to be added. Overall, Jam offers a plug-and-play quality: a programmer can accept or replace any part of Jest and preserve compatibility by implementing the corresponding Jam interfaces.
Jest's Juice package contains implementations of Jam interfaces: general solver classes (e.g., a conjugate-gradient solver), simple vector and space classes (e.g., a space of real numbers), simple operator classes (e.g., a zero and an identity operator), and classes of compound vectors and operators that wrap their components into a single vector respectively operator (e.g., product vector or block operator). Since Juice classes are mostly trivial, light-weight implementations, we expect most Jest programmers to use them independent of their particular application.
Finally, the Jag (Java for geophysics) group of packages contains vectors and operators for seismic image processing. Jag is centered around the Rsf (Regularly Sampled Function) vector class. An Rsf vector represents a multi-dimensional regularly sampled, physical functions and is similar to a traditional float array type. An array of axis objects describes the Rsf vector space. Additionally, Jag comprises several seismic image processing packages based on Rsf vectors, e.g., convolution, edge detection, nonstationary patching, and missing data estimation. In general, Jest's packages are grouped by potential users.
Besides Jest's optimization framework, Jest's vector and operator implementation (Jag) constitutes a budding seismic imaging library in its own right. We hope that its object orientation will permit programming intricate but reusable processing algorithms and data structures easily.
Java is a fun programming language. We struggled for years to develop an objected-oriented optimization and imaging package in C++, but our Fortran-programming colleagues found C++ too complex and difficult to master. We consider Java easy to program and hope, as Jest grows and prospers, some of our colleagues will join our effort.
We have little experience with off-the-shelf optimization packages since our laboratory, the Stanford Exploration Project, maintains its own small collection of optimization routines. It is this isolation of researchers and laboratories that Jest sets out to overcome. However, I will first list some brief and brash historic and technical comments on a few alternative libraries for contrast and comparison.
Obviously, Jest is not the first library that attempts to separate solver and application software. Examples of well-known high-quality optimization libraries are MINOS () and MINPACK (). However, these libraries are defined in procedural languages and impose severe restrictions on the application software. To the contrary, Jest does not require any particular implementation of any of its objects. It only requires that an object's mathematical operations are implemented somehow.
Lydia Deng et al. (, ) developed a C++ optimization library for geophysical inversion that addresses similar problems as Jest.
Fomel (, ) focused on performance and implemented a geophysical optimization library in Fortran90 using its modular features.
Historically, Jest is the latest in a series of optimization libraries. Our laboratory developed CLOP , an experimental geophysical inversion library implemented in C++. CLOP enabled Lumley et al. () to prototype a new multiple suppression scheme that probably would not have been attempted in our laboratory's traditional Fortran environment. Nichols and Dye redesigned CLOP's class hierarchy to express abstract objects of vector algebra. Independently Gockenbach and Symes of the Rice Inversion Project developed a similar C++ library. In 1994, the efforts of the two laboratories merged into the Hilbert Class Library (HCL) (). Gockenbach published HCL () and since maintains a detailed web-page (). Jest began as a Java implementation of HCL. We found Java much easier to use and learn than C++: an important fact for traditional Fortran or C programmers.
In the summer of 1996, SEP held an informal conference on objected-oriented numerics (). Afterwards, several participants cooperated to develop a framework to combine HCL's C++ classes with high-performance Fortran90 routines. The required linking of Fortran90 and C++ proved difficult but doable (, ).
Fall 1997, Jacob and Karrenbach implemented a multi-threaded velocity estimation based on Jest and processed a seismic field example.