From 6772b579cafbd28b09ff0fdfefe8d9bd88e5bb3f Mon Sep 17 00:00:00 2001 From: kris Date: Sat, 2 Jul 2022 21:20:16 +0100 Subject: [PATCH] Dramatically reduce memory use --- encode_audio.py | 22 +++++----------------- opcodes.py | 10 +++++----- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/encode_audio.py b/encode_audio.py index 0704594..ffe8773 100755 --- a/encode_audio.py +++ b/encode_audio.py @@ -140,32 +140,21 @@ def audio_bytestream(data: numpy.ndarray, step: int, lookahead_steps: int, next_tick = int(eta.i * dlen / 1000) if frame_offset >= 2043: # XXX - lookahead_steps = min_lookahead_steps + 120 # XXX parametrize + lookahead_steps = min_lookahead_steps + 130 # XXX parametrize else: lookahead_steps = min_lookahead_steps # Compute all possible opcode sequences for this frame offset - candidate_opcodes, voltages, lookahead_steps = \ + next_candidate_opcodes, voltages, lookahead_steps = \ opcodes.candidate_opcodes( frame_horizon(frame_offset, lookahead_steps), lookahead_steps, opcode if frame_offset == 2047 else None) + # print(frame_offset, voltages.shape, voltages.nbytes) opcode_idx = lookahead.evolve_return_best( sp, y1, y2, voltage1, voltage2, voltage1 * voltages, data[i:i+lookahead_steps]) - # Pick the opcode sequence that minimizes the total squared error - # relative to the data waveform. - # errors = total_error( - # all_positions * sp.scale, data[i:i + lookahead_steps]) - # opcode_idx = numpy.argmin(errors).item() - # if frame_offset == 2046: - # print("XXX", lookahead_steps) - # print(opcode_idx) - # for i, e in enumerate(errors): - # print(i, e, candidate_opcodes[i]) - # Next opcode - opcode = candidate_opcodes[opcode_idx][0] - # opcode = opcode_seq.__next__() + opcode = next_candidate_opcodes[opcode_idx] opcode_length = opcodes.cycle_length(opcode) opcode_counts[opcode] += 1 @@ -190,8 +179,7 @@ def audio_bytestream(data: numpy.ndarray, step: int, lookahead_steps: int, if new_error > 0.3: clicks += 1 print(frame_offset, i / sample_rate, opcode, new_error, - numpy.mean(data[i:i + opcode_length])) # , "<----" if \ - # new_error > 0.3 else "") + numpy.mean(data[i:i + opcode_length])) # print(frame_offset, i / sample_rate, opcode) for v in all_positions[0]: diff --git a/opcodes.py b/opcodes.py index f5432b5..9df6a73 100644 --- a/opcodes.py +++ b/opcodes.py @@ -20,7 +20,7 @@ def voltage_schedule(op: player_op.PlayerOp) -> numpy.ndarray: return op.toggles -@functools.lru_cache(None) +#@functools.lru_cache(None) def opcode_choices( frame_offset: int, eof_stage_1_op: player_op.PlayerOp = None) -> List[player_op.PlayerOp]: @@ -39,7 +39,7 @@ def opcode_choices( list(opcodes_generated.AUDIO_OPS), key=cycle_length, reverse=True) -@functools.lru_cache(None) +#@functools.lru_cache(None) def opcode_lookahead( frame_offset: int, lookahead_cycles: int, @@ -68,7 +68,7 @@ def opcode_lookahead( return tuple(ops) # TODO: fix return type -@functools.lru_cache(None) +#@functools.lru_cache(None) def cycle_lookahead( opcodes: Tuple[player_op.PlayerOp], lookahead_cycles: int) -> Tuple[float]: @@ -89,7 +89,7 @@ def cycle_lookahead( def candidate_opcodes( frame_offset: int, lookahead_cycles: int, eof_stage_1_op: player_op.PlayerOp -) -> Tuple[Tuple[Tuple[player_op.PlayerOp]], numpy.ndarray, int]: +) -> Tuple[Tuple[player_op.PlayerOp], numpy.ndarray, int]: """Deduplicate a tuple of opcode sequences that are equivalent. For each opcode sequence whose effect is the same when truncated to @@ -114,7 +114,7 @@ def candidate_opcodes( # print("Dropping", ops, cycles, seen_cycles[cycles]) continue seen_cycles[cycles] = ops - pruned_opcodes.append(ops) + pruned_opcodes.append(ops[0]) pruned_cycles.append(cycles) pruned_opcodes = tuple(pruned_opcodes)