Я думал, что все эти методы автоматического дифференцирования заточены под элементарные функции и не работают для таких вот "неявных" процедур, но почитаю поподробнее документацию.
Формально - автодифференциронивание должно работать для почти любого разумного кода. Но для достижения хорошей точности и эффективности строить всё на основе только самых базовых арифметических операций часто не получается. Приходится задавать хотя бы некоторые дополнительные функции в виде примитивов, т.е. явным образом реализовывать производные для них. Примеры: производные всяких sin/cos/exp задаётся аналитически, а не вычисляется автоматически - хотя это в принципе возможно, ведь эти функции реализованы через базовую арифметику. Алгоритмы типа fft или решателей уравнений тоже часто имеет смысл вручную аналитически дифференцировать.