You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/ML/Training/Training/GridCacheIO.h

102 lines
3.7 KiB
C

#pragma once
#ifndef GRID_CACHE_IO_H
#define GRID_CACHE_IO_H
#include <string>
#include <fstream>
#include <iostream>
#include "pch.h"
class GridCacheIO
{
public:
// 保存网格(写入 header + gridOutput2)
// 注意:会自动“清洗”一些不稳定的 n 字段,避免写入垃圾值
static bool saveGrid(const std::string& filename,
HX_NWTM_GRID_OUTPUT2 grid, // 这里用值传递:方便内部清洗
const HX_NWTM_GRID_INPUT& gridInput);
// 读取网格(读取后会检查 sceneKey 是否匹配)
// 注意:读取后也会做一次“清洗”,保证 n 字段稳定
static bool loadGrid(const std::string& filename,
HX_NWTM_GRID_OUTPUT2& grid,
const HX_NWTM_GRID_INPUT& expectedGridInput);
// 只检查 header 的 sceneKey 是否匹配(不读完整网格)
static bool isCacheMatch(const std::string& filename,
const HX_NWTM_GRID_INPUT& expectedGridInput);
static bool fileExists(const std::string& filename);
private:
// ---------------- 文件头 ----------------
struct GridCacheHeader
{
unsigned int magic; // 'GCHX'
unsigned int version; // 格式版本
unsigned int reserved; // 保留
unsigned long long sceneKey; // 串场景指纹
unsigned int nCells; // 快速检查
};
enum { MAGIC = 0x58484347 }; // 'GCHX' little-endian
enum { VERSION = 2 };
private:
// 计算串场景 key
static unsigned long long computeSceneKey64(const HX_NWTM_GRID_INPUT& in);
// FNV-1a 64
static unsigned long long fnv1a64_init();
static void fnv1a64_update(unsigned long long& h, const void* data, size_t len);
// hash 辅助
static void hashInt(unsigned long long& h, int v);
static void hashUInt(unsigned long long& h, unsigned int v);
static void hashDouble(unsigned long long& h, double v);
static void hashVec1D(unsigned long long& h, const dVec1& v);
static void hashIVec1D(unsigned long long& h, const iVec1& v);
static void hashVec2D(unsigned long long& h, const dVec2& v);
static void hashIVec2D(unsigned long long& h, const iVec2& v);
static void hashVec3D(unsigned long long& h, const dVec3& v);
// IO 基元
static bool writeUInt(std::ofstream& fs, unsigned int v);
static bool writeULL(std::ofstream& fs, unsigned long long v);
static bool writeInt(std::ofstream& fs, int v);
static bool writeDouble(std::ofstream& fs, double v);
static bool readUInt(std::ifstream& fs, unsigned int& v);
static bool readULL(std::ifstream& fs, unsigned long long& v);
static bool readInt(std::ifstream& fs, int& v);
static bool readDouble(std::ifstream& fs, double& v);
static bool writeSafeSize(std::ofstream& fs, size_t sz);
static bool readSafeSize(std::ifstream& fs, size_t& sz);
static bool writeVec1D(std::ofstream& fs, const dVec1& v);
static bool writeIVec1D(std::ofstream& fs, const iVec1& v);
static bool writeVec2D(std::ofstream& fs, const dVec2& v);
static bool writeIVec2D(std::ofstream& fs, const iVec2& v);
static bool writeVec3D(std::ofstream& fs, const dVec3& v);
static bool readVec1D(std::ifstream& fs, dVec1& v);
static bool readIVec1D(std::ifstream& fs, iVec1& v);
static bool readVec2D(std::ifstream& fs, dVec2& v);
static bool readIVec2D(std::ifstream& fs, iVec2& v);
static bool readVec3D(std::ifstream& fs, dVec3& v);
// gridOutput2 序列化
static bool writeGridOutput2(std::ofstream& fs, const HX_NWTM_GRID_OUTPUT2& g);
static bool readGridOutput2(std::ifstream& fs, HX_NWTM_GRID_OUTPUT2& g);
static bool readHeader(std::ifstream& fs, GridCacheHeader& hdr);
static bool writeHeader(std::ofstream& fs, const GridCacheHeader& hdr);
// “清洗”不稳定字段:用 vector size 统一覆盖 n,避免 DLL 未初始化导致的随机值
static void sanitizeGridOutput2(HX_NWTM_GRID_OUTPUT2& g);
};
#endif // GRID_CACHE_IO_H