Подключаемые блоки векторной обработки в Clojure

Я разрабатываю некоторое программное обеспечение для моделирования в Clojure, которое должно будет обрабатывать множество векторных данных (в основном возникающих в виде смещений в массивы с плавающей запятой Java, длина которых обычно находится в диапазоне 10-10000). Большое количество этих векторов должно будет пройти через различные этапы обработки, например. нормализация векторов, объединение двух потоков векторов, вычисление скользящего среднего и т. д.

Вместо того, чтобы делать все в императивном стиле, я надеялся создать более функциональное решение Clojure, которое будет делать следующее:

  • позволяет превратить любую векторную функцию в подключаемый модуль, например. (def module-a (сделать-модуль какой-то функцией))
  • позволить этим модулям быть компонованными в конвейеры, например. (def Combined-Module (combine-in-series module-a module-b)) будет подавать вывод модуля-a на вход модуля-b.
  • разрешить вспомогательным функциям доступ к состоянию, хранящемуся в заданном модуле, например (get-moving-average some-moving-average-module), который должен работать, даже если модуль some-moving-average встроен глубоко в комбинированный конвейер.
  • скрыть любой шаблонный код за кулисами, например выделение достаточно больших временных массивов для расчета векторов.

Звучит ли это как разумный подход?

Если да, то какие-нибудь подсказки по реализации или библиотеки, которые могут помочь?


person mikera    schedule 19.10.2010    source источник


Ответы (2)


На функциональном языке все является потоком данных. Вы можете использовать функции в качестве концепции вашего модуля.

Для решения каждого из ваших вариантов использования:

  • Подключаемый модуль – это функция Clojure, которая принимает единственный аргумент, являющийся состоянием вашего вектора данных. например (def module-a some-function) Чтобы упростить расширение с помощью модулей, я предлагаю использовать карту Clojure в качестве вашего состояния, где одно поле — это ваш массив с плавающей запятой.
  • Композиция модулей – это композиция функций. например (def combined-module (compose module-a module-b)
  • Вспомогательные функции — это функции доступа, извлекающие состояние из ваших данных. например Если ваши данные представляют собой карту Clojure с полем :moving-average, то ключевое слово :moving-average является вашей функцией доступа. Состояние не хранится в модулях.
  • Шаблонный код скрыт в реализации ваших функций, которые могут быть объявлены где угодно, возможно, в другом файле и пространстве имен.
person Jonathan Tran    schedule 19.10.2010

Кассовый трубопровод. http://intensivesystems.net/tutorials/conduit-motive.html

person Jim Duey    schedule 19.10.2010