This commit is contained in:
Christian Semmler 2025-03-05 14:51:09 -07:00
parent 5bb733603d
commit 43fed35196
3 changed files with 79 additions and 86 deletions

View File

@ -108,14 +108,7 @@ jobs:
matrix:
instance: [0, 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]
20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
steps:
- uses: actions/checkout@v4
@ -145,7 +138,7 @@ jobs:
# Get the first 8 characters of the SHA (enough for a decent seed)
SHA_PREFIX=$(echo "${{ github.sha }}" | cut -c 1-8)
tools/entropy.sh $((16#$SHA_PREFIX + ${{ matrix.instance }}))
python3 tools/entropy.py $((16#$SHA_PREFIX + ${{ matrix.instance }})) > entropy.h
- name: Build
shell: cmd
@ -239,12 +232,12 @@ jobs:
reccmp-project detect --what original --search-path legobin
reccmp-project detect --what recompiled --search-path build
- name: Denoise Accuracy
- name: Summarize Accuracy
shell: bash
run: |
reccmp-denoise --samples $(find build-entropy -type f -name "CONFIGPROGRESS.json") --output CONFIGPROGRESS.json
reccmp-denoise --samples $(find build-entropy -type f -name "ISLEPROGRESS.json") --output ISLEPROGRESS.json
reccmp-denoise --samples $(find build-entropy -type f -name "LEGO1PROGRESS.json") --output LEGO1PROGRESS.json
reccmp-reccmp -S CONFIGPROGRESS.SVG --svg-icon assets/config.png --target CONFIG --json CONFIGPROGRESS.json
reccmp-reccmp -S ISLEPROGRESS.SVG --svg-icon assets/isle.png --target ISLE --json ISLEPROGRESS.json
reccmp-reccmp -S LEGO1PROGRESS.SVG --svg-icon assets/lego1.png --target LEGO1 --json LEGO1PROGRESS.json
- name: Compare Accuracy With Current Master
shell: bash
@ -257,9 +250,31 @@ jobs:
curl -fLSs -o LEGO1PROGRESS-old.json $RELEASE_URL/LEGO1PROGRESS.json || echo "" >LEGO1PROGRESS-old.json
# Compare with current master
reccmp-denoise --diff CONFIGPROGRESS-old.json CONFIGPROGRESS.json
reccmp-denoise --diff ISLEPROGRESS-old.json ISLEPROGRESS.json
reccmp-denoise --diff LEGO1PROGRESS-old.json LEGO1PROGRESS.json
reccmp-reccmp --target CONFIG --diff CONFIGPROGRESS-old.json || echo "Current master not found"
reccmp-reccmp --target ISLE --diff ISLEPROGRESS-old.json || echo "Current master not found"
reccmp-reccmp --target LEGO1 --diff LEGO1PROGRESS-old.json || echo "Current master not found"
- name: Aggregate Accuracy
shell: bash
run: |
reccmp-aggregate --samples $(find build-entropy -type f -name "CONFIGPROGRESS.json") --output CONFIGPROGRESS-agg.json
reccmp-aggregate --samples $(find build-entropy -type f -name "ISLEPROGRESS.json") --output ISLEPROGRESS-agg.json
reccmp-aggregate --samples $(find build-entropy -type f -name "LEGO1PROGRESS.json") --output LEGO1PROGRESS-agg.json
- name: Compare Aggregate Accuracy With Current Master
shell: bash
env:
RELEASE_URL: https://github.com/isledecomp/isle/releases/download/continuous
run: |
# Download the current master state
curl -fLSs -o CONFIGPROGRESS-agg-old.json $RELEASE_URL/CONFIGPROGRESS-agg.json || echo "" >CONFIGPROGRESS-agg-old.json
curl -fLSs -o ISLEPROGRESS-agg-old.json $RELEASE_URL/ISLEPROGRESS-agg.json || echo "" >ISLEPROGRESS-agg-old.json
curl -fLSs -o LEGO1PROGRESS-agg-old.json $RELEASE_URL/LEGO1PROGRESS-agg.json || echo "" >LEGO1PROGRESS-agg-old.json
# Compare with current master
reccmp-aggregate --diff CONFIGPROGRESS-agg-old.json CONFIGPROGRESS-agg.json || echo "Current master not found"
reccmp-aggregate --diff ISLEPROGRESS-agg-old.json ISLEPROGRESS-agg.json || echo "Current master not found"
reccmp-aggregate --diff LEGO1PROGRESS-agg-old.json LEGO1PROGRESS-agg.json || echo "Current master not found"
- name: Test Exports
shell: bash
@ -285,9 +300,9 @@ jobs:
with:
name: Accuracy Report
path: |
CONFIGPROGRESS.*
ISLEPROGRESS.*
LEGO1PROGRESS.*
CONFIGPROGRESS*
ISLEPROGRESS*
LEGO1PROGRESS*
upload:
name: Upload artifacts

45
tools/entropy.py Normal file
View File

@ -0,0 +1,45 @@
import random
import string
import sys
# Parameters for tweaking:
MAX_CLASSES = 10
MAX_FUNC_PER_CLASS = 10
# Only the unique suffix, not counting "Class" or "Function"
CLASS_NAME_LEN = 6
FUNC_NAME_LEN = 8
def random_camel_case(length: int) -> str:
"""Return a random string with first letter capitalized."""
return "".join(
[
random.choice(string.ascii_uppercase),
*random.choices(string.ascii_lowercase, k=length - 1),
]
)
# If the first parameter is an integer, use it as the seed.
try:
seed = int(sys.argv[1])
except (IndexError, ValueError):
seed = random.randint(0, 10000)
random.seed(seed)
print(f"// Seed: {seed}\n")
num_classes = random.randint(1, MAX_CLASSES)
for i in range(num_classes):
class_name = "Class" + random_camel_case(CLASS_NAME_LEN)
print(f"class {class_name} {{")
num_functions = random.randint(1, MAX_FUNC_PER_CLASS)
for j in range(num_functions):
function_name = "Function" + random_camel_case(FUNC_NAME_LEN)
print(f"\tinline void {function_name}() {{}}")
print(f"}};\n")
print()

View File

@ -1,67 +0,0 @@
#!/bin/bash
# Output file
OUTPUT_FILE="entropy.h"
# Function to generate a CamelCase string of given length
generate_name() {
local seed="$1"
local length="$2"
local char_count=0
local random_bytes=""
while [ "$char_count" -lt "$length" ]; do
random_bytes+=$(od -vAn -N4 -tu4 < /dev/urandom | tr -d '[:space:]')
char_count=$((char_count + 1))
done
# Use the provided seed for the random number generation. Crucially, re-seed bash's
# RANDOM for each name.
RANDOM="$seed"
local result=""
for ((i=0; i<length; i++)); do
# Get a pseudo-random number between 0 and 25 (inclusive)
local rand_index=$((RANDOM % 26))
# Convert to lowercase ASCII character (a=97)
local char_code=$((97 + rand_index))
# Append to the result string
result+=$(printf "\\$(printf '%o' "$char_code")")
done
echo "$result" | sed -E 's/(^|_)([a-z])/\U\2/g'
}
# Parse command-line arguments
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <seed_number>"
exit 1
fi
SEED="$1"
# Initialize the random number generator with the seed
RANDOM="$SEED"
# Generate a random number of classes (between 1 and 10)
NUM_CLASSES=$((RANDOM % 10 + 1))
> "$OUTPUT_FILE" # Clear or create the output file
echo "// Seed: $SEED" > "$OUTPUT_FILE"
echo >> "$OUTPUT_FILE"
for ((i=0; i<NUM_CLASSES; i++)); do
CLASS_NAME="Class$(generate_name "$((SEED + i * 100))" 6)"
echo "class $CLASS_NAME {" >> "$OUTPUT_FILE"
# Generate a random number of methods (between 1 and 10)
NUM_METHODS=$((RANDOM % 10 + 1))
for ((j=0; j<NUM_METHODS; j++)); do
METHOD_NAME="Function$(generate_name "$((SEED + i * 100 + j))" 8)"
echo -e "\tinline void $METHOD_NAME() {}" >> "$OUTPUT_FILE"
done
echo "};" >> "$OUTPUT_FILE"
echo >> "$OUTPUT_FILE"
done
echo "Generated $NUM_CLASSES classes in $OUTPUT_FILE using seed $SEED"