rogermt commited on
Commit
2c8b675
·
verified ·
1 Parent(s): 8e44042

Move own-solver/neurogolf_solver/solvers/mode.py to own-solver/

Browse files
own-solver/neurogolf_solver/solvers/mode.py ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Mode fill solver — output = solid fill of most common input color.
3
+
4
+ v5.2: Solves Task 129 (score 19.451).
5
+ Uses runtime ReduceSum→ArgMax→Expand for variable mode across inputs.
6
+ Falls through to s_constant when mode is fixed across all examples.
7
+ """
8
+
9
+ import numpy as np
10
+ from onnx import helper, numpy_helper, TensorProto
11
+ from ..onnx_helpers import mk, _make_int64_init, _build_pad_node
12
+ from ..data_loader import get_exs, fixed_shapes
13
+ from ..constants import GH, GW
14
+
15
+
16
+ def s_mode_fill(td):
17
+ """Mode fill: output is entirely the most common color from input.
18
+ Uses runtime ArgMax to handle variable mode across inputs."""
19
+ exs = get_exs(td)
20
+
21
+ for inp, out in exs:
22
+ if inp.shape != out.shape:
23
+ return None
24
+ vals, counts = np.unique(inp, return_counts=True)
25
+ mode = vals[np.argmax(counts)]
26
+ if not np.all(out == mode):
27
+ return None
28
+
29
+ # Check if mode is always the same color
30
+ modes = set()
31
+ for inp, out in exs:
32
+ vals, counts = np.unique(inp, return_counts=True)
33
+ modes.add(vals[np.argmax(counts)])
34
+
35
+ if len(modes) == 1:
36
+ return None # Let s_constant handle it
37
+
38
+ sp = fixed_shapes(td)
39
+ if sp is None:
40
+ return None
41
+ (IH, IW), (OH, OW) = sp
42
+ if (IH, IW) != (OH, OW):
43
+ return None
44
+
45
+ pad_h, pad_w = GH - IH, GW - IW
46
+
47
+ inits = [
48
+ _make_int64_init('sl_st', [0, 0, 0, 0]),
49
+ _make_int64_init('sl_en', [1, 10, IH, IW]),
50
+ _make_int64_init('rs_axes_mode', [2, 3]),
51
+ numpy_helper.from_array(np.arange(10, dtype=np.int64).reshape(1, 10, 1, 1), 'classes'),
52
+ ]
53
+
54
+ nodes = [
55
+ helper.make_node('Slice', ['input', 'sl_st', 'sl_en'], ['cropped']),
56
+ helper.make_node('ReduceSum', ['cropped', 'rs_axes_mode'], ['hist'], keepdims=1),
57
+ helper.make_node('ArgMax', ['hist'], ['mode_idx'], axis=1, keepdims=1),
58
+ helper.make_node('Equal', ['mode_idx', 'classes'], ['eq']),
59
+ helper.make_node('Cast', ['eq'], ['mode_oh'], to=TensorProto.FLOAT),
60
+ helper.make_node('Expand', ['mode_oh', 'sl_en'], ['expanded']),
61
+ ]
62
+ nodes.append(_build_pad_node('expanded', 'output', pad_h, pad_w, inits))
63
+ return mk(nodes, inits)