From 43fed35196f26f4ac5e211fafd274ac18395a44b Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Wed, 5 Mar 2025 14:51:09 -0700 Subject: [PATCH] Update --- .github/workflows/build.yml | 53 ++++++++++++++++++----------- tools/entropy.py | 45 +++++++++++++++++++++++++ tools/entropy.sh | 67 ------------------------------------- 3 files changed, 79 insertions(+), 86 deletions(-) create mode 100644 tools/entropy.py delete mode 100644 tools/entropy.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 537fc915..1cde8e7a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -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 diff --git a/tools/entropy.py b/tools/entropy.py new file mode 100644 index 00000000..a98a98b8 --- /dev/null +++ b/tools/entropy.py @@ -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() diff --git a/tools/entropy.sh b/tools/entropy.sh deleted file mode 100644 index 140b6839..00000000 --- a/tools/entropy.sh +++ /dev/null @@ -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" - 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> "$OUTPUT_FILE" - - # Generate a random number of methods (between 1 and 10) - NUM_METHODS=$((RANDOM % 10 + 1)) - for ((j=0; j> "$OUTPUT_FILE" - done - - echo "};" >> "$OUTPUT_FILE" - echo >> "$OUTPUT_FILE" -done - -echo "Generated $NUM_CLASSES classes in $OUTPUT_FILE using seed $SEED"