1*01826a49SYabin Cui /*
2*01826a49SYabin Cui * Copyright (c) Meta Platforms, Inc. and affiliates.
3*01826a49SYabin Cui * All rights reserved.
4*01826a49SYabin Cui *
5*01826a49SYabin Cui * This source code is licensed under both the BSD-style license (found in the
6*01826a49SYabin Cui * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*01826a49SYabin Cui * in the COPYING file in the root directory of this source tree).
8*01826a49SYabin Cui */
9*01826a49SYabin Cui extern "C" {
10*01826a49SYabin Cui #include "datagen.h"
11*01826a49SYabin Cui }
12*01826a49SYabin Cui #include "Options.h"
13*01826a49SYabin Cui #include "test/RoundTrip.h"
14*01826a49SYabin Cui #include "utils/ScopeGuard.h"
15*01826a49SYabin Cui
16*01826a49SYabin Cui #include <cstddef>
17*01826a49SYabin Cui #include <cstdio>
18*01826a49SYabin Cui #include <cstdlib>
19*01826a49SYabin Cui #include <memory>
20*01826a49SYabin Cui #include <random>
21*01826a49SYabin Cui
22*01826a49SYabin Cui using namespace std;
23*01826a49SYabin Cui using namespace pzstd;
24*01826a49SYabin Cui
25*01826a49SYabin Cui namespace {
26*01826a49SYabin Cui string
writeData(size_t size,double matchProba,double litProba,unsigned seed)27*01826a49SYabin Cui writeData(size_t size, double matchProba, double litProba, unsigned seed) {
28*01826a49SYabin Cui std::unique_ptr<uint8_t[]> buf(new uint8_t[size]);
29*01826a49SYabin Cui RDG_genBuffer(buf.get(), size, matchProba, litProba, seed);
30*01826a49SYabin Cui string file = tmpnam(nullptr);
31*01826a49SYabin Cui auto fd = std::fopen(file.c_str(), "wb");
32*01826a49SYabin Cui auto guard = makeScopeGuard([&] { std::fclose(fd); });
33*01826a49SYabin Cui auto bytesWritten = std::fwrite(buf.get(), 1, size, fd);
34*01826a49SYabin Cui if (bytesWritten != size) {
35*01826a49SYabin Cui std::abort();
36*01826a49SYabin Cui }
37*01826a49SYabin Cui return file;
38*01826a49SYabin Cui }
39*01826a49SYabin Cui
40*01826a49SYabin Cui template <typename Generator>
generateInputFile(Generator & gen)41*01826a49SYabin Cui string generateInputFile(Generator& gen) {
42*01826a49SYabin Cui // Use inputs ranging from 1 Byte to 2^16 Bytes
43*01826a49SYabin Cui std::uniform_int_distribution<size_t> size{1, 1 << 16};
44*01826a49SYabin Cui std::uniform_real_distribution<> prob{0, 1};
45*01826a49SYabin Cui return writeData(size(gen), prob(gen), prob(gen), gen());
46*01826a49SYabin Cui }
47*01826a49SYabin Cui
48*01826a49SYabin Cui template <typename Generator>
generateOptions(Generator & gen,const string & inputFile)49*01826a49SYabin Cui Options generateOptions(Generator& gen, const string& inputFile) {
50*01826a49SYabin Cui Options options;
51*01826a49SYabin Cui options.inputFiles = {inputFile};
52*01826a49SYabin Cui options.overwrite = true;
53*01826a49SYabin Cui
54*01826a49SYabin Cui std::uniform_int_distribution<unsigned> numThreads{1, 32};
55*01826a49SYabin Cui std::uniform_int_distribution<unsigned> compressionLevel{1, 10};
56*01826a49SYabin Cui
57*01826a49SYabin Cui options.numThreads = numThreads(gen);
58*01826a49SYabin Cui options.compressionLevel = compressionLevel(gen);
59*01826a49SYabin Cui
60*01826a49SYabin Cui return options;
61*01826a49SYabin Cui }
62*01826a49SYabin Cui }
63*01826a49SYabin Cui
main()64*01826a49SYabin Cui int main() {
65*01826a49SYabin Cui std::mt19937 gen(std::random_device{}());
66*01826a49SYabin Cui
67*01826a49SYabin Cui auto newlineGuard = makeScopeGuard([] { std::fprintf(stderr, "\n"); });
68*01826a49SYabin Cui for (unsigned i = 0; i < 10000; ++i) {
69*01826a49SYabin Cui if (i % 100 == 0) {
70*01826a49SYabin Cui std::fprintf(stderr, "Progress: %u%%\r", i / 100);
71*01826a49SYabin Cui }
72*01826a49SYabin Cui auto inputFile = generateInputFile(gen);
73*01826a49SYabin Cui auto inputGuard = makeScopeGuard([&] { std::remove(inputFile.c_str()); });
74*01826a49SYabin Cui for (unsigned i = 0; i < 10; ++i) {
75*01826a49SYabin Cui auto options = generateOptions(gen, inputFile);
76*01826a49SYabin Cui if (!roundTrip(options)) {
77*01826a49SYabin Cui std::fprintf(stderr, "numThreads: %u\n", options.numThreads);
78*01826a49SYabin Cui std::fprintf(stderr, "level: %u\n", options.compressionLevel);
79*01826a49SYabin Cui std::fprintf(stderr, "decompress? %u\n", (unsigned)options.decompress);
80*01826a49SYabin Cui std::fprintf(stderr, "file: %s\n", inputFile.c_str());
81*01826a49SYabin Cui return 1;
82*01826a49SYabin Cui }
83*01826a49SYabin Cui }
84*01826a49SYabin Cui }
85*01826a49SYabin Cui return 0;
86*01826a49SYabin Cui }
87