rogermt commited on
Commit
3b316e7
·
verified ·
1 Parent(s): d646184

Add s_variable_scale_2x (Task 307, 262/262): ConvTranspose stride-2 upscale

Browse files
own-solver/neurogolf_solver/solvers/wave5.py CHANGED
@@ -366,3 +366,57 @@ def s_symmetry_check_lr(td):
366
  y = oh.make_tensor_value_info("output", TensorProto.FLOAT, [1, 10, 30, 30])
367
  g = oh.make_graph(nodes, "g", [x], [y], initializer=inits)
368
  return oh.make_model(g, ir_version=8, opset_imports=[oh.make_opsetid("", 17)])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
366
  y = oh.make_tensor_value_info("output", TensorProto.FLOAT, [1, 10, 30, 30])
367
  g = oh.make_graph(nodes, "g", [x], [y], initializer=inits)
368
  return oh.make_model(g, ir_version=8, opset_imports=[oh.make_opsetid("", 17)])
369
+
370
+
371
+
372
+ def s_variable_scale_2x(td):
373
+ """Variable-shape scale 2x: each pixel becomes a 2x2 block. Output = 2H x 2W."""
374
+ exs = get_exs(td)
375
+ for inp, out in exs:
376
+ h, w = inp.shape
377
+ if out.shape != (2 * h, 2 * w):
378
+ return None
379
+ if not np.array_equal(np.repeat(np.repeat(inp, 2, axis=0), 2, axis=1), out):
380
+ return None
381
+ if len(exs) < 2:
382
+ return None
383
+ if any(out.shape[0] > 30 or out.shape[1] > 30 for _, out in exs):
384
+ return None
385
+ kernel = np.ones((10, 1, 2, 2), dtype=np.float32)
386
+ inits = [
387
+ onh.from_array(kernel, 'up_kernel'),
388
+ onh.from_array(np.array([1], dtype=np.int64), 'axes_1'),
389
+ onh.from_array(np.array([2], dtype=np.int64), 'axes_2'),
390
+ onh.from_array(np.array([3], dtype=np.int64), 'axes_3'),
391
+ onh.from_array(np.array([], dtype=np.int64), 'scalar_shape'),
392
+ onh.from_array(np.float32(2.0), 'two_f'),
393
+ onh.from_array(np.arange(30, dtype=np.float32).reshape(1, 1, 30, 1), 'row_pos'),
394
+ onh.from_array(np.arange(30, dtype=np.float32).reshape(1, 1, 1, 30), 'col_pos'),
395
+ onh.from_array(np.array([0, 0], dtype=np.int64), 'sl_st'),
396
+ onh.from_array(np.array([30, 30], dtype=np.int64), 'sl_en'),
397
+ onh.from_array(np.array([2, 3], dtype=np.int64), 'sl_ax'),
398
+ ]
399
+ nodes = [
400
+ oh.make_node('ConvTranspose', ['input', 'up_kernel'], ['upscaled'],
401
+ kernel_shape=[2, 2], strides=[2, 2], group=10),
402
+ oh.make_node('Slice', ['upscaled', 'sl_st', 'sl_en', 'sl_ax'], ['sliced']),
403
+ oh.make_node('ReduceSum', ['input', 'axes_1'], ['presence'], keepdims=1),
404
+ oh.make_node('ReduceMax', ['presence'], ['row_has'], axes=[3], keepdims=1),
405
+ oh.make_node('ReduceSum', ['row_has', 'axes_2'], ['h_nd']),
406
+ oh.make_node('Reshape', ['h_nd', 'scalar_shape'], ['h_f']),
407
+ oh.make_node('ReduceMax', ['presence'], ['col_has'], axes=[2], keepdims=1),
408
+ oh.make_node('ReduceSum', ['col_has', 'axes_3'], ['w_nd']),
409
+ oh.make_node('Reshape', ['w_nd', 'scalar_shape'], ['w_f']),
410
+ oh.make_node('Mul', ['h_f', 'two_f'], ['oh_f']),
411
+ oh.make_node('Mul', ['w_f', 'two_f'], ['ow_f']),
412
+ oh.make_node('Less', ['row_pos', 'oh_f'], ['row_mask_b']),
413
+ oh.make_node('Cast', ['row_mask_b'], ['row_mask'], to=TensorProto.FLOAT),
414
+ oh.make_node('Less', ['col_pos', 'ow_f'], ['col_mask_b']),
415
+ oh.make_node('Cast', ['col_mask_b'], ['col_mask'], to=TensorProto.FLOAT),
416
+ oh.make_node('Mul', ['row_mask', 'col_mask'], ['grid_mask']),
417
+ oh.make_node('Mul', ['sliced', 'grid_mask'], ['output']),
418
+ ]
419
+ x = oh.make_tensor_value_info("input", TensorProto.FLOAT, [1, 10, 30, 30])
420
+ y = oh.make_tensor_value_info("output", TensorProto.FLOAT, [1, 10, 30, 30])
421
+ g = oh.make_graph(nodes, "g", [x], [y], initializer=inits)
422
+ return oh.make_model(g, ir_version=8, opset_imports=[oh.make_opsetid("", 17)])