mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-11-10 22:47:09 +01:00
kuhy overruled the "do not fix coursework to be better than it was submitted" rule: git history is the archive, so the working tree can be clean. This lands the config and the mechanical half of the cleanup -- 9,281 ruff findings under the fleet config down to 3,686, with no per-file-ignores anywhere. What is in here: - pyproject.toml, the first one in this repo. select = ["ALL"], mypy strict, and the vendored list mirrored into ruff exclude and coverage omit. Five rules are off and each says why; CPY001 is the only judgement call, because stamping a copyright header onto 137 university assignments would assert a licence that was never claimed. No hook is wired up yet -- a gate lands only once its subject is clean. - ruff format + the safe fixes, then a second pass over the docstring rules ruff marks unsafe (they only edit docstring text). 108 files. - TRAK/sightpy is vendored, not coursework: it is rafael-fuente/Python-Raytracer (BSD 3-Clause). Verified against a fresh upstream clone with line endings normalised -- 30 of 32 files byte-identical, ray.py and scene.py carrying a 12- and 13-line local patch that counts rays for the report. 35 files that should never have been linted, now excluded and restored. - WDWR, SPD, MOM and ECRYPT are fully clean, by hand and verified by running them: WDWR's three plot scripts print the same statistics as before, MOM's PuLP model solves to the same cost. WDWR's graph.py had a 342-character CSV header embedded as a string literal, which cannot be wrapped -- the data moved to data/pareto_front.csv. Two 0-byte .py stubs are deleted; an empty file is not a deliverable and git still has it. Three harness bugs found by actually running things: - `run` now forces MPLBACKEND=Agg. TRAK finished its ray trace in 37 seconds and then sat for 45 minutes: plt.show() had opened an image viewer and was waiting for someone to close the window. - TRAK's main.py only pops that viewer with --show now, and its runner writes to a gitignored build/ via the new --entry-args. The default output path is outputs/output.png, which is TRACKED -- a plain run overwrote a submitted deliverable. - course_lib.sh was 357 lines, over this repo's own cap. Split into course_probe.sh and course_run.sh. Verified: ECOTE 26 tests pass, ECRYPT_PROJECT 99 pass, TRAK renders cornell_box in 37s and exits 0, every module compiles, and every import ruff removed was checked to be genuinely unused. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0172dj34FDpao6wsix8ZuCzE
168 lines
4.6 KiB
Python
Executable File
168 lines
4.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Plot the SPD lab-4 masking thresholds for the 200 Hz and 400 Hz tone complexes.
|
|
|
|
Each dataset is one measured masking curve -- probe frequency against the
|
|
level at which it became audible -- and the two figures overlay every curve
|
|
recorded at that fundamental.
|
|
"""
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
# Prepare the datasets
|
|
DATASETS_200_HZ = []
|
|
DATASETS_400_HZ = []
|
|
|
|
# Dataset 1: Wieloton 200 Hz, 7 (1400 Hz), 3 składowe
|
|
# Starting x value is 1400 Hz
|
|
DATASETS_200_HZ.append(
|
|
{
|
|
"name": "200 Hz, 7 (1400 Hz), 3 składowe",
|
|
"x": [1400 + 0, 1400 + 50, 1400 + 100, 1400 + 150],
|
|
"y": [200, 200, 215, 230],
|
|
}
|
|
)
|
|
|
|
# Dataset 2: Wieloton 200 Hz, 7 (1400 Hz), 7 składowych
|
|
DATASETS_200_HZ.append(
|
|
{
|
|
"name": "200 Hz, 7 (1400 Hz), 7 składowych",
|
|
"x": [1400 + 0, 1400 + 50, 1400 + 100, 1400 + 150],
|
|
"y": [190, 190, 200, 195],
|
|
}
|
|
)
|
|
|
|
# Dataset 3: Wieloton 200 Hz, 10 (2000 Hz), 3 składowe
|
|
# Starting x value is 2000 Hz
|
|
DATASETS_200_HZ.append(
|
|
{
|
|
"name": "200 Hz, 10 (2000 Hz), 3 składowe",
|
|
"x": [2000 + 0, 2000 + 50, 2000 + 100, 2000 + 150],
|
|
"y": [225, 215, 220, 265],
|
|
}
|
|
)
|
|
|
|
# Dataset 4: Wieloton 200 Hz, 10 (2000 Hz), 7 składowych
|
|
DATASETS_200_HZ.append(
|
|
{
|
|
"name": "200 Hz, 10 (2000 Hz), 7 składowych",
|
|
"x": [2000 + 0, 2000 + 50, 2000 + 100, 2000 + 150],
|
|
"y": [190, 205, 205, 210],
|
|
}
|
|
)
|
|
|
|
# Dataset 4: Wieloton 200 Hz, 10 (2000 Hz), 7 składowych
|
|
DATASETS_200_HZ.append(
|
|
{
|
|
"name": "Shouten - 7",
|
|
"x": [1400 + 0, 1400 + 50, 1400 + 100, 1400 + 150],
|
|
"y": [200, 207.5, 214, 222],
|
|
}
|
|
)
|
|
|
|
# Dataset 4: Wieloton 200 Hz, 10 (2000 Hz), 7 składowych
|
|
DATASETS_200_HZ.append(
|
|
{
|
|
"name": "Shouten - 10",
|
|
"x": [2000 + 0, 2000 + 50, 2000 + 100, 2000 + 150],
|
|
"y": [200, 205, 210, 215],
|
|
}
|
|
)
|
|
|
|
|
|
# Dataset 5: Wieloton 400 Hz, 7 (2800 Hz), 3 składowe
|
|
# Starting x value is 2800 Hz
|
|
DATASETS_400_HZ.append(
|
|
{
|
|
"name": "400 Hz, 7 (2800 Hz), 3 składowe",
|
|
"x": [2800 + 0, 2800 + 100, 2800 + 200, 2800 + 300],
|
|
"y": [405, 410, 410, 405],
|
|
}
|
|
)
|
|
|
|
# Dataset 6: Wieloton 400 Hz, 7 (2800 Hz), 7 składowych
|
|
DATASETS_400_HZ.append(
|
|
{
|
|
"name": "400 Hz, 7 (2800 Hz), 7 składowych",
|
|
"x": [2800 + 0, 2800 + 100, 2800 + 200, 2800 + 300],
|
|
"y": [410, 420, 420, 425],
|
|
}
|
|
)
|
|
|
|
# Dataset 7: Wieloton 400 Hz, 10 (4000 Hz), 3 składowe
|
|
# Starting x value is 4000 Hz
|
|
DATASETS_400_HZ.append(
|
|
{
|
|
"name": "400 Hz, 10 (4000 Hz), 3 składowe",
|
|
"x": [4000 + 0, 4000 + 100, 4000 + 200, 4000 + 300],
|
|
"y": [407, 419, 425, 425],
|
|
}
|
|
)
|
|
|
|
# Dataset 8: Wieloton 400 Hz, 10 (4000 Hz), 7 składowych
|
|
# Note: The last two 'Wynik [Hz]' values seem inconsistent.
|
|
# They are much lower than expected based on prior values.
|
|
# Assuming there might be typos, and they should be 2200 and 2400
|
|
# instead of 220 and 240.
|
|
DATASETS_400_HZ.append(
|
|
{
|
|
"name": "400 Hz, 10 (4000 Hz), 7 składowych",
|
|
"x": [4000 + 0, 4000 + 100, 4000 + 200, 4000 + 300],
|
|
"y": [405, 410, 415, 415], # Original data
|
|
}
|
|
)
|
|
|
|
DATASETS_400_HZ.append(
|
|
{
|
|
"name": "Shouten - 7",
|
|
"x": [2800 + 0, 2800 + 100, 2800 + 200, 2800 + 300],
|
|
"y": [400, 414, 428, 443],
|
|
}
|
|
)
|
|
|
|
|
|
DATASETS_400_HZ.append(
|
|
{
|
|
"name": "Shouten - 10",
|
|
"x": [4000 + 0, 4000 + 100, 4000 + 200, 4000 + 300],
|
|
"y": [400, 410, 420, 430], # Original data
|
|
}
|
|
)
|
|
|
|
# Plot the data for 200 Hz
|
|
plt.figure(figsize=(12, 8))
|
|
for dataset in DATASETS_200_HZ:
|
|
if "Shouten" in dataset["name"]:
|
|
plt.plot(
|
|
dataset["x"], dataset["y"], marker="s", color="red", label=dataset["name"]
|
|
) # Shouten datasets
|
|
else:
|
|
plt.plot(
|
|
dataset["x"], dataset["y"], marker="o", label=dataset["name"]
|
|
) # Other datasets
|
|
plt.xlabel("Frequency [Hz]")
|
|
plt.ylabel("Result [Hz]")
|
|
plt.title("Combined Graph of Results for 200 Hz")
|
|
plt.legend()
|
|
plt.grid(visible=True)
|
|
plt.savefig("results_200Hz.png") # Save the plot
|
|
plt.show()
|
|
|
|
# Plot the data for 400 Hz
|
|
plt.figure(figsize=(12, 8))
|
|
for dataset in DATASETS_400_HZ:
|
|
if "Shouten" in dataset["name"]:
|
|
plt.plot(
|
|
dataset["x"], dataset["y"], marker="s", color="red", label=dataset["name"]
|
|
) # Shouten datasets
|
|
else:
|
|
plt.plot(
|
|
dataset["x"], dataset["y"], marker="o", label=dataset["name"]
|
|
) # Other datasets
|
|
plt.xlabel("Frequency [Hz]")
|
|
plt.ylabel("Result [Hz]")
|
|
plt.title("Combined Graph of Results for 400 Hz")
|
|
plt.legend()
|
|
plt.grid(visible=True)
|
|
plt.savefig("results_400Hz.png") # Save the plot
|
|
plt.show()
|