ferrotherm 0.28.0

Thermodynamic computing in pure Rust: sparse energy-based models, chromatic block-Gibbs, parallel tempering, thermodynamic linear algebra, stochastic differentiable programs, a variational compiler onto device topologies, exact inference by variable elimination, planted instances with known optima, sampler certificates, and a first-class joules ledger. std-only, zero dependencies, wasm-clean, deterministic by seed.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
�

�ۀj�H���dZddlZddlmcmZddlZddlZddl	m
Z
ddlZej�
dee
e�����j����ddlZd�Zd�Zd�Zd�Zd�Zd	�Zd
�Zd�Zd�Zd
�Zd�Zd�Zd�Z d�Z!d�Z"d�Z#d�Z$d�Z%d�Z&d�Z'd�Z(d�Z)d�Z*d�Z+d�Z,d�Z-d�Z.d�Z/d �Z0d!�Z1d"�Z2d#�Z3d$�Z4dS)%apTests for the modelling layer.

Run from the repository root, after `cargo build --release`:

    python3 -m pytest python/test_model.py -q

Each test names a way this layer can be wrong without looking wrong. Sampling is stochastic, so
nothing here asserts on a particular random draw: every assertion is about a property the answer
must have for any correct solver.
�N)�Pathc��	�tj���	�	fd�dD��}�	�|d|d���	�|d|d���	�|d|d���	���}|j}|s�tj|��dzdtj��vstj	|��rtj
|��ndtj
|��d�z}ttj|�����d}|d|d|dh}t|��}d	}||k}|s�tjd
|fd||f��dtj��vstj	t��rtj
t��ndtj
|��tj
|��tj
|��d
�z}tj|��dzd|iz}ttj|�����dx}x}x}}dS)Nc�>��i|]}|��|d����S����categorical��.0�n�ps  ��P/Users/dcharlot/vibe-coding/bmi-concept/research/ferrotherm/python/test_model.py�
<dictcomp>z7test_a_triangle_needs_three_colours.<locals>.<dictcomp>s)���D�D�D�A��A�M�M�!�Q���D�D�D�)�west�middle�eastrrr�.
>assert %(py2)s
{%(py2)s = %(py0)s.feasible
}�a��py0�py2r��==�z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)s�len�rr�py4�py7�
>assert %(py9)s�py9)�ft�Problem�	not_equal�solve�feasible�
@pytest_ar�_format_assertmsg�@py_builtins�locals�_should_repr_global_name�	_saferepr�AssertionError�_format_explanationr�_call_reprcompare)
�rr�@py_assert1�@py_format3�@py_assert3�@py_assert6�@py_assert5�@py_format8�@py_format10r
s
         @r�#test_a_triangle_needs_three_coloursr8sJ���
�
���A�D�D�D�D�)C�D�D�D�A��K�K��&�	�1�X�;�'�'�'��K�K��(��Q�v�Y�'�'�'��K�K��&�	�1�V�9�%�%�%�	���	�	�A��:��:����q��������������1������1�������:�������������������&�	�1�X�;��&�	�2�;�3�2�3�3�;�q�;�3�q�8�;�;�;�;�;�;�;�;�;�3�q�;�;�;�;�;�;�;�;�;�;�;�;�3�;�;�;�;�;�3�;�;�;�;�;�;�2�;�;�;�;�3�;�;�;�;�q�;�;�;�;�;�;�;�;�!�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;rc���tj��}|�ddd��}|�d|�d��z��|���d}d}||k}|slt
jd|fd||f��t
j|��t
j|��d�z}d	d
|iz}tt
j
|�����dx}x}}tj��}|�ddd��}tjtd�
��5|�|d��ddd��dS#1swxYwYdS)zSThe trap: a variable over 10..=20 holds 13 in its fourth slot. The literal says 13.�temperature�
���
r�z%(py1)s == %(py4)s��py1r�assert %(py6)s�py6Nztemperature.*10\.\.=20��matchr)r"r#�integer�maximize�is_r%r'r/r,r-r.�pytest�raises�
ValueError�fix�r
�t�@py_assert0r3�@py_assert2�@py_format5�@py_format7s       r�,test_an_integer_is_written_in_its_own_valuesrS!s���
�
���A�	�	�	�-��R�(�(�A��J�J�q�1�5�5��9�9�}�����7�7�9�9�]�#�)�r�)�#�r�)�)�)�)�)�)�)�)�)�)�#�r�)�)�)�)�)�#�)�)�)�)�r�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�
�
���A�	�	�	�-��R�(�(�A�	��z�)B�	C�	C�	C���	���a�������������������������s�1E�E�Ec��tj��}|�ddd��}|�|d��|���d}d}|}||k}|sltjd|fd||f��tj|��tj|��d�z}d	d
|iz}ttj	|�����dx}x}x}}dS)N�drifti����i����i�����r)z%(py1)s == -%(py4)sr@�assert %(py7)sr)
r"r#rFrLr%r'r/r,r-r.)r
�drOr3r5rP�@py_format6r6s        r�test_a_range_below_zero_worksrZ.s���
�
���A�	�	�	�'�3��$�$�A��E�E�!�S�M�M�M��7�7�9�9�W��$�"�$�"��$���$�$�$�$�$�$�$�$�$�$���$�$�$�$�$��$�$�$�$�"�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$rc�
�d�}d}d}|
}|||��}d}||k}|s�tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��tj|��tj|��d�z}tjd	��d
zd|iz}ttj|�����dx}x}x}x}x}}d}d}|}|||��}d
}||k}|s�tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��tj|��tj|��d�z}tjd��d
zd|iz}ttj|�����dx}x}x}x}x}}d}d}|}|||��}d}||k}|s�tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��tj|��tj|��d�z}tjd��d
zd|iz}ttj|�����dx}x}x}x}x}}d}d}|
}|||��}d}||k}|s�tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��tj|��tj|��d�z}tjd��d
zd|iz}ttj|�����dx}x}x}x}x}}d}d}|}|||��}d}||k}|s�tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��tj|��tj|��d�z}tjd��d
zd|iz}ttj|�����dx}x}x}x}x}}dS)aThe distinction an inequality exists for, in the only case that shows it.

    With every variable rewarded, `at most 2` and `exactly 2` agree. With every variable penalised,
    they do not: an inequality is satisfied by taking none, an equality is not.
    c�����tj����fd�td��D��}t�|��|d����t�fd�t
