Мнение специалиста от 13 июля 2013 года | Конструктивная кибернетика

История освоения Wolfram Mathematica, универсальной и мощной платформы автоматизации интеллектуального труда


Введение

Этот пост, как в общем-то понятно из его названия, про то, как я и мои коллеги осваивали программу Mathematica, и что из этого в итоге вышло. Мотивацией к написанию настоящей заметки послужило три, в общем-то малосвязанных друг с другом, момента.

Во-первых, 02 июля 2013 года, наша научно-исследовательская группа объявила о смене технической политики в области математического моделирования и высокопроизводительных вычислений (подробнее...). И этот пост, в принципе, иллюстрирует и вполне объясняет принятое нами решение, которое при поверхностном взгляде может выглядеть как сильное ограничение.

Во-вторых, 23 июня 2013 года, исполнилось ровно 25 лет постине удивительной программе Wolfram Mathematica. Наше краткое поздравление доступно по ссылке, а настоящую заметку – можно считать его расширенной версией.

В-третьих, в блоге Российского сообщества пользователей системы Mathematica появился минипроект: «Рассказы пользователей Mathematica» (подробнее...). После ознакомления с ним, подумалось, что наша нетривиальная и многоходовая история освоения Wolfram Mathematica, возможно будет интересна читателям и может быть кого-нибудь подвигнет на систематическое изучение и применение этой многогранной и мощной программы.

Данный пост практически не содержит кода и математики и совсем не содержит решения конкретных задач. И причин тому две. Во-первых, заметка и так уже получилась по графомански неприлично объёмной, но как говорится: «из песни слов не выкинешь». Во-вторых, назначение у данного поста иное, нежели технические подробности, он о пути и идеологии.

Здесь необходимо отметить, что все высказывания и мысли об ограничениях/достоинствах тех или иных программ и/или технологий, приведённые в данной заметке ниже – это есть субъективное мнение её автора.

Этапы освоения Wolfram Mathematica

Путь освоения программы Wolfram Mathematica, как можно будет увидеть ниже, у меня был достаточно извилист и в чём-то тернист, и в нём явно прослеживается несколько основных этапов. Эти вехи кратко представлены на интерактивной диаграмме:

Ну а теперь чуть подробнее о каждом из этапов.


2000 г. Версия 4. Первое знакомство.

Да, именно c 4-й версии Wolfram Mathematica началось моё знакомство с этим программным продуктом. Первоначально Mathematica воспринял как систему компьютерной алгебры, но в тоже время и почувствовал мощь и скрытый потенциал программы. В учебной и научной деятельности не применял. Причины этого были разные.

С одной стороны уже достаточно хорошо знал и активно применял для численных вычислений MathCAD. В тех случаях, когда его ресурсов не хватало, расчёты делал в собственных программах, написанных на языке С/C++ с привлечением ряда библиотек численного анализа. С другой стороны, для аналитических расчётов вполне хватало карандаша, ластика и бумаги. Информацию при этом черпал из многочисленных справочников и монографий (преимущественно в печатном виде).

Таким образом, особой потребности в изучении этой сложной и непонятной программы, как тогда казалось (особенно после символьно-графического интерфейса MathCAD) – я не испытывал. Но два слова: Wolfram и Mathematica – в глубинах памяти засели.


2006 г. Версия 5.2. Первая попытка применения.

Прошло 6 лет. За это время мои запросы к вычислительным инструментам выросли, но к версии 5.2 выросла и сама программа Mathematica. Тем не менее, попытка сразу написать на ней объёмный код для численных расчётов оказалась неудачной. Неконтролируемое потребление оперативной памяти (а её на компьютере тогда было существенно меньше 4-х ГБ) и плохая устойчивость кода свели на нет все усилия. Отрицательную роль конечно сыграло и отсутствие навыков программирования на языке Mathematica, а также отсутствие квалифицированной техподдержки в «шаговой» доступности (не встретился нам тогда человек, по знаниям и отзывчивости равный Роману Осипову). Вновь выручил язык С и сторонние библиотеки. А Mathematica была отложена до лучших времён, с мыслью, что Стивен Вольфрам обязательно будет продолжать её улучшать. Но всё чаще стало приходить понимание, что для аналитических математических расчётов карандаша, ластика и бумаги уже хватает не всегда...


