语料库最小化函数
function HPDFMinimizeCorpusCase(const Input: TBytes;
const Predicate: THPDFFailurePredicate; MaximumAttempts: Integer;
out AInfo: THPDFCorpusMinimizationInfo): TBytes;
The reducer first removes complete indirect-object spans and then applies progressively smaller byte-range reductions
仅当 predicate 仍然报告原始失败签名时,才接受该候选项
AInfo 报告尝试次数、被接受的缩减次数、被移除的对象跨度、被移除的字节范围、原始和最终大小,以及被保留的签名
Continuous corpus storage
function HPDFDefaultCorpusStoreOptions: THPDFCorpusStoreOptions;
function HPDFMinimizeAndStoreCorpusCase(const Input: TBytes;
const Predicate: THPDFFailurePredicate;
const CorpusDirectory: string;
const Options: THPDFCorpusStoreOptions;
out AInfo: THPDFCorpusCaseInfo): Boolean;
function HPDFCorpusCaseInfoToJSON(
const AInfo: THPDFCorpusCaseInfo): AnsiString;
type
THPDFCorpusStoreAction = (csaAdded, csaReplaced, csaKeptExisting);
THPDFCorpusStoreOptions = record
MaximumAttempts: Integer;
MaximumInputBytes: Int64;
MaximumStoredBytes: Int64;
LockRetryCount: Integer;
end;
存储会根据失败签名的 SHA-256 摘要派生一个稳定的 case ID,重新验证任何已有的 case,对已有和新进入的候选项都做最小化,并保留最小的结果
跨进程锁会对同一个语料目录的判定进行串行化,而 write-through 临时文件加原子替换,则避免读取方看到不完整的 PDF 或元数据文件
THPDFCorpusStoreOptions 限定最小化尝试次数、传入字节数、存储字节数和加锁重试次数,THPDFCorpusCaseInfo.Action 报告该 case 是被新增、替换还是保留
sidecar schema hotpdf.corpus.case.v1 以稳定的字段顺序记录 case ID、确切的失败签名、内容 SHA-256 和已存储的字节数
HPDFCompareRegressionResultsDeterministic 在解析、渲染、文本和保存这几个域上比较跨引擎的重复签名,并拒绝不稳定或失败的运行