Update.
[pytorch.git] / conv_chain.py
index 04dfdfa..85ae4fc 100755 (executable)
@@ -15,28 +15,30 @@ def conv_chain(input_size, output_size, depth, cond):
         r = [ ]
         for kernel_size in range(1, input_size + 1):
             for stride in range(1, input_size + 1):
-                if cond(kernel_size, stride):
-                    n = (input_size - kernel_size) // stride
-                    if n * stride + kernel_size == input_size:
-                        q = conv_chain(n + 1, output_size, depth - 1, cond)
+                if cond(depth, kernel_size, stride):
+                    n = (input_size - kernel_size) // stride + 1
+                    if (n - 1) * stride + kernel_size == input_size:
+                        q = conv_chain(n, output_size, depth - 1, cond)
                         r += [ [ (kernel_size, stride) ] + u for u in q ]
         return r
 
 ######################################################################
 
-# Example
+if __name__ == "__main__":
 
-c = conv_chain(
-    input_size = 64, output_size = 8,
-    depth = 5,
-    cond = lambda k, s: k <= 4 and s <= 2 and s <= k//2
-)
+    # Example
 
-x = torch.rand(1, 1, 64)
+    c = conv_chain(
+        input_size = 64, output_size = 8,
+        depth = 5,
+        cond = lambda d, k, s: k <= 4 and s <= k and (s == 1 or d < 3)
+    )
 
-for m in c:
-    m = nn.Sequential(*[ nn.Conv1d(1, 1, l[0], l[1]) for l in m ])
-    print(m)
-    print(x.size(), m(x).size())
+    x = torch.rand(1, 1, 64)
+
+    for m in c:
+        model = nn.Sequential(*[ nn.Conv1d(1, 1, l[0], l[1]) for l in m ])
+        print(model)
+        print(x.size(), model(x).size())
 
 ######################################################################