Чтобы добавить свою собственную функцию, достаточно определить ее в funcadd.c, а затем скомпилировать (включая funcadd.h) для создания файла dll. Например, в библиотеке функций, описанной по адресу https://ampl.com/resources/extended-function-library/, мы скомпилировали funcadd.c, содержащий множество функций, в ampgsl.dll. Затем, чтобы использовать одну из этих функций, например, gsl_expm1, достаточно написать:
load amplgsl.dll; function gsl_expm1;
При компиляции файла *.dll пользователь может указать любое имя этого файла. Далее необходимо убедиться, что бы файл с функцией пользователя *.dll находился в том же каталоге, что и решатель, чтобы решатель мог вызвать его при оценке выражений цели и/или ограничений.
Можно протестировать свою функцию, вызвав ее в операторе AMPL, указав например display mytanh (1.0001);. Таким образом пользователь может проверить правильность работы функции независимо от решателя.
Наиболее общее обсуждение определяемых пользователем функций можно найти в подразделе Advanced Interface Topics раздела Подключение вашего решателя к AMPL www.ampl.com/REFS/hooking2.pdf, начиная со страницы 18. В этом разделе также описаны несколько примеров. Кроме этого, на страничке Огужана Озменама по адресу: http://oguzhanozmen.blogspot.com/2008/07/how-to-import-user-defined-functions-to.html можно получить дополнительную информацию о подключении пользовательских функций.