|��D������������j}|s�tj
���dzdtj��vstj
���rtj���ndtj|��d�z}ttj|�����d}t�fd�|D����S)	Nc�@��g|]}��d|������S��v��binary�r�ir
s  �r�
<listcomp>zRtest_at_most_is_a_ceiling_and_at_least_is_a_floor.<locals>.run.<locals>.<listcomp>=�+���
2�
2�
2�A�a�h�h�w�1�w�w���
2�
2�
2r��c3�Z�K�|]%\}}�d|z
z|�d��zV��&dS)rf�N�rH)rrcr_�signs   �r�	<genexpr>zQtest_at_most_is_a_ceiling_and_at_least_is_a_floor.<locals>.run.<locals>.<genexpr>?s>�����K�K�T�Q��t�q�1�u�~����a���0�K�K�K�K�K�Krrrrc3�6�K�|]}�|j�dV��dS�riN��name)rr_rs  �rrlzQtest_at_most_is_a_ceiling_and_at_least_is_a_floor.<locals>.run.<locals>.<genexpr>Bs.�����.�.��A�a�f�I�.�1�.�.�.�.�.�.r)r"r#�range�getattrrG�sum�	enumerater%r&r'r(r)r*r+r,r-r.)�kindrk�vsr1r2rr
s `   @@r�runz>test_at_most_is_a_ceiling_and_at_least_is_a_floor.<locals>.run;sF������J�L�L��
2�
2�
2�
2��q���
2�
2�
2�����4����Q����	�
�
�3�K�K�K�K�Y�r�]�]�K�K�K�K�K�L�L�L�
�G�G�I�I���z��z����1��������������q������q�������z�������������������.�.�.�.�b�.�.�.�.�.�.r�at_mostrirgr)z;%(py7)s
{%(py7)s = %(py0)s(%(py2)s, +%(py4)s)
} == %(py10)srw)rrrr�py10z0a ceiling binds against a reward pushing past it�
>assert %(py12)s�py12Nr)z;%(py7)s
{%(py7)s = %(py0)s(%(py2)s, -%(py4)s)
} == %(py10)szand is satisfied by taking none�exactlyz'where an equality still has to take two�at_leastrfz#a floor does not forbid taking morez+and holds against a reward pushing below it�	r'r/r)r*r+r,r(r-r.)	rwr1r3r5r4�@py_assert9�@py_assert8�@py_format11�@py_format13s	         r�1test_at_most_is_a_ceiling_and_at_least_is_a_floorr�5s@��/�/�/��V�1�V�1�"�V�3�3�y�"���V��V���"�V�V�V�V�V�V�V�V�V���V�V�V�V�V�V�V�V�V�V�V�V�3�V�V�V�V�V�3�V�V�V�V�V�V�y�V�V�V�V�1�V�V�V�V��V�V�V�V��V�V�V�V�V�V�V�V�$V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V��E�1�E�1�"�E�3�3�y�"���E��E���"�E�E�E�E�E�E�E�E�E���E�E�E�E�E�E�E�E�E�E�E�E�3�E�E�E�E�E�3�E�E�E�E�E�E�y�E�E�E�E�1�E�E�E�E��E�E�E�E��E�E�E�E�E�E�E�E�$E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E��M�1�M�1�"�M�3�3�y�"���M��M���"�M�M�M�M�M�M�M�M�M���M�M�M�M�M�M�M�M�M�M�M�M�3�M�M�M�M�M�3�M�M�M�M�M�M�y�M�M�M�M�1�M�M�M�M��M�M�M�M��M�M�M�M�M�M�M�M�$M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M��J�A�J�A�2�J�3�3�z�2���J�!�J��!�#�J�J�J�J�J�J�J�J�J��!�J�J�J�J�J�J�J�J�J�J�J�J�3�J�J�J�J�J�3�J�J�J�J�J�J�z�J�J�J�J�A�J�J�J�J��J�J�J�J�!�J�J�J�J�J�J�J�J�%J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J�J��R�A�R�A�2�R�3�3�z�2���R�!�R��!�#�R�R�R�R�R�R�R�R�R��!�R�R�R�R�R�R�R�R�R�R�R�R�3�R�R�R�R�R�3�R�R�R�R�R�R�z�R�R�R�R�A�R�R�R�R��R�R�R�R�!�R�R�R�R�R�R�R�R�%R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�Rrc�r��	�tj���	�	fd�td��D��}�	�|d���	�td�t
|��D�������	�����j}|s�tj
���dzdtj��vstj
���rtj���ndtj|��d�z}ttj|�����d}�fd	�|D��}t|��}d}||k}|s�tjd
|fd||f��dtj��vstj
t
��rtjt
��ndtj|��tj|��tj|��d
�z}tj
���dzd|iz}ttj|�����dx}x}x}}dS)zDNine shifts, at most two taken. The old binding capped this at four.c�@��g|]}��d|������S)�sr`rbs  �rrdz@test_a_counting_constraint_can_be_any_length.<locals>.<listcomp>N�+���	.�	.�	.��!�(�(�7�q�7�7�
�
�	.�	.�	.r�	rgc3�RK�|]"\}}d|z
|�d��zV��#dS)r�riNrj)rrcr�s   rrlz?test_a_counting_constraint_can_be_any_length.<locals>.<genexpr>Ps9����@�@�$�!�Q�A��E�Q�U�U�1�X�X�%�@�@�@�@�@�@rrrrNc3�6�K�|]}�|j�dV��dSrnro�rr�rs  �rrlz?test_a_counting_constraint_can_be_any_length.<locals>.<genexpr>Ss.�����*�*�Q��!�&�	�*�q�*�*�*�*�*�*rrrrsrr r!)r"r#rqrxrGrsrtr%r&r'r(r)r*r+r,r-r.r/)
�shr1r2r3r4r5r6r7rr
s
        @@r�,test_a_counting_constraint_can_be_any_lengthr�Ks@����
�
���A�	.�	.�	.�	.�U�1�X�X�	.�	.�	.�B��I�I�b�!�����J�J�s�@�@�)�B�-�-�@�@�@�@�@�A�A�A�	���	�	�A��:��:����q��������������1������1�������:������������������*�*�*�*�"�*�*�*�2�3�*�*�*�2�a�2�*�a�/�2�2�2�2�2�2�2�2�2�*�a�2�2�2�2�2�2�2�2�2�2�2�2�3�2�2�2�2�2�3�2�2�2�2�2�2�*�2�2�2�2�*�2�2�2�2�a�2�2�2�2�2�2�2�2��2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2�2rc��tj��}|�dd��}|�ddd��}|�|�d��|�d��gd��|�d	|�d��zd|�d��zz��|���}|j}|s�tj
|��d
zdtj��vstj
|��rtj|��ndtj|��d�z}ttj|�����d
}|d}d}||k}|d}	d}
|	|
k}||z}d}
||
k}|s�tjd|fd||f��tj|��tj|��d�z}tjd|fd|	|
f��tj|	��tj|
��d�z}tjd|fd||
f��||tj|
��d�z}tj
|��dzd|iz}ttj|�����d
x}x}x}x}	x}x}
x}x}}
|d}d}||k}|s�tjd|fd||f��tj|��tj|��d�z}tj
d��dzd|iz}ttj|�����d
x}x}}d
S)zH"At most one of a=3 and b=17" is not sayable with a single shared value.�xrf�yr;r<r�rir=rrrNrr?r@)z%(py8)s == %(py11)s)�py8�py11)�<=)z (%(py6)s + %(py13)s) <= %(py17)s)rC�py13�py17z
>assert %(py19)s�py19z)and it keeps the more valuable of the two�
>assert %(py6)srC)r"r#r	rFrxrHrGr%r&r'r(r)r*r+r,r-r.r/)r
r�r�rr1r2rOr3rP�@py_assert7�@py_assert10r�@py_assert14�@py_assert16�@py_assert15rQ�@py_format12�@py_format18�@py_format20rRs                    r�9test_literals_in_one_constraint_may_name_different_valuesr�Vs���
�
���A�	�
�
�c�1���A�	�	�	�#�r�2���A��I�I�q�u�u�Q�x�x����r���#�Q�'�'�'��J�J�q�1�5�5��8�8�|�a�!�%�%��)�)�m�+�,�,�,�	���	�	�A��:��:����q��������������1������1�������:������������������
�c�F�1�a�1�F�a�K�1�A�c�F�1�b�1�F�b�L�1�1�1�)�1�Q�1�)�Q�.�1�1�1�1�1�1�1�1�1�F�a�1�1�1�1�1�F�1�1�1�1�a�1�1�1�1�1�1�1�1�1�1�1�1�F�b�1�1�1�1�1�F�1�1�1�1�b�1�1�1�1�1�1�1�1�1�1�1�1�)�Q�1�1�1�1�1�1�1�Q�1�1�1�1�1�1�1�1��1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1��S�6�C�Q�C�6�Q�;�C�C�C�C�C�C�C�C�C�6�Q�C�C�C�C�C�6�C�C�C�C�Q�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�Crc��
�d�}|dd��d}d}||k}|s�tjd|fd||f��tj|��tj|��d�z}tjd	��d
zd|iz}t	tj|�����dx}x}}|dd��d}d}||k}|s�tjd|fd||f��tj|��tj|��d�z}tjd
��d
zd|iz}t	tj|�����dx}x}}|dd��d}d}||k}|s�tjd|fd||f��tj|��tj|��d�z}tjd��d
zd|iz}t	tj|�����dx}x}}t
j���
�
fd�td��D��}�
�	|d���
j
}|��}|j}|dd��d}	||	k}
|
s�tjd|
fd||	f��dtj
��vstj�
��rtj�
��ndtj|��tj|��tj|��tj|	��d�z}tjd��dzd|iz}t	tj|�����dx}x}x}x}
}	dS)Nc�����tj����fd�td��D��}t�|��|����t�fd�|D������������j}|s�tj	���dzdtj��vstj���rtj
���ndtj
|��d�z}ttj|�����d}t�fd�|D�����jfS)Nc�@��g|]}��d|������Sr^r`rbs  �rrdzAtest_exactly_one_and_at_most_one.<locals>.run.<locals>.<listcomp>fs+���1�1�1�1�Q�X�X�g�!�g�g�
�
�1�1�1rr=c3�H�K�|]}�|�d��zV��dSrnrj)rr�rks  �rrlz@test_exactly_one_and_at_most_one.<locals>.run.<locals>.<genexpr>hs1�����2�2�1�t�a�e�e�A�h�h��2�2�2�2�2�2rrrrc3�6�K�|]}�|j�dV��dSrnror�s  �rrlz@test_exactly_one_and_at_most_one.<locals>.run.<locals>.<genexpr>ks.�����-�-��1�Q�V�9�-�1�-�-�-�-�-�-r)r"r#rqrrrGrsr%r&r'r(r)r*r+r,r-r.�spins)�methodrkr_r1r2rr
s `   @@rrwz-test_exactly_one_and_at_most_one.<locals>.rundsE������J�L�L��1�1�1�1��a���1�1�1�����6���1����	�
�
�3�2�2�2�2��2�2�2�2�2�3�3�3�
�G�G�I�I���z��z����1��������������q������q�������z�������������������-�-�-�-�a�-�-�-�-�-�q�w�6�6r�exactly_one�����rrirr?r@zone, even pushed offr�rC�at_most_oneznone, when pushed offzand one when pulled onc�@��g|]}��d|������Sr^r`rbs  �rrdz4test_exactly_one_and_at_most_one.<locals>.<listcomp>ss+���-�-�-�q����'�a�'�'�	�	�-�-�-rr=��>)z^%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.solve
}()
}.spins
} > %(py9)sr
�rrrrCr!z-at_most k=1 costs slack; at_most_one does not�
>assert %(py11)sr�)r'r/r,r(r-r.r"r#rqrxr%r�r)r*r+)rwrOr3rPrQrRr_r1r5r�r�r7r�r
s             @r� test_exactly_one_and_at_most_oner�cs����7�7�7��3�}�b�!�!�!�$�A��A�$��)�A�A�A�A�A�A�A�A�A�$��A�A�A�A�A�$�A�A�A�A��A�A�A�A�A�A�A�A�+A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A��3�}�b�!�!�!�$�B��B�$��)�B�B�B�B�B�B�B�B�B�$��B�B�B�B�B�$�B�B�B�B��B�B�B�B�B�B�B�B�+B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B��3�}�b�!�!�!�$�C��C�$��)�C�C�C�C�C�C�C�C�C�$��C�C�C�C�C�$�C�C�C�C��C�C�C�C�C�C�C�C�+C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�	�
���A�-�-�-�-�E�!�H�H�-�-�-�A��I�I�a��O�O�O��7�g�7�7�9�9�g�9�?�g�S�S���3�3�A�6�g�?�6�6�g�g�g�g�g�g�g�g�g�?�6�g�g�g�g�g�g�g�g�g�g�g�g�1�g�g�g�g�g�1�g�g�g�g�g�g�7�g�g�g�g�9�g�g�g�g�?�g�g�g�g�6�g�g�g�g�g�g�g�g�8g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�g�grc�B�tj��}|�dd��}tjt
d���5|�|gd��ddd��n#1swxYwYtjt
d���5|�||�dd��gd��ddd��n#1swxYwYtjtd	���5|�|dgd��ddd��dS#1swxYwYdS)
Nr�r�at least tworDriz	k must ber�r�zvariables or literals)r"r#r	rIrJrKrx�	TypeError�r
r�s  r�7test_a_counting_constraint_refuses_what_it_cannot_countr�xs���
�
���A�	�
�
�c�1���A�	��z��	8�	8�	8���	�	�	�1�#�q����������������������	��z��	5�	5�	5�1�1�	�	�	�1�a�m�m�C��+�+�,�a�0�0�0�1�1�1�1�1�1�1�1�1�1�1����1�1�1�1�	��y�(?�	@�	@�	@���	�	�	�1�c�(�A������������������������s6�A)�)A-�0A-�-C�C�C�.D�D�Dc	��d�}d}||��}d}||��}||k}|�s#tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��dtj��vstj|��rtj|��ndtj|��tj|��d�z}tjd��d	zd
|iz}ttj|�����dx}x}x}x}}dS)Nc�~�	�tj���	�	fd�td��D��}t�	|��|d���	���}|j}t
|��}d�td��D��}||k}|�stjd|fd||f��dtj
��vstjt��rtjt��nddtj
��vstj|��rtj|��ndtj|��tj|��tj|��d	�z}tj
d
��dzd|iz}ttj|�����dx}x}x}}|jS)
Nc�@��g|]}��d|������Sr^r`rbs  �rrdzYtest_slack_costs_spins_but_never_appears_in_the_answer.<locals>.spins.<locals>.<listcomp>�rerrfrgc��h|]}d|����Sr^�)rrcs  r�	<setcomp>zXtest_slack_costs_spins_but_never_appears_in_the_answer.<locals>.spins.<locals>.<setcomp>�s�� ;� ;� ;�Q��Q��� ;� ;� ;rr)zL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.values
})
} == %(py8)s�setr�rrA�py3�py5r�zno slack in the answer�
>assert %(py10)sry)r"r#rqrrr%�valuesr�r'r/r)r*r+r,r(r-r.r�)
rurvrrP�@py_assert4r�r4�@py_format9r�r
s
         @rr�zEtest_slack_costs_spins_but_never_appears_in_the_answer.<locals>.spins�s�����J�L�L��
