语料库最小化函数

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 在解析、渲染、文本和保存这几个域上比较跨引擎的重复签名,并拒绝不稳定或失败的运行