tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.View probe and timer
cat /app/probe.py; echo "=====TIMER====="; bash /app/timer.sh
from __future__ import annotations
import torch
import reforacle
g = torch.Generator().manual_seed(0)
logits = torch.randn(2, 6, generator=g)
print("logits:", logits.tolist())
print("reference greedy_token ->", reforacle.greedy_token(logits).tolist())
print("reference temperature_scale(T=0) ->", reforacle.temperature_scale(logits, 0.0).tolist())
print()
print("Probe any reference function this way to discover its exact behavior,")
print("then implement it in /app/objectives.py to match.")
=====TIMER=====
Remaining time (hours:minutes):
1:59
[stdout]
from __future__ import annotations
import torch
import reforacle
g = torch.Generator().manual_seed(0)
logits = torch.randn(2, 6, generator=g)
print("logits:", logits.tolist())
print("reference greedy_token ->", reforacle.greedy_token(logits).tolist())
print("reference temperature_scale(T=0) ->", reforacle.temperature_scale(logits, 0.0).tolist())
print()
print("Probe any reference function this way to discover its exact behavior,")
print("then implement it in /app/objectives.py to match.")
=====TIMER=====
Remaining time (hours:minutes):
1:59
1 from __future__ import annotations
2
3 import torch
4
5
6 def greedy_token(logits):
7 raise NotImplementedError
8
9
10 def temperature_scale(logits, temperature):
11 raise NotImplementedError
12
13
14 def top_k_filter(logits, k):
15 raise NotImplementedError
16
17
18 def top_p_filter(logits, p):
19 raise NotImplementedError
20
21
22 def min_p_filter(logits, p):
23 raise NotImplementedError
24
25
26 def repetition_penalty(logits, input_ids, penalty):
27 raise NotImplementedError
28
29
30 def frequency_penalty(logits, input_ids, penalty):
31 raise NotImplementedError
32
33
34 def presence_penalty(logits, input_ids, penalty):
35 raise NotImplementedError
36
37
38 def suppress_tokens(logits, token_ids):
39 raise NotImplementedError
40
41
42 def min_length_filter(logits, cur_len, min_len, eos_id):
43 raise NotImplementedError
44
45
46 def renormalize_logits(logits):
47 raise NotImplementedError
48
49
50 def attention_mask(input_ids, pad_id):
51 raise NotImplementedError
52
53
54 def position_ids(input_ids, pad_id):
55 raise NotImplementedError
56
57
58 def causal_mask(t):
59 raise NotImplementedError
60
61
62 def shift_labels(input_ids, ignore_index):
63 raise NotImplementedError
64
65
66 def completion_loss_labels(input_ids, prompt_lengths, ignore_index):
67 raise NotImplementedError
68
69
70 def mask_after_eos(input_ids, eos_id):
71 raise NotImplementedError
72
73
74 def sequence_lengths(input_ids, pad_id):
75 raise NotImplementedError
76
77
78 def last_token_indices(attn_mask):
79 raise NotImplementedError
80
81
82 def gather_last_logits(logits, attn_mask):
83 raise NotImplementedError
84
85
86 def truncate_left(input_ids, max_len):
87 raise NotImplementedError
88
89
90 def pad_to_multiple(input_ids, pad_id, multiple):
91 raise NotImplementedError
92
93
94 def action_logprobs(logits, actions):
95 raise NotImplementedError
96
97
98 def entropy_from_logits(logits):
99 raise NotImplementedError
100
101
102 def reward_to_go(rewards, mask):
103 raise NotImplementedError
104
105
106 def discount_cumsum(x, gamma):
107 raise NotImplementedError
108
109
110 def build_position_ids_packed(seq_lengths, total_len):
111 raise NotImplementedError
112
113
114 def logits_warper(logits, temperature, top_k, top_p):
115 raise NotImplementedError
116
117
118 def sample_greedy_warped(logits, temperature, top_k, top_p):
119 raise NotImplementedError
120
121
122 def prepare_labels(input_ids, prompt_lengths, ignore_index):
123 raise NotImplementedError
124
125
126 def rollout_last_logits(logits, input_ids, pad_id):
127 raise NotImplementedError
128
129
130 def epsilon_filter(logits, epsilon):
131 raise NotImplementedError
132
133
134 def first_stop_index(input_ids, stop_ids):
135 raise NotImplementedError
136
137
138 def masked_argmax(logits, mask):
139 raise NotImplementedError
140
141
142 def topk_indices(logits, k):
143 raise NotImplementedError
144
145
146 def right_pad_to(input_ids, pad_id, width):
147 raise NotImplementedError
148
149
150 def generation_stop_mask(input_ids, eos_id, min_len):
151 raise NotImplementedError
152
/app/objectives.py
from __future__ import annotations
import torch
import reforacle
g = torch.Generator().manual_seed(0)
logits = torch.randn(2, 6, generator=g)
print("logits:", logits.tolist())
print("reference greedy_token ->", reforacle.greedy_token(logits).tolist())
print("reference temperature_scale(T=0) ->", reforacle.temperature_scale(logits, 0.0).tolist())
print()
print("Probe any reference function this way to discover its exact behavior,")
print("then implement it in /app/objectives.py to match.")
=====TIMER=====
Remaining time (hours:minutes):
1:59
[stdout]
from __future__ import annotations
import torch
import reforacle
g = torch.Generator().manual_seed(0)
logits = torch.randn(2, 6, generator=g)
print("logits:", logits.tolist())
print("reference greedy_token ->", reforacle.greedy_token(logits).tolist())
print("reference temperature_scale(T=0) ->", reforacle.temperature_scale(logits, 0.0).tolist())
print()
print("Probe any reference function this way to discover its exact behavior,")
print("then implement it in /app/objectives.py to match.")
=====TIMER=====
Remaining time (hours:minutes):
1:59
1 from __future__ import annotations
2
3 import torch
4
5
6 def greedy_token(logits):
7 raise NotImplementedError
8
9
10 def temperature_scale(logits, temperature):
11 raise NotImplementedError
12
13
14 def top_k_filter(logits, k):
15 raise NotImplementedError
16
17
18 def top_p_filter(logits, p):
19 raise NotImplementedError
20
21
22 def min_p_filter(logits, p):
23 raise NotImplementedError
24
25
26 def repetition_penalty(logits, input_ids, penalty):
27 raise NotImplementedError
28
29
30 def frequency_penalty(logits, input_ids, penalty):
31 raise NotImplementedError
32
33
34 def presence_penalty(logits, input_ids, penalty):
35 raise NotImplementedError
36
37
38 def suppress_tokens(logits, token_ids):
39 raise NotImplementedError
40
41
42 def min_length_filter(logits, cur_len, min_len, eos_id):
43 raise NotImplementedError
44
45
46 def renormalize_logits(logits):
47 raise NotImplementedError
48
49
50 def attention_mask(input_ids, pad_id):
51 raise NotImplementedError
52
53
54 def position_ids(input_ids, pad_id):
55 raise NotImplementedError
56
57
58 def causal_mask(t):
59 raise NotImplementedError
60
61
62 def shift_labels(input_ids, ignore_index):
63 raise NotImplementedError
64
65
66 def completion_loss_labels(input_ids, prompt_lengths, ignore_index):
67 raise NotImplementedError
68
69
70 def mask_after_eos(input_ids, eos_id):
71 raise NotImplementedError
72
73
74 def sequence_lengths(input_ids, pad_id):
75 raise NotImplementedError
76
77
78 def last_token_indices(attn_mask):
79 raise NotImplementedError
80
81
82 def gather_last_logits(logits, attn_mask):
83 raise NotImplementedError
84
85
86 def truncate_left(input_ids, max_len):
87 raise NotImplementedError
88
89
90 def pad_to_multiple(input_ids, pad_id, multiple):
91 raise NotImplementedError
92
93
94 def action_logprobs(logits, actions):
95 raise NotImplementedError
96
97
98 def entropy_from_logits(logits):
99 raise NotImplementedError
100
101
102 def reward_to_go(rewards, mask):
103 raise NotImplementedError
104
105
106 def discount_cumsum(x, gamma):
107 raise NotImplementedError
108
109
110 def build_position_ids_packed(seq_lengths, total_len):
111 raise NotImplementedError
112
113
114 def logits_warper(logits, temperature, top_k, top_p):
115 raise NotImplementedError
116
117
118 def sample_greedy_warped(logits, temperature, top_k, top_p):
119 raise NotImplementedError
120
121
122 def prepare_labels(input_ids, prompt_lengths, ignore_index):
123 raise NotImplementedError
124
125
126 def rollout_last_logits(logits, input_ids, pad_id):
127 raise NotImplementedError
128
129
130 def epsilon_filter(logits, epsilon):
131 raise NotImplementedError
132
133
134 def first_stop_index(input_ids, stop_ids):
135 raise NotImplementedError
136
137
138 def masked_argmax(logits, mask):
139 raise NotImplementedError
140
141
142 def topk_indices(logits, k):
143 raise NotImplementedError
144
145
146 def right_pad_to(input_ids, pad_id, width):
147 raise NotImplementedError
148
149
150 def generation_stop_mask(input_ids, eos_id, min_len):
151 raise NotImplementedError
152
List reforacle functions
python3 -c "import reforacle; print([x for x in dir(reforacle) if not x.startswith('__')])"['F', 'NEG_INF', 'action_logprobs', 'attention_mask', 'build_position_ids_packed', 'causal_mask', 'completion_loss_labels', 'discount_cumsum', 'entropy_from_logits', 'epsilon_filter', 'first_stop_index', 'frequency_penalty', 'gather_last_logits', 'generation_stop_mask', 'greedy_token', 'last_token_indices', 'logits_warper', 'mask_after_eos', 'masked_argmax', 'min_length_filter', 'min_p_filter', 'pad_to_multiple', 'position_ids', 'prepare_labels', 'presence_penalty', 'renormalize_logits', 'repetition_penalty', 'reward_to_go', 'right_pad_to', 'rollout_last_logits', 'sample_greedy_warped', 'sequence_lengths', 'shift_labels', 'suppress_tokens', 'temperature_scale', 'top_k_filter', 'top_p_filter', 'topk_indices', 'torch', 'truncate_left'] [stdout] ['F', 'NEG_INF', 'action_logprobs', 'attention_mask', 'build_position_ids_packed', 'causal_mask', 'completion_loss_labels', 'discount_cumsum', 'entropy_from_logits', 'epsilon_filter', 'first_stop_index', 'frequency_penalty', 'gather_last_logits', 'generation_stop_mask', 'greedy_token', 'last_token_indices', 'logits_warper', 'mask_after_eos', 'masked_argmax', 'min_length_filter', 'min_p_filter', 'pad_to_multiple', 'position_ids', 'prepare_labels', 'presence_penalty', 'renormalize_logits', 'repetition_penalty', 'reward_to_go', 'right_pad_to', 'rollout_last_logits', 'sample_greedy_warped', 'sequence_lengths', 'shift_labels', 'suppress_tokens', 'temperature_scale', 'top_k_filter', 'top_p_filter', 'topk_indices', 'torch', 'truncate_left']
Check constants
python3 -c "import reforacle; print('NEG_INF', reforacle.NEG_INF); print('F', reforacle.F)"NEG_INF -inf F <module 'torch.nn.functional' from '/usr/local/lib/python3.12/dist-packages/torch/nn/functional.py'> [stdout] NEG_INF -inf F <module 'torch.nn.functional' from '/usr/local/lib/python3.12/dist-packages/torch/nn/functional.py'>
Probe greedy and temperature
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(0)
logits=torch.randn(2,6,generator=g)
print('logits', logits.tolist())
print('greedy', R.greedy_token(logits), R.greedy_token(logits).dtype, R.greedy_token(logits).shape)
print('temp0', R.temperature_scale(logits,0.0).tolist())
print('temp2', R.temperature_scale(logits,2.0).tolist())
print('temp0.5', R.temperature_scale(logits,0.5).tolist())
# 1D
l1=torch.randn(5,generator=g)
print('1d logits', l1.tolist())
print('greedy1d', R.greedy_token(l1))
print('temp1d0', R.temperature_scale(l1,0.0).tolist())
"logits [[1.5409960746765137, -0.293428897857666, -2.1787893772125244, 0.5684312582015991, -1.0845223665237427, -1.3985954523086548], [0.40334683656692505, 0.8380263447761536, -0.7192575931549072, -0.40334352850914, -0.5966353416442871, 0.18203648924827576]] greedy tensor([0, 1]) torch.int64 torch.Size([2]) temp0 [[0.0, -inf, -inf, -inf, -inf, -inf], [-inf, 0.0, -inf, -inf, -inf, -inf]] temp2 [[0.7704980373382568, -0.146714448928833, -1.0893946886062622, 0.28421562910079956, -0.5422611832618713, -0.6992977261543274], [0.20167341828346252, 0.4190131723880768, -0.3596287965774536, -0.20167176425457, -0.29831767082214355, 0.09101824462413788]] temp0.5 [[3.0819921493530273, -0.586857795715332, -4.357578754425049, 1.1368625164031982, -2.1690447330474854, -2.7971909046173096], [0.8066936731338501, 1.6760526895523071, -1.4385151863098145, -0.80668705701828, -1.1932706832885742, 0.3640729784965515]] 1d logits [-0.8566746115684509, 1.1006041765213013, -1.0711873769760132, 0.1227012425661087, -0.5663174986839294] greedy1d tensor(1) temp1d0 [-inf, 0.0, -inf, -inf, -inf] [stdout] logits [[1.5409960746765137, -0.293428897857666, -2.1787893772125244, 0.5684312582015991, -1.0845223665237427, -1.3985954523086548], [0.40334683656692505, 0.8380263447761536, -0.7192575931549072, -0.40334352850914, -0.5966353416442871, 0.18203648924827576]] greedy tensor([0, 1]) torch.int64 torch.Size([2]) temp0 [[0.0, -inf, -inf, -inf, -inf, -inf], [-inf, 0.0, -inf, -inf, -inf, -inf]] temp2 [[0.7704980373382568, -0.146714448928833, -1.0893946886062622, 0.28421562910079956, -0.5422611832618713, -0.6992977261543274], [0.20167341828346252, 0.4190131723880768, -0.3596287965774536, -0.20167176425457, -0.29831767082214355, 0.09101824462413788]] temp0.5 [[3.0819921493530273, -0.586857795715332, -4.357578754425049, 1.1368625164031982, -2.1690447330474854, -2.7971909046173096], [0.8066936731338501, 1.6760526895523071, -1.4385151863098145, -0.80668705701828, -1.1932706832885742, 0.3640729784965515]] 1d logits [-0.8566746115684509, 1.1006041765213013, -1.0711873769760132, 0.1227012425661087, -0.5663174986839294] greedy1d tensor(1) temp1d0 [-inf, 0.0, -inf, -inf, -inf]
Probe top_k and top_p
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(1)
logits=torch.randn(2,6,generator=g)
print('logits', logits.tolist())
print('topk2', R.top_k_filter(logits,2).tolist())
print('topk1', R.top_k_filter(logits,1).tolist())
print('topk6', R.top_k_filter(logits,6).tolist())
print()
print('topp0.9', R.top_p_filter(logits,0.9).tolist())
print('topp0.5', R.top_p_filter(logits,0.5).tolist())
print('topp1.0', R.top_p_filter(logits,1.0).tolist())
print('topp0.0', R.top_p_filter(logits,0.0).tolist())
"logits [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] topk2 [[0.6613521575927734, -inf, -inf, 0.6213173270225525, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -0.05825017765164375]] topk1 [[0.6613521575927734, -inf, -inf, -inf, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -inf]] topk6 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] topp0.9 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -inf, -0.16613022983074188], [-inf, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] topp0.5 [[0.6613521575927734, 0.266924113035202, -inf, 0.6213173270225525, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -0.05825017765164375]] topp1.0 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] topp0.0 [[0.6613521575927734, -inf, -inf, -inf, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -inf]] [stdout] logits [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] topk2 [[0.6613521575927734, -inf, -inf, 0.6213173270225525, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -0.05825017765164375]] topk1 [[0.6613521575927734, -inf, -inf, -inf, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -inf]] topk6 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] topp0.9 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -inf, -0.16613022983074188], [-inf, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] topp0.5 [[0.6613521575927734, 0.266924113035202, -inf, 0.6213173270225525, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -0.05825017765164375]] topp1.0 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] topp0.0 [[0.6613521575927734, -inf, -inf, -inf, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -inf]]
Probe min_p and epsilon
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(1)
logits=torch.randn(2,6,generator=g)
print('minp0.1', R.min_p_filter(logits,0.1).tolist())
print('minp0.5', R.min_p_filter(logits,0.5).tolist())
print('minp0.0', R.min_p_filter(logits,0.0).tolist())
print()
print('eps0.1', R.epsilon_filter(logits,0.1).tolist())
print('eps0.05', R.epsilon_filter(logits,0.05).tolist())
print('eps0.0', R.epsilon_filter(logits,0.0).tolist())
"minp0.1 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] minp0.5 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -0.05825017765164375]] minp0.0 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] eps0.1 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -inf, -0.16613022983074188], [-inf, 0.38168391585350037, -inf, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] eps0.05 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] eps0.0 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] [stdout] minp0.1 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] minp0.5 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -0.05825017765164375]] minp0.0 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] eps0.1 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -inf, -0.16613022983074188], [-inf, 0.38168391585350037, -inf, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] eps0.05 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]] eps0.0 [[0.6613521575927734, 0.266924113035202, 0.06167725846171379, 0.6213173270225525, -0.4519059658050537, -0.16613022983074188], [-1.522768497467041, 0.38168391585350037, -1.0276086330413818, -0.563052773475647, -0.8922905325889587, -0.05825017765164375]]
Check probs for min_p/epsilon threshold conventions
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(1)
logits=torch.randn(2,6,generator=g)
probs=torch.softmax(logits,dim=-1)
print('probs', probs.tolist())
print('max*0.5', (probs.max(-1,keepdim=True).values*0.5).tolist())
"probs [[0.2532000243663788, 0.1706734001636505, 0.13900430500507355, 0.24326342344284058, 0.08317290991544724, 0.11068599671125412], [0.05503150075674057, 0.36957666277885437, 0.0902935117483139, 0.14368471503257751, 0.10337712615728378, 0.23803651332855225]] max*0.5 [[0.1266000121831894], [0.18478833138942719]] [stdout] probs [[0.2532000243663788, 0.1706734001636505, 0.13900430500507355, 0.24326342344284058, 0.08317290991544724, 0.11068599671125412], [0.05503150075674057, 0.36957666277885437, 0.0902935117483139, 0.14368471503257751, 0.10337712615728378, 0.23803651332855225]] max*0.5 [[0.1266000121831894], [0.18478833138942719]]
Probe edge cases for filters
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(1)
logits=torch.randn(2,6,generator=g)
print('eps0.9', R.epsilon_filter(logits,0.9).tolist())
print('minp1.5', R.min_p_filter(logits,1.5).tolist())
print('minp1.0', R.min_p_filter(logits,1.0).tolist())
print('topp0.001', R.top_p_filter(logits,0.001).tolist())
"eps0.9 [[0.6613521575927734, -inf, -inf, -inf, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -inf]] minp1.5 [[-inf, -inf, -inf, -inf, -inf, -inf], [-inf, -inf, -inf, -inf, -inf, -inf]] minp1.0 [[0.6613521575927734, -inf, -inf, -inf, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -inf]] topp0.001 [[0.6613521575927734, -inf, -inf, -inf, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -inf]] [stdout] eps0.9 [[0.6613521575927734, -inf, -inf, -inf, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -inf]] minp1.5 [[-inf, -inf, -inf, -inf, -inf, -inf], [-inf, -inf, -inf, -inf, -inf, -inf]] minp1.0 [[0.6613521575927734, -inf, -inf, -inf, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -inf]] topp0.001 [[0.6613521575927734, -inf, -inf, -inf, -inf, -inf], [-inf, 0.38168391585350037, -inf, -inf, -inf, -inf]]
Probe penalties
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(2)
logits=torch.randn(2,6,generator=g)
ids=torch.tensor([[0,0,1,3],[2,2,2,5]])
print('logits',logits.tolist())
print('rep1.5', R.repetition_penalty(logits,ids,1.5).tolist())
print('rep0.8', R.repetition_penalty(logits,ids,0.8).tolist())
print('freq0.5', R.frequency_penalty(logits,ids,0.5).tolist())
print('pres0.5', R.presence_penalty(logits,ids,0.5).tolist())
"logits [[0.39229682087898254, -0.223564013838768, -0.31950026750564575, -1.2050371170043945, 1.0444635152816772, -0.6332277059555054], [0.5731067657470703, 0.540947437286377, -0.39190584421157837, -1.0426788330078125, 1.318617343902588, 0.747639000415802]] rep1.5 [[0.17435413599014282, -0.3353460133075714, -0.31950026750564575, -1.8075556755065918, 1.0444635152816772, -0.6332277059555054], [0.5731067657470703, 0.540947437286377, -1.32268226146698, -1.0426788330078125, 1.318617343902588, 0.49842599034309387]] rep0.8 [[0.6129637360572815, -0.17885121703147888, -0.31950026750564575, -0.9640297293663025, 1.0444635152816772, -0.6332277059555054], [0.5731067657470703, 0.540947437286377, -0.20065581798553467, -1.0426788330078125, 1.318617343902588, 0.9345487356185913]] freq0.5 [[-0.6077032089233398, -0.7235640287399292, -0.31950026750564575, -1.7050371170043945, 1.0444635152816772, -0.6332277059555054], [0.5731067657470703, 0.540947437286377, -1.8919057846069336, -1.0426788330078125, 1.318617343902588, 0.247639000415802]] pres0.5 [[-0.10770317912101746, -0.7235640287399292, -0.31950026750564575, -1.7050371170043945, 1.0444635152816772, -0.6332277059555054], [0.5731067657470703, 0.540947437286377, -0.8919058442115784, -1.0426788330078125, 1.318617343902588, 0.247639000415802]] [stdout] logits [[0.39229682087898254, -0.223564013838768, -0.31950026750564575, -1.2050371170043945, 1.0444635152816772, -0.6332277059555054], [0.5731067657470703, 0.540947437286377, -0.39190584421157837, -1.0426788330078125, 1.318617343902588, 0.747639000415802]] rep1.5 [[0.17435413599014282, -0.3353460133075714, -0.31950026750564575, -1.8075556755065918, 1.0444635152816772, -0.6332277059555054], [0.5731067657470703, 0.540947437286377, -1.32268226146698, -1.0426788330078125, 1.318617343902588, 0.49842599034309387]] rep0.8 [[0.6129637360572815, -0.17885121703147888, -0.31950026750564575, -0.9640297293663025, 1.0444635152816772, -0.6332277059555054], [0.5731067657470703, 0.540947437286377, -0.20065581798553467, -1.0426788330078125, 1.318617343902588, 0.9345487356185913]] freq0.5 [[-0.6077032089233398, -0.7235640287399292, -0.31950026750564575, -1.7050371170043945, 1.0444635152816772, -0.6332277059555054], [0.5731067657470703, 0.540947437286377, -1.8919057846069336, -1.0426788330078125, 1.318617343902588, 0.247639000415802]] pres0.5 [[-0.10770317912101746, -0.7235640287399292, -0.31950026750564575, -1.7050371170043945, 1.0444635152816772, -0.6332277059555054], [0.5731067657470703, 0.540947437286377, -0.8919058442115784, -1.0426788330078125, 1.318617343902588, 0.247639000415802]]
Probe suppress, min_length, renormalize
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(3)
logits=torch.randn(2,6,generator=g)
print('logits',logits.tolist())
print('suppress[1,3]', R.suppress_tokens(logits,[1,3]).tolist())
print('suppress tensor', R.suppress_tokens(logits,torch.tensor([0,5])).tolist())
print('minlen cur2 min5 eos0', R.min_length_filter(logits,2,5,0).tolist())
print('minlen cur5 min5 eos0', R.min_length_filter(logits,5,5,0).tolist())
print('minlen cur6 min5 eos0', R.min_length_filter(logits,6,5,0).tolist())
print('renorm', R.renormalize_logits(logits).tolist())
import torch.nn.functional as F
print('logsoftmax', F.log_softmax(logits,dim=-1).tolist())
"logits [[0.8032760620117188, 0.17483338713645935, 0.08897809684276581, -0.6137180328369141, 0.04618244990706444, -1.3682591915130615], [0.3374950885772705, 1.0111159086227417, -1.435179352760315, 0.9774317741394043, 0.5220499634742737, 1.2379167079925537]] suppress[1,3] [[0.8032760620117188, -inf, 0.08897809684276581, -inf, 0.04618244990706444, -1.3682591915130615], [0.3374950885772705, -inf, -1.435179352760315, -inf, 0.5220499634742737, 1.2379167079925537]] suppress tensor [[-inf, 0.17483338713645935, 0.08897809684276581, -0.6137180328369141, 0.04618244990706444, -inf], [-inf, 1.0111159086227417, -1.435179352760315, 0.9774317741394043, 0.5220499634742737, -inf]] minlen cur2 min5 eos0 [[-inf, 0.17483338713645935, 0.08897809684276581, -0.6137180328369141, 0.04618244990706444, -1.3682591915130615], [-inf, 1.0111159086227417, -1.435179352760315, 0.9774317741394043, 0.5220499634742737, 1.2379167079925537]] minlen cur5 min5 eos0 [[0.8032760620117188, 0.17483338713645935, 0.08897809684276581, -0.6137180328369141, 0.04618244990706444, -1.3682591915130615], [0.3374950885772705, 1.0111159086227417, -1.435179352760315, 0.9774317741394043, 0.5220499634742737, 1.2379167079925537]] minlen cur6 min5 eos0 [[0.8032760620117188, 0.17483338713645935, 0.08897809684276581, -0.6137180328369141, 0.04618244990706444, -1.3682591915130615], [0.3374950885772705, 1.0111159086227417, -1.435179352760315, 0.9774317741394043, 0.5220499634742737, 1.2379167079925537]] renorm [[-1.0467677116394043, -1.6752103567123413, -1.7610657215118408, -2.463761806488037, -1.803861379623413, -3.2183029651641846], [-2.1622753143310547, -1.488654375076294, -3.9349498748779297, -1.5223385095596313, -1.9777202606201172, -1.261853575706482]] logsoftmax [[-1.0467677116394043, -1.6752103567123413, -1.7610657215118408, -2.463761806488037, -1.803861379623413, -3.2183029651641846], [-2.1622753143310547, -1.488654375076294, -3.9349498748779297, -1.5223385095596313, -1.9777202606201172, -1.261853575706482]] [stdout] logits [[0.8032760620117188, 0.17483338713645935, 0.08897809684276581, -0.6137180328369141, 0.04618244990706444, -1.3682591915130615], [0.3374950885772705, 1.0111159086227417, -1.435179352760315, 0.9774317741394043, 0.5220499634742737, 1.2379167079925537]] suppress[1,3] [[0.8032760620117188, -inf, 0.08897809684276581, -inf, 0.04618244990706444, -1.3682591915130615], [0.3374950885772705, -inf, -1.435179352760315, -inf, 0.5220499634742737, 1.2379167079925537]] suppress tensor [[-inf, 0.17483338713645935, 0.08897809684276581, -0.6137180328369141, 0.04618244990706444, -inf], [-inf, 1.0111159086227417, -1.435179352760315, 0.9774317741394043, 0.5220499634742737, -inf]] minlen cur2 min5 eos0 [[-inf, 0.17483338713645935, 0.08897809684276581, -0.6137180328369141, 0.04618244990706444, -1.3682591915130615], [-inf, 1.0111159086227417, -1.435179352760315, 0.9774317741394043, 0.5220499634742737, 1.2379167079925537]] minlen cur5 min5 eos0 [[0.8032760620117188, 0.17483338713645935, 0.08897809684276581, -0.6137180328369141, 0.04618244990706444, -1.3682591915130615], [0.3374950885772705, 1.0111159086227417, -1.435179352760315, 0.9774317741394043, 0.5220499634742737, 1.2379167079925537]] minlen cur6 min5 eos0 [[0.8032760620117188, 0.17483338713645935, 0.08897809684276581, -0.6137180328369141, 0.04618244990706444, -1.3682591915130615], [0.3374950885772705, 1.0111159086227417, -1.435179352760315, 0.9774317741394043, 0.5220499634742737, 1.2379167079925537]] renorm [[-1.0467677116394043, -1.6752103567123413, -1.7610657215118408, -2.463761806488037, -1.803861379623413, -3.2183029651641846], [-2.1622753143310547, -1.488654375076294, -3.9349498748779297, -1.5223385095596313, -1.9777202606201172, -1.261853575706482]] logsoftmax [[-1.0467677116394043, -1.6752103567123413, -1.7610657215118408, -2.463761806488037, -1.803861379623413, -3.2183029651641846], [-2.1622753143310547, -1.488654375076294, -3.9349498748779297, -1.5223385095596313, -1.9777202606201172, -1.261853575706482]]
Probe masks/positions
python3 -c "
import torch, reforacle as R
ids=torch.tensor([[5,6,7,0,0],[1,2,0,0,0]])
print('attn pad0', R.attention_mask(ids,0).tolist(), R.attention_mask(ids,0).dtype)
print('pos pad0', R.position_ids(ids,0).tolist(), R.position_ids(ids,0).dtype)
print('causal 4', R.causal_mask(4).tolist(), R.causal_mask(4).dtype)
print('seqlen', R.sequence_lengths(ids,0).tolist(), R.sequence_lengths(ids,0).dtype)
am=R.attention_mask(ids,0)
print('last_tok_idx', R.last_token_indices(am).tolist(), R.last_token_indices(am).dtype)
"attn pad0 [[1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0]] torch.float32 pos pad0 [[0, 1, 2, 2, 2], [0, 1, 1, 1, 1]] torch.int64 causal 4 [[0.0, -inf, -inf, -inf], [0.0, 0.0, -inf, -inf], [0.0, 0.0, 0.0, -inf], [0.0, 0.0, 0.0, 0.0]] torch.float32 seqlen [3, 2] torch.int64 last_tok_idx [2, 1] torch.int64 [stdout] attn pad0 [[1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0]] torch.float32 pos pad0 [[0, 1, 2, 2, 2], [0, 1, 1, 1, 1]] torch.int64 causal 4 [[0.0, -inf, -inf, -inf], [0.0, 0.0, -inf, -inf], [0.0, 0.0, 0.0, -inf], [0.0, 0.0, 0.0, 0.0]] torch.float32 seqlen [3, 2] torch.int64 last_tok_idx [2, 1] torch.int64
Probe position_ids leading pad conventions
python3 -c "
import torch, reforacle as R
ids=torch.tensor([[0,0,7,8,9],[0,2,0,4,0]])
print('pos', R.position_ids(ids,0).tolist())
print('attn', R.attention_mask(ids,0).tolist())
print('seqlen', R.sequence_lengths(ids,0).tolist())
am=R.attention_mask(ids,0)
print('last', R.last_token_indices(am).tolist())
# all pad row
ids2=torch.tensor([[0,0,0]])
print('pos allpad', R.position_ids(ids2,0).tolist())
print('last allpad', R.last_token_indices(R.attention_mask(ids2,0)).tolist())
"pos [[0, 0, 0, 1, 2], [0, 0, 0, 1, 1]] attn [[0.0, 0.0, 1.0, 1.0, 1.0], [0.0, 1.0, 0.0, 1.0, 0.0]] seqlen [3, 2] last [4, 3] pos allpad [[0, 0, 0]] last allpad [-1] [stdout] pos [[0, 0, 0, 1, 2], [0, 0, 0, 1, 1]] attn [[0.0, 0.0, 1.0, 1.0, 1.0], [0.0, 1.0, 0.0, 1.0, 0.0]] seqlen [3, 2] last [4, 3] pos allpad [[0, 0, 0]] last allpad [-1]
Probe gather_last_logits
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(4)
logits=torch.randn(2,5,4,generator=g) # B,T,V
ids=torch.tensor([[5,6,7,0,0],[1,2,0,0,0]])
am=R.attention_mask(ids,0)
out=R.gather_last_logits(logits,am)
print('shape',out.shape)
print('out',out.tolist())
print('expect row0 t2', logits[0,2].tolist())
print('expect row1 t1', logits[1,1].tolist())
"shape torch.Size([2, 4]) out [[-0.8683629631996155, -0.20505589246749878, 0.3975607752799988, 0.6699259877204895], [-0.7042272090911865, 2.012578248977661, 0.9120109677314758, 0.27727454900741577]] expect row0 t2 [-0.8683629631996155, -0.20505589246749878, 0.3975607752799988, 0.6699259877204895] expect row1 t1 [-0.7042272090911865, 2.012578248977661, 0.9120109677314758, 0.27727454900741577] [stdout] shape torch.Size([2, 4]) out [[-0.8683629631996155, -0.20505589246749878, 0.3975607752799988, 0.6699259877204895], [-0.7042272090911865, 2.012578248977661, 0.9120109677314758, 0.27727454900741577]] expect row0 t2 [-0.8683629631996155, -0.20505589246749878, 0.3975607752799988, 0.6699259877204895] expect row1 t1 [-0.7042272090911865, 2.012578248977661, 0.9120109677314758, 0.27727454900741577]
Probe label functions
python3 -c "
import torch, reforacle as R
ids=torch.tensor([[5,6,7,8,9],[1,2,3,4,0]])
print('shift ign-100', R.shift_labels(ids,-100).tolist(), R.shift_labels(ids,-100).shape)
print('comp pl[2,1] ign-100', R.completion_loss_labels(ids,torch.tensor([2,1]),-100).tolist())
print('prepare pl[2,1] ign-100', R.prepare_labels(ids,torch.tensor([2,1]),-100).tolist())
ids2=torch.tensor([[5,6,0,7,0],[1,0,3,4,0]])
print('mask_after_eos eos0', R.mask_after_eos(ids2,0).tolist())
"shift ign-100 [[6, 7, 8, 9, -100], [2, 3, 4, 0, -100]] torch.Size([2, 5]) comp pl[2,1] ign-100 [[-100, -100, 7, 8, 9], [-100, 2, 3, 4, 0]] prepare pl[2,1] ign-100 [[-100, 7, 8, 9, -100], [2, 3, 4, 0, -100]] mask_after_eos eos0 [[1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0]] [stdout] shift ign-100 [[6, 7, 8, 9, -100], [2, 3, 4, 0, -100]] torch.Size([2, 5]) comp pl[2,1] ign-100 [[-100, -100, 7, 8, 9], [-100, 2, 3, 4, 0]] prepare pl[2,1] ign-100 [[-100, 7, 8, 9, -100], [2, 3, 4, 0, -100]] mask_after_eos eos0 [[1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0]]
Disambiguate prepare_labels and mask_after_eos
python3 -c "
import torch, reforacle as R
ids=torch.tensor([[10,11,12,13,14,15]])
for pl in [0,1,3,6]:
print('prepare pl',pl, R.prepare_labels(ids,torch.tensor([pl]),-100).tolist())
print('comp pl',pl, R.completion_loss_labels(ids,torch.tensor([pl]),-100).tolist())
# no eos row for mask_after_eos
ids2=torch.tensor([[5,6,7],[0,0,0]])
print('mask_after_eos no-eos row', R.mask_after_eos(ids2,0).tolist())
"prepare pl 0 [[11, 12, 13, 14, 15, -100]] comp pl 0 [[10, 11, 12, 13, 14, 15]] prepare pl 1 [[11, 12, 13, 14, 15, -100]] comp pl 1 [[-100, 11, 12, 13, 14, 15]] prepare pl 3 [[-100, -100, 13, 14, 15, -100]] comp pl 3 [[-100, -100, -100, 13, 14, 15]] prepare pl 6 [[-100, -100, -100, -100, -100, -100]] comp pl 6 [[-100, -100, -100, -100, -100, -100]] mask_after_eos no-eos row [[1.0, 1.0, 1.0], [1.0, 0.0, 0.0]] [stdout] prepare pl 0 [[11, 12, 13, 14, 15, -100]] comp pl 0 [[10, 11, 12, 13, 14, 15]] prepare pl 1 [[11, 12, 13, 14, 15, -100]] comp pl 1 [[-100, 11, 12, 13, 14, 15]] prepare pl 3 [[-100, -100, 13, 14, 15, -100]] comp pl 3 [[-100, -100, -100, 13, 14, 15]] prepare pl 6 [[-100, -100, -100, -100, -100, -100]] comp pl 6 [[-100, -100, -100, -100, -100, -100]] mask_after_eos no-eos row [[1.0, 1.0, 1.0], [1.0, 0.0, 0.0]]
Probe truncate/pad functions
python3 -c "
import torch, reforacle as R
ids=torch.tensor([[5,6,7,8,9,10]])
print('trunc_left 3', R.truncate_left(ids,3).tolist())
print('trunc_left 10', R.truncate_left(ids,10).tolist())
ids2=torch.tensor([[5,6,7],[1,2,0]])
print('pad_to_mult pad0 m4', R.pad_to_multiple(ids2,0,4).tolist())
print('pad_to_mult pad0 m2', R.pad_to_multiple(ids2,0,2).tolist())
print('pad_to_mult pad0 m3', R.pad_to_multiple(ids2,0,3).tolist())
print('right_pad_to pad0 w5', R.right_pad_to(ids2,0,5).tolist())
print('right_pad_to pad0 w2', R.right_pad_to(ids2,0,2).tolist())
"trunc_left 3 [[8, 9, 10]] trunc_left 10 [[5, 6, 7, 8, 9, 10]] pad_to_mult pad0 m4 [[5, 6, 7, 0], [1, 2, 0, 0]] pad_to_mult pad0 m2 [[5, 6, 7, 0], [1, 2, 0, 0]] pad_to_mult pad0 m3 [[5, 6, 7], [1, 2, 0]] right_pad_to pad0 w5 [[5, 6, 7, 0, 0], [1, 2, 0, 0, 0]] right_pad_to pad0 w2 [[5, 6], [1, 2]] [stdout] trunc_left 3 [[8, 9, 10]] trunc_left 10 [[5, 6, 7, 8, 9, 10]] pad_to_mult pad0 m4 [[5, 6, 7, 0], [1, 2, 0, 0]] pad_to_mult pad0 m2 [[5, 6, 7, 0], [1, 2, 0, 0]] pad_to_mult pad0 m3 [[5, 6, 7], [1, 2, 0]] right_pad_to pad0 w5 [[5, 6, 7, 0, 0], [1, 2, 0, 0, 0]] right_pad_to pad0 w2 [[5, 6], [1, 2]]
Probe action_logprobs and entropy
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(5)
logits=torch.randn(2,3,4,generator=g)
actions=torch.tensor([[0,1,2],[3,2,1]])
print('action_logprobs', R.action_logprobs(logits,actions).tolist(), R.action_logprobs(logits,actions).shape)
import torch.nn.functional as F
print('check', F.log_softmax(logits,-1).gather(-1,actions.unsqueeze(-1)).squeeze(-1).tolist())
print()
l2=torch.randn(2,5,generator=g)
print('entropy', R.entropy_from_logits(l2).tolist(), R.entropy_from_logits(l2).shape)
p=F.softmax(l2,-1); print('check ent', (-(p*torch.log(p)).sum(-1)).tolist())
"action_logprobs [[-0.28045034408569336, -2.5107481479644775, -2.4612276554107666], [-1.225541353225708, -2.472426414489746, -1.1336541175842285]] torch.Size([2, 3]) check [[-0.28045034408569336, -2.5107481479644775, -2.4612276554107666], [-1.225541353225708, -2.472426414489746, -1.1336541175842285]] entropy [1.4363868236541748, 1.3867380619049072] torch.Size([2]) check ent [1.4363868236541748, 1.3867380619049072] [stdout] action_logprobs [[-0.28045034408569336, -2.5107481479644775, -2.4612276554107666], [-1.225541353225708, -2.472426414489746, -1.1336541175842285]] torch.Size([2, 3]) check [[-0.28045034408569336, -2.5107481479644775, -2.4612276554107666], [-1.225541353225708, -2.472426414489746, -1.1336541175842285]] entropy [1.4363868236541748, 1.3867380619049072] torch.Size([2]) check ent [1.4363868236541748, 1.3867380619049072]
Probe reward_to_go, discount_cumsum, build_position_ids_packed
python3 -c "
import torch, reforacle as R
r=torch.tensor([[1.,2.,3.,4.],[5.,6.,7.,8.]])
mask=torch.tensor([[1.,1.,1.,0.],[1.,1.,0.,0.]])
print('reward_to_go', R.reward_to_go(r,mask).tolist())
print('discount g0.9', R.discount_cumsum(r,0.9).tolist())
x1=torch.tensor([1.,2.,3.])
print('discount 1d g0.5', R.discount_cumsum(x1,0.5).tolist())
print('build_pos [3,2] total5', R.build_position_ids_packed(torch.tensor([3,2]),5).tolist())
print('build_pos [2,1,2] total5', R.build_position_ids_packed(torch.tensor([2,1,2]),5).tolist())
"reward_to_go [[6.0, 5.0, 3.0, 0.0], [11.0, 6.0, 0.0, 0.0]] discount g0.9 [[8.145999908447266, 7.939999580383301, 6.599999904632568, 4.0], [21.90199851989746, 18.779998779296875, 14.199999809265137, 8.0]] discount 1d g0.5 [2.75, 3.5, 3.0] build_pos [3,2] total5 [0, 1, 2, 0, 1] build_pos [2,1,2] total5 [0, 1, 0, 0, 1] [stdout] reward_to_go [[6.0, 5.0, 3.0, 0.0], [11.0, 6.0, 0.0, 0.0]] discount g0.9 [[8.145999908447266, 7.939999580383301, 6.599999904632568, 4.0], [21.90199851989746, 18.779998779296875, 14.199999809265137, 8.0]] discount 1d g0.5 [2.75, 3.5, 3.0] build_pos [3,2] total5 [0, 1, 2, 0, 1] build_pos [2,1,2] total5 [0, 1, 0, 0, 1]
Disambiguate reward_to_go gap and build_pos padding
python3 -c "
import torch, reforacle as R
r=torch.tensor([[1.,2.,3.,4.]])
mask=torch.tensor([[1.,0.,1.,1.]])
print('rtg gap', R.reward_to_go(r,mask).tolist())
# build pos with padding
print('build_pos [2,1] total5', R.build_position_ids_packed(torch.tensor([2,1]),5).tolist(), R.build_position_ids_packed(torch.tensor([2,1]),5).dtype)
print('reward_to_go dtype', R.reward_to_go(r,mask).dtype)
"rtg gap [[8.0, 0.0, 7.0, 4.0]] build_pos [2,1] total5 [0, 1, 0, 0, 0] torch.int64 reward_to_go dtype torch.float32 [stdout] rtg gap [[8.0, 0.0, 7.0, 4.0]] build_pos [2,1] total5 [0, 1, 0, 0, 0] torch.int64 reward_to_go dtype torch.float32
Probe logits_warper and sample_greedy_warped
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(6)
logits=torch.randn(2,6,generator=g)
print('warper T2 k3 p0.9', R.logits_warper(logits,2.0,3,0.9).tolist())
print('sample_greedy T2 k3 p0.9', R.sample_greedy_warped(logits,2.0,3,0.9).tolist())
print()
# manual: temp then topk then topp
t=R.temperature_scale(logits,2.0)
t=R.top_k_filter(t,3)
t=R.top_p_filter(t,0.9)
print('manual chain', t.tolist())
print('argmax chain', t.argmax(-1).tolist())
"warper T2 k3 p0.9 [[-inf, -inf, 0.3592336177825928, -0.3492269217967987, -inf, 0.08885011076927185], [0.7278369665145874, 0.3201565742492676, 0.967765212059021, -inf, -inf, -inf]] sample_greedy T2 k3 p0.9 [2, 2] manual chain [[-inf, -inf, 0.3592336177825928, -0.3492269217967987, -inf, 0.08885011076927185], [0.7278369665145874, 0.3201565742492676, 0.967765212059021, -inf, -inf, -inf]] argmax chain [2, 2] [stdout] warper T2 k3 p0.9 [[-inf, -inf, 0.3592336177825928, -0.3492269217967987, -inf, 0.08885011076927185], [0.7278369665145874, 0.3201565742492676, 0.967765212059021, -inf, -inf, -inf]] sample_greedy T2 k3 p0.9 [2, 2] manual chain [[-inf, -inf, 0.3592336177825928, -0.3492269217967987, -inf, 0.08885011076927185], [0.7278369665145874, 0.3201565742492676, 0.967765212059021, -inf, -inf, -inf]] argmax chain [2, 2]
Probe rollout_last_logits and first_stop_index
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(7)
logits=torch.randn(2,5,4,generator=g) # B,T,V
ids=torch.tensor([[5,6,7,0,0],[1,2,3,4,0]])
out=R.rollout_last_logits(logits,ids,0)
print('rollout shape', out.shape)
print('row0 == logits[0,2]?', torch.allclose(out[0],logits[0,2]))
print('row1 == logits[1,3]?', torch.allclose(out[1],logits[1,3]))
print()
ids2=torch.tensor([[5,6,7,8,9],[1,3,2,3,1]])
print('first_stop [7,9]', R.first_stop_index(ids2,[7,9]).tolist())
print('first_stop [3]', R.first_stop_index(ids2,[3]).tolist())
print('first_stop [99]', R.first_stop_index(ids2,[99]).tolist())
"Exit code 1 rollout shape torch.Size([2, 4]) row0 == logits[0,2]? True row1 == logits[1,3]? True Traceback (most recent call last): File "<string>", line 12, in <module> File "reforacle.py", line 243, in reforacle.first_stop_index AttributeError: 'list' object has no attribute 'tolist' [error] tool reported failure
Check first_stop_index return type
python3 -c "
import torch, reforacle as R
ids2=torch.tensor([[5,6,7,8,9],[1,3,2,3,1]])
print('first_stop [7,9]', R.first_stop_index(ids2,[7,9]))
print('first_stop [3]', R.first_stop_index(ids2,[3]))
print('first_stop [99]', R.first_stop_index(ids2,[99]))
print('first_stop tensor arg', R.first_stop_index(ids2,torch.tensor([3])))
"Exit code 1 Traceback (most recent call last): File "<string>", line 4, in <module> File "reforacle.py", line 243, in reforacle.first_stop_index AttributeError: 'list' object has no attribute 'tolist' [error] tool reported failure
first_stop_index with tensor stop_ids
python3 -c "
import torch, reforacle as R
ids2=torch.tensor([[5,6,7,8,9],[1,3,2,3,1]])
print('fs [7,9]', R.first_stop_index(ids2,torch.tensor([7,9])).tolist())
print('fs [3]', R.first_stop_index(ids2,torch.tensor([3])).tolist())
print('fs [99]', R.first_stop_index(ids2,torch.tensor([99])).tolist())
print('fs [5,1]', R.first_stop_index(ids2,torch.tensor([5,1])).tolist())
"fs [7,9] [2, -1] fs [3] [-1, 1] fs [99] [-1, -1] fs [5,1] [0, 0] [stdout] fs [7,9] [2, -1] fs [3] [-1, 1] fs [99] [-1, -1] fs [5,1] [0, 0]
Probe masked_argmax and topk_indices
python3 -c "
import torch, reforacle as R
g=torch.Generator().manual_seed(8)
logits=torch.randn(2,6,generator=g)
mask=torch.tensor([[1.,0.,1.,0.,1.,0.],[0.,0.,1.,1.,0.,1.]])
print('logits',logits.tolist())
print('masked_argmax', R.masked_argmax(logits,mask).tolist())
print('topk_indices k3', R.topk_indices(logits,3).tolist(), R.topk_indices(logits,3).dtype)
print('topk_indices k1', R.topk_indices(logits,1).tolist())
"logits [[0.2712765038013458, -1.2729183435440063, 0.5026970505714417, 0.4180806875228882, -0.6394201517105103, -0.6607707142829895], [-0.14331436157226562, -0.10431472212076187, -1.5312546491622925, 0.6318014860153198, -1.3447675704956055, 1.4309413433074951]] masked_argmax [2, 5] topk_indices k3 [[2, 3, 0], [5, 3, 1]] torch.int64 topk_indices k1 [[2], [5]] [stdout] logits [[0.2712765038013458, -1.2729183435440063, 0.5026970505714417, 0.4180806875228882, -0.6394201517105103, -0.6607707142829895], [-0.14331436157226562, -0.10431472212076187, -1.5312546491622925, 0.6318014860153198, -1.3447675704956055, 1.4309413433074951]] masked_argmax [2, 5] topk_indices k3 [[2, 3, 0], [5, 3, 1]] torch.int64 topk_indices k1 [[2], [5]]
Probe generation_stop_mask
python3 -c "
import torch, reforacle as R
ids=torch.tensor([[5,6,0,7,0],[1,0,3,4,0],[0,0,0,0,0]])
print('genstop eos0 minlen0', R.generation_stop_mask(ids,0,0).tolist(), R.generation_stop_mask(ids,0,0).dtype)
print('genstop eos0 minlen2', R.generation_stop_mask(ids,0,2).tolist())
print('genstop eos0 minlen3', R.generation_stop_mask(ids,0,3).tolist())
"genstop eos0 minlen0 [[1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0]] torch.float32 genstop eos0 minlen2 [[1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0]] genstop eos0 minlen3 [[1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 1.0, 0.0, 0.0]] [stdout] genstop eos0 minlen0 [[1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0]] torch.float32 genstop eos0 minlen2 [[1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0]] genstop eos0 minlen3 [[1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 1.0, 0.0, 0.0], [1.0, 1.0, 1.0, 0.0, 0.0]]
generation_stop_mask no-eos and huge min_len
python3 -c "
import torch, reforacle as R
ids=torch.tensor([[5,6,7,8,9],[5,6,0,8,9]])
print('genstop no-eos row minlen0', R.generation_stop_mask(ids,0,0).tolist())
print('genstop no-eos row minlen3', R.generation_stop_mask(ids,0,3).tolist())
print('genstop minlen10 (huge)', R.generation_stop_mask(ids,0,10).tolist())
print('mask_after_eos', R.mask_after_eos(ids,0).tolist())
"genstop no-eos row minlen0 [[1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 0.0, 0.0]] genstop no-eos row minlen3 [[1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 0.0, 0.0]] genstop minlen10 (huge) [[1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0]] mask_after_eos [[1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 0.0, 0.0]] [stdout] genstop no-eos row minlen0 [[1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 0.0, 0.0]] genstop no-eos row minlen3 [[1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 0.0, 0.0]] genstop minlen10 (huge) [[1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0]] mask_after_eos [[1.0, 1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 0.0, 0.0]]
from __future__ import annotations
import torch
NEG_INF = float("-inf")
def greedy_token(logits):
return logits.argmax(dim=-1)
def temperature_scale(logits, temperature):
if temperature == 0:
idx = logits.argmax(dim=-1, keepdim=True)
out = torch.full_like(logits, NEG_INF)
out.scatter_(-1, idx, 0.0)
return out
return logits / temperature
def top_k_filter(logits, k):
k = min(int(k), logits.shape[-1])
out = logits.clone()
if k <= 0:
out.fill_(NEG_INF)
return out
thresh = torch.topk(logits, k, dim=-1).values[..., -1:]
out[logits < thresh] = NEG_INF
return out
def top_p_filter(logits, p):
sorted_logits, sorted_idx = torch.sort(logits, descending=True, dim=-1)
probs = torch.softmax(sorted_logits, dim=-1)
cum = probs.cumsum(dim=-1)
remove = cum > p
remove[..., 1:] = remove[..., :-1].clone()
remove[..., 0] = False
remove_scattered = torch.zeros_like(remove).scatter(-1, sorted_idx, remove)
return logits.masked_fill(remove_scattered, NEG_INF)
def min_p_filter(logits, p):
probs = torch.softmax(logits, dim=-1)
maxp = probs.max(dim=-1, keepdim=True).values
remove = probs < p * maxp
return logits.masked_fill(remove, NEG_INF)
def repetition_penalty(logits, input_ids, penalty):
counts = torch.zeros_like(logits).scatter_add_(
-1, input_ids, torch.ones_like(input_ids, dtype=logits.dtype)
)
factor = penalty ** counts
return torch.where(logits > 0, logits / factor, logits * factor)
def frequency_penalty(logits, input_ids, penalty):
counts = torch.zeros_like(logits).scatter_add_(
-1, input_ids, torch.ones_like(input_ids, dtype=logits.dtype)
)
return logits - penalty * counts
def presence_penalty(logits, input_ids, penalty):
counts = torch.zeros_like(logits).scatter_add_(
-1, input_ids, torch.ones_like(input_ids, dtype=logits.dtype)
)
present = (counts > 0).to(logits.dtype)
return logits - penalty * present
def suppress_tokens(logits, token_ids):
out = logits.clone()
out[..., token_ids] = NEG_INF
return out
def min_length_filter(logits, cur_len, min_len, eos_id):
out = logits.clone()
if cur_len < min_len:
out[..., eos_id] = NEG_INF
return out
def renormalize_logits(logits):
return torch.log_softmax(logits, dim=-1)
def attention_mask(input_ids, pad_id):
return (input_ids != pad_id).to(torch.float32)
def position_ids(input_ids, pad_id):
m = (input_ids != pad_id).long()
pos = m.cumsum(dim=-1) - 1
return pos.clamp(min=0)
def causal_mask(t):
mask = torch.full((t, t), NEG_INF)
return torch.triu(mask, diagonal=1)
def shift_labels(input_ids, ignore_index):
labels = torch.full_like(input_ids, ignore_index)
labels[..., :-1] = input_ids[..., 1:]
return labels
def completion_loss_labels(input_ids, prompt_lengths, ignore_index):
labels = input_ids.clone()
ar = torch.arange(input_ids.shape[-1], device=input_ids.device)
mask = ar.unsqueeze(0) < prompt_lengths.unsqueeze(1)
labels[mask] = ignore_index
return labels
def mask_after_eos(input_ids, eos_id):
L = input_ids.shape[-1]
ar = torch.arange(L, device=input_ids.device)
is_eos = input_ids == eos_id
first = torch.where(is_eos, ar, torch.full_like(ar, L)).min(dim=-1).values
mask = ar.unsqueeze(0) <= first.unsqueeze(1)
return mask.to(torch.float32)
def sequence_lengths(input_ids, pad_id):
return (input_ids != pad_id).sum(dim=-1)
def last_token_indices(attn_mask):
L = attn_mask.shape[-1]
ar = torch.arange(L, device=attn_mask.device)
idx = torch.where(attn_mask > 0, ar, torch.full_like(ar, -1))
return idx.max(dim=-1).values
def gather_last_logits(logits, attn_mask):
idx = last_token_indices(attn_mask)
B = logits.shape[0]
return logits[torch.arange(B, device=logits.device), idx]
def truncate_left(input_ids, max_len):
L = input_ids.shape[-1]
start = max(L - int(max_len), 0)
return input_ids[..., start:]
def pad_to_multiple(input_ids, pad_id, multiple):
L = input_ids.shape[-1]
rem = L % multiple
if rem == 0:
return input_ids
pad = multiple - rem
padding = torch.full(
(*input_ids.shape[:-1], pad), pad_id, dtype=input_ids.dtype, device=input_ids.device
)
return torch.cat([input_ids, padding], dim=-1)
def action_logprobs(logits, actions):
logp = torch.log_softmax(logits, dim=-1)
return logp.gather(-1, actions.unsqueeze(-1)).squeeze(-1)
def entropy_from_logits(logits):
logp = torch.log_softmax(logits, dim=-1)
p = torch.softmax(logits, dim=-1)
return -(p * logp).sum(dim=-1)
def reward_to_go(rewards, mask):
masked = rewards * mask
rcs = torch.flip(torch.cumsum(torch.flip(masked, [-1]), dim=-1), [-1])
return rcs * mask
def discount_cumsum(x, gamma):
out = torch.zeros_like(x)
running = torch.zeros(x.shape[:-1], dtype=x.dtype, device=x.device)
T = x.shape[-1]
for t in range(T - 1, -1, -1):
running = x[..., t] + gamma * running
out[..., t] = running
return out
def build_position_ids_packed(seq_lengths, total_len):
out = torch.zeros(total_len, dtype=torch.long)
pos = 0
for L in seq_lengths.tolist():
end = min(pos + L, total_len)
out[pos:end] = torch.arange(end - pos)
pos = end
return out
def logits_warper(logits, temperature, top_k, top_p):
x = temperature_scale(logits, temperature)
x = top_k_filter(x, top_k)
x = top_p_filter(x, top_p)
return x
def sample_greedy_warped(logits, temperature, top_k, top_p):
return logits_warper(logits, temperature, top_k, top_p).argmax(dim=-1)
def prepare_labels(input_ids, prompt_lengths, ignore_index):
labels = shift_labels(input_ids, ignore_index)
ar = torch.arange(input_ids.shape[-1], device=input_ids.device)
thresh = (prompt_lengths - 1).clamp(min=0)
mask = ar.unsqueeze(0) < thresh.unsqueeze(1)
labels[mask] = ignore_index
return labels
def rollout_last_logits(logits, input_ids, pad_id):
am = attention_mask(input_ids, pad_id)
return gather_last_logits(logits, am)
def epsilon_filter(logits, epsilon):
probs = torch.softmax(logits, dim=-1)
top1 = probs.max(dim=-1, keepdim=True).values
remove = (probs < epsilon) & (probs < top1)
return logits.masked_fill(remove, NEG_INF)
def first_stop_index(input_ids, stop_ids):
matches = (input_ids.unsqueeze(-1) == stop_ids.reshape(-1)).any(dim=-1)
has = matches.any(dim=-1)
first = matches.to(torch.long).argmax(dim=-1)
return torch.where(has, first, torch.full_like(first, -1))
def masked_argmax(logits, mask):
masked = logits.masked_fill(mask == 0, NEG_INF)
return masked.argmax(dim=-1)
def topk_indices(logits, k):
return torch.topk(logits, k, dim=-1).indices
def right_pad_to(input_ids, pad_id, width):
L = input_ids.shape[-1]
if width <= L:
return input_ids[..., :width]
pad = width - L
padding = torch.full(
(*input_ids.shape[:-1], pad), pad_id, dtype=input_ids.dtype, device=input_ids.device
)
return torch.cat([input_ids, padding], dim=-1)
def generation_stop_mask(input_ids, eos_id, min_len):
L = input_ids.shape[-1]
ar = torch.arange(L, device=input_ids.device)
is_eos = input_ids == eos_id
first = torch.where(is_eos, ar, torch.full_like(ar, L)).min(dim=-1).values
stop = torch.maximum(first, torch.full_like(first, min_len - 1))
mask = ar.unsqueeze(0) <= stop.unsqueeze(1)
return mask.to(torch.float32)
Run verification harness
cat > /tmp/verify.py << 'EOF'
import torch, reforacle as R
import objectives as O
torch.manual_seed(123)
fails=[]
def chk(name, a, b):
try:
if isinstance(b, torch.Tensor):
if a.shape!=b.shape:
fails.append((name,'shape',a.shape,b.shape)); return
if a.dtype!=b.dtype:
fails.append((name,'dtype',a.dtype,b.dtype)); return
if not torch.allclose(a.float(), b.float(), atol=1e-5, rtol=1e-4, equal_nan=True):
fails.append((name,'val', a.flatten()[:8].tolist(), b.flatten()[:8].tolist())); return
else:
if a!=b: fails.append((name,'scalar',a,b)); return
except Exception as e:
fails.append((name,'exc',str(e)))
for trial in range(30):
B=torch.randint(1,4,(1,)).item(); V=torch.randint(2,10,(1,)).item(); T=torch.randint(1,7,(1,)).item()
logits=torch.randn(B,V)
chk('greedy_token', O.greedy_token(logits), R.greedy_token(logits))
for temp in [0.0,0.5,1.0,2.0]:
chk(f'temperature_scale{temp}', O.temperature_scale(logits,temp), R.temperature_scale(logits,temp))
for k in [1,2,V,V+1]:
chk(f'top_k{k}', O.top_k_filter(logits,k), R.top_k_filter(logits,k))
for p in [0.0,0.3,0.5,0.9,1.0]:
chk(f'top_p{p}', O.top_p_filter(logits,p), R.top_p_filter(logits,p))
chk(f'min_p{p}', O.min_p_filter(logits,p), R.min_p_filter(logits,p))
for e in [0.0,0.05,0.2,0.9]:
chk(f'eps{e}', O.epsilon_filter(logits,e), R.epsilon_filter(logits,e))
ids=torch.randint(0,V,(B,T))
for pen in [0.8,1.0,1.5]:
chk(f'rep{pen}', O.repetition_penalty(logits,ids,pen), R.repetition_penalty(logits,ids,pen))
for pen in [0.0,0.5,1.5]:
chk(f'freq{pen}', O.frequency_penalty(logits,ids,pen), R.frequency_penalty(logits,ids,pen))
chk(f'pres{pen}', O.presence_penalty(logits,ids,pen), R.presence_penalty(logits,ids,pen))
tks=torch.randint(0,V,(min(2,V),)).unique()
chk('suppress', O.suppress_tokens(logits,tks), R.suppress_tokens(logits,tks))
chk('suppress_list', O.suppress_tokens(logits,tks.tolist()), R.suppress_tokens(logits,tks.tolist()))
for cur in [0,3,5]:
chk('minlen', O.min_length_filter(logits,cur,4,0), R.min_length_filter(logits,cur,4,0))
chk('renorm', O.renormalize_logits(logits), R.renormalize_logits(logits))
# sequences with pad
ids2=torch.randint(0,V,(B,T))
pad=0
chk('attn', O.attention_mask(ids2,pad), R.attention_mask(ids2,pad))
chk('pos', O.position_ids(ids2,pad), R.position_ids(ids2,pad))
chk('causal', O.causal_mask(T), R.causal_mask(T))
chk('seqlen', O.sequence_lengths(ids2,pad), R.sequence_lengths(ids2,pad))
am=R.attention_mask(ids2,pad)
chk('last_tok', O.last_token_indices(am), R.last_token_indices(am))
logits3=torch.randn(B,T,V)
chk('gather_last', O.gather_last_logits(logits3,am), R.gather_last_logits(logits3,am))
chk('rollout', O.rollout_last_logits(logits3,ids2,pad), R.rollout_last_logits(logits3,ids2,pad))
chk('shift', O.shift_labels(ids2,-100), R.shift_labels(ids2,-100))
pls=torch.randint(0,T+1,(B,))
chk('comp', O.completion_loss_labels(ids2,pls,-100), R.completion_loss_labels(ids2,pls,-100))
chk('prepare', O.prepare_labels(ids2,pls,-100), R.prepare_labels(ids2,pls,-100))
chk('mask_eos', O.mask_after_eos(ids2,pad), R.mask_after_eos(ids2,pad))
for ml in [0,2,T,T+3]:
chk(f'genstop{ml}', O.generation_stop_mask(ids2,pad,ml), R.generation_stop_mask(ids2,pad,ml))
for ml in [1,3,T+2]:
chk(f'trunc{ml}', O.truncate_left(ids2,ml), R.truncate_left(ids2,ml))
for m in [1,2,3,4]:
chk(f'padmult{m}', O.pad_to_multiple(ids2,pad,m), R.pad_to_multiple(ids2,pad,m))
for w in [1,T,T+3]:
chk(f'rpad{w}', O.right_pad_to(ids2,pad,w), R.right_pad_to(ids2,pad,w))
acts=torch.randint(0,V,(B,T))
chk('action_lp', O.action_logprobs(logits3,acts), R.action_logprobs(logits3,acts))
chk('entropy', O.entropy_from_logits(logits), R.entropy_from_logits(logits))
rew=torch.randn(B,T); msk=(torch.rand(B,T)>0.3).float()
chk('rtg', O.reward_to_go(rew,msk), R.reward_to_go(rew,msk))
for g in [0.0,0.5,0.9,1.0]:
chk(f'disc{g}', O.discount_cumsum(rew,g), R.discount_cumsum(rew,g))
chk(f'disc1d{g}', O.discount_cumsum(rew[0],g), R.discount_cumsum(rew[0],g))
sl=torch.randint(1,4,(B,)); tot=int(sl.sum().item())+torch.randint(0,3,(1,)).item()
chk('buildpos', O.build_position_ids_packed(sl,tot), R.build_position_ids_packed(sl,tot))
for temp in [0.5,1.0,2.0]:
chk(f'warper{temp}', O.logits_warper(logits,temp,2,0.9), R.logits_warper(logits,temp,2,0.9))
chk(f'sgw{temp}', O.sample_greedy_warped(logits,temp,2,0.9), R.sample_greedy_warped(logits,temp,2,0.9))
stops=torch.randint(0,V,(min(2,V),)).unique()
chk('first_stop', O.first_stop_index(ids2,stops), R.first_stop_index(ids2,stops))
m2=(torch.rand(B,V)>0.3).float()
m2[:,0]=1.0
chk('masked_argmax', O.masked_argmax(logits,m2), R.masked_argmax(logits,m2))
for k in [1,2,V]:
chk(f'topk_idx{k}', O.topk_indices(logits,k), R.topk_indices(logits,k))
from collections import Counter
c=Counter(f[0] for f in fails)
print("total fail records:", len(fails))
print("distinct failing funcs:", sorted(set(x.rstrip('0123456789.') for x in c)))
for f in fails[:20]:
print(f)
EOF
python3 /tmp/verify.pyExit code 1
Traceback (most recent call last):
File "/tmp/verify.py", line 1, in <module>
import torch, reforacle as R
ModuleNotFoundError: No module named 'reforacle'
[error] tool reported failureRun verification from /app
python3 /tmp/verify.py
Exit code 1
Traceback (most recent call last):
File "/tmp/verify.py", line 1, in <module>
import torch, reforacle as R
ModuleNotFoundError: No module named 'reforacle'
[error] tool reported failureRun verification from /app dir
cp /tmp/verify.py /app/verify.py && python3 verify.py; rm -f /app/verify.py
total fail records: 0 distinct failing funcs: [] [stdout] total fail records: 0 distinct failing funcs: []
Extended verification with varied sizes and nonzero pad
cat > /app/verify2.py << 'EOF'
import torch, reforacle as R
import objectives as O
from collections import Counter
fails=[]
def chk(name,a,b):
if isinstance(b,torch.Tensor):
if a.shape!=b.shape: fails.append((name,'shape',a.shape,b.shape));return
if a.dtype!=b.dtype: fails.append((name,'dtype',a.dtype,b.dtype));return
if not torch.allclose(a.float(),b.float(),atol=1e-5,rtol=1e-4,equal_nan=True):
fails.append((name,'val',a.flatten()[:6].tolist(),b.flatten()[:6].tolist()))
else:
if a!=b: fails.append((name,a,b))
for seed in range(200,260):
torch.manual_seed(seed)
B=torch.randint(1,6,(1,)).item(); V=torch.randint(2,20,(1,)).item(); T=torch.randint(1,12,(1,)).item()
logits=torch.randn(B,V)*3
chk('greedy',O.greedy_token(logits),R.greedy_token(logits))
for t in [0.0,0.1,0.7,3.0]: chk('temp',O.temperature_scale(logits,t),R.temperature_scale(logits,t))
for k in [1,V//2+1,V]: chk('topk',O.top_k_filter(logits,k),R.top_k_filter(logits,k))
for p in [0.01,0.4,0.85,1.0]:
chk('topp',O.top_p_filter(logits,p),R.top_p_filter(logits,p))
chk('minp',O.min_p_filter(logits,p),R.min_p_filter(logits,p))
chk('eps',O.epsilon_filter(logits,p),R.epsilon_filter(logits,p))
pad=torch.randint(0,V,(1,)).item()
ids=torch.randint(0,V,(B,T))
for pen in [0.7,1.0,1.3]: chk('rep',O.repetition_penalty(logits,ids,pen),R.repetition_penalty(logits,ids,pen))
for pen in [0.3,1.1]:
chk('freq',O.frequency_penalty(logits,ids,pen),R.frequency_penalty(logits,ids,pen))
chk('pres',O.presence_penalty(logits,ids,pen),R.presence_penalty(logits,ids,pen))
chk('attn',O.attention_mask(ids,pad),R.attention_mask(ids,pad))
chk('pos',O.position_ids(ids,pad),R.position_ids(ids,pad))
chk('causal',O.causal_mask(T),R.causal_mask(T))
chk('seqlen',O.sequence_lengths(ids,pad),R.sequence_lengths(ids,pad))
am=R.attention_mask(ids,pad)
chk('last',O.last_token_indices(am),R.last_token_indices(am))
l3=torch.randn(B,T,V)
chk('gather',O.gather_last_logits(l3,am),R.gather_last_logits(l3,am))
chk('rollout',O.rollout_last_logits(l3,ids,pad),R.rollout_last_logits(l3,ids,pad))
chk('shift',O.shift_labels(ids,-100),R.shift_labels(ids,-100))
pls=torch.randint(0,T+1,(B,))
chk('comp',O.completion_loss_labels(ids,pls,-100),R.completion_loss_labels(ids,pls,-100))
chk('prep',O.prepare_labels(ids,pls,-100),R.prepare_labels(ids,pls,-100))
chk('maskeos',O.mask_after_eos(ids,pad),R.mask_after_eos(ids,pad))
for ml in [0,1,T,T+5]: chk('genstop',O.generation_stop_mask(ids,pad,ml),R.generation_stop_mask(ids,pad,ml))
for ml in [1,T//2+1,T+2]: chk('trunc',O.truncate_left(ids,ml),R.truncate_left(ids,ml))
for m in [1,3,5]: chk('padmult',O.pad_to_multiple(ids,pad,m),R.pad_to_multiple(ids,pad,m))
for w in [1,T,T+4]: chk('rpad',O.right_pad_to(ids,pad,w),R.right_pad_to(ids,pad,w))
acts=torch.randint(0,V,(B,T))
chk('actlp',O.action_logprobs(l3,acts),R.action_logprobs(l3,acts))
chk('ent',O.entropy_from_logits(logits),R.entropy_from_logits(logits))
rew=torch.randn(B,T); msk=(torch.rand(B,T)>0.4).float()
chk('rtg',O.reward_to_go(rew,msk),R.reward_to_go(rew,msk))
for g in [0.0,0.7,1.0]:
chk('disc',O.discount_cumsum(rew,g),R.discount_cumsum(rew,g))
chk('disc1d',O.discount_cumsum(rew[0],g),R.discount_cumsum(rew[0],g))
sl=torch.randint(1,5,(B,)); tot=int(sl.sum())+torch.randint(0,4,(1,)).item()
chk('bpos',O.build_position_ids_packed(sl,tot),R.build_position_ids_packed(sl,tot))
for t in [0.3,1.0,2.5]:
for kk in [1,V]:
for pp in [0.5,1.0]:
chk('warp',O.logits_warper(logits,t,kk,pp),R.logits_warper(logits,t,kk,pp))
chk('sgw',O.sample_greedy_warped(logits,t,kk,pp),R.sample_greedy_warped(logits,t,kk,pp))
stops=torch.randint(0,V,(3,)).unique()
chk('fstop',O.first_stop_index(ids,stops),R.first_stop_index(ids,stops))
m2=(torch.rand(B,V)>0.4).float(); m2[:,0]=1.0
chk('margmax',O.masked_argmax(logits,m2),R.masked_argmax(logits,m2))
for k in [1,V//2+1,V]: chk('tkidx',O.topk_indices(logits,k),R.topk_indices(logits,k))
c=Counter(f[0] for f in fails)
print("fails:",len(fails), dict(c))
for f in fails[:15]: print(f)
EOF
python3 /app/verify2.py; rm -f /app/verify2.pyfails: 52 {'warp': 49, 'topp': 3}
('warp', 'val', [-0.23860295116901398, -6.135237693786621, -22.550317764282227, 10.636717796325684, 16.69678497314453, 0.5882902145385742], [-0.23860295116901398, -inf, -inf, 10.636717796325684, 16.69678497314453, 0.5882902145385742])
('warp', 'val', [2.5869393348693848, -10.562701225280762, 3.506807327270508, 1.858924150466919, -6.870359420776367, -8.742650985717773], [2.5869393348693848, -10.562701225280762, 3.506807327270508, 1.858924150466919, -6.870359420776367, -8.742650985717773])
('warp', 'val', [-12.942009925842285, -6.763495445251465, -10.204878807067871, -0.705073356628418, 2.9203476905822754, -10.60231876373291], [-inf, -inf, -inf, -0.705073356628418, 2.9203476905822754, -inf])
('warp', 'val', [-1.3602813482284546, 4.004066467285156, 15.994654655456543, 2.0706684589385986, -8.569985389709473, 18.022897720336914], [-inf, 4.004066467285156, 15.994654655456543, -inf, -inf, 18.022897720336914])
('warp', 'val', [4.595158576965332, 15.636774063110352, -20.057750701904297, -5.866537094116211, 4.2438249588012695, 5.378098487854004], [4.595158576965332, 15.636774063110352, -inf, -inf, 4.2438249588012695, 5.378098487854004])
('warp', 'val', [-4.065798282623291, -0.6338192820549011, 19.58210563659668, 13.75371265411377, 12.393814086914062, -8.174854278564453], [-inf, -inf, 19.58210563659668, 13.75371265411377, 12.393814086914062, -inf])
('topp', 'val', [3.091322422027588, 1.9417786598205566, 4.176062107086182, 5.800649642944336, 0.7055670619010925, 5.8554205894470215], [3.091322422027588, 1.9417786598205566, 4.176062107086182, 5.800649642944336, 0.7055670619010925, 5.8554205894470215])
('warp', 'val', [10.304408073425293, 6.47259521484375, 13.920206069946289, 19.335498809814453, 2.3518900871276855, 19.518068313598633], [10.304408073425293, -inf, 13.920206069946289, 19.335498809814453, -inf, 19.518068313598633])
('warp', 'val', [3.091322422027588, 1.9417786598205566, 4.176062107086182, 5.800649642944336, 0.7055670619010925, 5.8554205894470215], [3.091322422027588, 1.9417786598205566, 4.176062107086182, 5.800649642944336, 0.7055670619010925, 5.8554205894470215])
('warp', 'val', [7.832986354827881, 13.174393653869629, 19.439207077026367, 7.362174034118652, 2.740497589111328, -inf], [7.832986354827881, 13.174393653869629, 19.439207077026367, 7.362174034118652, -inf, -inf])
('warp', 'val', [-1.1505299806594849, 2.576460838317871, -7.921551704406738, -0.9234959483146667, -5.633893013000488, 21.174951553344727], [-inf, -inf, -inf, -inf, -inf, 21.174951553344727])
('warp', 'val', [0.2704876959323883, 17.535934448242188, 3.3274476528167725, -1.5739814043045044, -3.686605215072632, -0.595334529876709], [0.2704876959323883, 17.535934448242188, 3.3274476528167725, -inf, -inf, -inf])
('warp', 'val', [6.372287750244141, 16.453227996826172, 15.505805969238281, 17.036399841308594, 0.9337731003761292, -13.964143753051758], [6.372287750244141, 16.453227996826172, 15.505805969238281, 17.036399841308594, 0.9337731003761292, -13.964143753051758])
('warp', 'val', [-5.094399929046631, 20.738588333129883, -12.873316764831543, -13.742354393005371, -0.07978963106870651, 3.414625883102417], [-inf, 20.738588333129883, -inf, -inf, -inf, -inf])
('warp', 'val', [-7.499542713165283, -13.237858772277832, -8.753808975219727, -11.024028778076172, -7.621323108673096, 5.252030372619629], [-inf, -inf, -inf, -inf, -inf, -inf])
[stdout]
fails: 52 {'warp': 49, 'topp': 3}
('warp', 'val', [-0.23860295116901398, -6.135237693786621, -22.550317764282227, 10.636717796325684, 16.69678497314453, 0.5882902145385742], [-0.23860295116901398, -inf, -inf, 10.636717796325684, 16.69678497314453, 0.5882902145385742])
('warp', 'val', [2.5869393348693848, -10.562701225280762, 3.506807327270508, 1.858924150466919, -6.870359420776367, -8.742650985717773], [2.5869393348693848, -10.562701225280762, 3.506807327270508, 1.858924150466919, -6.870359420776367, -8.742650985717773])
('warp', 'val', [-12.942009925842285, -6.763495445251465, -10.204878807067871, -0.705073356628418, 2.9203476905822754, -10.60231876373291], [-inf, -inf, -inf, -0.705073356628418, 2.9203476905822754, -inf])
('warp', 'val', [-1.3602813482284546, 4.004066467285156, 15.994654655456543, 2.0706684589385986, -8.569985389709473, 18.022897720336914], [-inf, 4.004066467285156, 15.994654655456543, -inf, -inf, 18.022897720336914])
('warp', 'val', [4.595158576965332, 15.636774063110352, -20.057750701904297, -5.866537094116211, 4.2438249588012695, 5.378098487854004], [4.595158576965332, 15.636774063110352, -inf, -inf, 4.2438249588012695, 5.378098487854004])
('warp', 'val', [-4.065798282623291, -0.6338192820549011, 19.58210563659668, 13.75371265411377, 12.393814086914062, -8.174854278564453], [-inf, -inf, 19.58210563659668, 13.75371265411377, 12.393814086914062, -inf])
('topp', 'val', [3.091322422027588, 1.9417786598205566, 4.176062107086182, 5.800649642944336, 0.7055670619010925, 5.8554205894470215], [3.091322422027588, 1.9417786598205566, 4.176062107086182, 5.800649642944336, 0.7055670619010925, 5.8554205894470215])
('warp', 'val', [10.304408073425293, 6.47259521484375, 13.920206069946289, 19.335498809814453, 2.3518900871276855, 19.518068313598633], [10.304408073425293, -inf, 13.920206069946289, 19.335498809814453, -inf, 19.518068313598633])
('warp', 'val', [3.091322422027588, 1.9417786598205566, 4.176062107086182, 5.800649642944336, 0.7055670619010925, 5.8554205894470215], [3.091322422027588, 1.9417786598205566, 4.176062107086182, 5.800649642944336, 0.7055670619010925, 5.8554205894470215])
('warp', 'val', [7.832986354827881, 13.174393653869629, 19.439207077026367, 7.362174034118652, 2.740497589111328, -inf], [7.832986354827881, 13.174393653869629, 19.439207077026367, 7.362174034118652, -inf, -inf])
('warp', 'val', [-1.1505299806594849, 2.576460838317871, -7.921551704406738, -0.9234959483146667, -5.633893013000488, 21.174951553344727], [-inf, -inf, -inf, -inf, -inf, 21.174951553344727])
('warp', 'val', [0.2704876959323883, 17.535934448242188, 3.3274476528167725, -1.5739814043045044, -3.686605215072632, -0.595334529876709], [0.2704876959323883, 17.535934448242188, 3.3274476528167725, -inf, -inf, -inf])
('warp', 'val', [6.372287750244141, 16.453227996826172, 15.505805969238281, 17.036399841308594, 0.9337731003761292, -13.964143753051758], [6.372287750244141, 16.453227996826172, 15.505805969238281, 17.036399841308594, 0.9337731003761292, -13.964143753051758])
('warp', 'val', [-5.094399929046631, 20.738588333129883, -12.873316764831543, -13.742354393005371, -0.07978963106870651, 3.414625883102417], [-inf, 20.738588333129883, -inf, -inf, -inf, -inf])
('warp', 'val', [-7.499542713165283, -13.237858772277832, -8.753808975219727, -11.024028778076172, -7.621323108673096, 5.252030372619629], [-inf, -inf, -inf, -inf, -inf, -inf])Debug minimal top_p failure
cat > /app/dbg.py << 'EOF'
import torch, reforacle as R, objectives as O
# find minimal top_p failure
for seed in range(200,260):
torch.manual_seed(seed)
B=torch.randint(1,6,(1,)).item(); V=torch.randint(2,20,(1,)).item(); T=torch.randint(1,12,(1,)).item()
logits=torch.randn(B,V)*3
for p in [0.01,0.4,0.85,1.0]:
a=O.top_p_filter(logits,p); b=R.top_p_filter(logits,p)
if not torch.allclose(a.float(),b.float(),atol=1e-5,equal_nan=True):
print("seed",seed,"p",p,"V",V)
for r in range(B):
if not torch.allclose(a[r].float(),b[r].float(),equal_nan=True):
print(" logits",logits[r].tolist())
print(" mine ",a[r].tolist())
print(" ref ",b[r].tolist())
probs=torch.softmax(logits[r],-1)
sl,si=torch.sort(logits[r],descending=True)
print(" sorted probs",torch.softmax(sl,-1).tolist())
print(" cumsum",torch.softmax(sl,-1).cumsum(-1).tolist())
break
else:
continue
break
EOF
python3 /app/dbg.py; rm -f /app/dbg.pyseed 208 p 1.0 V 16 logits [-3.3527073860168457, 2.921694040298462, 6.05880069732666, 8.856302261352539, 1.841355562210083, 0.5535116791725159, -6.680208206176758, 4.055140495300293, 5.47697639465332, 2.2890536785125732, -1.6594781875610352, -4.98466157913208, 7.794589996337891, 0.2183900773525238, 1.6799187660217285, -3.383551597595215] mine [-3.3527073860168457, 2.921694040298462, 6.05880069732666, 8.856302261352539, 1.841355562210083, 0.5535116791725159, -6.680208206176758, 4.055140495300293, 5.47697639465332, 2.2890536785125732, -1.6594781875610352, -4.98466157913208, 7.794589996337891, 0.2183900773525238, 1.6799187660217285, -3.383551597595215] ref [-3.3527073860168457, 2.921694040298462, 6.05880069732666, 8.856302261352539, 1.841355562210083, 0.5535116791725159, -inf, 4.055140495300293, 5.47697639465332, 2.2890536785125732, -1.6594781875610352, -4.98466157913208, 7.794589996337891, 0.2183900773525238, 1.6799187660217285, -3.383551597595215] sorted probs [0.6871465444564819, 0.23765863478183746, 0.04188995063304901, 0.02341136708855629, 0.00564847607165575, 0.0018183673964813352, 0.0009658943745307624, 0.0006173004512675107, 0.0005252736737020314, 0.0001702915906207636, 0.00012180130579508841, 1.8625329175847583e-05, 3.4256584058312e-06, 3.321608119222219e-06, 6.698774654978479e-07, 1.229217190257259e-07] cumsum [0.6871465444564819, 0.9248051643371582, 0.9666951298713684, 0.9901065230369568, 0.9957549571990967, 0.9975733160972595, 0.9985392093658447, 0.9991565346717834, 0.999681830406189, 0.9998521208763123, 0.9999738931655884, 0.9999925494194031, 0.9999959468841553, 0.9999992847442627, 0.9999999403953552, 1.0000001192092896] [stdout] seed 208 p 1.0 V 16 logits [-3.3527073860168457, 2.921694040298462, 6.05880069732666, 8.856302261352539, 1.841355562210083, 0.5535116791725159, -6.680208206176758, 4.055140495300293, 5.47697639465332, 2.2890536785125732, -1.6594781875610352, -4.98466157913208, 7.794589996337891, 0.2183900773525238, 1.6799187660217285, -3.383551597595215] mine [-3.3527073860168457, 2.921694040298462, 6.05880069732666, 8.856302261352539, 1.841355562210083, 0.5535116791725159, -6.680208206176758, 4.055140495300293, 5.47697639465332, 2.2890536785125732, -1.6594781875610352, -4.98466157913208, 7.794589996337891, 0.2183900773525238, 1.6799187660217285, -3.383551597595215] ref [-3.3527073860168457, 2.921694040298462, 6.05880069732666, 8.856302261352539, 1.841355562210083, 0.5535116791725159, -inf, 4.055140495300293, 5.47697639465332, 2.2890536785125732, -1.6594781875610352, -4.98466157913208, 7.794589996337891, 0.2183900773525238, 1.6799187660217285, -3.383551597595215] sorted probs [0.6871465444564819, 0.23765863478183746, 0.04188995063304901, 0.02341136708855629, 0.00564847607165575, 0.0018183673964813352, 0.0009658943745307624, 0.0006173004512675107, 0.0005252736737020314, 0.0001702915906207636, 0.00012180130579508841, 1.8625329175847583e-05, 3.4256584058312e-06, 3.321608119222219e-06, 6.698774654978479e-07, 1.229217190257259e-07] cumsum [0.6871465444564819, 0.9248051643371582, 0.9666951298713684, 0.9901065230369568, 0.9957549571990967, 0.9975733160972595, 0.9985392093658447, 0.9991565346717834, 0.999681830406189, 0.9998521208763123, 0.9999738931655884, 0.9999925494194031, 0.9999959468841553, 0.9999992847442627, 0.9999999403953552, 1.0000001192092896]
Test top_p candidate implementations
cat > /app/dbg2.py << 'EOF'
import torch, reforacle as R
def desc_shift(logits,p,cmp): # candidate A/D
sl,si=torch.sort(logits,descending=True,dim=-1)
probs=torch.softmax(sl,-1); cum=probs.cumsum(-1)
remove = cum>p if cmp=='>' else cum>=p
remove[...,1:]=remove[...,:-1].clone(); remove[...,0]=False
rs=torch.zeros_like(remove).scatter(-1,si,remove)
return logits.masked_fill(rs,float('-inf'))
def desc_noshift(logits,p,cmp):
sl,si=torch.sort(logits,descending=True,dim=-1)
probs=torch.softmax(sl,-1); cum=probs.cumsum(-1)
remove = cum>p if cmp=='>' else cum>=p
rs=torch.zeros_like(remove).scatter(-1,si,remove)
return logits.masked_fill(rs,float('-inf'))
def desc_excl(logits,p,cmp): # cumulative exclusive
sl,si=torch.sort(logits,descending=True,dim=-1)
probs=torch.softmax(sl,-1); cum=probs.cumsum(-1)-probs
remove = cum>p if cmp=='>' else cum>=p
rs=torch.zeros_like(remove).scatter(-1,si,remove)
return logits.masked_fill(rs,float('-inf'))
def asc(logits,p):
sl,si=torch.sort(logits,descending=False,dim=-1)
cum=torch.softmax(sl,-1).cumsum(-1)
remove = cum <= (1-p)
remove[...,-1:]=False
rs=torch.zeros_like(remove).scatter(-1,si,remove)
return logits.masked_fill(rs,float('-inf'))
cands={'A_shift>':lambda l,p:desc_shift(l,p,'>'),'D_shift>=':lambda l,p:desc_shift(l,p,'>='),
'noshift>':lambda l,p:desc_noshift(l,p,'>'),'noshift>=':lambda l,p:desc_noshift(l,p,'>='),
'excl>':lambda l,p:desc_excl(l,p,'>'),'excl>=':lambda l,p:desc_excl(l,p,'>='),'asc':asc}
score={k:0 for k in cands}; tot=0
for seed in range(0,120):
torch.manual_seed(seed)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,20,(1,)).item()
for scale in [1,3]:
logits=torch.randn(B,V)*scale
for p in [0.0,0.01,0.3,0.5,0.85,0.9,1.0]:
ref=R.top_p_filter(logits,p); tot+=1
for k,f in cands.items():
if torch.allclose(f(logits,p).float(),ref.float(),atol=1e-6,equal_nan=True): score[k]+=1
print("tot",tot);
for k,v in sorted(score.items(),key=lambda x:-x[1]): print(k,v)
EOF
python3 /app/dbg2.py; rm -f /app/dbg2.pytot 1680 A_shift> 1679 D_shift>= 1679 excl> 1679 asc 1679 excl>= 1440 noshift> 178 noshift>= 28 [stdout] tot 1680 A_shift> 1679 D_shift>= 1679 excl> 1679 asc 1679 excl>= 1440 noshift> 178 noshift>= 28
Find the single top_p failing case
cat > /app/dbg3.py << 'EOF'
import torch, reforacle as R
def A(logits,p):
sl,si=torch.sort(logits,descending=True,dim=-1)
cum=torch.softmax(sl,-1).cumsum(-1)
remove=cum>p
remove[...,1:]=remove[...,:-1].clone(); remove[...,0]=False
rs=torch.zeros_like(remove).scatter(-1,si,remove)
return logits.masked_fill(rs,float('-inf'))
for seed in range(0,120):
torch.manual_seed(seed)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,20,(1,)).item()
for scale in [1,3]:
logits=torch.randn(B,V)*scale
for p in [0.0,0.01,0.3,0.5,0.85,0.9,1.0]:
ref=R.top_p_filter(logits,p); mine=A(logits,p)
if not torch.allclose(mine.float(),ref.float(),atol=1e-6,equal_nan=True):
for r in range(B):
if not torch.allclose(mine[r].float(),ref[r].float(),equal_nan=True):
print("seed",seed,"scale",scale,"p",p)
sl,si=torch.sort(logits[r],descending=True)
cum=torch.softmax(sl,-1).cumsum(-1)
print(" sorted cum:",[round(x,7) for x in cum.tolist()])
print(" sorted idx:",si.tolist())
print(" mine remove:", torch.isinf(mine[r]).tolist())
print(" ref remove:", torch.isinf(ref[r]).tolist())
EOF
python3 /app/dbg3.py; rm -f /app/dbg3.pyseed 92 scale 3 p 1.0 sorted cum: [0.9994081, 0.99964, 0.9997894, 0.9998604, 0.9999022, 0.9999333, 0.9999621, 0.9999773, 0.9999881, 0.9999964, 0.9999999, 1.0000001] sorted idx: [2, 8, 11, 3, 10, 0, 5, 6, 1, 7, 9, 4] mine remove: [False, False, False, False, False, False, False, False, False, False, False, False] ref remove: [False, False, False, False, True, False, False, False, False, False, False, False] [stdout] seed 92 scale 3 p 1.0 sorted cum: [0.9994081, 0.99964, 0.9997894, 0.9998604, 0.9999022, 0.9999333, 0.9999621, 0.9999773, 0.9999881, 0.9999964, 0.9999999, 1.0000001] sorted idx: [2, 8, 11, 3, 10, 0, 5, 6, 1, 7, 9, 4] mine remove: [False, False, False, False, False, False, False, False, False, False, False, False] ref remove: [False, False, False, False, True, False, False, False, False, False, False, False]
Inspect full-precision cumsum at p=1.0 case
cat > /app/dbg4.py << 'EOF'
import torch, reforacle as R
torch.manual_seed(92)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,20,(1,)).item()
logits=torch.randn(B,V) # scale 1 first draws
logits=torch.randn(B,V)*3
# reproduce: seed92, first draw scale1 then scale3? loop did scale in [1,3]; scale1 uses first randn, scale3 second
# redo exactly:
torch.manual_seed(92)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,20,(1,)).item()
for scale in [1,3]:
logits=torch.randn(B,V)*scale
if scale==3:
for r in range(B):
sl,si=torch.sort(logits[r],descending=True)
probs=torch.softmax(sl,-1)
cum=probs.cumsum(-1)
if abs(cum[-1].item()-1.0)>1e-8 or (cum>1.0).any():
print("row",r,"V",V)
for i,c in enumerate(cum.tolist()):
print(i, repr(c), c>1.0)
EOF
python3 /app/dbg4.py; rm -f /app/dbg4.pyrow 1 V 12 0 0.9994081258773804 False 1 0.9996400475502014 False 2 0.9997894167900085 False 3 0.999860405921936 False 4 0.9999022483825684 False 5 0.9999333024024963 False 6 0.9999620914459229 False 7 0.9999772906303406 False 8 0.9999881386756897 False 9 0.9999963641166687 False 10 0.9999999403953552 False 11 1.0000001192092896 True row 2 V 12 0 0.8797993659973145 False 1 0.9259933829307556 False 2 0.9558112025260925 False 3 0.9683697819709778 False 4 0.9782565236091614 False 5 0.9857871532440186 False 6 0.9922946095466614 False 7 0.9956743121147156 False 8 0.9977378845214844 False 9 0.9992793202400208 False 10 0.9998341798782349 False 11 1.0000001192092896 True [stdout] row 1 V 12 0 0.9994081258773804 False 1 0.9996400475502014 False 2 0.9997894167900085 False 3 0.999860405921936 False 4 0.9999022483825684 False 5 0.9999333024024963 False 6 0.9999620914459229 False 7 0.9999772906303406 False 8 0.9999881386756897 False 9 0.9999963641166687 False 10 0.9999999403953552 False 11 1.0000001192092896 True row 2 V 12 0 0.8797993659973145 False 1 0.9259933829307556 False 2 0.9558112025260925 False 3 0.9683697819709778 False 4 0.9782565236091614 False 5 0.9857871532440186 False 6 0.9922946095466614 False 7 0.9956743121147156 False 8 0.9977378845214844 False 9 0.9992793202400208 False 10 0.9998341798782349 False 11 1.0000001192092896 True
Check reference removal for both rows at p=1.0
cat > /app/dbg5.py << 'EOF'
import torch, reforacle as R
torch.manual_seed(92)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,20,(1,)).item()
for scale in [1,3]:
logits=torch.randn(B,V)*scale
if scale==3:
ref=R.top_p_filter(logits,1.0)
for r in range(B):
sl,si=torch.sort(logits[r],descending=True)
removed=torch.isinf(ref[r])
print("row",r,"removed idx:",torch.nonzero(removed).flatten().tolist(),
"sorted last idx:",si[-1].item(),
"cum_last",torch.softmax(sl,-1).cumsum(-1)[-1].item())
EOF
python3 /app/dbg5.py; rm -f /app/dbg5.pyrow 0 removed idx: [] sorted last idx: 4 cum_last 1.0 row 1 removed idx: [4] sorted last idx: 4 cum_last 1.0000001192092896 row 2 removed idx: [] sorted last idx: 10 cum_last 1.0000001192092896 [stdout] row 0 removed idx: [] sorted last idx: 4 cum_last 1.0 row 1 removed idx: [4] sorted last idx: 4 cum_last 1.0000001192092896 row 2 removed idx: [] sorted last idx: 10 cum_last 1.0000001192092896
Broad search for exact top_p implementation
cat > /app/dbg6.py << 'EOF'
import torch, reforacle as R
def v_A(logits,p):
sl,si=torch.sort(logits,descending=True,dim=-1)
cum=torch.softmax(sl,-1).cumsum(-1)
rem=cum>p; rem[...,1:]=rem[...,:-1].clone(); rem[...,0]=False
return logits.masked_fill(torch.zeros_like(rem).scatter(-1,si,rem),float('-inf'))
def v_probsort(logits,p):
probs=torch.softmax(logits,-1)
sp,si=torch.sort(probs,descending=True,dim=-1)
cum=sp.cumsum(-1)
rem=cum>p; rem[...,1:]=rem[...,:-1].clone(); rem[...,0]=False
return logits.masked_fill(torch.zeros_like(rem).scatter(-1,si,rem),float('-inf'))
def v_ge(logits,p):
sl,si=torch.sort(logits,descending=True,dim=-1)
cum=torch.softmax(sl,-1).cumsum(-1)
rem=cum>=p; rem[...,1:]=rem[...,:-1].clone(); rem[...,0]=False
return logits.masked_fill(torch.zeros_like(rem).scatter(-1,si,rem),float('-inf'))
def v_probsort_ge(logits,p):
probs=torch.softmax(logits,-1)
sp,si=torch.sort(probs,descending=True,dim=-1)
cum=sp.cumsum(-1)
rem=cum>=p; rem[...,1:]=rem[...,:-1].clone(); rem[...,0]=False
return logits.masked_fill(torch.zeros_like(rem).scatter(-1,si,rem),float('-inf'))
def v_double(logits,p):
sl,si=torch.sort(logits,descending=True,dim=-1)
cum=torch.softmax(sl.double(),-1).cumsum(-1)
rem=cum>p; rem[...,1:]=rem[...,:-1].clone(); rem[...,0]=False
return logits.masked_fill(torch.zeros_like(rem).scatter(-1,si,rem),float('-inf'))
cands={'A':v_A,'probsort':v_probsort,'ge':v_ge,'probsort_ge':v_probsort_ge,'double':v_double}
score={k:0 for k in cands}; tot=0; failex={k:None for k in cands}
for seed in range(0,200):
torch.manual_seed(seed)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,25,(1,)).item()
for scale in [1,2,4]:
logits=torch.randn(B,V)*scale
for p in [0.0,0.01,0.3,0.5,0.7,0.85,0.9,0.95,0.99,1.0]:
ref=R.top_p_filter(logits,p); tot+=1
for k,f in cands.items():
if torch.allclose(f(logits,p).float(),ref.float(),atol=1e-6,equal_nan=True): score[k]+=1
elif failex[k] is None: failex[k]=(seed,scale,p)
print("tot",tot)
for k,v in sorted(score.items(),key=lambda x:-x[1]): print(k,v, "firstfail",failex[k])
EOF
python3 /app/dbg6.py; rm -f /app/dbg6.pytot 6000 ge 5980 firstfail (11, 4, 1.0) A 5954 firstfail (6, 4, 1.0) probsort 5943 firstfail (6, 4, 1.0) double 5943 firstfail (6, 4, 1.0) probsort_ge 5935 firstfail (6, 4, 1.0) [stdout] tot 6000 ge 5980 firstfail (11, 4, 1.0) A 5954 firstfail (6, 4, 1.0) probsort 5943 firstfail (6, 4, 1.0) double 5943 firstfail (6, 4, 1.0) probsort_ge 5935 firstfail (6, 4, 1.0)
Study p=1.0 removal rule
cat > /app/dbg7.py << 'EOF'
import torch, reforacle as R
# Study p=1.0 rule: for each row print sorted cumsum and which sorted positions removed
cnt=0
for seed in range(0,60):
torch.manual_seed(seed)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,25,(1,)).item()
for scale in [4]:
logits=torch.randn(B,V)*scale
ref=R.top_p_filter(logits,1.0)
for r in range(B):
sl,si=torch.sort(logits[r],descending=True)
cum=torch.softmax(sl,-1).cumsum(-1)
removed_sorted=torch.isinf(ref[r]).gather(0,si)
if removed_sorted.any():
cnt+=1
if cnt<=12:
print("removed sorted pos:",torch.nonzero(removed_sorted).flatten().tolist(),
"/",V)
# print cum around removal
print(" cum:",[round(x,8) for x in cum.tolist()])
EOF
python3 /app/dbg7.py; rm -f /app/dbg7.pyremoved sorted pos: [15, 16, 17] / 18 cum: [0.99862373, 0.99900562, 0.99932396, 0.99962693, 0.99975544, 0.99980325, 0.99984515, 0.99988538, 0.99991697, 0.99994349, 0.99996459, 0.99997878, 0.99999136, 0.99999994, 1.0, 1.00000012, 1.00000012, 1.00000012] removed sorted pos: [17] / 18 cum: [0.59770721, 0.92173451, 0.96709383, 0.98605943, 0.99633229, 0.99809486, 0.99864763, 0.99907267, 0.99941707, 0.99971473, 0.99982733, 0.99989259, 0.99995619, 0.99999344, 0.99999803, 0.99999923, 1.0, 1.00000012] removed sorted pos: [22] / 23 cum: [0.92442656, 0.99108195, 0.99540609, 0.99727297, 0.998667, 0.99936491, 0.99963093, 0.99981982, 0.99987453, 0.9999091, 0.99994212, 0.99996573, 0.99997556, 0.99998391, 0.99999058, 0.99999398, 0.99999696, 0.99999833, 0.99999905, 0.99999952, 0.99999994, 1.0, 1.0] removed sorted pos: [17] / 18 cum: [0.86732215, 0.93212104, 0.96830487, 0.98349851, 0.98900729, 0.99441886, 0.99958605, 0.9997443, 0.99984777, 0.99991429, 0.99996203, 0.99997699, 0.99998659, 0.99999595, 0.9999975, 0.99999881, 1.0, 1.00000012] removed sorted pos: [21] / 22 cum: [0.80086476, 0.9000122, 0.94636762, 0.98142076, 0.98984993, 0.99473649, 0.99788737, 0.99917054, 0.99952114, 0.99979502, 0.99987727, 0.99994451, 0.99997145, 0.99998176, 0.99998772, 0.99999261, 0.99999714, 0.99999934, 0.99999958, 0.99999982, 1.0, 1.0] removed sorted pos: [21] / 22 cum: [0.50632638, 0.81230891, 0.92693299, 0.97667861, 0.98970658, 0.99518716, 0.99845243, 0.99903572, 0.99927461, 0.99946308, 0.99961829, 0.99975228, 0.99984783, 0.99992192, 0.99997312, 0.99998569, 0.9999913, 0.99999666, 0.99999857, 0.9999994, 1.0, 1.0] removed sorted pos: [17] / 18 cum: [0.60838068, 0.97816741, 0.99214774, 0.99834222, 0.99903619, 0.99959207, 0.99972492, 0.99981725, 0.99990392, 0.99996519, 0.99997962, 0.9999882, 0.99999344, 0.99999791, 0.99999923, 0.99999964, 1.0, 1.0] removed sorted pos: [16] / 17 cum: [0.99504024, 0.99854046, 0.99920022, 0.99955267, 0.99971396, 0.99980718, 0.99989724, 0.99994594, 0.99996853, 0.99999088, 0.99999458, 0.99999642, 0.99999774, 0.99999869, 0.99999958, 1.0, 1.0] removed sorted pos: [12] / 13 cum: [0.99236506, 0.99712992, 0.99828953, 0.99908298, 0.99956346, 0.99974012, 0.99984938, 0.99992794, 0.99997824, 0.99999398, 0.99999952, 1.0, 1.00000012] removed sorted pos: [23] / 24 cum: [0.62343627, 0.74874121, 0.8411622, 0.93263531, 0.95608348, 0.97485375, 0.99071944, 0.9938935, 0.99661714, 0.99768245, 0.99835259, 0.99894142, 0.99936467, 0.9995904, 0.99973357, 0.99987441, 0.99996078, 0.99997932, 0.99999654, 0.99999785, 0.99999917, 0.99999982, 1.0, 1.00000012] removed sorted pos: [20, 21] / 22 cum: [0.53464824, 0.85451722, 0.98858571, 0.99508655, 0.99663866, 0.99812853, 0.99901897, 0.99950635, 0.99978125, 0.99996197, 0.99997789, 0.99998575, 0.99999005, 0.99999422, 0.99999589, 0.99999738, 0.99999869, 0.99999923, 0.99999958, 0.99999994, 1.00000012, 1.00000012] removed sorted pos: [11, 12, 13, 14] / 15 cum: [0.87211514, 0.99971843, 0.99987495, 0.99996495, 0.99998021, 0.99998766, 0.99999338, 0.99999762, 0.99999964, 0.99999988, 0.99999994, 1.0, 1.0, 1.0, 1.0] [stdout] removed sorted pos: [15, 16, 17] / 18 cum: [0.99862373, 0.99900562, 0.99932396, 0.99962693, 0.99975544, 0.99980325, 0.99984515, 0.99988538, 0.99991697, 0.99994349, 0.99996459, 0.99997878, 0.99999136, 0.99999994, 1.0, 1.00000012, 1.00000012, 1.00000012] removed sorted pos: [17] / 18 cum: [0.59770721, 0.92173451, 0.96709383, 0.98605943, 0.99633229, 0.99809486, 0.99864763, 0.99907267, 0.99941707, 0.99971473, 0.99982733, 0.99989259, 0.99995619, 0.99999344, 0.99999803, 0.99999923, 1.0, 1.00000012] removed sorted pos: [22] / 23 cum: [0.92442656, 0.99108195, 0.99540609, 0.99727297, 0.998667, 0.99936491, 0.99963093, 0.99981982, 0.99987453, 0.9999091, 0.99994212, 0.99996573, 0.99997556, 0.99998391, 0.99999058, 0.99999398, 0.99999696, 0.99999833, 0.99999905, 0.99999952, 0.99999994, 1.0, 1.0] removed sorted pos: [17] / 18 cum: [0.86732215, 0.93212104, 0.96830487, 0.98349851, 0.98900729, 0.99441886, 0.99958605, 0.9997443, 0.99984777, 0.99991429, 0.99996203, 0.99997699, 0.99998659, 0.99999595, 0.9999975, 0.99999881, 1.0, 1.00000012] removed sorted pos: [21] / 22 cum: [0.80086476, 0.9000122, 0.94636762, 0.98142076, 0.98984993, 0.99473649, 0.99788737, 0.99917054, 0.99952114, 0.99979502, 0.99987727, 0.99994451, 0.99997145, 0.99998176, 0.99998772, 0.99999261, 0.99999714, 0.99999934, 0.99999958, 0.99999982, 1.0, 1.0] removed sorted pos: [21] / 22 cum: [0.50632638, 0.81230891, 0.92693299, 0.97667861, 0.98970658, 0.99518716, 0.99845243, 0.99903572, 0.99927461, 0.99946308, 0.99961829, 0.99975228, 0.99984783, 0.99992192, 0.99997312, 0.99998569, 0.9999913, 0.99999666, 0.99999857, 0.9999994, 1.0, 1.0] removed sorted pos: [17] / 18 cum: [0.60838068, 0.97816741, 0.99214774, 0.99834222, 0.99903619, 0.99959207, 0.99972492, 0.99981725, 0.99990392, 0.99996519, 0.99997962, 0.9999882, 0.99999344, 0.99999791, 0.99999923, 0.99999964, 1.0, 1.0] removed sorted pos: [16] / 17 cum: [0.99504024, 0.99854046, 0.99920022, 0.99955267, 0.99971396, 0.99980718, 0.99989724, 0.99994594, 0.99996853, 0.99999088, 0.99999458, 0.99999642, 0.99999774, 0.99999869, 0.99999958, 1.0, 1.0] removed sorted pos: [12] / 13 cum: [0.99236506, 0.99712992, 0.99828953, 0.99908298, 0.99956346, 0.99974012, 0.99984938, 0.99992794, 0.99997824, 0.99999398, 0.99999952, 1.0, 1.00000012] removed sorted pos: [23] / 24 cum: [0.62343627, 0.74874121, 0.8411622, 0.93263531, 0.95608348, 0.97485375, 0.99071944, 0.9938935, 0.99661714, 0.99768245, 0.99835259, 0.99894142, 0.99936467, 0.9995904, 0.99973357, 0.99987441, 0.99996078, 0.99997932, 0.99999654, 0.99999785, 0.99999917, 0.99999982, 1.0, 1.00000012] removed sorted pos: [20, 21] / 22 cum: [0.53464824, 0.85451722, 0.98858571, 0.99508655, 0.99663866, 0.99812853, 0.99901897, 0.99950635, 0.99978125, 0.99996197, 0.99997789, 0.99998575, 0.99999005, 0.99999422, 0.99999589, 0.99999738, 0.99999869, 0.99999923, 0.99999958, 0.99999994, 1.00000012, 1.00000012] removed sorted pos: [11, 12, 13, 14] / 15 cum: [0.87211514, 0.99971843, 0.99987495, 0.99996495, 0.99998021, 0.99998766, 0.99999338, 0.99999762, 0.99999964, 0.99999988, 0.99999994, 1.0, 1.0, 1.0, 1.0]
Search cumsum recipe for exact top_p match
cat > /app/dbg8.py << 'EOF'
import torch, reforacle as R
def make(cumfn, cmp):
def f(logits,p):
sl,si=torch.sort(logits,descending=True,dim=-1)
cum=cumfn(sl)
rem = cum>=p if cmp=='>=' else cum>p
rem[...,1:]=rem[...,:-1].clone(); rem[...,0]=False
return logits.masked_fill(torch.zeros_like(rem).scatter(-1,si,rem),float('-inf'))
return f
cumfns={
'softmax_cumsum': lambda sl: torch.softmax(sl,-1).cumsum(-1),
'exp_logsoftmax': lambda sl: torch.exp(torch.log_softmax(sl,-1)).cumsum(-1),
'double': lambda sl: torch.softmax(sl.double(),-1).cumsum(-1).float(),
'onemin_revcum': lambda sl: (1 - torch.flip(torch.flip(torch.softmax(sl,-1),[-1]).cumsum(-1),[-1]) + torch.softmax(sl,-1)),
}
cands={}
for cn,cf in cumfns.items():
for cmp in ['>','>=']:
cands[f'{cn}|{cmp}']=make(cf,cmp)
score={k:0 for k in cands}; tot=0; fails={k:[] for k in cands}
for seed in range(0,150):
torch.manual_seed(seed)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,25,(1,)).item()
for scale in [1,2,4]:
logits=torch.randn(B,V)*scale
for p in [0.0,0.3,0.5,0.7,0.85,0.9,0.95,0.99,1.0]:
ref=R.top_p_filter(logits,p); tot+=1
for k,f in cands.items():
if torch.allclose(f(logits,p).float(),ref.float(),atol=1e-6,equal_nan=True): score[k]+=1
elif len(fails[k])<3: fails[k].append((seed,scale,p))
print("tot",tot)
for k,v in sorted(score.items(),key=lambda x:-x[1]): print(f"{v:5d} {k} {fails[k]}")
EOF
python3 /app/dbg8.py; rm -f /app/dbg8.pytot 4050 4035 softmax_cumsum|>= [(11, 4, 1.0), (17, 4, 1.0), (19, 4, 1.0)] 4033 exp_logsoftmax|>= [(7, 4, 1.0), (11, 4, 1.0), (17, 4, 1.0)] 4011 softmax_cumsum|> [(6, 4, 1.0), (7, 4, 1.0), (9, 4, 1.0)] 4010 exp_logsoftmax|> [(6, 4, 1.0), (9, 4, 1.0), (11, 4, 1.0)] 4009 double|>= [(7, 4, 1.0), (8, 4, 1.0), (18, 4, 1.0)] 4007 onemin_revcum|>= [(7, 4, 1.0), (18, 4, 1.0), (19, 4, 1.0)] 4003 double|> [(6, 4, 1.0), (7, 4, 1.0), (9, 4, 1.0)] 4003 onemin_revcum|> [(6, 4, 1.0), (7, 4, 1.0), (9, 4, 1.0)] [stdout] tot 4050 4035 softmax_cumsum|>= [(11, 4, 1.0), (17, 4, 1.0), (19, 4, 1.0)] 4033 exp_logsoftmax|>= [(7, 4, 1.0), (11, 4, 1.0), (17, 4, 1.0)] 4011 softmax_cumsum|> [(6, 4, 1.0), (7, 4, 1.0), (9, 4, 1.0)] 4010 exp_logsoftmax|> [(6, 4, 1.0), (9, 4, 1.0), (11, 4, 1.0)] 4009 double|>= [(7, 4, 1.0), (8, 4, 1.0), (18, 4, 1.0)] 4007 onemin_revcum|>= [(7, 4, 1.0), (18, 4, 1.0), (19, 4, 1.0)] 4003 double|> [(6, 4, 1.0), (7, 4, 1.0), (9, 4, 1.0)] 4003 onemin_revcum|> [(6, 4, 1.0), (7, 4, 1.0), (9, 4, 1.0)]
/app/objectives.py
cum = probs.cumsum(dim=-1)
remove = cum > p
remove[..., 1:] = remove[..., :-1].clone() cum = probs.cumsum(dim=-1)
remove = cum >= p
remove[..., 1:] = remove[..., :-1].clone()Match cumsum recipe to reference p=1.0 boundary
cat > /app/dbg9.py << 'EOF'
import torch, reforacle as R
# For p=1.0, compute reference's first-removed sorted position -> f = firstremoved-1 = first index with cum>=1.0
# Test which cum recipe reproduces f for ALL rows.
recipes={
'sm_cumsum': lambda sl: torch.softmax(sl,-1).cumsum(-1),
'exp_lsm': lambda sl: torch.exp(torch.log_softmax(sl,-1)).cumsum(-1),
'double': lambda sl: torch.softmax(sl.double(),-1).cumsum(-1),
'double_exp': lambda sl: torch.exp(torch.log_softmax(sl.double(),-1)).cumsum(-1),
}
match={k:0 for k in recipes}; total=0
for seed in range(0,300):
torch.manual_seed(seed)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,25,(1,)).item()
for scale in [1,2,3,4,5]:
logits=torch.randn(B,V)*scale
ref=R.top_p_filter(logits,1.0)
for r in range(B):
sl,si=torch.sort(logits[r],descending=True)
rem_sorted=torch.isinf(ref[r]).gather(0,si)
nz=torch.nonzero(rem_sorted).flatten()
f_ref = (nz[0].item()-1) if len(nz)>0 else (len(sl)-1) # last kept index
total+=1
for k,rec in recipes.items():
cum=rec(sl)
ge=(cum>=1.0)
fidx = torch.nonzero(ge).flatten()
f_rec = fidx[0].item() if len(fidx)>0 else len(sl)-1
if f_rec==f_ref: match[k]+=1
print("total rows",total)
for k,v in sorted(match.items(),key=lambda x:-x[1]): print(f"{v}/{total} {k}")
EOF
python3 /app/dbg9.py; rm -f /app/dbg9.pytotal rows 3775 3678/3775 sm_cumsum 3641/3775 exp_lsm 3457/3775 double 3457/3775 double_exp [stdout] total rows 3775 3678/3775 sm_cumsum 3641/3775 exp_lsm 3457/3775 double 3457/3775 double_exp
Test softmax ordering recipes for boundary
cat > /app/dbg10.py << 'EOF'
import torch, reforacle as R
def boundary_ref(logits_r):
ref=R.top_p_filter(logits_r.unsqueeze(0),1.0)[0]
sl,si=torch.sort(logits_r,descending=True)
rem=torch.isinf(ref).gather(0,si)
nz=torch.nonzero(rem).flatten()
return (nz[0].item()-1) if len(nz)>0 else (len(sl)-1), sl, si
def r_sm_sortlogits(sl, logits_r, si): return torch.softmax(sl,-1).cumsum(-1)
def r_sm_orig(sl, logits_r, si):
probs=torch.softmax(logits_r,-1); sp=probs.gather(0,si); return sp.cumsum(-1)
def r_sm_origsort(sl, logits_r, si):
probs=torch.softmax(logits_r,-1); sp,_=torch.sort(probs,descending=True); return sp.cumsum(-1)
def r_flip_asc(sl, logits_r, si):
sla,_=torch.sort(logits_r,descending=False)
p=torch.softmax(sla,-1); return torch.flip(1-torch.flip(p,[-1]).cumsum(-1),[-1])+torch.softmax(sl,-1)*0 + torch.flip(torch.flip(p,[-1]).cumsum(-1),[-1])
recipes={'sm_sortlogits':r_sm_sortlogits,'sm_orig':r_sm_orig,'sm_origsort':r_sm_origsort}
match={k:0 for k in recipes}; tot=0
for seed in range(0,300):
torch.manual_seed(seed)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,25,(1,)).item()
for scale in [1,2,3,4,5]:
logits=torch.randn(B,V)*scale
for r in range(B):
fref,sl,si=boundary_ref(logits[r]); tot+=1
for k,rec in recipes.items():
cum=rec(sl,logits[r],si)
fidx=torch.nonzero(cum>=1.0).flatten()
frec=fidx[0].item() if len(fidx)>0 else len(sl)-1
if frec==fref: match[k]+=1
print("tot",tot)
for k,v in sorted(match.items(),key=lambda x:-x[1]): print(f"{v}/{tot} {k}")
EOF
python3 /app/dbg10.py; rm -f /app/dbg10.pytot 3775 3678/3775 sm_sortlogits 3504/3775 sm_orig 3504/3775 sm_origsort [stdout] tot 3775 3678/3775 sm_sortlogits 3504/3775 sm_orig 3504/3775 sm_origsort
Match rate by logit scale at high p
cat > /app/dbg11.py << 'EOF'
import torch, reforacle as R, objectives as O
for scale in [0.5,1,1.5,2,3,5]:
tot=0; ok=0
for seed in range(0,400):
torch.manual_seed(seed*7+scale.__hash__()%3 if isinstance(scale,float) else seed)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,30,(1,)).item()
logits=torch.randn(B,V)*scale
for p in [1.0,0.999,0.9999]:
ref=R.top_p_filter(logits,p); mine=O.top_p_filter(logits,p); tot+=1
if torch.allclose(mine.float(),ref.float(),atol=1e-6,equal_nan=True): ok+=1
print(f"scale {scale}: {ok}/{tot}")
EOF
python3 /app/dbg11.py; rm -f /app/dbg11.pyscale 0.5: 1200/1200 scale 1: 1200/1200 scale 1.5: 1200/1200 scale 2: 1199/1200 scale 3: 1198/1200 scale 5: 1088/1200 [stdout] scale 0.5: 1200/1200 scale 1: 1200/1200 scale 1.5: 1200/1200 scale 2: 1199/1200 scale 3: 1198/1200 scale 5: 1088/1200
Re-run extended verification with realistic scale-1 logits
cat > /app/verify2.py << 'EOF'
import torch, reforacle as R
import objectives as O
from collections import Counter
fails=[]
def chk(name,a,b):
if isinstance(b,torch.Tensor):
if a.shape!=b.shape: fails.append((name,'shape',a.shape,b.shape));return
if a.dtype!=b.dtype: fails.append((name,'dtype',a.dtype,b.dtype));return
if not torch.allclose(a.float(),b.float(),atol=1e-5,rtol=1e-4,equal_nan=True):
fails.append((name,'val',a.flatten()[:6].tolist(),b.flatten()[:6].tolist()))
else:
if a!=b: fails.append((name,a,b))
for seed in range(300,360):
torch.manual_seed(seed)
B=torch.randint(1,6,(1,)).item(); V=torch.randint(2,20,(1,)).item(); T=torch.randint(1,12,(1,)).item()
logits=torch.randn(B,V) # scale 1 (realistic)
chk('greedy',O.greedy_token(logits),R.greedy_token(logits))
for t in [0.0,0.1,0.7,3.0]: chk('temp',O.temperature_scale(logits,t),R.temperature_scale(logits,t))
for k in [1,V//2+1,V]: chk('topk',O.top_k_filter(logits,k),R.top_k_filter(logits,k))
for p in [0.01,0.4,0.85,0.95,1.0]:
chk('topp',O.top_p_filter(logits,p),R.top_p_filter(logits,p))
chk('minp',O.min_p_filter(logits,p),R.min_p_filter(logits,p))
chk('eps',O.epsilon_filter(logits,p),R.epsilon_filter(logits,p))
pad=torch.randint(0,V,(1,)).item()
ids=torch.randint(0,V,(B,T))
for pen in [0.7,1.0,1.3]: chk('rep',O.repetition_penalty(logits,ids,pen),R.repetition_penalty(logits,ids,pen))
for pen in [0.3,1.1]:
chk('freq',O.frequency_penalty(logits,ids,pen),R.frequency_penalty(logits,ids,pen))
chk('pres',O.presence_penalty(logits,ids,pen),R.presence_penalty(logits,ids,pen))
chk('attn',O.attention_mask(ids,pad),R.attention_mask(ids,pad))
chk('pos',O.position_ids(ids,pad),R.position_ids(ids,pad))
chk('causal',O.causal_mask(T),R.causal_mask(T))
chk('seqlen',O.sequence_lengths(ids,pad),R.sequence_lengths(ids,pad))
am=R.attention_mask(ids,pad)
chk('last',O.last_token_indices(am),R.last_token_indices(am))
l3=torch.randn(B,T,V)
chk('gather',O.gather_last_logits(l3,am),R.gather_last_logits(l3,am))
chk('rollout',O.rollout_last_logits(l3,ids,pad),R.rollout_last_logits(l3,ids,pad))
chk('shift',O.shift_labels(ids,-100),R.shift_labels(ids,-100))
pls=torch.randint(0,T+1,(B,))
chk('comp',O.completion_loss_labels(ids,pls,-100),R.completion_loss_labels(ids,pls,-100))
chk('prep',O.prepare_labels(ids,pls,-100),R.prepare_labels(ids,pls,-100))
chk('maskeos',O.mask_after_eos(ids,pad),R.mask_after_eos(ids,pad))
for ml in [0,1,T,T+5]: chk('genstop',O.generation_stop_mask(ids,pad,ml),R.generation_stop_mask(ids,pad,ml))
for ml in [1,T//2+1,T+2]: chk('trunc',O.truncate_left(ids,ml),R.truncate_left(ids,ml))
for m in [1,3,5]: chk('padmult',O.pad_to_multiple(ids,pad,m),R.pad_to_multiple(ids,pad,m))
for w in [1,T,T+4]: chk('rpad',O.right_pad_to(ids,pad,w),R.right_pad_to(ids,pad,w))
acts=torch.randint(0,V,(B,T))
chk('actlp',O.action_logprobs(l3,acts),R.action_logprobs(l3,acts))
chk('ent',O.entropy_from_logits(logits),R.entropy_from_logits(logits))
rew=torch.randn(B,T); msk=(torch.rand(B,T)>0.4).float()
chk('rtg',O.reward_to_go(rew,msk),R.reward_to_go(rew,msk))
for g in [0.0,0.7,1.0]:
chk('disc',O.discount_cumsum(rew,g),R.discount_cumsum(rew,g))
chk('disc1d',O.discount_cumsum(rew[0],g),R.discount_cumsum(rew[0],g))
sl=torch.randint(1,5,(B,)); tot=int(sl.sum())+torch.randint(0,4,(1,)).item()
chk('bpos',O.build_position_ids_packed(sl,tot),R.build_position_ids_packed(sl,tot))
for t in [0.3,1.0,2.5]:
for kk in [1,V]:
for pp in [0.5,0.9,1.0]:
chk('warp',O.logits_warper(logits,t,kk,pp),R.logits_warper(logits,t,kk,pp))
chk('sgw',O.sample_greedy_warped(logits,t,kk,pp),R.sample_greedy_warped(logits,t,kk,pp))
stops=torch.randint(0,V,(3,)).unique()
chk('fstop',O.first_stop_index(ids,stops),R.first_stop_index(ids,stops))
m2=(torch.rand(B,V)>0.4).float(); m2[:,0]=1.0
chk('margmax',O.masked_argmax(logits,m2),R.masked_argmax(logits,m2))
for k in [1,V//2+1,V]: chk('tkidx',O.topk_indices(logits,k),R.topk_indices(logits,k))
c=Counter(f[0] for f in fails)
print("fails:",len(fails), dict(c))
for f in fails[:15]: print(f)
EOF
python3 /app/verify2.py; rm -f /app/verify2.pyfails: 1 {'warp': 1}
('warp', 'val', [-3.2521607875823975, -4.165002822875977, 2.896406412124634, -0.6721125245094299, 1.4978793859481812, 2.725703001022339], [-3.2521607875823975, -4.165002822875977, 2.896406412124634, -0.6721125245094299, 1.4978793859481812, 2.725703001022339])
[stdout]
fails: 1 {'warp': 1}
('warp', 'val', [-3.2521607875823975, -4.165002822875977, 2.896406412124634, -0.6721125245094299, 1.4978793859481812, 2.725703001022339], [-3.2521607875823975, -4.165002822875977, 2.896406412124634, -0.6721125245094299, 1.4978793859481812, 2.725703001022339])Test exclusive-cumsum top_p recipe
cat > /app/dbg12.py << 'EOF'
import torch, reforacle as R
def rec(logits,p,cmp,excl):
sl,si=torch.sort(logits,descending=True,dim=-1)
probs=torch.softmax(sl,-1); cum=probs.cumsum(-1)
base = cum-probs if excl else cum
rem = base>=p if cmp=='>=' else base>p
if not excl:
rem[...,1:]=rem[...,:-1].clone(); rem[...,0]=False
return logits.masked_fill(torch.zeros_like(rem).scatter(-1,si,rem),float('-inf'))
cands={'excl>=':lambda l,p:rec(l,p,'>=',True),'excl>':lambda l,p:rec(l,p,'>',True),
'shift>=':lambda l,p:rec(l,p,'>=',False)}
score={k:0 for k in cands}; tot=0; fx={k:[] for k in cands}
for seed in range(0,300):
torch.manual_seed(seed)
B=torch.randint(1,5,(1,)).item(); V=torch.randint(2,30,(1,)).item()
for scale in [1,2,3,4,5,8]:
logits=torch.randn(B,V)*scale
for p in [0.0,0.3,0.5,0.7,0.85,0.9,0.95,0.99,1.0]:
ref=R.top_p_filter(logits,p); tot+=1
for k,f in cands.items():
if torch.allclose(f(logits,p).float(),ref.float(),atol=1e-6,equal_nan=True): score[k]+=1
elif len(fx[k])<4: fx[k].append((seed,scale,p))
print("tot",tot)
for k,v in sorted(score.items(),key=lambda x:-x[1]): print(f"{v} {k} {fx[k]}")
EOF
python3 /app/dbg12.py; rm -f /app/dbg12.pytot 16200 15962 shift>= [(3, 5, 1.0), (3, 8, 1.0), (5, 4, 1.0), (5, 5, 1.0)] 15751 excl> [(0, 8, 1.0), (3, 5, 1.0), (3, 8, 1.0), (4, 8, 1.0)] 14400 excl>= [(0, 1, 0.0), (0, 2, 0.0), (0, 3, 0.0), (0, 4, 0.0)] [stdout] tot 16200 15962 shift>= [(3, 5, 1.0), (3, 8, 1.0), (5, 4, 1.0), (5, 5, 1.0)] 15751 excl> [(0, 8, 1.0), (3, 5, 1.0), (3, 8, 1.0), (4, 8, 1.0)] 14400 excl>= [(0, 1, 0.0), (0, 2, 0.0), (0, 3, 0.0), (0, 4, 0.0)]
Final comprehensive check of all 37 functions
cat > /app/finalcheck.py << 'EOF'
import torch, reforacle as R, objectives as O, inspect
funcs=[n for n,f in inspect.getmembers(O,inspect.isfunction) if not n.startswith('_')]
# confirm all reference funcs implemented (no NotImplementedError)
stub=[]
for n in dir(R):
if n.startswith('_') or n in ('torch','F','NEG_INF'): continue
if not hasattr(O,n): stub.append(('missing',n))
print("missing:",stub)
from collections import Counter
fails=Counter()
for seed in range(1000,1120):
torch.manual_seed(seed)
B=torch.randint(1,7,(1,)).item(); V=torch.randint(2,40,(1,)).item(); T=torch.randint(1,15,(1,)).item()
logits=torch.randn(B,V)
def ck(n,a,b):
if isinstance(b,torch.Tensor):
if a.shape!=b.shape or a.dtype!=b.dtype or not torch.allclose(a.float(),b.float(),atol=1e-5,rtol=1e-4,equal_nan=True): fails[n]+=1
elif a!=b: fails[n]+=1
ck('greedy_token',O.greedy_token(logits),R.greedy_token(logits))
for t in [0.0,0.2,0.6,1.0,2.0]: ck('temperature_scale',O.temperature_scale(logits,t),R.temperature_scale(logits,t))
for k in [1,2,V//2+1,V]: ck('top_k_filter',O.top_k_filter(logits,k),R.top_k_filter(logits,k))
for p in [0.0,0.2,0.5,0.8,0.9,0.95]:
ck('top_p_filter',O.top_p_filter(logits,p),R.top_p_filter(logits,p))
ck('min_p_filter',O.min_p_filter(logits,p),R.min_p_filter(logits,p))
ck('epsilon_filter',O.epsilon_filter(logits,p),R.epsilon_filter(logits,p))
pad=torch.randint(0,V,(1,)).item(); ids=torch.randint(0,V,(B,T))
for pn in [0.6,0.9,1.0,1.4]: ck('repetition_penalty',O.repetition_penalty(logits,ids,pn),R.repetition_penalty(logits,ids,pn))
for pn in [0.0,0.4,1.2]:
ck('frequency_penalty',O.frequency_penalty(logits,ids,pn),R.frequency_penalty(logits,ids,pn))
ck('presence_penalty',O.presence_penalty(logits,ids,pn),R.presence_penalty(logits,ids,pn))
tk=torch.randint(0,V,(3,)).unique()
ck('suppress_tokens',O.suppress_tokens(logits,tk),R.suppress_tokens(logits,tk))
ck('suppress_tokens',O.suppress_tokens(logits,tk.tolist()),R.suppress_tokens(logits,tk.tolist()))
for cur in [0,3,7,20]: ck('min_length_filter',O.min_length_filter(logits,cur,5,0),R.min_length_filter(logits,cur,5,0))
ck('renormalize_logits',O.renormalize_logits(logits),R.renormalize_logits(logits))
ck('attention_mask',O.attention_mask(ids,pad),R.attention_mask(ids,pad))
ck('position_ids',O.position_ids(ids,pad),R.position_ids(ids,pad))
ck('causal_mask',O.causal_mask(T),R.causal_mask(T))
ck('sequence_lengths',O.sequence_lengths(ids,pad),R.sequence_lengths(ids,pad))
am=R.attention_mask(ids,pad); ck('last_token_indices',O.last_token_indices(am),R.last_token_indices(am))
l3=torch.randn(B,T,V)
ck('gather_last_logits',O.gather_last_logits(l3,am),R.gather_last_logits(l3,am))
ck('rollout_last_logits',O.rollout_last_logits(l3,ids,pad),R.rollout_last_logits(l3,ids,pad))
ck('shift_labels',O.shift_labels(ids,-100),R.shift_labels(ids,-100))
pls=torch.randint(0,T+1,(B,))
ck('completion_loss_labels',O.completion_loss_labels(ids,pls,-100),R.completion_loss_labels(ids,pls,-100))
ck('prepare_labels',O.prepare_labels(ids,pls,-100),R.prepare_labels(ids,pls,-100))
ck('mask_after_eos',O.mask_after_eos(ids,pad),R.mask_after_eos(ids,pad))
for ml in [0,1,3,T,T+5]: ck('generation_stop_mask',O.generation_stop_mask(ids,pad,ml),R.generation_stop_mask(ids,pad,ml))
for ml in [1,3,T,T+3]: ck('truncate_left',O.truncate_left(ids,ml),R.truncate_left(ids,ml))
for m in [1,2,4,8]: ck('pad_to_multiple',O.pad_to_multiple(ids,pad,m),R.pad_to_multiple(ids,pad,m))
for w in [1,T,T+5]: ck('right_pad_to',O.right_pad_to(ids,pad,w),R.right_pad_to(ids,pad,w))
acts=torch.randint(0,V,(B,T)); ck('action_logprobs',O.action_logprobs(l3,acts),R.action_logprobs(l3,acts))
ck('entropy_from_logits',O.entropy_from_logits(logits),R.entropy_from_logits(logits))
rew=torch.randn(B,T); msk=(torch.rand(B,T)>0.4).float()
ck('reward_to_go',O.reward_to_go(rew,msk),R.reward_to_go(rew,msk))
for g in [0.0,0.5,0.9,0.99,1.0]:
ck('discount_cumsum',O.discount_cumsum(rew,g),R.discount_cumsum(rew,g))
ck('discount_cumsum',O.discount_cumsum(rew[0],g),R.discount_cumsum(rew[0],g))
slens=torch.randint(1,6,(B,)); tot=int(slens.sum())+torch.randint(0,5,(1,)).item()
ck('build_position_ids_packed',O.build_position_ids_packed(slens,tot),R.build_position_ids_packed(slens,tot))
for t in [0.5,1.0,2.0]:
for kk in [1,3,V]:
for pp in [0.5,0.9]:
ck('logits_warper',O.logits_warper(logits,t,kk,pp),R.logits_warper(logits,t,kk,pp))
ck('sample_greedy_warped',O.sample_greedy_warped(logits,t,kk,pp),R.sample_greedy_warped(logits,t,kk,pp))
stops=torch.randint(0,V,(4,)).unique(); ck('first_stop_index',O.first_stop_index(ids,stops),R.first_stop_index(ids,stops))
m2=(torch.rand(B,V)>0.4).float(); m2[:,0]=1.0
ck('masked_argmax',O.masked_argmax(logits,m2),R.masked_argmax(logits,m2))
for k in [1,3,V]: ck('topk_indices',O.topk_indices(logits,k),R.topk_indices(logits,k))
print("total functions tested:", len(set(['greedy_token','temperature_scale','top_k_filter','top_p_filter','min_p_filter','repetition_penalty','frequency_penalty','presence_penalty','suppress_tokens','min_length_filter','renormalize_logits','attention_mask','position_ids','causal_mask','shift_labels','completion_loss_labels','mask_after_eos','sequence_lengths','last_token_indices','gather_last_logits','truncate_left','pad_to_multiple','action_logprobs','entropy_from_logits','reward_to_go','discount_cumsum','build_position_ids_packed','logits_warper','sample_greedy_warped','prepare_labels','rollout_last_logits','epsilon_filter','first_stop_index','masked_argmax','topk_indices','right_pad_to','generation_stop_mask'])))
print("FAILS:", dict(fails) if fails else "NONE")
EOF
python3 /app/finalcheck.py; rm -f /app/finalcheck.pymissing: []
Traceback (most recent call last):
File "/app/finalcheck.py", line 70, in <module>
for k in [1,3,V]: ck('topk_indices',O.topk_indices(logits,k),R.topk_indices(logits,k))
^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/objectives.py", line 245, in topk_indices
return torch.topk(logits, k, dim=-1).indices
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: selected index k out of range
[stdout]
missing: []
Traceback (most recent call last):
File "/app/finalcheck.py", line 70, in <module>
for k in [1,3,V]: ck('topk_indices',O.topk_indices(logits,k),R.topk_indices(logits,k))
^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/objectives.py", line 245, in topk_indices
return torch.topk(logits, k, dim=-1).indices
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: selected index k out of rangeFinal check all 37 functions, realistic scale
sed -e 's/for k in \[1,2,V\/\/2+1,V\]/for k in [x for x in [1,2,V\/\/2+1,V] if x<=V]/' -e 's/for k in \[1,3,V\]/for k in [x for x in [1,3,V] if x<=V]/g' finalcheck.py > /tmp/fc.py 2>/dev/null; cat > /app/finalcheck.py << 'PYEOF'
import torch, reforacle as R, objectives as O
from collections import Counter
fails=Counter()
for seed in range(1000,1130):
torch.manual_seed(seed)
B=torch.randint(1,7,(1,)).item(); V=torch.randint(2,40,(1,)).item(); T=torch.randint(1,15,(1,)).item()
logits=torch.randn(B,V)
def ck(n,a,b):
if isinstance(b,torch.Tensor):
if a.shape!=b.shape or a.dtype!=b.dtype or not torch.allclose(a.float(),b.float(),atol=1e-5,rtol=1e-4,equal_nan=True): fails[n]+=1
elif a!=b: fails[n]+=1
ck('greedy_token',O.greedy_token(logits),R.greedy_token(logits))
for t in [0.0,0.2,0.6,1.0,2.0]: ck('temperature_scale',O.temperature_scale(logits,t),R.temperature_scale(logits,t))
for k in [x for x in [1,2,V//2+1,V] if 1<=x<=V]: ck('top_k_filter',O.top_k_filter(logits,k),R.top_k_filter(logits,k))
for p in [0.0,0.2,0.5,0.8,0.9,0.95]:
ck('top_p_filter',O.top_p_filter(logits,p),R.top_p_filter(logits,p))
ck('min_p_filter',O.min_p_filter(logits,p),R.min_p_filter(logits,p))
ck('epsilon_filter',O.epsilon_filter(logits,p),R.epsilon_filter(logits,p))
pad=torch.randint(0,V,(1,)).item(); ids=torch.randint(0,V,(B,T))
for pn in [0.6,0.9,1.0,1.4]: ck('repetition_penalty',O.repetition_penalty(logits,ids,pn),R.repetition_penalty(logits,ids,pn))
for pn in [0.0,0.4,1.2]:
ck('frequency_penalty',O.frequency_penalty(logits,ids,pn),R.frequency_penalty(logits,ids,pn))
ck('presence_penalty',O.presence_penalty(logits,ids,pn),R.presence_penalty(logits,ids,pn))
tk=torch.randint(0,V,(3,)).unique()
ck('suppress_tokens',O.suppress_tokens(logits,tk),R.suppress_tokens(logits,tk))
for cur in [0,3,7,20]: ck('min_length_filter',O.min_length_filter(logits,cur,5,0),R.min_length_filter(logits,cur,5,0))
ck('renormalize_logits',O.renormalize_logits(logits),R.renormalize_logits(logits))
ck('attention_mask',O.attention_mask(ids,pad),R.attention_mask(ids,pad))
ck('position_ids',O.position_ids(ids,pad),R.position_ids(ids,pad))
ck('causal_mask',O.causal_mask(T),R.causal_mask(T))
ck('sequence_lengths',O.sequence_lengths(ids,pad),R.sequence_lengths(ids,pad))
am=R.attention_mask(ids,pad); ck('last_token_indices',O.last_token_indices(am),R.last_token_indices(am))
l3=torch.randn(B,T,V)
ck('gather_last_logits',O.gather_last_logits(l3,am),R.gather_last_logits(l3,am))
ck('rollout_last_logits',O.rollout_last_logits(l3,ids,pad),R.rollout_last_logits(l3,ids,pad))
ck('shift_labels',O.shift_labels(ids,-100),R.shift_labels(ids,-100))
pls=torch.randint(0,T+1,(B,))
ck('completion_loss_labels',O.completion_loss_labels(ids,pls,-100),R.completion_loss_labels(ids,pls,-100))
ck('prepare_labels',O.prepare_labels(ids,pls,-100),R.prepare_labels(ids,pls,-100))
ck('mask_after_eos',O.mask_after_eos(ids,pad),R.mask_after_eos(ids,pad))
for ml in [0,1,3,T,T+5]: ck('generation_stop_mask',O.generation_stop_mask(ids,pad,ml),R.generation_stop_mask(ids,pad,ml))
for ml in [1,3,T,T+3]: ck('truncate_left',O.truncate_left(ids,ml),R.truncate_left(ids,ml))
for m in [1,2,4,8]: ck('pad_to_multiple',O.pad_to_multiple(ids,pad,m),R.pad_to_multiple(ids,pad,m))
for w in [1,T,T+5]: ck('right_pad_to',O.right_pad_to(ids,pad,w),R.right_pad_to(ids,pad,w))
acts=torch.randint(0,V,(B,T)); ck('action_logprobs',O.action_logprobs(l3,acts),R.action_logprobs(l3,acts))
ck('entropy_from_logits',O.entropy_from_logits(logits),R.entropy_from_logits(logits))
rew=torch.randn(B,T); msk=(torch.rand(B,T)>0.4).float()
ck('reward_to_go',O.reward_to_go(rew,msk),R.reward_to_go(rew,msk))
for g in [0.0,0.5,0.9,0.99,1.0]:
ck('discount_cumsum',O.discount_cumsum(rew,g),R.discount_cumsum(rew,g))
ck('discount_cumsum',O.discount_cumsum(rew[0],g),R.discount_cumsum(rew[0],g))
slens=torch.randint(1,6,(B,)); tot=int(slens.sum())+torch.randint(0,5,(1,)).item()
ck('build_position_ids_packed',O.build_position_ids_packed(slens,tot),R.build_position_ids_packed(slens,tot))
for t in [0.5,1.0,2.0]:
for kk in [x for x in [1,3,V] if 1<=x<=V]:
for pp in [0.5,0.9]:
ck('logits_warper',O.logits_warper(logits,t,kk,pp),R.logits_warper(logits,t,kk,pp))
ck('sample_greedy_warped',O.sample_greedy_warped(logits,t,kk,pp),R.sample_greedy_warped(logits,t,kk,pp))
stops=torch.randint(0,V,(4,)).unique(); ck('first_stop_index',O.first_stop_index(ids,stops),R.first_stop_index(ids,stops))
m2=(torch.rand(B,V)>0.4).float(); m2[:,0]=1.0
ck('masked_argmax',O.masked_argmax(logits,m2),R.masked_argmax(logits,m2))
for k in [x for x in [1,3,V] if 1<=x<=V]: ck('topk_indices',O.topk_indices(logits,k),R.topk_indices(logits,k))
print("FAILS:", dict(fails) if fails else "NONE - ALL PASS")
PYEOF
python3 /app/finalcheck.py; rm -f /app/finalcheck.pyFAILS: NONE - ALL PASS [stdout] FAILS: NONE - ALL PASS
Confirm standalone, no reforacle, no stubs
cd /tmp && python3 -c "
import ast
src=open('/app/objectives.py').read()
assert 'reforacle' not in src, 'references reforacle!'
assert 'NotImplementedError' not in src, 'stub remains!'
t=ast.parse(src)
imports=[n.name for node in ast.walk(t) if isinstance(node,ast.Import) for n in node.names]
print('imports:', imports)
funcs=[n.name for n in t.body if isinstance(n,ast.FunctionDef)]
print('num functions:', len(funcs))
# import in isolated dir without reforacle
import sys; sys.path.insert(0,'/app');
import objectives
print('standalone import OK')
"; bash /app/timer.shimports: ['torch'] num functions: 37 standalone import OK Remaining time (hours:minutes): 1:41 Shell cwd was reset to /app [stdout] imports: ['torch'] num functions: 37 standalone import OK Remaining time (hours:minutes): 1:41 [stderr] Shell cwd was reset to /app
No file changes, the agent left the workspace untouched.
=== SyncVals verifier (post-training decoding/collation, sealed oracle) === FUNCTIONS PASSED: 31/37 (partial_score=0.8378) REWARD = 0 (1 iff ALL 37 functions match the sealed reference exactly) The agent probes a sealed compiled oracle (reforacle) to recover 37 decoding/sampling/collation conventions (logit processors, sampling filters, sequence collation, RLHF/SFT rollout helpers) and reimplements them in torch.
Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_42be4b9ff55e4636. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.
Trial trial_42be4b9ff55e4636 · verifier authoritative; classifier explanatory.