2�
2�
2�
2��q���
2�
2�
2�����4����Q����
�G�G�I�I���8�U�s�8�}�}�U� ;� ;�%��(�(� ;� ;� ;�U�}� ;�;�U�U�U�U�U�U�U�U�U�}� ;�U�U�U�U�U�U�U�U�U�U�U�U�s�U�U�U�U�U�s�U�U�U�U�U�U�U�U�U�U�U�U�U�1�U�U�U�U�U�1�U�U�U�U�U�U�8�U�U�U�U�}�U�U�U�U� ;�U�U�U�U�U�U�U�U�=U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U�U��w�rrxr|r�)zO%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}r�)rrrrCr�ryz$an inequality needs a slack variablerzr{r~)r�r1r3r�rr5r�r�s        r�6test_slack_costs_spins_but_never_appears_in_the_answerr��s�������V�5�5����V�I�V�e�e�I�.�.�V��.�.�V�V�V�V�V�V�V�V�V��.�V�V�V�V�V�V�V�V�V�V�V�V�5�V�V�V�V�V�5�V�V�V�V�V�V��V�V�V�V��V�V�V�V�V�V�V�V�V�V�V�e�V�V�V�V�V�e�V�V�V�V�V�V�I�V�V�V�V�.�V�V�V�V�V�V�V�V�0V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�Vrc�p�tj��}|�dd��|�dd��}}|�d|�d��|�d��zz��|���}|d|df}d}||k}|s�t
jd|fd||f��t
j|��t
j|��d	�z}t
j	|��d
zd|iz}tt
j|�����dx}x}}dS)Nrr�brfrg)rgrgrr?r@r�rC)r"r#r	rGrHr%r'r/r,r(r-r.)	r
rr��ansrOr3rPrQrRs	         r�'test_a_quadratic_term_rewards_agreementr��s7��
�
���A��=�=��a� � �!�-�-��Q�"7�"7�q�A��J�J�q�A�E�E�!�H�H�q�u�u�Q�x�x�'�(�)�)�)�
�'�'�)�)�C���H�c�#�h��.�6�.��6�)�.�.�.�.�.�.�.�.�.��6�.�.�.�.�.��.�.�.�.�6�.�.�.�.�.�.�.�.�3�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.rc���tj��}|�dd��|�dd��}}|�||��|�d|�d��zd|�d��zz��|���}|j}|s�tj	|��dzdtj��vstj|��rtj
|��ndtj
|��d�z}ttj|�����d	}|d}|d}||k}|s�tjd
|fd||f��tj
|��tj
|��d�z}	tj	|��d
zd|	iz}
ttj|
�����d	x}x}}|j}|��}|j}d}||k}
|
s�tjd|
fd||f��dtj��vstj|��rtj
|��ndtj
|��tj
|��tj
|��tj
|��d�z}tj	d��dzd|iz}ttj|�����d	x}x}x}x}
}d	S)zZThe penalty scales above the largest objective coefficient, or a constraint is decorative.rrr��2rirr�rN)�!=)z%(py1)s != %(py4)sr@r�rC�d)�>=)za%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.solve
}()
}.penalty
} >= %(py9)sr
r�z&the penalty must outrank the objectiver�r�)r"r#r	r$rGrHr%r&r'r(r)r*r+r,r-r.r/�penalty)r
rr�r�r1r2rOr3rPrQrRr5r�r�r7r�s                r�3test_a_constraint_cannot_be_outbid_by_the_objectiver��s	��
�
���A��=�=��a� � �!�-�-��Q�"7�"7�q�A��K�K��1�����J�J�r�A�E�E�!�H�H�}�r�A�E�E�!�H�H�}�,�-�-�-�
�'�'�)�)�C��<��<������������������3������3�������<�������������������s�8�$�s�3�x�$�8�x��$�$�$�$�$�$�$�$�$�8�x�$�$�$�$�$�8�$�$�$�$�x�$�$�$�$�$�$�$�$��$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$��7�M�7�7�9�9�M�9��M��M���#�M�M�M�M�M�M�M�M�M���M�M�M�M�M�M�M�M�M�M�M�M�1�M�M�M�M�M�1�M�M�M�M�M�M�7�M�M�M�M�9�M�M�M�M��M�M�M�M��M�M�M�M�M�M�M�M�%M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�M�Mrc�<�tj��}|�dd��|�dd��}}|�||��|�d��|�d|�d��zd|�d��zz��|���}|d|df}d}||k}|s�tj	d|fd	||f��tj
|��tj
|��d
�z}tj|��dzd|iz}ttj
|�����d
x}x}}|j}	g}
|	|
k}|s�tj	d|fd|	|
f��dtj��vstj|��rtj
|��ndtj
|	��tj
|
��d�z}tjd��dzd|iz}ttj
|�����d
x}	x}}
|j}	|	}|s�tjd��dzdtj��vstj|��rtj
|��ndtj
|	��d�z}
ttj
|
�����d
x}	}|j}t)|��}
d}|
|k}|�stj	d|fd|
|f��dtj��vstjt(��rtj
t(��nddtj��vstj|��rtj
|��ndtj
|��tj
|
��tj
|��d�z}tj|j��dzd|iz}ttj
|�����d
x}x}
x}}d}|jd}|j}||v}|s�tj	d|fd||f��tj
|��tj
|��tj
|��d �z}tj|jd��d!zd"|iz}ttj
|�����d
x}x}x}}|jd}|j}d}||k}
|
s�tj	d#|
fd$||f��tj
|��tj
|��tj
|��d%�z}tjd&��d!zd"|iz}ttj
|�����d
x}x}x}
}d
S)'z�A penalty makes a constraint expensive, not impossible.

    Pin it below the objective and the sampler pays it: every variable decodes cleanly and the
    constraint is broken. `feasible` used to be true for exactly that answer.
    rrr���?�(ri)ririrr?r@r�rCN)z1%(py2)s
{%(py2)s = %(py0)s.undecoded
} == %(py5)sr��rrr�z every variable decoded perfectly�
>assert %(py7)srzand it is still not feasiblez2
>assert not %(py2)s
{%(py2)s = %(py0)s.feasible
}r)zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.violated
})
} == %(py8)srr�r�ryzmust differr��in)z.%(py1)s in %(py6)s
{%(py6)s = %(py4)s.detail
})rArrC�
>assert %(py8)sr�r�)z)%(py3)s
{%(py3)s = %(py1)s.by
} > %(py6)s�rAr�rCz'and by how much, not only that it broke)r"r#r	r$r�rGrHr%r'r/r,r(r-r.�	undecodedr)r*r+r&�violatedr�detail�by)r
rr�r�rOr3rPrQrRr1r�rYr6�@py_format4r�r4r�r�r5s                   r�(test_feasible_means_the_constraints_holdr��s���	�
���A��=�=��a� � �!�-�-��Q�"7�"7�q�A��K�K��1�����I�I�c�N�N�N��J�J�r�A�E�E�!�H�H�}�r�A�E�E�!�H�H�}�,�-�-�-�
�'�'�)�)�C���H�c�#�h��.�6�.��6�)�.�.�.�.�.�.�.�.�.��6�.�.�.�.�.��.�.�.�.�6�.�.�.�.�.�.�.�.�3�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.��=�B�B�B�=�B��B�B�B�B�B�B�B�B�B�=�B�B�B�B�B�B�B�B�B�B�B�B�B�3�B�B�B�B�B�3�B�B�B�B�B�B�=�B�B�B�B�B�B�B�B�B�B�B�B�B� B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B��|�;�|��;��;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�s�;�;�;�;�;�s�;�;�;�;�;�;�|�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;��|�/�3�|���/��/���!�/�/�/�/�/�/�/�/�/���/�/�/�/�/�/�/�/�/�/�/�/�3�/�/�/�/�/�3�/�/�/�/�/�/�/�/�/�/�/�/�/�s�/�/�/�/�/�s�/�/�/�/�/�/�|�/�/�/�/��/�/�/�/��/�/�/�/�/�/�/�/�3�<�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/�/��C�C�L��O�C�O�2�C�=�2�2�C�C�C�C�C�C�C�C�C�=�2�C�C�C�C�C�=�C�C�C�C�O�C�C�C�C�2�C�C�C�C�C�C�C�C�C�L��O�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C��<��?�L�?��L��L���!�L�L�L�L�L�L�L�L�L���L�L�L�L�L�?�L�L�L�L��L�L�L�L��L�L�L�L�L�L�L�L�#L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�Lrc���d�}d}||��}|j}|}|s�tjd��dzdtj��vstj|��rtj|��ndtj|��tj|��tj|��d�z}ttj|�����dx}x}x}}d}||��}|j}|s�tjd��d	zdtj��vstj|��rtj|��ndtj|��tj|��tj|��d�z}ttj|�����dx}x}}d}||��}|j}|s�tjd
��d	zdtj��vstj|��rtj|��ndtj|��tj|��tj|��d�z}ttj|�����dx}x}}ddtd
��fD]s}tj��}|�dd��tjtd���5|�|��ddd��n#1swxYwY�tdS)Nc��tj��}|�dd��|�dd��}}|�||��|r|�|��|�d|�d��zd|�d��zz��|���S)Nrrr�r�ri)r"r#r	r$r�rGrHr%)�pinr
rr�s    rrwz<test_raising_the_penalty_wins_a_constraint_back.<locals>.run�s����J�L�L���}�}�S�!�$�$�a�m�m�C��&;�&;�1��	���A�q�����	�
�I�I�c�N�N�N�	�
�
�2����a���=�2����a���=�0�1�1�1��w�w�y�y�rr��outbidzP
>assert not %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}.feasible
}rw�rrrrCgi@zand won back by raising itzL
>assert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}.feasible
}z.the automatic scaling already handles this one�g��nanr�rzpositive numberrD)r&r'r(r)r*r+r,r-r.�floatr"r#r	rIrJrKr�)	rwr1r3r5r�r6rR�badr
s	         r�/test_raising_the_penalty_wins_a_constraint_backr��s]������*�s�s�3�x�x�*�x� �*� � �*� �*�*�*�(�*�*�*�*�*�*�*�*�*�*�*�*�*�s�*�*�*�*�*�s�*�*�*�*�*�*�3�*�*�*�*�x�*�*�*�*� �*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*�*��<�3�3�u�:�:�<�:��<��<�<�<� <�<�<�<�<�<�<�<�<�<�<�<�<�<�3�<�<�<�<�<�3�<�<�<�<�<�<�u�<�<�<�<�:�<�<�<�<��<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<��O�3�3�t�9�9�O�9��O��O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�3�O�O�O�O�O�3�O�O�O�O�O�O�t�O�O�O�O�9�O�O�O�O��O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O��T�5��<�<�(�����J�L�L��	�
�
�c�1����
�]�:�->�
?�
?�
?�	�	�
�I�I�c�N�N�N�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	���s�K0�0K4	�7K4	c�*�tj��}|�dd��}|�|d��|���|�dd���}|j}|j}||k}|s�tjd|fd||f��d	tj
��vstj|��rtj|��nd	tj|��d	tj
��vstj|��rtj|��nd	tj|��d
�z}tj
d��dzd
|iz}ttj|�����dx}x}}|j}d}||k}|s�tjd|fd||f��d	tj
��vstj|��rtj|��nd	tj|��tj|��d�z}	tj
|��dzd|	iz}
ttj|
�����dx}x}}|j}t%|t&��}|�sddtj
��vstjt$��rtjt$��ndd	tj
��vstj|��rtj|��nd	tj|��dtj
��vstjt&��rtjt&��ndtj|��d�z}ttj|�����dx}}|j}|j}|}||k}|s�tjd|fd||f��d	tj
��vstj|��rtj|��nd	tj|��d	tj
��vstj|��rtj|��nd	tj|��d
�z}
tj
d��dzd|
iz}
ttj|
�����dx}x}x}}|j��|j}d}||u}|s�tjd|fd||f��d	tj
��vstj|��rtj|��nd	tj|��tj|��d�z}	tj
d��dzd|	iz}
ttj|
�����dx}x}}dSdS)Nr�rfrgr�i)�beta�drawsr)zN%(py2)s
{%(py2)s = %(py0)s.beta_eff
} == %(py6)s
{%(py6)s = %(py4)s.beta_eff
}�cr�zbeta_eff is a real numberr�r�rr�)z*%(py2)s
{%(py2)s = %(py0)s.ess
} > %(py5)sr�r�rzSassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.findings
}, %(py4)s)
}�
isinstance�list)rrAr�rrC)zP%(py2)s
{%(py2)s = %(py0)s.passed
} == not %(py6)s
{%(py6)s = %(py4)s.findings
}z(passed is exactly an empty findings listr r!��is not)z7%(py2)s
{%(py2)s = %(py0)s.noise_floor
} is not %(py5)sz+a TV without its floor is not a measurement)r"r#r	rLr%�certify�beta_effr'r/r)r*r+r,r(r-r.�ess�findingsr�r��passed�tv�noise_floor)r
r�r�r1r5r3rRr�r�rYr6rPr�r7s              r�8test_a_certificate_reports_on_the_sampler_not_the_answerr��s���
�
���A�	�
�
�c�1���A��E�E�!�Q�K�K�K��G�G�I�I�I�	�	�	�s�#�	�&�&�A��:�@���@�:��#�@�@�@�@�@�@�@�@�@�:��@�@�@�@�@�@�@�@�@�@�@�@�1�@�@�@�@�@�1�@�@�@�@�@�@�:�@�@�@�@�@�@�@�@�@�@�@��@�@�@�@�@��@�@�@�@�@�@��@�@�@�@�@�@�@�@�%@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@��5��1��5�1�9����������5�1�������������1������1�������5�����1���������a��������������������������j�'�:�j�$�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�:�'�'�'�'�'�:�'�'�'�'�'�'�'�'�'�'�'�'�'�a�'�'�'�'�'�a�'�'�'�'�'�'�j�'�'�'�'�'�'�'�'�'�'�'�$�'�'�'�'�'�$�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'��8�S�A�J�S�J��S�8��'�S�S�S�S�S�S�S�S�S�8��S�S�S�S�S�S�S�S�S�S�S�S�1�S�S�S�S�S�1�S�S�S�S�S�S�8�S�S�S�S�S�S�S�S�S�S�S�A�S�S�S�S�S�A�S�S�S�S�S�S�J�S�S�S�S�S�S�S�S�)S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S�S��t���}�W�D�W�}�D�(�W�W�W�W�W�W�W�W�W�}�D�W�W�W�W�W�W�W�W�W�W�W�W�q�W�W�W�W�W�q�W�W�W�W�W�W�}�W�W�W�W�D�W�W�W�W�W�W�W�W�*W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W��rc�l���d\}}tj��}|�d||f��}t|��D]*�|�|�������+t|��D]*}|�|�|�����+|�d|d�	d��zd|d�	d��zz��|�
d�����j}|s�tj
���d	zd
tj��vstj���rtj���nd
tj|��d�z}t%tj|�����d}t|��D�]L���fd
�t|��D��}t)|��}d}	||	k}
|
�s
tjd|
fd||	f��dtj��vstjt(��rtjt(��nddtj��vstj|��rtj|��ndtj|��tj|	��d�z}tj
d��d|����dzd|iz}t%tj|�����dx}x}
}	��N�d}
d}|
|k}|s�tjd|fd|
|f��tj|
��tj|��d�z}tj
���dzd|iz}t%tj|�����dx}
x}}�d}
d}|
|k}|s�tjd|fd|
|f��tj|
��tj|��d�z}tj
���dzd|iz}t%tj|�����dx}
x}}dS)zQThe shape most real models have, and the one that needs an index to write at all.)rr�assignr)rrgri)rir� ��triesrr�rNc�2��g|]}�d��d|�d��|��S)zassign[�,�]r�)rr�r��ws  ��rrdzItest_a_grid_of_variables_models_an_assignment_problem.<locals>.<listcomp>�s7���E�E�E�q�S�1C�1�1C�1C�q�1C�1C�1C�-D�E��E�E�Err�z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr�taken�rrAr�rCzworker z takes exactly one shift: r�r�zassign[0,2]r?r@r�rCzassign[1,0])r"r#�gridrqr��rowr��columnrGrHr%r&r'r(r)r*r+r,r-r.rr/)�workers�shiftsr
rr�r1r2rrPr5r�rRr�rOr3rQr�rs                @@r�5test_a_grid_of_variables_models_an_assignment_problemr�sp�����O�G�V�
�
���A�	���x�'�6�*�+�+�A�
�7�^�^� � ��	�
�
�a�e�e�A�h�h�����
�6�]�]�#�#��	�
�
�a�h�h�q�k�k�"�"�"�"��J�J�q�1�T�7�;�;�q�>�>�!�A��$����A���$6�6�7�7�7�
�'�'��'�
�
�C��<��<������������������3������3�������<������������������
�7�^�^�O�O��E�E�E�E�E�E�&�M�M�E�E�E���5�z�z�N�Q�N�z�Q��N�N�N�N�N�N�N�N�N�z�Q�N�N�N�N�N�N�N�N�N�N�N�N�s�N�N�N�N�N�s�N�N�N�N�N�N�N�N�N�N�N�N�N�5�N�N�N�N�N�5�N�N�N�N�N�N�z�N�N�N�N�Q�N�N�N�N�N�N�N�N� N�!� N� N�u� N� N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N��}��'��'���"�'�'�'�'�'�'�'�'�'���'�'�'�'�'��'�'�'�'��'�'�'�'�'�'�'�'�C�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'��}��'��'���"�'�'�'�'�'�'�'�'�'���'�'�'�'�'��'�'�'�'��'�'�'�'�'�'�'�'�C�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'rc�	�tj��}|�dd��}t|��}d}||k}|s�t	jd|fd||f��dt
j��vst	jt��rt	j	t��nddt
j��vst	j|��rt	j	|��ndt	j	|��t	j	|��d�z}d	d
|iz}tt	j|�����dx}x}}|j}d}||k}|s�t	jd|fd||f��dt
j��vst	j|��rt	j	|��ndt	j	|��t	j	|��d
�z}	dd|	iz}
tt	j|
�����dx}x}}|d}|j
}d}||k}|st	jd|fd||f��t	j	|��t	j	|��t	j	|��d�z}d	d
|iz}tt	j|�����dx}x}x}}tjt d���5|dddd��n#1swxYwYtjt d���5|dddd��n#1swxYwYtjt d���5|dddd��n#1swxYwYd�|�d��D��}gd�}||k}|slt	jd|fd||f��t	j	|��t	j	|��d�z}dd|iz}tt	j|�����dx}x}}d �|�d!��D��}d"dg}||k}|slt	jd|fd||f��t	j	|��t	j	|��d�z}dd|iz}tt	j|�����dx}x}}dS)#zTPython wraps a negative index. A wrap here is an off-by-one that reaches the answer.r�)rgr�rrrrr�assert %(py8)sr�N)z,%(py2)s
{%(py2)s = %(py0)s.dims
} == %(py5)sr�rWr)rirg�x[1,2])z,%(py3)s
{%(py3)s = %(py1)s.name
} == %(py6)sr�zoutside dimensionrD)rr)r�rzdimensions and was givenric��g|]	}|j��
Sr�ro�rr_s  rrdzNtest_a_grid_index_outside_the_shape_is_refused_not_wrapped.<locals>.<listcomp>�s��%�%�%�q�A�F�%�%�%r)zx[1,0]zx[1,1]rr?r@rBrCc��g|]	}|j��
Sr�rors  rrdzNtest_a_grid_index_outside_the_shape_is_refused_not_wrapped.<locals>.<listcomp>�s��(�(�(�q�A�F�(�(�(rrgzx[0,2])r"r#rrr'r/r)r*r+r,r-r.�dimsrprIrJ�
IndexErrorrr)
r
rrPr5r�rRr�r1r3rYr6rOrQs
             r�:test_a_grid_index_outside_the_shape_is_refused_not_wrappedr�s���
�
���A�	���s�F���A��q�6�6��Q��6�Q�;����������6�Q�������������3������3��������������q������q�������6�����Q�����������������������������6��V��6�V�����������6�V�������������1������1�������6�����V�����������������������������T�7�#�7�<�#�8�#�<�8�#�#�#�#�#�#�#�#�#�#�<�8�#�#�#�#�#�7�#�#�#�#�<�#�#�#�#�8�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�#�	��z�)<�	=�	=�	=���	�$���������������������	��z�)<�	=�	=�	=���	�%���������������������	��z�)C�	D�	D�	D�
�
�	�!���
�
�
�
�
�
�
�
�
�
�
����
�
�
�
�&�%�A�E�E�!�H�H�%�%�%�G�)G�)G�)G�G�%�)G�G�G�G�G�G�G�G�G�G�G�%�)G�G�G�G�G�G�%�G�G�G�G�)G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�(�(�A�H�H�Q�K�K�(�(�(�@�X�x�,@�@�(�,@�@�@�@�@�@�@�@�@�@�@�(�,@�@�@�@�@�@�(�@�@�@�@�,@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@s6�7	K�K�K�2	L�L�L�-	M�M�	Mc���tj��}|�ddd���}|�|dd��|���d}d}||k}|sltjd|fd||f��tj|��tj|��d	�z}d
d|iz}ttj	|�����dx}x}}dS)N�temprc�0�|�|dd��S)Nr;r<)rF)�prrs  r�<lambda>z.test_a_grid_takes_any_domain.<locals>.<lambda>s��2�:�:�a��R�+@�+@�rrir�ztemp[1]rr?r@rBrC)
r"r#rrLr%r'r/r,r-r.rMs       r�test_a_grid_takes_any_domainrs���
�
���A�	���v�t�@�@�A�A�A��E�E�!�A�$��O�O�O��7�7�9�9�Y��%�2�%��2�%�%�%�%�%�%�%�%�%�%��2�%�%�%�%�%��%�%�%�%�2�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%rc� 
�d�}d}||��}d}||k}|s�tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��tj|��d�z}tjd��d	zd
|iz}ttj|�����dx}x}x}}d}||��}d
}||k}|s�tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��tj|��d�z}tjd��d	zd
|iz}ttj|�����dx}x}x}}d}||��}d}||k}|s�tjd|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��tj|��d�z}tjd��d	zd
|iz}ttj|�����dx}x}x}}dD�]�}tj
��}|�dd|���}	|�|	d��|�
d���}
|
j}|s�tj||
f��dzdtj��vstj|
��rtj|
��ndtj|��d�z}ttj|�����d}|
d}d}||k}
|
s�tjd|
fd||f��tj|��tj|��d�z}tj||
f��dzd|iz}ttj|�����dx}x}
}���tj
��}|�ddd d���}|�|d!��|�
d���}
|
d}d!}||k}
|
s�tjd|
fd||f��tj|��tj|��d�z}tj|
��dzd|iz}ttj|�����dx}x}
}|
j}d}||k}|s�tjd|fd"||f��dtj��vstj|
��rtj|
��ndtj|��tj|��d#�z}tjd$��d%zd&|iz}ttj|�����dx}x}}t#jt&d'�(��5tj
���d)dd*���ddd��dS#1swxYwYdS)+zVThe trade is the difference between a model that fits a machine and one that does not.c��tj��}|�dd|���|�d���jS)Nrr
��encodingrfr�)r"r#r	r%r�)�encr
s  rr�zDtest_an_encoding_can_be_chosen_and_costs_what_it_says.<locals>.spinss<���J�L�L��	�
�
�c�1�s�
�+�+�+��w�w�Q�w���%�%r�one-hotr
rrr�rzone spin per valuer r!N�domain-wallr=z	one fewerrarz+log2 of the domain, and the cheapest by far)r!r"rr�r�rr�rr?r@r�rCrNr;r<r��z-%(py2)s
{%(py2)s = %(py0)s.spins
} == %(py5)sr�zeleven values in ten spinsr�rzunknown encodingrDr��rot13)r'r/r)r*r+r,r(r-r.r"r#r	rLr%r&rFr�rIrJrK)r�r1r3r4r5r6r7r r
rr�r2rOrPrQrRrNr�rYs                   r�5test_an_encoding_can_be_chosen_and_costs_what_it_saysr&	s{��&�&�&�
�6�5�5����6�q�6��q� �6�6�6�6�6�6�6�6�6��q�6�6�6�6�6�6�6�6�6�6�6�6�5�6�6�6�6�6�5�6�6�6�6�6�6��6�6�6�6��6�6�6�6�q�6�6�6�6�6�6�6�6�"6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6��1�5�5����1�1�1��1�$�1�1�1�1�1�1�1�1�1��1�1�1�1�1�1�1�1�1�1�1�1�1�5�1�1�1�1�1�5�1�1�1�1�1�1��1�1�1�1��1�1�1�1�1�1�1�1�1�1�1�1�1�k�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1�1��N�5�5��?�?�N�a�N�?�a��N�N�N�N�N�N�N�N�N�?�a�N�N�N�N�N�N�N�N�N�N�N�N�5�N�N�N�N�N�5�N�N�N�N�N�N��N�N�N�N�?�N�N�N�N�a�N�N�N�N�N�N�N�N�!N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�*�)�)���J�L�L��
�M�M�#�q�3�M�/�/��	���a������g�g�B�g�����|�'�|�'�'�'�c�3�Z�'�'�'�'�'�'�'�'�'�'�'�'�'�s�'�'�'�'�'�s�'�'�'�'�'�'�|�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'��3�x�(�1�(�x�1�}�(�(�(�(�(�(�(�(�(�x�1�(�(�(�(�(�x�(�(�(�(�1�(�(�(�(�(�(�(�(�s�C�j�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�	�
���A�	�	�	�#�r�2�
�	�6�6�A��E�E�!�R�L�L�L�
�'�'��'�
�
�C��s�8��r��8�r�>����������8�r������8�����r���������3��������������������������9�8��8�9��?�8�8�8�8�8�8�8�8�8�9��8�8�8�8�8�8�8�8�8�8�8�8�3�8�8�8�8�8�3�8�8�8�8�8�8�9�8�8�8�8��8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�	��z�);�	<�	<�	<�;�;�
�
��� � ��a�'� �:�:�:�;�;�;�;�;�;�;�;�;�;�;�;����;�;�;�;�;�;s�*Z�Z�
Zc��tj��}|�ddd���}|�|d��t	jtd���5|���ddd��dS#1swxYwYdS)	zMIts indicator is a product of every bit, so its degree grows with the domain.r�rarrzOneHot|one-hotrDN)r"r#r	rLrIrJrKr%)r
rs  r�5test_a_binary_encoded_variable_cannot_carry_a_literalr))s���
�
���A�	�
�
�c�1�x�
�0�0�A��E�E�!�Q�K�K�K�	��z�)9�	:�	:�	:���	���	�	�	���������������������s�A?�?B�Bc��tj��}|�dd��}tjt
d���5|�dd��ddd��n#1swxYwYtjt
d���5|�|d��ddd��n#1swxYwYtjt
d���5|�|gd��ddd��n#1swxYwYtjtd���5|�	d	��ddd��dS#1swxYwYdS)
N�colourrzalready declaredrDr�r�riznot a bare numberr=)
r"r#r	rIrJrKrLrxr�rGr�s  r�&test_errors_name_what_the_caller_wroter,2s#��
�
���A�	�
�
�h��"�"�A�	��z�);�	<�	<�	<�#�#�	�
�
�h��"�"�"�#�#�#�#�#�#�#�#�#�#�#����#�#�#�#�	��z��	2�	2�	2���	���a�����������������������	��z��	8�	8�	8���	�	�	�1�#�q����������������������	��y�(;�	<�	<�	<���	�
�
�1�
�
�
���������������������sH�A(�(A,�/A,�B1�1B5�8B5�C;�;C?�C?�!E�E�Ec�T�tj��}|�dd��}|�|d��|�dddd���d}d}||k}|sltjd	|fd
||f��tj|��tj|��d�z}dd
|iz}ttj	|�����dx}x}}|���d}d}||k}|s�tjd	|fd
||f��tj|��tj|��d�z}tj
d��dzd
|iz}ttj	|�����dx}x}}tjtd���5|�dd���ddd��n#1swxYwYtjtd���5|�td��d���ddd��dS#1swxYwYdS)Nr�rrig�������?g@r�r<)�beta_hot�	beta_cold�stages�sweepsrr?r@rBrCz#zeros mean the library's own ladderr�zbeta_cold must exceedrDg @)r.r/r�)r"r#r	rLr%r'r/r,r-r.r(rIrJrKr�)r
r�rOr3rPrQrRs       r�<test_a_bad_annealing_ladder_is_refused_rather_than_defaultedr2?s���
�
���A�	�
�
�c�1���A��E�E�!�Q�K�K�K��7�7�D�C��2�7�F�F�s�K�P�q�P�K�q�P�P�P�P�P�P�P�P�P�P�K�q�P�P�P�P�P�K�P�P�P�P�q�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P��7�7�9�9�S�>�E�Q�E�>�Q��E�E�E�E�E�E�E�E�E�>�Q�E�E�E�E�E�>�E�E�E�E�Q�E�E�E�E�E�E�E�E� E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�E�	��z�)@�	A�	A�	A�.�.�	������-�-�-�.�.�.�.�.�.�.�.�.�.�.����.�.�.�.�	��z�)@�	A�	A�	A�6�6�	����u�����5�5�5�6�6�6�6�6�6�6�6�6�6�6�6����6�6�6�6�6�6s$�!G�G	�G	�+%H�H!�$H!c����tj��}|�dd���|�t	�fd�td��D������|���d}d}||k}|sltjd|fd||f��tj	|��tj	|��d�z}dd	|iz}ttj|�����d
x}x}}d
S)zV`sum()` starts from 0, which is the natural Python idiom and must not be a type error.r�r
c3�H�K�|]}|��|��zV��dS�Nrj)rr_r�s  �rrlz5test_summing_terms_in_a_loop_works.<locals>.<genexpr>Os1�����2�2�A�1�q�u�u�Q�x�x�<�2�2�2�2�2�2rr=rr?r@rBrCN)r"r#r	rGrsrqr%r'r/r,r-r.)r
rOr3rPrQrRr�s      @r�"test_summing_terms_in_a_loop_worksr6Ks	���
�
���A�	�
�
�c�1���A��J�J�s�2�2�2�2��q���2�2�2�2�2�3�3�3��7�7�9�9�S�>��Q��>�Q�����������>�Q������>�����Q�����������������������������rc�.�tj��}|�dd��|�dd��}}|�||��|���|���}|j}d}||��}|s�tj|dd���dzdtj
��vstj|��rtj|��ndtj|��tj|��tj|��d�z}ttj|�����dx}x}}d	}||v}	|	s�tjd
|	fd||f��tj|��dtj
��vstj|��rtj|��ndd�z}
tj|dd
���dzd|
iz}ttj|�����dx}}	dS)Nrrr�zftp 1r�zN
>assert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}�textr�zspins 6r�)z%(py1)s in %(py3)s)rAr��Pz
>assert %(py5)sr�)r"r#r	r$r%�ftp�
startswithr'r(r)r*r+r,r-r.r/)r
rr�r8r1r3r5rRrOrPr�rYs            r�%test_the_compiled_program_is_readabler<Ss��
�
���A��=�=��a� � �!�-�-��Q�"7�"7�q�A��K�K��1�����G�G�I�I�I��5�5�7�7�D��?�.�7�.�?�?�7�#�#�.�#�.�.�.�T�#�2�#�Y�.�.�.�.�.�.�.�.�.�.�.�.�.�4�.�.�.�.�.�4�.�.�.�.�.�.�?�.�.�.�.�7�.�.�.�.�#�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.�.��'�9���'�'�'�'�'�'�'�'�'�9��'�'�'�'�'�9�'�'�'�'�'�'�'�'�'�'�'��'�'�'�'�'��'�'�'�'�'�'�'�'�'�'�d�3�B�3�i�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'�'rc
�@�d�}|d���}|j}|s�tj|��dzdtj��vstj|��rtj|��ndtj|��d�z}ttj|�����d}g}|j	}t|��}d}||k}|}|r|j	d}	|	j}
|
}|}|�s�tjd	|fd
||f��dtj��vstjt��rtjt��nddtj��vstj|��rtj|��ndtj|��tj|��tj|��d�z}d
d|iz}
|�
|
��|rAdtj|	��tj|
��d�z}|�
|��tj|d��iz}tj|��dzd|iz}ttj|�����dx}x}x}x}x}x}x}	x}
}|j}d}||k}|s�tjd	|fd||f��dtj��vstj|��rtj|��ndtj|��tj|��d�z}tj|��dzd|iz}ttj|�����dx}x}}d}t!|��}||v}|�stjd|fd||f��tj|��dtj��vstjt ��rtjt ��nddtj��vstj|��rtj|��ndtj|��d�z}tjt!|����dzd|iz}ttj|�����dx}x}}|d���}|j	}g}||k}|s�tjd	|fd||f��d tj��vstj|��rtj|��nd tj|��tj|��d�z}tj|��dzd|iz}ttj|�����dx}x}}|j}d!}||k}|s�tjd	|fd||f��d tj��vstj|��rtj|��nd tj|��tj|��d�z}d"d|iz}ttj|�����dx}x}}t"j}d}|j}|||��}d}||k}|}|�sRtjd#|fd$||f��d%tj��vstjt"��rtjt"��nd%tj|��tj|��d tj��vstj|��rtj|��nd tj|��tj|��tj|��d&�z}
tjt'|j����d'zd(|
iz}ttj|�����dx}x}x}x}x}x}}|��}g}|j}|}|r|j	}g}||k}|}|�sad)d*tj��vstj|��rtj|��nd*tj|��d+�z}|�
|��|r�tjd	|fd,||f��d*tj��vstj|��rtj|��nd*tj|��tj|��d-�z} d.d/| iz}!|�
|!��tj|d��iz}"tj|��d0zd1|"iz}#ttj|#�����dx}x}x}x}x}}|j}d!}||k}|s�tjd	|fd||f��d*tj��vstj|��rtj|��nd*tj|��tj|��d�z}d"d|iz}ttj|�����dx}x}}dS)2Nc�R�tj��}|�dd��|�dd��}}|j||fi|��|�d|�d��zd|�d��zz��|�d���S)Nrrgr�r=r�r�)r"r#r	r$rGrHr%)�kwr
rr�s    r�buildz<test_a_preference_is_traded_and_a_rule_is_not.<locals>.buildbs����J�L�L���}�}�S�!�$�$�a�m�m�C��&;�&;�1�����A�q���B����	�
�
�1�q�u�u�Q�x�x�<�!�a�e�e�A�h�h�,�.�/�/�/��w�w�R�w� � � rr���softr�cheaprrirr)zO%(py7)s
{%(py7)s = %(py2)s(%(py5)s
{%(py5)s = %(py3)s.violated
})
} == %(py10)sr)rr�r�rryz%(py12)sr{z(not %(py17)s
{%(py17)s = %(py15)s.hard
})�py15r�z
>assert %(py21)s�py21�z1%(py2)s
{%(py2)s = %(py0)s.soft_cost
} == %(py5)sr�r�r�tradedr��z0%(py1)s in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}�str�rAr�rrCr�r�gI@)z0%(py2)s
{%(py2)s = %(py0)s.violated
} == %(py5)s�dearr�rW)�<)zv%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.copysign
}(%(py4)s, %(py7)s
{%(py7)s = %(py5)s.soft_cost
})
} < %(py12)s�math)rrrr�rr!r{z
>assert not %(py14)s�py14z%%(py4)s
{%(py4)s = %(py2)s.feasible
}�rule)rr)z1%(py8)s
{%(py8)s = %(py6)s.violated
} == %(py11)s)rCr�r�z%(py13)sr�z
>assert %(py16)s�py16)r&r'r(r)r*r+r,r-r.r�r�hardr/�append�_format_boolop�	soft_costrJrN�copysign�repr)$rArDr1r2r�r4rr�rOr�r��@py_assert18r�r��@py_format19r��@py_format22r3rYr6r5rPrRr�rL�@py_assert11r�r��@py_format16rPr�rQr��@py_format14�@py_format15�@py_format17s$                                    r�-test_a_preference_is_traded_and_a_rule_is_notr`]s:��
!�!�!�
�E�s�O�O�O�E��>� �>� � � �5� � � � � � � � � � � � � �5� � � � � �5� � � � � � �>� � � � � � � � � � � � � � � � � �I�I�u�~�I�3�~���I�!�I��!�#�I�I�I�I�I�E�N�1�,=�I�,=�,B�I�,B�(B�I�(B�I�I�I�I�I�I�I�I�I��!�I�I�I�I�I�I�I�I�I�I�I�I�3�I�I�I�I�I�3�I�I�I�I�I�I�I�I�I�I�I�I�I�u�I�I�I�I�I�u�I�I�I�I�I�I�~�I�I�I�I��I�I�I�I�!�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�,=�I�I�I�I�,B�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�E�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I��?�(�c�(�?�c�!�(�(�(�(�(�(�(�(�(�?�c�(�(�(�(�(�(�(�(�(�(�(�(�5�(�(�(�(�(�5�(�(�(�(�(�(�?�(�(�(�(�c�(�(�(�(�(�(�(�(�5�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(��-�s�5�z�z�-�8�z�!�-�-�-�-�-�-�-�-�-�8�z�-�-�-�-�-�8�-�-�-�-�-�-�-�-�-�-�-�s�-�-�-�-�-�s�-�-�-�-�-�-�-�-�-�-�-�-�-�5�-�-�-�-�-�5�-�-�-�-�-�-�z�-�-�-�-�-�-�-�-�3�u�:�:�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-�-��5�d����D��=�$�B�$�=�B��$�$�$�$�$�$�$�$�$�=�B�$�$�$�$�$�$�$�$�$�$�$�$�4�$�$�$�$�$�4�$�$�$�$�$�$�=�$�$�$�$�B�$�$�$�$�$�$�$�$��$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$�$��>� �S� �>�S� � � � � � � � � � �>�S� � � � � � � � � � � � �4� � � � � �4� � � � � � �>� � � � �S� � � � � � � � � � � � � � � � � � � � � � � � � � � ��}�K�S�K�$�.�K�}�}�S�.�1�1�K�A�K�1�A�5�K�K�5�K�5�K�K�K�K�K�K�K�1�A�K�K�K�K�K�K�K�K�K�K�K�K�t�K�K�K�K�K�t�K�K�K�K�K�K�}�K�K�K�K�S�K�K�K�K�K�K�K�K�K�K�K�$�K�K�K�K�K�$�K�K�K�K�K�K�.�K�K�K�K�1�K�K�K�K�A�K�K�K�K�K�K�K�K�t�D�N�7K�7K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K��5�7�7�D�6�6�4�=�6�=�6�=�6�T�]�6�b�6�]�b�0�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�4�6�6�6�6�6�4�6�6�6�6�6�6�=�6�6�6�6�6�6�6�6�6�6�6�6�6�=�6�6�6�6�6�6�6�]�b�6�6�6�6�6�6�6�6�6�6�6�6�T�6�6�6�6�6�T�6�6�6�6�6�6�]�6�6�6�6�b�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�$�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6�6��>� �S� �>�S� � � � � � � � � � �>�S� � � � � � � � � � � � �4� � � � � �4� � � � � � �>� � � � �S� � � � � � � � � � � � � � � � � � � � � � � � � � � � � rc����tj����fd�td��D��}��|dd�����td�|D��������d���}|j}|s�tj	|��d	zd
tj��vstj|��rtj
|��nd
tj
|��d�z}ttj|�����d}|j}d}||k}|s�tjd
|fd||f��d
tj��vstj|��rtj
|��nd
tj
|��tj
|��d�z}tj	|��dzd|iz}ttj|�����dx}x}}dS)Nc�@��g|]}��d|������Sr^r`rbs  �rrdzGtest_a_soft_price_is_squared_because_the_penalty_is.<locals>.<listcomp>}r�rrfrir�rBc3�FK�|]}d|�d��zV��dS)r<riNrjrs  rrlzFtest_a_soft_price_is_squared_because_the_penalty_is.<locals>.<genexpr>s0����-�-�Q�2����a���=�-�-�-�-�-�-rr?r�rrrg"@rrGr�r�r)r"r#rqrxrGrsr%r&r'r(r)r*r+r,r-r.rUr/)	rvrr1r2r�r3rYr6r
s	        @r�3test_a_soft_price_is_squared_because_the_penalty_isrd{s
���
�
���A�	.�	.�	.�	.�U�1�X�X�	.�	.�	.�B��I�I�b�!�#�I�����J�J�s�-�-�"�-�-�-�-�-�.�.�.�	���b����A��:��:����q��������������1������1�������:������������������
�;� �#� �;�#�� � � � � � � � � �;�#� � � � � � � � � � � � �1� � � � � �1� � � � � � �;� � � � �#� � � � � � � � �q� � � � � � � � � � � � � � � � � � � � � � � � � � rc���tjd��}td��D]}|�||dzdzd��� |�dd���}gd�|_|j}d}|}||k}|s�tjd|fd	||f��d
tj
��vstj|��rtj|��nd
tj|��tj|��d�z}dd
|iz}ttj|�����dx}x}x}}tjt"d���5gd�|_ddd��n#1swxYwYtjt"d���5gd�|_ddd��n#1swxYwY|j}d}|}||k}|s�tjd|fd	||f��d
tj
��vstj|��rtj|��nd
tj|��tj|��d�z}tjd��dzd
|iz}ttj|�����dx}x}x}}dS)Nrfrir���r��seed)ririririg@r)z/%(py2)s
{%(py2)s = %(py0)s.energy
} == -%(py5)s�simr�rr�z4 nodesrD)riririz-1/\+1)rirririz#a refused write must not half-applyr�)r"�Modelrq�couplerAr��energyr'r/r)r*r+r,r-r.rIrJrKr()	�mrcrir1r�r4r3rRr�s	         r�Etest_a_state_computed_elsewhere_is_scored_by_the_same_code_or_refusedrn�s?��	�����A�
�1�X�X�&�&��	����Q��U�a�K��%�%�%�%�
�'�'�s��'�
#�
#�C����C�I��:��#��#���:������������:��������������3������3�������:�����#������������������������������
��z��	3�	3�	3����I�I��	�������������������	��z��	3�	3�	3�!�!� �L�L��	�!�!�!�!�!�!�!�!�!�!�!����!�!�!�!��:�D�#�D�#��D�:���D�D�D�D�D�D�D�D�D�:��D�D�D�D�D�D�D�D�D�D�D�D�3�D�D�D�D�D�3�D�D�D�D�D�D�:�D�D�D�D�#�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�Ds$�
E�E�"E�
F�F�Fc��	�tj���	�	fd�dD��\}}}�	�d|�d��z|�d��z|�d��z���	�d���}|j}d}||k}|s�t
jd|fd||f��d	tj	��vst
j
|��rt
j|��nd	t
j|��t
j|��d
�z}t
j|��dzd|iz}tt
j|�����dx}x}}|j}d
}||k}|s�t
jd|fd||f��d	tj	��vst
j
|��rt
j|��nd	t
j|��t
j|��d
�z}t
j|��dzd|iz}tt
j|�����dx}x}}dS)Nc3�B�K�|]}��|��V��dSr5r`r
s  �rrlzctest_the_ancilla_count_is_readable_because_sampling_a_reduced_model_is_not_sound.<locals>.<genexpr>�s-�����*�*�q�q�x�x��{�{�*�*�*�*�*�*r�abcrrir(r�r)z0%(py2)s
{%(py2)s = %(py0)s.ancillas
} == %(py5)sr�r�r�rrfr$)r"r#rGrHr%�ancillasr'r/r)r*r+r,r(r-r.r�)
rr�r�r�r1r�r3rYr6r
s
         @r�Ptest_the_ancilla_count_is_readable_because_sampling_a_reduced_model_is_not_soundrs�sc���
�
���A�*�*�*�*�E�*�*�*�G�A�q�!��J�J�q�1�5�5��8�8�|�a�e�e�A�h�h�&����q���1�2�2�2�
�'�'��'�
�
�C��<�!�1�!�<�1��!�!�!�!�!�!�!�!�!�<�1�!�!�!�!�!�!�!�!�!�!�!�!�3�!�!�!�!�!�3�!�!�!�!�!�!�<�!�!�!�!�1�!�!�!�!�!�!�!�!�c�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!�!��9����9��>����������9��������������3������3�������9��������������3��������������������������rc	�|�tjd��}td��D]}|�||dzd���|�dd���}|���}g}d}||u}|}|r(t
|��}t|��}	d}
|	|
k}|}|�s$tj	d|fd||f��dtj��vstj|��rtj
|��ndtj
|��d	�z}d
d|iz}
|�|
��|�rAtj	d|fd
|	|
f��dtj��vstjt��rtj
t��nddtj��vstjt��rtj
t��nddtj��vstj|��rtj
|��ndtj
|��tj
|	��tj
|
��d�z}dd|iz}|�|��tj|d��iz}tj|��dzd|iz}t#tj|�����dx}x}x}x}x}x}	x}}
|j}|��}d}|}||k}|s�tj	d|fd||f��dtj��vstj|��rtj
|��ndtj
|��tj
|��tj
|��d�z}dd|iz}t#tj|�����dx}x}x}x}}dS)Nr
r=rir�rgr�)z%(py2)s is not %(py5)s�state)rr�z%(py7)srr)zU%(py15)s
{%(py15)s = %(py9)s(%(py13)s
{%(py13)s = %(py10)s(%(py11)s)
})
} == %(py18)srr�)r!ryr�r�rE�py18z%(py20)s�py20rz
>assert %(py23)s�py23g@)zS%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exact_ground_energy
}()
} == -%(py7)srirzassert %(py10)sry)r"rjrqrkrA�exact_ground_stater�rr'r/r)r*r+r,rSrTr(r-r.�exact_ground_energy)rmrcrirur1r�r3rO�@py_assert12r��@py_assert17r�rYr6rY�@py_format21rZ�@py_format24r4r�r5r�r�s                       r�;test_the_exact_ground_state_is_readable_not_only_its_energyr�s$��
�����A�
�1�X�X� � ��	����A��E�3�����
�'�'�s��'�
#�
#�C��"�"�$�$�E�<�<��<�5���<�<�<�<�<�S��Z�Z�<��Z���<�A�<��A�!5�<�<�<�<�<�<�<�<�<�<�<�5��<�<�<�<�<�<�<�<�<�<�<�<�5�<�<�<�<�<�5�<�<�<�<�<�<��<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<��A�<�<�<�<�<�<�<�<�<�<�<�<��<�<�<�<�<��<�<�<�<�<�<�<�<�<�<�<�<�<�S�<�<�<�<�<�S�<�<�<�<�<�<�<�<�<�<�<�<�<��<�<�<�<�<��<�<�<�<�<�<�Z�<�<�<�<��<�<�<�<�A�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�u�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�<��"�,�"�"�$�$�,��,���,�$��,�,�,�,�,�,�,�,�,�,�$��,�,�,�,�,�,�,�,�,�,�,�,�3�,�,�,�,�,�3�,�,�,�,�,�,�"�,�,�,�,�$�,�,�,�,��,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,�,rc� ��	�tj���	�	fd�td��D��}�	�|���	�d�����j}|s�t
j���dzdtj	��vst
j
���rt
j���ndt
j|��d�z}tt
j
|�����d}�fd�td��D��}t|��}gd	�}||k}|s�t
jd
|fd||f��dtj	��vst
j
t��rt
jt��ndt
j|��t
j|��t
j|��d
�z}t
j���dzd|iz}tt
j
|�����dx}x}x}}dS)Nc�B��g|]}��d|��d����S)r�rfrrbs  �rrdzTtest_all_different_solves_a_latin_square_row_and_names_the_clash.<locals>.<listcomp>�s-���5�5�5�q����w�1�w�w��	"�	"�5�5�5rrf�<r�rrrc3�.�K�|]}�d|��V��dS)r�Nr�)rrcrs  �rrlzStest_all_different_solves_a_latin_square_row_and_names_the_clash.<locals>.<genexpr>�s-�����/�/��!�G��G�G�*�/�/�/�/�/�/r)rrirgrrr�sortedrr r!)r"r#rq�
all_differentr%r&r'r(r)r*r+r,r-r.r�r/)
r_r1r2r3r4r5r6r7rr
s
        @@r�@test_all_different_solves_a_latin_square_row_and_names_the_clashr��s����
