import numpy as np VOCAB = ' .!?ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' _CH2IDX = {ch: i for i, ch in enumerate(VOCAB)} def ch2idx(ch: str) -> int: return _CH2IDX[ch] def idx2ch(idx: int) -> str: return VOCAB[idx] def concat(v: np.ndarray, c: np.ndarray) -> np.ndarray: return np.concatenate([v, c]) def split(vc: np.ndarray, v_size: np.ndarray|int) -> tuple[np.ndarray, np.ndarray]: n = len(v_size) if isinstance(v_size, np.ndarray) else v_size return vc[:n], vc[n:] def shift_right(m: np.ndarray) -> np.ndarray: return np.hstack([np.zeros((m.shape[0], 1)), m[:, :-1]]) def shift_left(m: np.ndarray) -> np.ndarray: return np.hstack([m[:, 1:], np.zeros((m.shape[0], 1))]) def shift_up(m: np.ndarray) -> np.ndarray: return np.vstack([m[1:, :], np.zeros((1, m.shape[1]))]) def shift_down(m: np.ndarray) -> np.ndarray: return np.vstack([np.zeros((1, m.shape[1])), m[:-1, :]]) def clamp_one_hot(src_dst: np.ndarray) -> np.ndarray: index = np.argmax(src_dst) result = np.zeros_like(src_dst) result[index] = 1 return result class Rnn: def __init__(self): pass