@@ -166,42 +166,88 @@ std::vector<IScheduler::WireId<IScheduler::Boolean>>
166166EagerScheduler::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
172186std::vector<IScheduler::WireId<IScheduler::Boolean>>
173187EagerScheduler::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
179208std::vector<IScheduler::WireId<IScheduler::Boolean>>
180209EagerScheduler::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
186223std::vector<IScheduler::WireId<IScheduler::Boolean>>
187224EagerScheduler::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
193239std::vector<IScheduler::WireId<IScheduler::Boolean>>
194240EagerScheduler::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
200246std::vector<IScheduler::WireId<IScheduler::Boolean>>
201247EagerScheduler::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
207253IScheduler::WireId<IScheduler::Boolean> EagerScheduler::privateXorPrivate (
0 commit comments