Я использую Halide и пытаюсь рассчитать размер максимально подключенных ячеек для данного двумерного ввода. Идея состоит в том, чтобы использовать рекурсивную функцию, но я не знаю, как написать ее на языке Halide.
Исходный скрипт Python и ожидаемые результаты следующие.
import random
N = 4
data = [[0 for i in range(N)] for j in range(N)]
for index in range(N*N):
data[index/N][index%N] = (random.randint(0,100) & 1)
print "Input"for d in data:
print d
def ret(x, y):
if x < 0 or y < 0 or x >= N or y >= N:
return 0
if data[y][x] == 0:
return 0
data[y][x] = 0
return ret(x, y-1) + ret(x, y+1) + ret(x-1, y) + ret(x+1, y) + 1
result = [[0 for i in range(N)] for j in range(N)]
for y in range(4):
for x in range(4):
result[y][x] = ret(x, y)
print "Output"for r in result:
print r"""Input
[1, 0, 1, 0]
[0, 0, 1, 1]
[0, 0, 1, 1]
[1, 1, 0, 1]
Output
[1, 0, 6, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]
[2, 0, 0, 0]
"""
Реализация Halide здесь, но у меня есть сообщение об ошибке ниже.
#include "Halide.h"using namespace Halide;
#define N 6
int main() {
Image<uint8_t> input(N, N);
for(int y = 0; y < N; y++) {
for(int x = 0; x < N; x++) {
input(x, y) = rand() & 1;
printf("%3d", input(x, y));
}
printf("\n");
}
printf("\n");
Var x("x"), y("y");
Func input_f("input_f"), f("f");
input_f(x, y) = input(x, y);
f(x, y) = BoundaryConditions::constant_exterior(input_f, 0, 0, N, 0, N)(x, y);
f(x, y) = select(f(x, y) != 0, f(x-1, y) + f(x+1, y) + f(x, y-1) + f(x, y+1) + 1, 0);
Image<uint8_t> output = f.realize(N, N);
for(int y = 0; y < N; y++) {
for(int x = 0; x < N; x++) {
printf("%3d", output(x, y));
}
printf("\n");
}
return 0;
}
Сообщение об ошибке:
In definition of Func "f":
All of a functions recursive references to itself must contain the same pure variables in the same places as on the left-hand-side.
Согласно сообщению об ошибке, я не могу использовать «x-1» и «x + 1» в правой части. Но я хочу сделать это.
Есть ли способ реализовать такой рекурсивный вызов Func?
* Я не придерживаюсь рекурсивного вызова, если смогу получить ожидаемый результат в Halide.
Задача ещё не решена.