X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=eingather.py;h=734edbea92288f4145d63aafa2ec398fdb51c12a;hb=7e0d32924fda14c2ddfe23a63616eac33476d83c;hp=b27110022263045413c87e0e4327ba2902aca283;hpb=7d526f2fa3849a4a049b3a1da4dddb92e3132428;p=pytorch.git diff --git a/eingather.py b/eingather.py index b271100..734edbe 100755 --- a/eingather.py +++ b/eingather.py @@ -15,43 +15,31 @@ def eingather(op, src, *indexes): s_indexes = re.findall("\(([^)]*)\)", s_src) s_src = re.sub("\([^)]*\)", "_", s_src) - all_sizes = tuple(d for s in ( src, ) + indexes for d in s.size()) + all_sizes = tuple(d for s in (src,) + indexes for d in s.size()) s_all = "".join([s_src] + s_indexes) shape = tuple(all_sizes[s_all.index(v)] for v in s_dst) - idx = [] - n_index = 0 + def do(x, s_x): + idx = [] + n_index = 0 - for i in range(src.dim()): - v = s_src[i] - if v == "_": - index, s_index = indexes[n_index], s_indexes[n_index] - n_index += 1 - - sub_idx = [] - - for i in range(index.dim()): - v = s_index[i] + for i in range(x.dim()): + v = s_x[i] + if v == "_": + idx.append(do(indexes[n_index], s_indexes[n_index])) + n_index += 1 + else: j = s_dst.index(v) a = ( - torch.arange(index.size(i)) + torch.arange(x.size(i)) .reshape((1,) * j + (-1,) + (1,) * (len(s_dst) - j - 1)) .expand(shape) ) - sub_idx.append(a) + idx.append(a) - index = index[sub_idx] - idx.append(index) - else: - j = s_dst.index(v) - a = ( - torch.arange(src.size(i)) - .reshape((1,) * j + (-1,) + (1,) * (len(s_dst) - j - 1)) - .expand(shape) - ) - idx.append(a) + return x[idx] - return src[idx] + return do(src, s_src) ####################### @@ -60,7 +48,7 @@ src = torch.rand(3, 5, 7, 11) index1 = torch.randint(src.size(2), (src.size(3), src.size(1), src.size(3))) index2 = torch.randint(src.size(3), (src.size(1),)) -# I want result[a, c, e] = src[c, a, index1[e, a, e], index2[a], e] +# result[a, c, e] = src[c, a, index1[e, a, e], index2[a]] result = eingather("ca(eae)(a) -> ace", src, index1, index2)