Update.
authorFrançois Fleuret <francois@fleuret.org>
Wed, 24 May 2023 15:20:12 +0000 (17:20 +0200)
committerFrançois Fleuret <francois@fleuret.org>
Wed, 24 May 2023 15:20:12 +0000 (17:20 +0200)
eingather.py

index f8b3e89..b271100 100755 (executable)
@@ -15,7 +15,9 @@ def eingather(op, src, *indexes):
     s_indexes = re.findall("\(([^)]*)\)", s_src)
     s_src = re.sub("\([^)]*\)", "_", s_src)
 
-    shape = tuple(src.size(s_src.index(v)) for v in s_dst)
+    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
@@ -54,13 +56,13 @@ def eingather(op, src, *indexes):
 
 #######################
 
-src = torch.rand(3, 5, 7, 11, 13)
-index1 = torch.randint(src.size(2), (src.size(4), src.size(1), src.size(4)))
+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 = eingather("ca(eae)(a)e -> ace", src, index1, index2)
+result = eingather("ca(eae)(a) -> ace", src, index1, index2)
 
 # Check
 
@@ -69,6 +71,6 @@ error = 0
 for a in range(result.size(0)):
     for c in range(result.size(1)):
         for e in range(result.size(2)):
-            error += (result[a, c, e] - src[c, a, index1[e, a, e], index2[a], e]).abs()
+            error += (result[a, c, e] - src[c, a, index1[e, a, e], index2[a]]).abs()
 
 print(error.item())