OptimJ
Encyclopedia
OptimJ is an extension of the Java
with language support for writing optimization models and abstractions for bulk data processing. OptimJ aims at providing a clear and concise algebraic notation for optimization modeling, removing compatibility barriers between optimization modeling and application programming tools, and bringing state-of-the-art software engineering techniques such as object-orientation and modern IDE support to optimization experts.
OptimJ models are directly compatible with Java source code, existing Java libraries such as database access, Excel connection or graphical interfaces. OptimJ is compatible with development tools such as Eclipse, CVS, JUnit or JavaDoc. OptimJ is available for free with the following solvers lp_solve, glpk, LP or MPS file formats and also supports the following commercial solvers: Gurobi
, MOSEK
, IBM ILOG CPLEX Optimization Studio.
Language concepts=
OptimJ combines concepts from object-oriented imperative languages with concepts from algebraic modeling languages for optimization problems. Here we will review the optimization concepts added to Java, starting with a concrete example.
Readers familiar with Java will notice a strong similarity with this language. Indeed, OptimJ is a conservative extension
of Java: every valid Java program is also a valid OptimJ program and has the same behavior.
This map coloring example also shows features specific to optimization that have no direct equivalent in Java, introduced by the keywords
, which basically represent memory locations that can be written to and read from.
OptimJ also introduces the notion of a decision variable, which basically represents an unknown quantity whose value one is searching. A solution to an optimization problem is a set of values for all its decision variables that respects the constraints of the problem—without decision variables, it would not possible to express optimization problems. The term "decision variable" comes from the optimization community, but decision variables in OptimJ are the same concept as logical variables in logical languages such as Prolog.
Decision variables have special types introduced by the keyword
In the map coloring example, decision variables were introduced together with the range of values they may take.
This is just a shorthand equivalent to putting a constraint on the variable.
In the map coloring example, this set of constraints states that in any solution to the map coloring problem, the color of Belgium must be different from the color of Germany, and the color of Germany must be different from the color of Denmark.
The operator
Constraints typically come in batches and can be quantified with the
Assuming that the array
The type
Traditionally, associative arrays are heavily used in the expression of optimization problems. OptimJ associative arrays are very handy when associated to their specific initialization syntax. Initial values can be given in Intensional definition
, as in:
or can be given in Extensional definition
, as in:
Here each of the entries
Tuple types and tuple values are both written between
This construction is very similar to the Summation notation used in mathematics, with a syntax compatible with the Java language.
Comprehensions can also be used to build collections, such as lists, sets, multisets or maps:
Comprehension expressions can have an arbitrary expression as target, as in:
They can also have an arbitrary number of generators and filters:
Comprehension need not apply only to numeric values. Set or multiset-building comprehensions, especially in combination with tuples of strings, make it possible to express queries very similar to SQL database queries:
In the context of optimization models, comprehension expressions provide a concise and expressive way to pre-process and clean the input data, and format the output data.
Development environment=
OptimJ is available as an Eclipse plug-in. The compiler implements a source-to-source translation from OptimJ to standard Java, thus providing immediate compatibility with most development tools of the Java ecosystem.
OptimJ GUI and Rapid Prototyping=
Since the OptimJ compiler knows about the structure of all data used in models, it is able to generate a structured graphical view of this data at compile-time. This is especially relevant in the case of associative arrays where the compiler knows the collections used for indexing the various dimensions.
The basic graphical view generated by the compiler is reminiscent of an OLAP cube
. It can then be customized in many different ways, from simple coloring up to providing new widgets for displaying data elements.
The compiler-generated OptimJ GUI saves the OR expert from writing all the glue code required when mapping graphical libraries to data. It enables rapid prototyping, by providing immediate visual hints about the structure of data.
Another part of the OptimJ GUI reports in real time performance statistics from the solver. This information can be used for understanding performance problems and improving solving time. At this time, it is available only for lp_solve.
Supported solvers=
OptimJ is available for free with the following solvers lp_solve, glpk, LP or MPS file formats and also supports the following commercial solvers: Gurobi
, Mosek, IBM ILOG CPLEX Optimization Studio.
External links=
Java (programming language)
Java is a programming language originally developed by James Gosling at Sun Microsystems and released in 1995 as a core component of Sun Microsystems' Java platform. The language derives much of its syntax from C and C++ but has a simpler object model and fewer low-level facilities...
with language support for writing optimization models and abstractions for bulk data processing. OptimJ aims at providing a clear and concise algebraic notation for optimization modeling, removing compatibility barriers between optimization modeling and application programming tools, and bringing state-of-the-art software engineering techniques such as object-orientation and modern IDE support to optimization experts.
OptimJ models are directly compatible with Java source code, existing Java libraries such as database access, Excel connection or graphical interfaces. OptimJ is compatible with development tools such as Eclipse, CVS, JUnit or JavaDoc. OptimJ is available for free with the following solvers lp_solve, glpk, LP or MPS file formats and also supports the following commercial solvers: Gurobi
Gurobi
Gurobi is a commercial software package for solving large-scale linear optimization, quadratic optimization, and mixed-integer optimization problems...
, MOSEK
MOSEK
MOSEK is a software package for the solution of linear, mixed-integer linear, quadratic, mixed-integer quadratic, quadratically constraint, conic and convex nonlinear mathematical optimization problems. The emphasize in MOSEK is on solving large scale sparse problems. Particularly the...
, IBM ILOG CPLEX Optimization Studio.
Language concepts=
OptimJ combines concepts from object-oriented imperative languages with concepts from algebraic modeling languages for optimization problems. Here we will review the optimization concepts added to Java, starting with a concrete example.
The example of map coloring
The goal of a map coloring problem is to color a map so that regions sharing a common border have different colors. It can be expressed in OptimJ as follows.Readers familiar with Java will notice a strong similarity with this language. Indeed, OptimJ is a conservative extension
Conservative extension
In mathematical logic, a logical theory T_2 is a conservative extension of a theory T_1 if the language of T_2 extends the language of T_1; every theorem of T_1 is a theorem of T_2; and any theorem of T_2 which is in the language of T_1 is already a theorem of T_1.More generally, if Γ is a set of...
of Java: every valid Java program is also a valid OptimJ program and has the same behavior.
This map coloring example also shows features specific to optimization that have no direct equivalent in Java, introduced by the keywords
model
, var
, constraints
.Models
A model is an extension of a Java class that can contain not only fields and methods but also constraints and an objective function. It is introduced by themodel
keyword and follows the same rules as class declarations. A non-abstract model must be linked to a solver, introduced by the keyword solver
. The capabilities of the solver will determine what kind of constraints can be expressed in the model, for instance a linear solver such as lp solve will only allow linear constraints.Decision variables
Imperative languages such as Java provide a notion of imperative variablesImperative programming
In computer science, imperative programming is a programming paradigm that describes computation in terms of statements that change a program state...
, which basically represent memory locations that can be written to and read from.
OptimJ also introduces the notion of a decision variable, which basically represents an unknown quantity whose value one is searching. A solution to an optimization problem is a set of values for all its decision variables that respects the constraints of the problem—without decision variables, it would not possible to express optimization problems. The term "decision variable" comes from the optimization community, but decision variables in OptimJ are the same concept as logical variables in logical languages such as Prolog.
Decision variables have special types introduced by the keyword
var
. There is a var
type for each possible Java type.In the map coloring example, decision variables were introduced together with the range of values they may take.
This is just a shorthand equivalent to putting a constraint on the variable.
Constraints
Constraints express conditions that must be true in any solution of the problem. A constraint can be any Java boolean expression involving decision variables.In the map coloring example, this set of constraints states that in any solution to the map coloring problem, the color of Belgium must be different from the color of Germany, and the color of Germany must be different from the color of Denmark.
The operator
!=
is the standard Java not-equal operator.Constraints typically come in batches and can be quantified with the
forall
operator. For instance, instead of listing all countries and their neighbors explicitly in the source code, one may have an array of countries, an array of decision variables representing the color of each country, and an array boolean[][] neighboring
or a predicate (a boolean function) boolean isNeighbor
.Country c1 : countries
is a generator: it iterates c1
over all the values in the collection countries
.:isNeighbor(c1,c2)
is a filter: it keeps only the generated values for which the predicate is true (the symbol :
may be read as "if").Assuming that the array
countries
contains belgium
, germany
and denmark
, and that the predicate isNeighbor
returns true
for the couples (Belgium , Germany) and (Germany, Denmark), then this code is equivalent to the constraints block of the original map coloring example.Objectives
Optionally, when a model describes an optimization problem, an objective function to be minimized or maximized can be stated in the model.Generalist concepts
Generalist concepts are programming concepts that are not specific to OR problems and would make sense for any kind of application development. The generalist concepts added to Java by OptimJ make the expression of OR models easier or more concise. They are often present in older modeling languages and thus provide OR experts with a familiar way of expressing their models.Associative arrays
While Java arrays can only be indexed by 0-based integers, OptimJ arrays can be indexed by values of any type. Such arrays are typically called associative arrays or maps. In this example, the arrayage
contains the age of persons, identified by their name:The type
int[String]
denoting an array of int
indexed by String
. Accessing OptimJ arrays using the standard Java syntax:Traditionally, associative arrays are heavily used in the expression of optimization problems. OptimJ associative arrays are very handy when associated to their specific initialization syntax. Initial values can be given in Intensional definition
Intention
Intention is an agent's specific purpose in performing an action or series of actions, the end or goal that is aimed at. Outcomes that are unanticipated or unforeseen are known as unintended consequences....
, as in:
or can be given in Extensional definition
Extension
Extension may refer to:* A cheerleading stunt* The building of community capacity by outsiders, for instance agricultural extension* Extension , relating to the pulling apart of the Earth's crust and lithosphere...
, as in:
Here each of the entries
length[i]
is initialized with names[i].length
.Tuples
Tuples are ubiquitous in computing, but absent from most mainstream languages including Java. OptimJ provides a notion of tuple at the language level that can be very useful as indexes in combination with associative arrays.Tuple types and tuple values are both written between
(:
and :)
.Comprehensions
Comprehensions, also called aggregates operations or reductions, are OptimJ expressions that extend a given binary operation over a collection of values. A common example is the sum:This construction is very similar to the Summation notation used in mathematics, with a syntax compatible with the Java language.
Comprehensions can also be used to build collections, such as lists, sets, multisets or maps:
Comprehension expressions can have an arbitrary expression as target, as in:
They can also have an arbitrary number of generators and filters:
Comprehension need not apply only to numeric values. Set or multiset-building comprehensions, especially in combination with tuples of strings, make it possible to express queries very similar to SQL database queries:
In the context of optimization models, comprehension expressions provide a concise and expressive way to pre-process and clean the input data, and format the output data.
Development environment=
OptimJ is available as an Eclipse plug-in. The compiler implements a source-to-source translation from OptimJ to standard Java, thus providing immediate compatibility with most development tools of the Java ecosystem.
OptimJ GUI and Rapid Prototyping=
Since the OptimJ compiler knows about the structure of all data used in models, it is able to generate a structured graphical view of this data at compile-time. This is especially relevant in the case of associative arrays where the compiler knows the collections used for indexing the various dimensions.
The basic graphical view generated by the compiler is reminiscent of an OLAP cube
OLAP cube
An OLAP cube is a data structure that allows fast analysis of data. It can also be defined as the capability of manipulating and analyzing data from multiple perspectives...
. It can then be customized in many different ways, from simple coloring up to providing new widgets for displaying data elements.
The compiler-generated OptimJ GUI saves the OR expert from writing all the glue code required when mapping graphical libraries to data. It enables rapid prototyping, by providing immediate visual hints about the structure of data.
Another part of the OptimJ GUI reports in real time performance statistics from the solver. This information can be used for understanding performance problems and improving solving time. At this time, it is available only for lp_solve.
Supported solvers=
OptimJ is available for free with the following solvers lp_solve, glpk, LP or MPS file formats and also supports the following commercial solvers: Gurobi
Gurobi
Gurobi is a commercial software package for solving large-scale linear optimization, quadratic optimization, and mixed-integer optimization problems...
, Mosek, IBM ILOG CPLEX Optimization Studio.
External links=