Skip to content

Commit 2e1a00d

Browse files
Tal Davidifacebook-github-bot
authored andcommitted
Add Eager Scheduler support for composite AND operation (#100)
Summary: Pull Request resolved: #100 - Adds support for the Eager Scheduler to call composite AND operations in secret share engine - Added EagerScheduler to composite AND test fixture Reviewed By: elliottlawrence Differential Revision: D34701213 fbshipit-source-id: 4374cdde90818a375af3e1a255cb49c4df59183d
1 parent 4c695e0 commit 2e1a00d

2 files changed

Lines changed: 54 additions & 7 deletions

File tree

fbpcf/scheduler/EagerScheduler.cpp

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,42 +166,88 @@ std::vector<IScheduler::WireId<IScheduler::Boolean>>
166166
EagerScheduler::privateAndPrivateComposite(
167167
IScheduler::WireId<IScheduler::Boolean> left,
168168
std::vector<IScheduler::WireId<IScheduler::Boolean>> rights) {
169-
throw std::runtime_error("Not implemented");
169+
nonFreeGates_ += rights.size();
170+
std::vector<bool> rightValues(rights.size());
171+
for (size_t i = 0; i < rights.size(); i++) {
172+
rightValues[i] = wireKeeper_->getBooleanValue(rights[i]);
173+
}
174+
auto index = engine_->scheduleCompositeAND(
175+
wireKeeper_->getBooleanValue(left), rightValues);
176+
engine_->executeScheduledAND();
177+
auto result = engine_->getCompositeANDExecutionResult(index);
178+
std::vector<IScheduler::WireId<IScheduler::Boolean>> outputWires(
179+
result.size());
180+
for (size_t i = 0; i < rights.size(); i++) {
181+
outputWires[i] = wireKeeper_->allocateBooleanValue(result[i]);
182+
}
183+
return outputWires;
170184
}
171185

172186
std::vector<IScheduler::WireId<IScheduler::Boolean>>
173187
EagerScheduler::privateAndPrivateCompositeBatch(
174188
IScheduler::WireId<IScheduler::Boolean> left,
175189
std::vector<IScheduler::WireId<IScheduler::Boolean>> rights) {
176-
throw std::runtime_error("Not implemented");
190+
auto leftValues = wireKeeper_->getBatchBooleanValue(left);
191+
nonFreeGates_ += leftValues.size() * rights.size();
192+
std::vector<std::vector<bool>> rightValues;
193+
for (size_t i = 0; i < rights.size(); i++) {
194+
rightValues.push_back(wireKeeper_->getBatchBooleanValue(rights[i]));
195+
}
196+
197+
auto index = engine_->scheduleBatchCompositeAND(leftValues, rightValues);
198+
engine_->executeScheduledAND();
199+
auto result = engine_->getBatchCompositeANDExecutionResult(index);
200+
std::vector<IScheduler::WireId<IScheduler::Boolean>> outputWires(
201+
result.size());
202+
for (size_t i = 0; i < result.size(); i++) {
203+
outputWires[i] = wireKeeper_->allocateBatchBooleanValue(result[i]);
204+
}
205+
return outputWires;
177206
}
178207

179208
std::vector<IScheduler::WireId<IScheduler::Boolean>>
180209
EagerScheduler::privateAndPublicComposite(
181210
IScheduler::WireId<IScheduler::Boolean> left,
182211
std::vector<IScheduler::WireId<IScheduler::Boolean>> rights) {
183-
throw std::runtime_error("Not implemented");
212+
freeGates_ += rights.size();
213+
std::vector<IScheduler::WireId<IScheduler::Boolean>> outputWires(
214+
rights.size());
215+
for (size_t i = 0; i < rights.size(); i++) {
216+
outputWires[i] = wireKeeper_->allocateBooleanValue(engine_->computeFreeAND(
217+
wireKeeper_->getBooleanValue(left),
218+
wireKeeper_->getBooleanValue(rights[i])));
219+
}
220+
return outputWires;
184221
}
185222

186223
std::vector<IScheduler::WireId<IScheduler::Boolean>>
187224
EagerScheduler::privateAndPublicCompositeBatch(
188225
IScheduler::WireId<IScheduler::Boolean> left,
189226
std::vector<IScheduler::WireId<IScheduler::Boolean>> rights) {
190-
throw std::runtime_error("Not implemented");
227+
auto leftValues = wireKeeper_->getBatchBooleanValue(left);
228+
freeGates_ += leftValues.size() * rights.size();
229+
std::vector<IScheduler::WireId<IScheduler::Boolean>> outputWires(
230+
rights.size());
231+
for (size_t i = 0; i < rights.size(); i++) {
232+
outputWires[i] =
233+
wireKeeper_->allocateBatchBooleanValue((engine_->computeBatchFreeAND(
234+
leftValues, wireKeeper_->getBatchBooleanValue(rights[i]))));
235+
}
236+
return outputWires;
191237
}
192238

193239
std::vector<IScheduler::WireId<IScheduler::Boolean>>
194240
EagerScheduler::publicAndPublicComposite(
195241
IScheduler::WireId<IScheduler::Boolean> left,
196242
std::vector<IScheduler::WireId<IScheduler::Boolean>> rights) {
197-
throw std::runtime_error("Not implemented");
243+
return privateAndPublicComposite(left, rights);
198244
}
199245

200246
std::vector<IScheduler::WireId<IScheduler::Boolean>>
201247
EagerScheduler::publicAndPublicCompositeBatch(
202248
IScheduler::WireId<IScheduler::Boolean> left,
203249
std::vector<IScheduler::WireId<IScheduler::Boolean>> rights) {
204-
throw std::runtime_error("Not implemented");
250+
return privateAndPublicCompositeBatch(left, rights);
205251
}
206252

207253
IScheduler::WireId<IScheduler::Boolean> EagerScheduler::privateXorPrivate(

fbpcf/scheduler/test/SchedulerTest.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,8 @@ INSTANTIATE_TEST_SUITE_P(
497497
::testing::Values(
498498
SchedulerType::Plaintext,
499499
SchedulerType::NetworkPlaintext,
500-
SchedulerType::Lazy),
500+
SchedulerType::Lazy,
501+
SchedulerType::Eager),
501502
::testing::Values(16, 256, 1024)),
502503
[](const testing::TestParamInfo<CompositeSchedulerTestFixture::ParamType>&
503504
info) {

0 commit comments

Comments
 (0)