2008 г. Версия 6. Редкие случаи применения.

Именно 6-я версия Mathematica стала инструментом, который начал сильно выручать со сложными аналитическими расчётами (и порой не столько сложными, сколько утомительными). Причём выбор пал почему-то не Maple, видимо всё-таки версия 4 Mathematica сделала своё дело... Правда на данном этапе программа использовалась исключительно в режиме последовательного диалога (этакого «умного калькулятора»):

Вычислить производную:

Вычисление производной.

Решить дифференциальное уравнение:

Решение дифференциального уравнения.

Решить систему алгебраических уравнений:

Решение системы алгебраических уравнений.

Взять неопределённый интеграл:

Взятие неопределённого интеграла.

Честно говоря, скорость и лёгкость, с которой Mathematica «щёлкала» приведённые выше примеры – завораживала и притягивала. Тем не менее, использовать программу шире, нежели продвинутый калькулятор, не выходило, видимо не пришло ещё её время. Поэтому простенькие численные расчёты всё также делал на MathCAD, а сложные и ресурсоёмкие – всё также писал на языке С/C++. К тому времени освоил технологии SIMD и OpenMP – программы обрели нитевидный параллелизм на уровне ядер процессора, и жизнь сразу наладилась, но не надолго.


2009 г. Версия 7. Вспомогательный инструмент.

В 2009 году случился переломный момент: возможностей MathCAD, даже для простеньких вычислений, резко стало не хватать, и остро встал вопрос на что мигрировать: Maple, MatLAB, Mathematica, что-то иное. Здесь стоит оговориться, что значит: возможностей стало не хватать. Для производительной и комфортной работы очень хотелось следующих вещей:

  • Интеграция сильной символьной математики и сильных численных методов в рамках одной программы, одного документа;

  • Сокращение "зоопарка" программ для сложной визуализации, статистической обработки, анализа графов и т.п. задач;

  • Возможность гибкой и глубокой настройки внешнего вида графиков и диаграмм для задач когнитивной визуализации;

  • Прозрачный экспорт математических выражений в нотацию LaTeX для документирования и публикации;

  • Прозрачный экспорт математических выражений в нотацию языка C при написании программ под HPC кластеры.

Ряд малораспространённых, но интересных программ, а также полуживые Open source решения были отвергнуты сразу. Нужна была масштабируемая платформа с ясным будущим.

Maple был отвергнут из-за своей нестабильности и ограниченности (при решении тех задач, которые нам требовались). Хотя, справедливости ради, стоит отметить, что в то время Maple существенно опережал другие универсальные математические пакеты в вопросах решения дифференциальных уравнений и визуализации их фазовых портретов.

MatLAB проходил по большинству формальных требований, правда символьные вычисления были слабоваты, и интерфейс рабочей области (области вычислений) вызвал противоречивые чувства: неинтуитивный ввод команд, нагромождение окон, и т.п. моменты явно шли ему не в плюс.

Оставалась Mathematica, удовлетворяя и по формальным требованиям, и по интерфейсу рабочей области, который некоторые из моих коллег охарактеризовали как элегантный. На этом муки выбора прекратились. И появилась мотивация. Началось более-менее систематическое изучение синтаксиса и семантики конструкций языка Wolfram Mathematica. В самом начале было трудно, сильно трудно, но здорово выручила книга: [Дьяконов В.П. Mathematica 5/6/7. Полное руководство]. Правда она очень быстро потеряла актуальность, и основное место источника информации занял документационный центр.

Mathematica стала вспомогательным инструментом для численных расчётов – весь необходимый код, ранее созданный в MathCAD начал переноситься в эту среду. Первые программы писались практически исключительно в процедурном стиле (проекция мышления от С/С++ и MathCAD):

