Hashtron inference: Difference between revisions
Content deleted Content added
go |
Added Wren |
||
Line 310: | Line 310: | ||
} |
} |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
=={{header|Wren}}== |
|||
{{trans|Python}} |
|||
{{libheader|Wren-long}} |
|||
{{libheader|Wren-fmt}} |
|||
<syntaxhighlight lang="wren">import "./long" for ULong |
|||
import "./fmt" for Fmt |
|||
var hash = Fn.new { |n, s, max| |
|||
// 32 bit mask |
|||
var k = 0xFFFFFFFF |
|||
// Mixing stage, mix input with salt using subtraction |
|||
var m = (n - s) & k |
|||
// Hashing stage, use xor shift with prime coefficients |
|||
m = m ^ ((m << 2) & k) |
|||
m = m ^ ((m << 3) & k) |
|||
m = m ^ ((m >> 5) & k) |
|||
m = m ^ ((m >> 7) & k) |
|||
m = m ^ ((m << 11) & k) |
|||
m = m ^ ((m << 13) & k) |
|||
m = m ^ ((m >> 17) & k) |
|||
m = m ^ ((m << 19) & k) |
|||
// Mixing stage 2, mix input with salt using addition |
|||
m = (m + s) & k |
|||
// Modular stage using Lemire's fast alternative to modulo reduction |
|||
return ((ULong.new(m) * ULong.new(max)) >> 32).toSmall & k |
|||
} |
|||
var inference = Fn.new { |command, bits, program| |
|||
var out = ULong.zero |
|||
// Check if the program is empty |
|||
if (program.count == 0) return out |
|||
// Iterate over the bits |
|||
for (j in 0...bits) { |
|||
var input = command | (j << 16) |
|||
var ss = program[0][0] |
|||
var maxx = program [0][1] |
|||
input = hash.call(input, ss, maxx) |
|||
for (i in 1...program.count) { |
|||
var s = program[i][0] |
|||
var max = program[i][1] |
|||
maxx = maxx - max |
|||
input = hash.call(input, s, maxx) |
|||
} |
|||
input = input & 1 |
|||
if (input != 0) out = out | (ULong.one << j) |
|||
} |
|||
return out |
|||
} |
|||
System.print("Test demo:") |
|||
var program = [[0, 2]] |
|||
System.print(inference.call(42, 64, program)) |
|||
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] |
|||
] |
|||
System.print("\nSquare root demo for commands in [0, 255]:") |
|||
Fmt.tprint("$2i", (0..255).map { |i| inference.call(i, 4, program) }, 16)</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
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 |
|||
</pre> |