Часовня, эквивалентная NumPy `Arange` / эквивалент C для цикла - PullRequest
0 голосов
/ 07 января 2019

Какой самый идиоматичный способ в Часовне зацикливаться на серии действительных чисел с фиксированным приращением?

Эквивалентный код C будет:

for (x = 0.0; x<1.0; x+=0.1) {}

В Python / Numpy можно написать

x = numpy.arange(0.0, 1.0, 0.1)

Я мог бы представить написание итератора, как показано ниже, но есть ли эквивалент, встроенный в языковые / стандартные модули? (и тогда, конечно, возникает вопрос о написании параллельных версий этого)

iter arange(start, stop, step) {
  var x = start;
  while (x < stop) {
     yield x;
     x += step;
  }
}

Ответы [ 2 ]

0 голосов
/ 07 января 2019

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

// Define the general case
iter arange(type t, start, stop, step=1:t) {
  assert(stop > start, "Stop must be greater than start");
  assert(step > 0, "Step must be greater than 0");
  var x : t = start;
  while (x < stop) {
    yield x;
    x += step;
  }
}

// Overload for type from arguments
iter arange(start:?t, stop:t, step:t=1:t) {
  for x in arange(t, start, stop, step) do yield x;
}

// Overload for no start and default step = 1
iter arange(type t, stop) {
  for x in arange(t, 0, stop, 1) do yield x;
}

// Overload for no start and default step = 1
iter arange(stop:?t) {
  for x in arange(t, 0, stop, 1) do yield x;
}


// Example of simple iteration
for xi in arange(0.0,1.0,0.1) do writef(" %r",xi);
writef("\n");
for xi in arange(real,0,1,0.1) do writef(" %r",xi);
writef("\n");


// But Chapel allows other wonderful things once you
// define an iterator

// Array assignment
var x = arange(real, 0, 1, 0.1);
writeln(x);

// Promote a scalar function
var y = sin(2*pi*arange(real, 0, 1, 0.1));
for yi in y do writef(" %.3r",yi);
writef("\n");

// Step is optional
writeln(arange(real, 0, 10));
writeln(arange(0.0, 10.0));

Запуск этого производит

 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
 0 0.588 0.951 0.951 0.588 1.22e-16 -0.588 -0.951 -0.951 -0.588 -1.13e-15
0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
0 голосов
/ 07 января 2019

В Chapel в настоящее время нет встроенной поддержки итерации по регулярным последовательностям значений с плавающей запятой. Время от времени мы обсуждали расширение типа диапазона Chapel для поддержки типов индексов с плавающей запятой, но до сих пор не реализовали эту идею. Я считаю, что в настоящее время нет стандартной поддержки библиотек для таких шаблонов. Любой из этих запросов можно сделать на странице GitHub Chapel GitHub .

.

Если бы я писал этот шаблон сегодня, я бы либо написал сделанный вами итератор, либо просто поместил бы цикл while непосредственно в мой код. Для параллельной итерации по диапазону значений с плавающей запятой было бы лучше создать семейство перегрузок итераторов, как описано в праймере параллельных итераторов Чапеля .

...