QuantityIterations = 1000;
X = RandomReal[{-1, 1}, QuantityIterations];
Y = ConstantArray[0., QuantityIterations];
Do[
Y[[i]] = X[[i]]^2*Sin[\[Pi] Log[X[[i]]]];
,{i, 1, QuantityIterations}];

Ремарка. Кое где в очень старом коде, который приходится использовать повторно, я всё ещё нахожу монстров в виде 5-6-ти вложенных циклов и/или операторов IF THEN ELSE. Естественно, эти места безжалостно рефакторятся, бесплатно давая 2x-13x кратный прирост производительности, придавая коду строгий и лаконичный вид.

Примерно в это же время в моей научной деятельности появились тяжёлые вычислительные задачи, требующие для своей реализации MPI кластеры. Эти задачи конечно программировались на языке C/C++, но макетирование и отладка вычислительных алгоритмов велись на Mathematica.

Большинство аналитических расчётов делалось уже в Mathematica, но всё также в режиме последовательного диалога (на уровне изолированных выражений и операций). При этом отдельные задачи мы стали оформлять в виде цельных ноутбуков, фактически документируя идеи, ход принятия решений, доказательства утверждений, или разработку алгоритмов и процессы вычислений.

Отдельное большое направление применения Mathematica – это когнитивная визуализация результатов расчётов и оформление иллюстраций для публикаций, отчётов, презентаций.

Mathematica стала хорошим помощником. Правда очень сильно не хватало статистических функций и критериев проверки гипотез, функций по вейвлет-анализу, а также ряда специальных возможностей: подгрузки собственных функций и библиотек созданных на языке C/C++; запуск внешних приложений; компилирование функций в С платформу и т. п. фишек.


2010 г. Версия 8. Основной инструмент.

Выход 8-й версии Mathematica ознаменовал собою прорыв. Интерфейс стал стабилен, а сообщения об ошибках ввода и синтаксиса – весьма разнообразными и информативными. Вычислительное ядро прогнозируемо потребляло оперативную память, время исполнения программ было ожидаемо и приемлемо.

Для улучшения наших навыков программирования, и, возможно, спасения своих нервных клеток, наши зарубежные партнёры посоветовали (и дали почитать, за что им большая благодарность) книгу [D.B. Wagner, Power programming with Mathematica], после её прочтения «по диагонали» код немного выправился и преобразился:

QuantityIterations = 1000;
X = RandomReal[{-1, 1}, QuantityIterations];
Y = #^2 Sin[\[Pi] Log@#]&/@X;

После книги D.B. Wagnera и нескольких месяцев упражнений, с десятками «подходов к снаряду», из кода исчезли монстры процедурного стиля, а сам стиль остался в самом минималистичном виде. Т. е. процедурный стиль остался в трёх местах:

  • где он действительно необходим (в том числе по условию исходной задачи);

  • где избавление от него занимает неоправданно много времени, а код нужно просто запустить, чтобы опробовать идею;

  • в весьма запутанных случаях, где у программиста всё ещё не хватает квалификации и навыков функционального программирования и программирования в терминах Rules & Patterns. В борьбе с этим досадным моментом весьма помогает деятельность Леонида Шифрина и хороший форум для сложных и простых вопросов mathematica.stackexchange.com.

Ремарка. Здесь необходимо отметить, что благодаря усилиям сообщества «Российская VK группа Mathematica» и лично Романа Осипова, замечательная книга D.B. Wagnera, стала доступна в электронном виде (см. ссылку).

Переход к функциональному стилю давался нелегко. И основная трудность – это не освоение синтаксиса языка Wolfram, а именно формирование алгоритмического мышления в терминах: Map, Thread, Apply, Rules, Pattern, вместо конструкций for, while, if. Возможно конкретно в этом и заключается ореол таинственности и закрытости Wolfram Mathematica для изучения, при поверхностном взгляде на неё людей, выученных на парадигме языков программирования Fortran, С, Pascal, Basic и им подобных.

