user
# Hashtron classifier inference

## Description

This task involves implementing a Hashtron classifier inference function. Hashtron
classifier program can be machine learned to calculate arbitrary finite computable
functions or sets (Given enough CPU time and RAM).
The Hashtron classifier takes a command and a number of bits to infer, using a
provided program configuration. The inference function for the test will generate a
pseudo-random n-bits output. The inference function for the square root demo will
generate a square root of a command in range: 0 <= command < 256.

## Examples

### Test demo

Given the following program configuration and input command:

Program configuration:

Input command:

```
42
```

Number of bits:

```
64
```

Program:

```
[[0,2]]
```

The inference function should process the input and generate the following 64-bit output:

```
14106184687260844995
```

### Square root demo

Given the following program configuration and input command:

Program configuration:

Input command: A byte (integer) to take square root of.

Number of bits:

```
4
```

Program:

```
[[8776,79884], [12638,1259], [9953,1242], [4658,1228], [5197,1210], [12043,1201],
[6892,1183], [7096,1168], [10924,1149], [5551,1136], [5580,1123], [3735,1107],
[3652,1091], [12191,1076], [14214,1062], [13056,1045], [14816,1031], [15205,1017],
[10736,1001], [9804,989], [13081,974], [6706,960], [13698,944], [14369,928],
[16806,917], [9599,906], [9395,897], [4885,883], [10237,870], [10676,858],
[18518,845], [2619,833], [13715,822], [11065,810], [9590,799], [5747,785],
[2627,776], [8962,764], [5575,750], [3448,738], [5731,725], [9434,714],
[3163,703], [3307,690], [3248,678], [3259,667], [3425,657], [3506,648],
[3270,639], [3634,627], [3077,617], [3511,606], [27159,597], [27770,589],
[28496,580], [28481,571], [29358,562], [31027,552], [30240,543], [30643,534],
[31351,527], [31993,519], [32853,510], [33078,502], [33688,495], [29732,487],
[29898,480], [29878,474], [26046,468], [26549,461], [28792,453], [26101,446],
[32971,439], [29704,432], [23193,426], [29509,421], [27079,415], [32453,409],
[24737,404], [25725,400], [23755,395], [52538,393], [53242,386], [19609,380],
[26492,377], [24566,358], [31163,368], [57174,363], [26639,364], [31365,357],
[60918,350], [21235,338], [28072,322], [28811,314], [27571,320], [17635,309],
[51968,169], [54367,323], [60541,254], [26732,270], [52457,157], [27181,276],
[19874,227], [22797,320], [59346,271], [25496,260], [54265,231], [22281,250],
[42977,318], [26008,240], [87604,142], [94647,314], [52292,157], [20999,216],
[89253,316], [22746,29], [68338,312], [22557,317], [110904,104], [70975,285],
[51835,277], [51871,313], [132221,228], [18522,290], [68512,285], [118816,302],
[150865,268], [68871,273], [68139,290], [84984,285], [150693,266], [396047,272],
[84923,269], [215562,258], [68015,248], [247689,235], [214471,229], [264395,221],
[263287,212], [280193,201], [108065,194], [263616,187], [148609,176], [263143,173],
[378205,162], [312547,154], [50400,147], [328927,140], [279217,132], [181111,127],
[672098,118], [657196,113], [459383,111], [833281,105], [520281,102], [755397,95],
[787994,91], [492444,82], [1016592,77], [656147,71], [819893,66], [165531,61],
[886503,57], [1016551,54], [3547827,49], [14398170,43], [395900,41], [4950628,37],
[11481175,33], [100014881,30], [8955328,31], [11313984,27], [13640855,23],
[528553762,21], [63483027,17], [952477,8], [950580,4], [918378,2], [918471,1]]
```

The inference function should process the input and generate the square root of the input byte.
assistant
Translation of #Phix and Go

