![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Давно хотел прикрутить метод Хука-Дживса к одной задаче (это один из лучших методов оптимизации без вычисления производных, он хорошо справляется с т.н. «извилистыми оврагами» — одним из проклятий численной оптимизации). Проблема в том, что исходная статья практически недоступна, в книжках метод часто бывает описан с принципиальными ошибками (я знаю несколько примеров, проверять остальные описания нет ни времени, ни желания). В принципе я знаю как работает метод, даже когда-то реализовывал его, но хочется сделать реализацию, в точности соответствующую исходной статье и вышедшему на несколько лет позже обновлению алгоритма. Решение есть: по адресу http://netlib.org/opt/hooke.c лежит исходник канонической реализации метода, авторам которой я доверяю. Начинаю читать исходник и тут начинаются чудеса.
Ни с первого, ни со второго захода разобраться не удается. С виду простой исходник, сотня строк кода, комментарии, все должно быть понятно. С другой стороны, исходник просто изобилует двусмысленностями, которые заставляют сомневаться, сделал это автор с умыслом, решая какую-то проблему, которую я пока не вижу, или же это простая небрежность. После нескольких примеров, когда выясняется, что имеет место небрежность, я начинаю больше доверять себе и двигаюсь вперед быстрее.
К этому добавляются всякие алгоритмические загадки. Один и тот же цикл прерывается двумя способами — оператором break и с помощью флажка, но во втором случае до прерывания выполняется некий дополнительный код, который выполняется и при обычном исполнении тела цикла. Цикл do-while эмулируется циклом while, причем вокруг этого куча синтаксической грязи и с ходу даже не узнать, что это именно do-while. Пробиваться вперед приходится потом и кровью, постоянно изменяя исходник и запуская реверсивные тесты. Тесты иногда сигнализируют о мнимом сбое из-за изменения порядка вычислений, дающего ошибку в последних битах и тогда приходится проверять вручную. В результате код сокращается вдвое и в голове образуется понимание того, как в действительности работает алгоритм.
Все же низкое качество вычислительного софта поражает воображение. Сколько о нем плохо ни думай, а удивиться все равно придется.
Ни с первого, ни со второго захода разобраться не удается. С виду простой исходник, сотня строк кода, комментарии, все должно быть понятно. С другой стороны, исходник просто изобилует двусмысленностями, которые заставляют сомневаться, сделал это автор с умыслом, решая какую-то проблему, которую я пока не вижу, или же это простая небрежность. После нескольких примеров, когда выясняется, что имеет место небрежность, я начинаю больше доверять себе и двигаюсь вперед быстрее.
К этому добавляются всякие алгоритмические загадки. Один и тот же цикл прерывается двумя способами — оператором break и с помощью флажка, но во втором случае до прерывания выполняется некий дополнительный код, который выполняется и при обычном исполнении тела цикла. Цикл do-while эмулируется циклом while, причем вокруг этого куча синтаксической грязи и с ходу даже не узнать, что это именно do-while. Пробиваться вперед приходится потом и кровью, постоянно изменяя исходник и запуская реверсивные тесты. Тесты иногда сигнализируют о мнимом сбое из-за изменения порядка вычислений, дающего ошибку в последних битах и тогда приходится проверять вручную. В результате код сокращается вдвое и в голове образуется понимание того, как в действительности работает алгоритм.
Все же низкое качество вычислительного софта поражает воображение. Сколько о нем плохо ни думай, а удивиться все равно придется.