Какую реализацию массива Haskell использовать? АКА, каковы плюсы и минусы каждого

Что мне нужно? [неупорядоченный список]

  • ОЧЕНЬ простая распараллеливание
  • поддержка карты, фильтра и т. д.
  • способность выполнять вычисления на основе массивов эффективно, например, A=B+C, вроде массивов Matlab.
  • Генерация SIMD-кода. Я думаю, что в ближайшем будущем об этом не может быть и речи, но, эй, я могу спросить :)
  • поддержка матриц должна быть как минимум, более высокие размерности сейчас менее приоритетны.
  • возможность получить указатель на него и создать его из указателя C.
  • Поддержка других библиотек. IE, привязки к популярным математическим пакетам C, ввод-вывод на диск или изображения, если массивы двумерные.

Что я вижу?

  • Пакет массива на платформе haskell. Это благословенный и может делать параллель
  • Данные.Вектор. Имеет слияние петель, но не в платформе, поэтому его зрелость мне неизвестна.
  • repa, предоставленный командой DPH, но не работает ни с одной стабильной версией ghc сегодня.
  • Множество вариаций уровня поддержки реализаций массивов. Например, похоже не существует простого способа выгрузить 2D-вектор в файл изображения. IOW, сообщество Haskell, по-видимому, не остановилось на реализации массива.

Так что, пожалуйста, помогите мне выбрать.

EDIT A=B+C относится к добавлению элементов, а не к объединению списков


person rpg    schedule 04.03.2011    source источник
comment
минусы   -  person nmichaels    schedule 04.03.2011
comment
Подождите, разве ваши требования не требуют упорядоченного списка? Я не понимаю, как A=B+C может иметь смысл в ненумерованном списке, если только + не является union.   -  person Dan Burton    schedule 05.03.2011
comment
@ Дэн, я думаю, ты неправильно понял. Запрос эффективного A=B+C относился к числовому сложению, а не к конкатенации. Итак, в Data.Vector это будет zipWith (+).   -  person Thomas M. DuBuisson    schedule 10.03.2011
comment
@TomMD zipWith работает, соединяя элемент 1 первого списка с элементом 1 второго списка. Другими словами, порядок элементов в списках имеет значение. Когда список неупорядочен, это означает, что порядок элементов не имеет значения, поэтому я сказал, что A=B+C в таком сценарии бессмысленно. (если есть 1-й элемент, то он произвольный, так как порядок списка ничего не значит)   -  person Dan Burton    schedule 10.03.2011
comment
@Dan Если rpg хочет добавить векторы способом [a, b, c] + [x, y, z] --> [a+x, b+y, c+z], то zipWith - это именно то, что нужно. Я думаю, что мы спорим, не соглашаясь, какая операция желательна.   -  person Thomas M. DuBuisson    schedule 10.03.2011
comment
@TomMD Я не пытаюсь спорить; Я думаю, вы абсолютно правы. Я просто говорю, что векторы (о которых явно просит rpg) не являются неупорядоченными.   -  person Dan Burton    schedule 11.03.2011
comment
@dan О, я понял! Вы думаете, что он хочет, чтобы массив не был упорядочен. Он упомянул только неупорядоченный список, поскольку в списках свойств векторной библиотеки нет определенного порядка или предпочтений.   -  person Thomas M. DuBuisson    schedule 11.03.2011
comment
Том прав, векторы не отсортированы, а A=B+C здесь относится к поэлементному сложению.   -  person rpg    schedule 11.03.2011


Ответы (3)


Правильно, сообщество не остановилось на хорошей реализации массива. Я думаю, что было бы неплохо представить Haskell Prime, чтобы выдвинуть Vector API и удалить Data.Array.

Вектор очень взрослый! Она имеет:

Это не:

  • иметь достаточную поддержку со стороны других библиотек. IE, привязки к популярным математическим пакетам C
  • матрицы поддержки, но вы можете иметь векторы векторов. Если вы создадите некоторые матричные операции на основе векторов, возможно, вы сможете загрузить их в hackage как векторную матрицу.
  • Генерация SIMD-кода.

ПРИМЕЧАНИЕ. Вы можете превратить строки байтов в векторы чего угодно, поэтому, если у вас есть изображение в виде строки байтов, с помощью Vector.Storable вы можете делать то, что хотите, с изображением в качестве вектора.

person Thomas M. DuBuisson    schedule 04.03.2011
comment
Параллелизм кажется ограниченным векторами в штучной упаковке, тем самым теряя большую часть преимуществ. - person rpg; 04.03.2011
comment
@rpg Да, я сделал vector-strategies, используя очевидные комбинации инструментов parallel и deepseq. Не похоже, что вы можете получить параллельные неупакованные векторы, не обращаясь к чему-то, подкрепленному дополнительными исследованиями (распакован ли repa?), просто нет примитивов для поддержки такой работы. - person Thomas M. DuBuisson; 04.03.2011
comment
repa только в распакованном виде. Они даже не проверяют индексы, прежде чем ссылаться на них. - person rpg; 05.03.2011
comment
Вы смотрели на интерфейс? Это ужасно. - person Thomas M. DuBuisson; 05.03.2011

(Мне запрещено комментировать)

rpg: принимает ли hmatrix Data.Vector? У него есть Data.Packed.Vector, но они одинаковые?

да. Последняя версия hmatrix по умолчанию использует Data.Vector.Storable для одномерных векторов (ранее это было необязательно). Зависимость от вектора не отображается в Hackage, вероятно, потому, что она находится в флаге конфигурации.

Для матриц совместимости LAPACK нет Vector или Vector t, но их можно легко преобразовать (например: Data.Vector.fromList . toRows).

person Alberto Ruiz    schedule 11.03.2011

Если вам нужны привязки к популярным библиотекам C, лучшими вариантами, вероятно, являются hmatrix и blas. Blas — это просто привязка к библиотеке BLAS, тогда как hmatrix предоставляет некоторые операции более высокого уровня. Также существует множество библиотек, построенных на основе hmatrix, предлагающих дополнительную функциональность. Если вы занимаетесь какой-либо матричной работой, я бы начал с этого.

Векторный пакет также является хорошим выбором; он стабилен и обеспечивает отличную производительность. Типы Data.Vector.Storable представлены в виде массивов C, поэтому их взаимодействие с другими библиотеками C тривиально. Самый большой недостаток в том, что нет поддержки матрицы, поэтому вам придется делать это самостоятельно.

Что касается экспорта в формат изображения, большинство библиотек изображений Haskell, похоже, используют ByteStrings. Вы можете либо преобразовать в ByteString, либо привязать к библиотеке C, которая делает то, что вы хотите. Если вы найдете библиотеку Haskell, которая делает то, что вам нужно, должно быть достаточно просто преобразовать данные hmatrix в нужный формат.

person John L    schedule 04.03.2011
comment
Принимает ли hmatrix Data.Vector? У него есть Data.Packed.Vector, но одинаковы ли они? - person rpg; 04.03.2011
comment
@rpg Они не могут быть одинаковыми без hmatrix в зависимости от vector, так что нет. Если вы нажмете на документацию по пикше, вы увидите исходные ссылки, которые показывают их Vector определение. - person Thomas M. DuBuisson; 04.03.2011