�
���A�5�5�5�5�E�!�H�H�5�5�5�A��O�O�A����	���b����A��:��:����q��������������1������1�������:������������������/�/�/�/�e�A�h�h�/�/�/�B�6�/�/�/�B�<�<�<�B�/�<�?�B�B�B�B�B�B�B�B�B�/�<�B�B�B�B�B�B�B�B�B�B�B�B�6�B�B�B�B�B�6�B�B�B�B�B�B�/�B�B�B�B�/�B�B�B�B�<�B�B�B�B�B�B�B�B��B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B�Brc�"��tj����fd�td��D��}��|��t	jtd���5��d���ddd��dS#1swxYwYdS)Nc�B��g|]}��d|��d����S)r�rrrbs  �rrdzTtest_an_impossible_all_different_is_refused_rather_than_annealed.<locals>.<listcomp>�s-���	6�	6�	6��!�-�-��A����
#�
#�	6�	6�	6rr=zNo assignment can satisfyrDr(r�)r"r#rqr�rIrJrKr%)�xsr
s @r�@test_an_impossible_all_different_is_refused_rather_than_annealedr��s����	�
���A�	6�	6�	6�	6�U�1�X�X�	6�	6�	6�B��O�O�B����	��z�)D�	E�	E�	E���	���a�������������������������s� B�B�Bc
��tj��}|�ddd��}|�ddd��}|�||g��tj��}|�ddd��|�ddd��|j}d}||���}|j}|j}d}	||	���}
|
j}||k}|�sZt
jd	|fd
||f��dtj	��vst
j
|��rt
j|��ndt
j|��t
j|��t
j|��t
j|��dtj	��vst
j
|��rt
j|��ndt
j|��t
j|	��t
j|
��t
j|��d�
z}
dd
|
iz}tt
j
|�����dx}x}x}x}x}x}x}	x}
}dS)Nrrrr�r;r>rfr�r)z�%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.solve
}(tries=%(py4)s)
}.spins
} == %(py18)s
{%(py18)s = %(py16)s
{%(py16)s = %(py12)s
{%(py12)s = %(py10)s.solve
}(tries=%(py14)s)
}.spins
})
rrrrCr�ryr{rOrQrvzassert %(py20)srw)r"r#rFr�r%r�r'r/r)r*r+r,r-r.)rr�r�r�r1r3r5r�r[�@py_assert13r�r|rrYr}s               r�0test_all_different_over_disjoint_domains_is_freer��sa��	�
���A�!�)�)�C��A�.�.�a�A�I�I�c�2�r�4J�4J���O�O�Q��F����
�
���A�a�i�i��Q��*�*�*�A�I�I�c�2�r�,B�,B�,B��7�;��;�7�7�����;��!�;�Q�W�;�1�;�W�W�1�%5�%5�%5�;�%5�%;�;�!�%;�;�;�;�;�;�;�;�;�;�;�!�%;�;�;�;�;�;�;�;�;�;�;�;�;�1�;�;�;�;�;�1�;�;�;�;�;�;�7�;�;�;�;��;�;�;�;��;�;�;�;�!�;�;�;�;�;�;�;�;�;�;�;�Q�;�;�;�;�;�Q�;�;�;�;�;�;�W�;�;�;�;�1�;�;�;�;�%5�;�;�;�;�%;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;�;rc�&	�tj��}|�ddd���|�ddd���|�dd��|�d�	��}|j}t|��}d
}||k}|�st
jd|fd||f��d
tj	��vst
j
t
��rt
jt
��nd
dtj	��vst
j
|��rt
j|��ndt
j|��t
j|��t
j|��d�z}t
j|j��dzd|iz}tt
j|�����dx}x}x}}d}|jd}	||	v}|slt
jd|fd||	f��t
j|��t
j|	��d�z}
dd|
iz}tt
j|�����dx}x}}	g}d}|jd}
||
v}|}|sd}|jd}||v}|}|�st
jd|fd||
f��t
j|��t
j|
��d�z}dd|iz}|�|��|s`t
jd|fd||f��t
j|��t
j|��d �z}d!d"|iz}|�|��t
j|d
��iz}d#d$|iz}tt
j|�����dx}x}x}x}x}
x}x}}d%}t#|��}
||
v}|s�t
jd|fd&||
f��t
j|��d'tj	��vst
j
t"��rt
jt"��nd'dtj	��vst
j
|��rt
j|��ndt
j|
��d(�z}d)d|iz}tt
j|�����dx}x}}
dS)*Nr�r
rarr�r(�zrfr�rir)zM%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.caveats
})
} == %(py8)srrr�r�ryz'x'rr�)z%(py1)s in %(py4)sr@rBrCr!zpower of two)z%(py3)s in %(py6)s)r�rCz%(py8)sr�)z%(py11)s in %(py14)s)r�rOz%(py16)srQzassert %(py19)sr�zcaveat:rIrJrKr)r"r#r	r%�caveatsrr'r/r)r*r+r,r(r-r.rSrTrJ)r
rrPr�r�r4r�r�rOr3rQrRr1r5r�r�r{r^r_r�r�s                     r�<test_an_encoding_that_cannot_be_exact_is_reported_not_hiddenr��s#��	�
���A��M�M�#�q�8�M�,�,�,��M�M�#�q�8�M�,�,�,��M�M�#�q����	���a����A��y�)�3�y�>�>�)�Q�)�>�Q��)�)�)�)�)�)�)�)�)�>�Q�)�)�)�)�)�)�)�)�)�)�)�)�3�)�)�)�)�)�3�)�)�)�)�)�)�)�)�)�)�)�)�)�q�)�)�)�)�)�q�)�)�)�)�)�)�y�)�)�)�)�>�)�)�)�)�Q�)�)�)�)�)�)�)�)��	�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�� �A�I�a�L� �5�L� � � � � � � � � � �5�L� � � � � �5� � � � �L� � � � � � � � � � � � � � � � � � � � � � � � � � � �F�F�9�F��	�!��F�9��$�F�F�F�F�F��F�!�)�A�,�F��,�(F�F�F�F�F�F�F�F�F�F�F�F�9��F�F�F�F�F�9�F�F�F�F��F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F��,�F�F�F�F�F��F�F�F�F�,�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F����A����9������������9�������9��������������������������������A������A������������������������������������rc	��tj��}|�dd��|�ddd��|j}d}||���}|j}g}||k}|s�t
jd|fd	||f��d
tj	��vst
j
|��rt
j|��nd
t
j|��t
j|��t
j|��t
j|��t
j|��d�z}dd
|iz}tt
j
|�����dx}x}x}x}x}}dS)Nrr=r�rrfrfr�r)zo%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.solve
}(tries=%(py4)s)
}.caveats
} == %(py11)sr
)rrrrCr�r�zassert %(py13)sr�)r"r#r	rFr%r�r'r/r)r*r+r,r-r.)	r
r1r3r5r�r�rr�r]s	         r�&test_an_exact_model_carries_no_caveatsr��sz��
�
���A��M�M�#�q�����I�I�c�1�a�����7�)��)�7�7�����)��#�)�r�)�#�r�)�)�)�)�)�)�)�)�)�)�#�r�)�)�)�)�)�)�)�)�)�)�)�)�1�)�)�)�)�)�1�)�)�)�)�)�)�7�)�)�)�)��)�)�)�)��)�)�)�)�#�)�)�)�)�r�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)r)5�__doc__�builtinsr)�_pytest.assertion.rewrite�	assertion�rewriter'rN�sys�pathlibrrI�path�insertrJ�__file__�resolve�parent�
ferrothermr"r8rSrZr�r�r�r�r�r�r�r�r�r�r�rrrr&r)r,r2r6r<r`rdrnrsrr�r�r�r�r�r�rr�<module>r�s���	�	������������������
�
�
�
�������
�
�
�
������3�3�t�t�H�~�~�-�-�/�/�6�7�7�8�8�8�����<�<�<�
�
�
�%�%�%�S�S�S�,3�3�3�
D�
D�
D�h�h�h�*���	W�	W�	W�/�/�/�	N�	N�	N�M�M�M�(���*X�X�X�(�(�(�(A�A�A�(&�&�&�;�;�;�@���
�
�
�	6�	6�	6����(�(�(�!�!�!�<
!�
!�
!�E�E�E�,���-�-�-�C�C�C����<�<�<����*�*�*�*�*r