11const std = @import ("std" );
22const Config = @import ("config.zig" ).Config ;
33const energy = @import ("energy.zig" );
4+ const key = @import ("key.zig" );
45const pressure = @import ("pressure.zig" );
56const Stats = @import ("stats.zig" ).Stats ;
7+ const util = @import ("../internal/util.zig" );
68
79pub const BlockResult = struct {
810 accepted : bool ,
@@ -58,8 +60,16 @@ pub fn tryTransportBlock(comptime T: type, block: []T, cfg: Config, stats: ?*Sta
5860 std .debug .assert (block .len <= Config .max_block_size );
5961 if (stats ) | s | s .transport_blocks_visited += 1 ;
6062
61- const before_energy = energy .blockEnergy (T , block , cfg );
62- if (block .len <= 1 or before_energy == 0 ) {
63+ if (block .len <= 1 or util .isSorted (T , block )) {
64+ if (stats ) | s | s .transport_blocks_rejected += 1 ;
65+ return .{ .accepted = false , .before_energy = 0 , .after_energy = 0 };
66+ }
67+
68+ var keys : [Config .max_block_size ]key .KeyType (T ) = undefined ;
69+ for (block , 0.. ) | value , i | keys [i ] = key .biasedKey (T , value );
70+
71+ const before_energy = energy .blockEnergyFromKeys (T , keys [0.. block .len ], cfg );
72+ if (before_energy == 0 ) {
6373 if (stats ) | s | s .transport_blocks_rejected += 1 ;
6474 return .{ .accepted = false , .before_energy = before_energy , .after_energy = before_energy };
6575 }
@@ -72,8 +82,9 @@ pub fn tryTransportBlock(comptime T: type, block: []T, cfg: Config, stats: ?*Sta
7282 var desired : [Config .max_block_size ]usize = undefined ;
7383 var source_to_final : [Config .max_block_size ]usize = undefined ;
7484 var candidate : [Config .max_block_size ]T = undefined ;
85+ var candidate_keys : [Config .max_block_size ]key .KeyType (T ) = undefined ;
7586
76- pressure .compute (T , block , cfg , pressures [0.. block .len ]);
87+ pressure .computeFromKeys (T , keys [0 .. block . len ] , cfg , pressures [0.. block .len ]);
7788 pressure .proposalsFromPressure (pressures [0.. block .len ], cfg , proposals [0.. block .len ]);
7889
7990 var changed = false ;
@@ -95,9 +106,10 @@ pub fn tryTransportBlock(comptime T: type, block: []T, cfg: Config, stats: ?*Sta
95106 std .debug .assert (isPermutation (source_to_final [0.. block .len ]));
96107 for (block , 0.. ) | value , source_index | {
97108 candidate [source_to_final [source_index ]] = value ;
109+ candidate_keys [source_to_final [source_index ]] = keys [source_index ];
98110 }
99111
100- const after_energy = energy .blockEnergy (T , candidate [0.. block .len ], cfg );
112+ const after_energy = energy .blockEnergyFromKeys (T , candidate_keys [0.. block .len ], cfg );
101113 if (after_energy >= before_energy ) {
102114 std .debug .assert (equalSlices (T , block , original [0.. block .len ]));
103115 if (stats ) | s | s .transport_blocks_rejected += 1 ;
0 commit comments