"""生成一份「最小编码样例」的二进制生成物 + 一个输入 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():
rng = np.random.default_rng(0)
W = rng.standard_normal((4, 3)).astype(np.float64)
res = nrfunc.regionify(W, K=2, order=0, seed=0)
blob = nrfunc.to_bytes(res, bits=32)
with open(os.path.join(HERE, 'artifact.bin'), 'wb') as f:
f.write(blob)
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()