tfhe_libex
array.hpp
[詳解]
1 
5 #ifndef ARRAY
6 #define ARRAY
7 #include "../../common/common.hpp"
8 #include "../../operations/io/io.hpp"
9 #include "../type.hpp"
10 
14 template <typename Type>
15 class TFHEArray : virtual protected TFHEKeySet, virtual protected TFHEIO {
16  public:
17  std::vector<Type> array;
18  std::vector<int> shape;
19 
27  template <typename T, typename Alloc = std::allocator<T>>
28  TFHEArray(std::vector<T, Alloc> vec) {
29  shape = std::vector<int>();
30  mold(vec);
31  int index = 1;
32  int depth = 1;
33  for (int i = depth; i < shape.size(); i++) {
34  index *= shape[i];
35  }
36 
37  array = std::vector<Type>(index * shape[0]);
38 
39  for (int i = 0; i < vec.size(); i++) {
40  write(vec[i], i * index, depth);
41  }
42  }
43 
44  template <typename T, typename Alloc = std::allocator<T>>
45  void mold(std::vector<T, Alloc> vec) {
46  int size = vec.size();
47  shape.emplace_back(size);
48  if (size > 0) {
49  mold(vec[0]);
50  }
51  }
52  void mold(int num) {}
53 
54  void mold(std::vector<bool>::reference value) {}
55 
61  TFHEArray(const char* path, int id) {
62  long pos[3];
63  find_file_pointer(path, id, pos);
64  if (pos[0] == -1) {
65  // 見つからない
66  }
67 
68  if (pos[1] != static_cast<int>(TFHEType::TFHEArray)) {
69  // Error 該当するIDは要求する型ではない
70  }
71 
72  FILE* fp;
73  if ((fp = fopen(path, "rb")) == NULL) {
74  printf("ファイルオープンエラー\n");
75  exit(EXIT_FAILURE);
76  }
77 
78  fseek(fp, pos[0] + 12L + Type::array_option_num() * 4L, SEEK_SET);
79  int inbf[1];
80  fread(inbf, sizeof(int), 1, fp);
81 
82  int* tmp = new int[inbf[0]];
83 
84  fread(tmp, sizeof(int), inbf[0], fp);
85  shape = std::vector<int>(inbf[0]);
86  for (int i = 0; i < shape.size(); i++) {
87  shape[i] = tmp[i];
88  }
89 
90  int size = array_size();
91 
92  array = std::vector<Type>(size);
93  for (int i = 0; i < array.size(); i++) {
94  array[i].load_raw(fp);
95  }
96  delete tmp;
97  fclose(fp);
98  }
99 
105  template <class... T>
106  Type& at(T... n) {
107  std::initializer_list<int> q{n...};
108  std::vector<int> p(q.begin(), q.end());
109  int pos = 0;
110  int size = shape.size();
111  int index = 1;
112 
113  for (int i = 0; i < size - 1; i++) {
114  index *= shape[size - i - 1];
115  pos += p[i] * index;
116  }
117  pos += p[size - 1];
118  return array[pos];
119  }
120 
126  void save(const char* path, int id) {
127  long pos[3];
128 
129  find_file_pointer(path, id, pos);
130 
131  if (pos[0] != -1) {
132  remove_from_file(path, pos);
133  }
134  FILE* fp;
135  if ((fp = fopen(path, "ab+")) == NULL) {
136  printf("ファイルオープンエラー\n");
137  exit(EXIT_FAILURE);
138  }
139  fseek(fp, 0L, SEEK_END);
140  save_meta(fp, id);
141 
142  Type::save_option_forArray(fp);
143  save_option(fp);
144  for (int i = 0; i < array.size(); i++) {
145  array[i].save_raw(fp);
146  }
147 
148  fclose(fp);
149  }
150 
151  protected:
152  void save_option(FILE* fp) {
153  int* outbf = new int[1 + shape.size()];
154  outbf[0] = shape.size();
155  for (int i = 0; i < shape.size(); i++) {
156  outbf[1 + i] = shape[i];
157  }
158  fwrite(outbf, sizeof(int), 1 + shape.size(), fp);
159  delete outbf;
160  }
161 
162  void save_meta(FILE* fp, int id) {
163  int size = Type::array_size(shape.size(), array.size());
164 
165  int outbf[3];
166  outbf[0] = id;
167  outbf[1] = static_cast<int>(TFHEType::TFHEArray);
168  outbf[2] = size;
169  fwrite(outbf, sizeof(int), 3, fp);
170  }
171 
172  template <typename T>
173  void write(T vec, int pos, int depth) {
174  int index = 1;
175  depth++;
176  for (int i = depth; i < shape.size(); i++) {
177  index *= shape[i];
178  }
179  for (int i = 0; i < vec.size(); i++) {
180  write(vec[i], pos + i * index, depth);
181  }
182  }
183 
184  void write(int num, int pos, int depth) { array[pos] = Type(num); }
185 
186  void write(std::vector<bool>::reference value, int pos, int depth) {
187  array[pos] = Type(value);
188  }
189 
190  int array_size() {
191  int size = 1;
192  for (int i = 0; i < shape.size(); i++) {
193  size *= shape[i];
194  }
195  return size;
196  }
197 };
198 #endif
TFHEArray
TFHEの多次元配列のクラス.
Definition: array.hpp:15
TFHEArray::at
Type & at(T... n)
TFHEの配列の要素の参照を返すメソッド.
Definition: array.hpp:106
TFHEArray::save
void save(const char *path, int id)
TFHEの配列をファイルに保存するメソッド.
Definition: array.hpp:126
TFHEArray::TFHEArray
TFHEArray(std::vector< T, Alloc > vec)
多次元のstd::vector vecとその形を示すstd::vector<int> array_shapeからTFHEArrayを作成するコンストラクタ
Definition: array.hpp:28
TFHEIO
ファイル入出力の共通処理のクラス.
Definition: io.hpp:12
TFHEArray::TFHEArray
TFHEArray(const char *path, int id)
TFHEの配列をファイルから読み込むコンストラクタ.
Definition: array.hpp:61
TFHEKeySet
TFHEの秘密鍵,クラウド鍵,パラメータをまとめて管理するwrapperクラス.
Definition: keyset.hpp:43