#ifndef PROCESSOR_DATA_FILES_HPP_ #define PROCESSOR_DATA_FILES_HPP_ #include "Processor/Data_Files.h" #include "Processor/Processor.h" #include "Processor/NoFilePrep.h" #include "Protocols/dabit.h" #include "Math/Setup.h" #include "GC/BitPrepFiles.h" #include "Tools/benchmarking.h" template Preprocessing* Preprocessing::get_live_prep(SubProcessor* proc, DataPositions& usage) { return new typename T::LivePrep(proc, usage); } template template Preprocessing* Preprocessing::get_new( Machine& machine, DataPositions& usage, SubProcessor* proc) { if (machine.live_prep) return get_live_prep(proc, usage); else return new Sub_Data_Files(machine.get_N(), machine.template prep_dir_prefix(), usage, BaseMachine::thread_num); } template template Preprocessing* Preprocessing::get_new( bool live_prep, const Names& N, DataPositions& usage) { if (live_prep) return new typename T::LivePrep(usage); else return new GC::BitPrepFiles(N, get_prep_sub_dir(PREP_DIR, N.num_players()), usage, BaseMachine::thread_num); } template T Preprocessing::get_random_from_inputs(int nplayers) { T res; for (int j = 0; j < nplayers; j++) { T tmp; typename T::open_type _; this->get_input_no_count(tmp, _, j); res += tmp; } return res; } template Sub_Data_Files::Sub_Data_Files(const Names& N, DataPositions& usage, int thread_num) : Sub_Data_Files(N, OnlineOptions::singleton.prep_dir_prefix(N.num_players()), usage, thread_num) { } template int Sub_Data_Files::tuple_length(int dtype) { return DataPositions::tuple_size[dtype] * T::size(); } template string Sub_Data_Files::get_filename(const Names& N, Dtype type, int thread_num) { return PrepBase::get_filename(get_prep_sub_dir(N.num_players()), type, T::type_short(), N.my_num(), thread_num); } template string Sub_Data_Files::get_input_filename(const Names& N, int input_player, int thread_num) { return PrepBase::get_input_filename( get_prep_sub_dir(N.num_players()), T::type_short(), input_player, N.my_num(), thread_num); } template string Sub_Data_Files::get_edabit_filename(const Names& N, int n_bits, int thread_num) { return PrepBase::get_edabit_filename( get_prep_sub_dir(N.num_players()), n_bits, N.my_num(), thread_num); } template Sub_Data_Files::Sub_Data_Files(int my_num, int num_players, const string& prep_data_dir, DataPositions& usage, int thread_num) : Preprocessing(usage), my_num(my_num), num_players(num_players), prep_data_dir(prep_data_dir), thread_num(thread_num), part(0) { #ifdef DEBUG_FILES cerr << "Setting up Data_Files in: " << prep_data_dir << endl; #endif T::clear::check_setup(prep_data_dir); string type_short = T::type_short(); string type_string = T::type_string(); for (int dtype = 0; dtype < N_DTYPE; dtype++) { if (T::clear::allows(Dtype(dtype))) { buffers[dtype].setup( PrepBase::get_filename(prep_data_dir, Dtype(dtype), type_short, my_num, thread_num), tuple_length(dtype), type_string, DataPositions::dtype_names[dtype]); } } dabit_buffer.setup( PrepBase::get_filename(prep_data_dir, DATA_DABIT, type_short, my_num, thread_num), dabit::size(), type_string, DataPositions::dtype_names[DATA_DABIT]); input_buffers.resize(num_players); for (int i=0; i Data_Files::Data_Files(Machine& machine, SubProcessor* procp, SubProcessor* proc2) : usage(machine.get_N().num_players()), DataFp(*Preprocessing::get_new(machine, usage, procp)), DataF2(*Preprocessing::get_new(machine, usage, proc2)), DataFb( *Preprocessing::get_new(machine.live_prep, machine.get_N(), usage)) { } template Data_Files::Data_Files(const Names& N) : usage(N.num_players()), DataFp(*new Sub_Data_Files(N, usage)), DataF2(*new Sub_Data_Files(N, usage)), DataFb(*new Sub_Data_Files(N, usage)) { } template Data_Files::~Data_Files() { delete &DataFp; delete &DataF2; delete &DataFb; } template Sub_Data_Files::~Sub_Data_Files() { for (auto& x: edabit_buffers) { delete x.second; } if (part != 0) delete part; } template void Sub_Data_Files::seekg(DataPositions& pos) { if (OnlineOptions::singleton.file_prep_per_thread) return; if (T::LivePrep::use_part) { get_part().seekg(pos); return; } DataFieldType field_type = T::clear::field_type(); for (int dtype = 0; dtype < N_DTYPE; dtype++) if (T::clear::allows(Dtype(dtype))) buffers[dtype].seekg(pos.files[field_type][dtype]); for (int j = 0; j < num_players; j++) if (j == my_num) my_input_buffers.seekg(pos.inputs[j][field_type]); else input_buffers[j].seekg(pos.inputs[j][field_type]); for (map::const_iterator it = pos.extended[field_type].begin(); it != pos.extended[field_type].end(); it++) { setup_extended(it->first); extended[it->first].seekg(it->second); } dabit_buffer.seekg(pos.files[field_type][DATA_DABIT]); } template void Data_Files::seekg(DataPositions& pos) { DataFp.seekg(pos); DataF2.seekg(pos); DataFb.seekg(pos); usage = pos; } template void Data_Files::skip(const DataPositions& pos) { DataPositions new_pos = usage; new_pos.increase(pos); skipped.increase(pos); seekg(new_pos); } template void Sub_Data_Files::prune() { for (auto& buffer : buffers) buffer.prune(); my_input_buffers.prune(); for (int j = 0; j < num_players; j++) input_buffers[j].prune(); for (auto& it : extended) it.second.prune(); dabit_buffer.prune(); if (part != 0) part->prune(); } template void Data_Files::prune() { DataFp.prune(); DataF2.prune(); DataFb.prune(); } template void Sub_Data_Files::purge() { for (auto& buffer : buffers) buffer.purge(); my_input_buffers.purge(); for (int j = 0; j < num_players; j++) input_buffers[j].purge(); for (auto it : extended) it.second.purge(); dabit_buffer.purge(); if (part != 0) part->purge(); } template void Sub_Data_Files::setup_extended(const DataTag& tag, int tuple_size) { auto& buffer = extended[tag]; int tuple_length = tuple_size * T::size(); if (!buffer.is_up()) { stringstream ss; ss << prep_data_dir << tag.get_string() << "-" << T::type_short() << "-P" << my_num; buffer.setup(ss.str(), tuple_length); } buffer.check_tuple_length(tuple_length); } template void Sub_Data_Files::get_no_count(vector& S, DataTag tag, const vector& regs, int vector_size) { setup_extended(tag, regs.size()); for (int j = 0; j < vector_size; j++) for (unsigned int i = 0; i < regs.size(); i++) extended[tag].input(S[regs[i] + j]); } template void Sub_Data_Files::get_dabit_no_count(T& a, typename T::bit_type& b) { dabit tmp; dabit_buffer.input(tmp); a = tmp.first; b = tmp.second; } template template void Sub_Data_Files::buffer_edabits_with_queues(bool strict, int n_bits, false_type) { insecure("reading edaBits from files"); if (edabit_buffers.find(n_bits) == edabit_buffers.end()) { string filename = PrepBase::get_edabit_filename(prep_data_dir, n_bits, my_num, thread_num); ifstream* f = new ifstream(filename); if (f->fail()) throw runtime_error("cannot open " + filename); check_file_signature(*f, filename); edabit_buffers[n_bits] = f; } auto& buffer = *edabit_buffers[n_bits]; if (buffer.peek() == EOF) buffer.seekg(file_signature().get_length()); edabitvec eb; eb.input(n_bits, buffer); this->edabits[{strict, n_bits}].push_back(eb); if (buffer.fail()) throw runtime_error("error reading edaBits"); } template typename Sub_Data_Files::part_type& Sub_Data_Files::get_part() { if (part == 0) part = new part_type(my_num, num_players, get_prep_sub_dir(num_players), this->usage, thread_num); return *part; } #endif