# -*- coding: utf-8 -*-
"""生成一份「最小编码样例」的二进制生成物 + 一个输入 x,供四语言调用示例对照。

用法:
    python make_artifact.py

产出:
    artifact.bin   —— nrfunc.to_bytes(..., bits=32) 产出的二进制字节块(0 阶)
    input.txt      —— 输入向量 x(3 个 float32)+ 期望输出 y(4 个 float32),供各语言比对

设计(刻意最小,方便手写看懂):
    n=4 个输出单元、D=3 维输入、K=2 个区域(0 阶质心)
    centroids = [[1,0,0], [0,1,0]]     # 2 个质心
    assign    = [0, 1, 0, 1]           # 4 个单元分别属于区 0/1/0/1

    前向公式(0 阶):y[i] = Σ_j x[j] * centroids[assign[i]][j]
"""
import os
import sys
import struct

import numpy as np

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__),
                                                '..', '..', 'src')))
import nrfunc

HERE = os.path.dirname(os.path.abspath(__file__))


def main():
    # 用真实 regionify 生成一个 0 阶结果(保证产物是「真的 nrfunc 生成物」)
    rng = np.random.default_rng(0)
    W = rng.standard_normal((4, 3)).astype(np.float64)  # n=4, D=3
    res = nrfunc.regionify(W, K=2, order=0, seed=0)

    # 二进制产物(bits=32 无损,便于四种语言直接读 float32)
    blob = nrfunc.to_bytes(res, bits=32)
    with open(os.path.join(HERE, 'artifact.bin'), 'wb') as f:
        f.write(blob)

    # 输入向量 + 期望输出(用 Python 算一次期望值,供各语言比对)
    x = np.array([0.5, -0.25, 1.0], dtype=np.float32)
    y = nrfunc.functional_forward(res, x.reshape(1, -1)).reshape(-1).astype(np.float32)

    with open(os.path.join(HERE, 'input.txt'), 'w', encoding='utf-8') as f:
        f.write('x: ' + ' '.join(f'{v:.6f}' for v in x) + '\n')
        f.write('y_expected: ' + ' '.join(f'{v:.6f}' for v in y) + '\n')

    print(f'产物已生成:')
    print(f'  artifact.bin  {len(blob)} 字节(order={res["order"]} K={res["K"]} '
          f'n={res["n"]} D={res["D"]} bits=32)')
    print(f'  input.txt')
    print(f'  质心 centroids =\n{res["centroids"]}')
    print(f'  归属 assign    = {res["assign"].tolist()}')
    print(f'  输入 x         = {x.tolist()}')
    print(f'  期望输出 y     = {y.tolist()}')


if __name__ == '__main__':
    main()