File size: 1,797 Bytes
55d83dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#define SAFETENSORS_CPP_IMPLEMENTATION

#include <cstdint>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iostream>
#include <string>

#include "safetensors.hh"

int main(int argc, char **argv) {
  if (argc != 2) {
    return 2;
  }

  std::ifstream f(argv[1], std::ios::binary);
  std::string contents((std::istreambuf_iterator<char>(f)),
                       std::istreambuf_iterator<char>());
  if (contents.empty()) {
    return 2;
  }

  uint8_t *buf = static_cast<uint8_t *>(std::malloc(contents.size()));
  if (!buf) {
    return 2;
  }
  std::memcpy(buf, contents.data(), contents.size());

  safetensors::safetensors_t st;
  std::string warn;
  std::string err;
  bool ok = safetensors::mmap_from_memory(buf, contents.size(), argv[1], &st,
                                          &warn, &err);
  std::cerr << "mmap_from_memory=" << ok << " err=" << err << "\n";
  if (!ok) {
    return 1;
  }

  err.clear();
  bool valid = safetensors::validate_data_offsets(st, err);
  std::cerr << "validate_data_offsets=" << valid << " err=" << err << "\n";

  safetensors::tensor_t a;
  safetensors::tensor_t b;
  if (!st.tensors.at("a", &a) || !st.tensors.at("b", &b)) {
    return 1;
  }

  const uint8_t *base = st.databuffer_addr;
  std::cerr << "databuffer_size=" << st.databuffer_size << "\n";
  std::cerr << "a=[" << a.data_offsets[0] << "," << a.data_offsets[1]
            << "] bytes=" << char(base[a.data_offsets[0]])
            << char(base[a.data_offsets[1] - 1]) << "\n";
  std::cerr << "b=[" << b.data_offsets[0] << "," << b.data_offsets[1]
            << "] byte=" << char(base[b.data_offsets[0]]) << "\n";
  std::cerr << "alias=" << (base + b.data_offsets[0] == base + a.data_offsets[1] - 1)
            << "\n";

  std::free(buf);
  return valid ? 0 : 1;
}