Сменные векторные процессоры в Clojure - PullRequest
2 голосов
/ 19 октября 2010

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

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

  • позволяло превращать любую векторную функцию в сменный модуль , например (def module-a(make-module some-function))
  • позволяют этим модулям быть составленными в конвейеры , например (def комбинированный модуль (объединенный модуль-модуль-a-b))будет подавать выходные данные модуля -a на вход модуля-b
  • , позволяющий вспомогательным функциям получать доступ к состоянию, хранящемуся в данном модуле, например (получить скользящее среднее и некоторое перемещениесредний модуль), который должен был бы работать, даже если какой-то модуль скользящей средней встроен глубоко в объединенный конвейер
  • скрыть любой шаблонный код behiи сцены, например, выделение достаточно больших временных массивов для векторного вычисления.

Похоже ли это на разумный подход?

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

Ответы [ 2 ]

3 голосов
/ 20 октября 2010

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

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

  • A съемный модуль - это функция Clojure, которая принимает одинАргумент, который является состоянием вашего вектора данных.Например, (def module-a some-function) Чтобы обеспечить простое расширение модулями, я предлагаю использовать карту Clojure в качестве вашего состояния, где одно поле - это ваш массив с плавающей точкой.
  • Составляющие модули - это композиция функций.Например, (def combined-module (compose module-a module-b)
  • Вспомогательные функции - это функции доступа, извлекающие состояние из ваших данных.Например, если ваши данные представляют собой карту Clojure с полем :moving-average, то ключевое слово :moving-average является вашей функцией доступа.Состояние не сохраняется в модулях.
  • Код Boilerplate скрыт в реализации ваших функций, которые могут быть объявлены где угодно, возможно, в другом файле и пространстве имен.
2 голосов
/ 19 октября 2010
...