```
# 20240530 Raku programming solution

sub Inference($command, $bits, @program) {
   my  $out = 0;

   return $out unless @program.Bool;

   for ^$bits -> $j { # Iterate over the bits
      my $input = $command +| ($j +< 16);
      $input = Hashtron($input, @program[0][0], my $maxx = @program[0][1]);
      for @program[1..*] -> ($s, $max) {
         $input = Hashtron($input, $s, $maxx -= $max);
      }
      if ( $input +&= 1 ) != 0 { $out +|= 1 +< $j }
   }
   return $out;
}

sub Hashtron($n, $s, $max) {
   # Mixing stage, mix input with salt using subtraction
   my $m = $n - $s;

   # Hashing stage, use xor shift with prime coefficients
   for <-2 -3 +5 +7 -11 -13 +17 -19> -> $p {
      $m = ($m +^ ($m +> $p)) +& 0xFFFFFFFF; 
   }

   # Mixing stage 2, mix input with salt using addition
   $m = ($m + $s) +& 0xFFFFFFFF;

   # Modular stage using Lemire's fast alternative to modulo reduction
   return (($m * $max) +> 32) +& 0xFFFFFFFF;
}

sub MAIN() {
   say  "Test demo:\n{ Inference(42, 64, (<0 2>,)) } \n";
   say "Square root demo for commands in [0, 255]:";

   for ^256 .rotor(16) -> @i {
      say [~] @i.map: { sprintf( "%2d ", Inference($_, 4, (
         <8776 79884>, <12638 1259>, <9953 1242>, <4658 1228>, <5197 1210>,
         <12043 1201>, <6892 1183>, <7096 1168>, <10924 1149>, <5551 1136>, 
         <5580 1123>, <3735 1107>, <3652 1091>, <12191 1076>, <14214 1062>, 
         <13056 1045>, <14816 1031>, <15205 1017>, <10736 1001>, <9804 989>, 
         <13081 974>, <6706 960>, <13698 944>, <14369 928>, <16806 917>, 
         <9599 906>, <9395 897>, <4885 883>, <10237 870>, <10676 858>,
         <18518 845>, <2619 833>, <13715 822>, <11065 810>, <9590 799>, 
         <5747 785>, <2627 776>, <8962 764>, <5575 750>, <3448 738>, 
         <5731 725>, <9434 714>, <3163 703>, <3307 690>, <3248 678>, 
         <3259 667>, <3425 657>, <3506 648>, <3270 639>, <3634 627>, 
         <3077 617>, <3511 606>, <27159 597>, <27770 589>, <28496 580>, 
         <28481 571>, <29358 562>, <31027 552>, <30240 543>, <30643 534>,
         <31351 527>, <31993 519>, <32853 510>, <33078 502>, <33688 495>, 
         <29732 487>, <29898 480>, <29878 474>, <26046 468>, <26549 461>, 
         <28792 453>, <26101 446>, <32971 439>, <29704 432>, <23193 426>, 
         <29509 421>, <27079 415>, <32453 409>, <24737 404>, <25725 400>, 
         <23755 395>, <52538 393>, <53242 386>, <19609 380>, <26492 377>, 
         <24566 358>, <31163 368>, <57174 363>, <26639 364>, <31365 357>,
         <60918 350>, <21235 338>, <28072 322>, <28811 314>, <27571 320>, 
         <17635 309>, <51968 169>, <54367 323>, <60541 254>, <26732 270>, 
         <52457 157>, <27181 276>, <19874 227>, <22797 320>, <59346 271>, 
         <25496 260>, <54265 231>, <22281 250>, <42977 318>, <26008 240>, 
         <87604 142>, <94647 314>, <52292 157>, <20999 216>, <89253 316>, 
         <22746 29>, <68338 312>, <22557 317>, <110904 104>, <70975 285>,
         <51835 277>, <51871 313>, <132221 228>, <18522 290>, <68512 285>, 
         <118816 302>, <150865 268>, <68871 273>, <68139 290>, <84984 285>, 
         <150693 266>, <396047 272>, <84923 269>, <215562 258>, <68015 248>, 
         <247689 235>, <214471 229>, <264395 221>, <263287 212>, <280193 201>, 
         <108065 194>, <263616 187>, <148609 176>, <263143 173>, <378205 162>, 
         <312547 154>, <50400 147>, <328927 140>, <279217 132>, <181111 127>,
         <672098 118>, <657196 113>, <459383 111>, <833281 105>, <520281 102>, 
         <755397 95>, <787994 91>, <492444 82>, <1016592 77>, <656147 71>, 
         <819893 66>, <165531 61>, <886503 57>, <1016551 54>, <3547827 49>, 
         <14398170 43>, <395900 41>, <4950628 37>, <11481175 33>, 
         <100014881 30>, <8955328 31>, <11313984 27>, <13640855 23>,
         <528553762 21>, <63483027 17>, <952477 8>, <950580 4>, <918378 2>, 
         <918471 1> )
      ))} 
   } 
}

```

You may Attempt This Online!

Output:

```
Test demo:
14106184687260844995 

Square root demo for commands in [0, 255]:
 0  1  1  1  2  2  2  2  2  3  3  3  3  3  3  3 
 4  4  4  4  4  4  4  4  4  5  5  5  5  5  5  5 
 5  5  5  5  6  6  6  6  6  6  6  6  6  6  6  6 
 6  7  7  7  7  7  7  7  7  7  7  7  7  7  7  7 
 8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8 
 8  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9 
 9  9  9  9 10 10 10 10 10 10 10 10 10 10 10 10 
10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 
11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 
12 12 12 12 12 12 12 12 12 13 13 13 13 13 13 13 
13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 
13 13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 
14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 
14 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 
15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 
```