- template <typename T>
External function interface.
To use your own external functions within LocalSolver, you have to first define your external function in one of two ways:
- Implement the LSExternalFunction interface with the call method. The call method must take a LSExternalArgumentValues as single argument and must return a lsint or lsdouble value. The argument values contain the values of the expressions passed to the function. A distinction is made between integer arguments (bool, int) and floating point arguments (double)
- If your program is compiled with C++11, you can use a function, a functor or a lambda function instead. This function may take any number of lsint and lsdouble arguments, or alternatively a single LSExternalArgumentValues. It must return a lsint or lsdouble value.
- Instantiate the function as an LSExpression with LSModel#createExternalFunction or the dedicated shortcut LSModel#externalFunction.
- Pass arguments to your function and call it using LSModel#call. The first operand must the LSExpression returned by createExternalFunction. The other operands must be LSExpressions, whose values will be made accessible to your external function when it is called.
Note 1: Most of the time your external function will be called when the solver is in state S_Running. Do not attempt to call any method of the solver (to retrieve statistics, values of LSExpressions, etc.) in that state or an exception will be thrown. The only accessible function is LocalSolver#stop().
Note 2: Your functions must be thread-safe. According to the “nbThreads” parameter, LocalSolver can be multi-threaded. In that case, your external functions must be thread safe. If you cannot guarantee the thread-safety of your code, we strongly recommend you to limit the search of LocalSolver to one thread with LSParam#setNbThreads.
Note 3: LocalSolver does not manage memory of objects created outside of its environment. You are responsible for the lifetime of your LSExternalFunction, which must last as long as the search is active.
Node 4: You can provide additional data for your function (such as lower and upper bounds) with the help of the LSExternalContext associated with your function (see LSExpression#getExternalContext()).