Взрывной рост возможностей Wolfram Mathematica, как раз совпал с взрывным ростом наших потребностей: HPC GPGPU CUDA, Data Mining, Data Science, Graph Analysis, Image Analysis, Text Analytics, Nonlinear Dynamic, Big Data. Все сильные ограничения 7-й версии, в 8-й были сняты. Фактически, функционал программы синхронизовался с задачами нашей научно-исследовательской группы (вполне возможно, что и наоборот...).

Mathematica стала применяться для достаточно сложных и ресурсоёмких численных расчётов. К программированию на C/C++ обращались только в самых экстремальных случаях, тем более, что наши зарубежные партнёры предоставляли доступ к GridMathematica кластеру. В общем дело пошло, но мы очень быстро вновь упёрлись в ограничение. Точнее неудобство Mathematica, как среды для разработки и отладки объёмного, алгоритмически насыщенного кода. Но выход был найден практически моментально – это продукт Wolfram WorkBench.

А как же аналитика? Практически все аналитические расчёты были переведены на Wolfram Mathematica, причём глубина использования возможностей символьных вычислений этой программы резко возросла:

(i) многоэтапная обработка символьных выражений с ветвлением операций (путей обработки), как в простеньком иллюстративном примере:.

Обработка символьных выражений с ветвлением путей обработки.

(ii) а также доказательство некоторых утверждений полным перебором вариантов; машинный синтез моделей (формул) по заданным критериям; и решение массы других задач.


20012 г. Версия 9. Главный инструмент.

И вот в конце 2012 года вышла 9-ка. Интеграция с языком R, поддержка цепей Маркова, расширенная поддержка графов – сняла массу ограничений по статистике и по Machine Learning.

Истинная 64-х битная платформа:

64-х битная платформа.

позволила формировать и обрабатывать компактные массивы, содержащие свыше 4-х млрд. элементов.

Расширенный набор Web Operations обеспечивал прямой доступ к данным из среды социальных медиа, существенно ускоряя решение задач класса Data Science.

Расширение возможностей по численному решению дифференциальных уравнений и визуализации их аттракторов, свело на нет воспоминания о возможностях Maple в этой сфере.

Поддержка Image3D и расширенный функционал для работы с изображениями – это просто находка для наших исследований в области приложения Data Mining к биомедицинским проблемам.

Система Wolfram Mathematica 9 – стала нашим главным инструментом решения практически всех без исключения научных задач, как прикладных, так и фундаментальных. Объём .m кода создаваемого в Wolfram WorkBench стал стремительно расти.

Заключение

Итак, я надеюсь, что данный пост позволил читателю получить достаточно цельное представление о том, какими шагами мы двигались на этапе освоения постине удивительной программы Wolfram Mathematica. Кроме того, я также надеюсь, что из данного поста стали понятны причины практически «монопольной» ориентации нашей исследовательской группы на эту универсальную и мощную платформу автоматизации интеллектуального труда.

В качестве небольшого отступления. Мотивация к постоянному изучению Wolfram Mathematica – это эволюция, причём как задач, так и самой программы. Синергия этого процесса порождает знание.

Здесь уместна аналогия. Как известно из истории, первые ЭВМ программировались в машинных кодах, что было достаточно сложной и трудоёмкой задачей. Сильный, качественный прорыв произошёл благодаря разработке первого высокоуровневого языка программирования Фортран в 1954-57 гг. С этого момента взаимодействие человека и компьютера вышло на существенно иной уровень. Возможно сейчас мы наблюдаем следующий виток спирали, в связи с созданием и развитием языка Wolfram.

Скачать данную заметку в формате Wolfram CDF:
Powered by Wolfram CDF  HistoryOfMasteringWM.cdf


Данный документ распространяется на условиях лицензии: «Attribution-NonCommercial-NoDerivs» («Атрибуция – Некоммерческое использование – Без производных произведений») CC BY-NC-ND 3.0 Непортированная.


13 июля 2013 года.

Андрей Макаренко,
группа «Конструктивная Кибернетика».

Обсуждение: contact@rdcn.ru

Ключевые слова: Wolfram Mathematica, история освоения.