diff --git a/compiler/include/concretelang/Conversion/Utils/GlobalFHEContext.h b/compiler/include/concretelang/Conversion/Utils/GlobalFHEContext.h index 9c6677b7f..f312b830d 100644 --- a/compiler/include/concretelang/Conversion/Utils/GlobalFHEContext.h +++ b/compiler/include/concretelang/Conversion/Utils/GlobalFHEContext.h @@ -23,7 +23,6 @@ struct V0FHEConstraint { struct PackingKeySwitchParameter { size_t inputLweDimension; - size_t inputLweCount; size_t outputPolynomialSize; size_t level; size_t baseLog; @@ -55,7 +54,7 @@ struct V0Parameter { llvm::Optional largeInteger; - V0Parameter() = delete; + V0Parameter() {} V0Parameter(size_t glweDimension, size_t logPolynomialSize, size_t nSmall, size_t brLevel, size_t brLogBase, size_t ksLevel, diff --git a/compiler/include/concretelang/Dialect/BConcrete/IR/BConcreteOps.td b/compiler/include/concretelang/Dialect/BConcrete/IR/BConcreteOps.td index 91d1dcb62..dfb6a236e 100644 --- a/compiler/include/concretelang/Dialect/BConcrete/IR/BConcreteOps.td +++ b/compiler/include/concretelang/Dialect/BConcrete/IR/BConcreteOps.td @@ -115,7 +115,6 @@ def BConcrete_WopPBSCRTLweBufferOp : BConcrete_Op<"wop_pbs_crt_lwe_buffer"> { I32Attr : $keyswitchBaseLog, // Packing keyswitch key parameters I32Attr : $packingKeySwitchInputLweDimension, - I32Attr : $packingKeySwitchinputLweCount, I32Attr : $packingKeySwitchoutputPolynomialSize, I32Attr : $packingKeySwitchLevel, I32Attr : $packingKeySwitchBaseLog, diff --git a/compiler/include/concretelang/Dialect/Concrete/IR/ConcreteOps.td b/compiler/include/concretelang/Dialect/Concrete/IR/ConcreteOps.td index d3b6e6fdc..46d90af16 100644 --- a/compiler/include/concretelang/Dialect/Concrete/IR/ConcreteOps.td +++ b/compiler/include/concretelang/Dialect/Concrete/IR/ConcreteOps.td @@ -97,7 +97,6 @@ def Concrete_WopPBSLweOp : Concrete_Op<"wop_pbs_lwe"> { I32Attr : $keyswitchBaseLog, // Packing keyswitch key parameters I32Attr : $packingKeySwitchInputLweDimension, - I32Attr : $packingKeySwitchinputLweCount, I32Attr : $packingKeySwitchoutputPolynomialSize, I32Attr : $packingKeySwitchLevel, I32Attr : $packingKeySwitchBaseLog, diff --git a/compiler/include/concretelang/Dialect/TFHE/IR/TFHEOps.td b/compiler/include/concretelang/Dialect/TFHE/IR/TFHEOps.td index a83417186..6ac8b90a3 100644 --- a/compiler/include/concretelang/Dialect/TFHE/IR/TFHEOps.td +++ b/compiler/include/concretelang/Dialect/TFHE/IR/TFHEOps.td @@ -129,7 +129,6 @@ def TFHE_WopPBSGLWEOp : TFHE_Op<"wop_pbs_glwe"> { I32Attr : $keyswitchBaseLog, // Packing keyswitch key parameters I32Attr : $packingKeySwitchInputLweDimension, - I32Attr : $packingKeySwitchinputLweCount, I32Attr : $packingKeySwitchoutputPolynomialSize, I32Attr : $packingKeySwitchLevel, I32Attr : $packingKeySwitchBaseLog, diff --git a/compiler/include/concretelang/Support/V0Parameters.h b/compiler/include/concretelang/Support/V0Parameters.h index fcbce79ac..70264a435 100644 --- a/compiler/include/concretelang/Support/V0Parameters.h +++ b/compiler/include/concretelang/Support/V0Parameters.h @@ -42,7 +42,7 @@ struct Description { } // namespace optimizer -llvm::Optional getParameter(optimizer::Description &descr, +llvm::Expected getParameter(optimizer::Description &descr, optimizer::Config optimizerConfig); } // namespace concretelang } // namespace mlir diff --git a/compiler/lib/Conversion/FHEToTFHE/FHEToTFHE.cpp b/compiler/lib/Conversion/FHEToTFHE/FHEToTFHE.cpp index 20c61eb7f..bb1f3ae8d 100644 --- a/compiler/lib/Conversion/FHEToTFHE/FHEToTFHE.cpp +++ b/compiler/lib/Conversion/FHEToTFHE/FHEToTFHE.cpp @@ -147,7 +147,7 @@ struct ApplyLookupTableEintOpToWopPBSPattern // (!TFHE.glwe<{_,_,_}{2}>) auto wopPBS = rewriter.replaceOpWithNewOp( lutOp, resultTy, lutOp.a(), lutOp.lut(), -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1); + -1, -1); mlir::concretelang::convertOperandAndResultTypes( rewriter, wopPBS, [&](mlir::MLIRContext *, mlir::Type t) { return converter.convertType(t); diff --git a/compiler/lib/Conversion/TFHEGlobalParametrization/TFHEGlobalParametrization.cpp b/compiler/lib/Conversion/TFHEGlobalParametrization/TFHEGlobalParametrization.cpp index 1d72d8408..129800157 100644 --- a/compiler/lib/Conversion/TFHEGlobalParametrization/TFHEGlobalParametrization.cpp +++ b/compiler/lib/Conversion/TFHEGlobalParametrization/TFHEGlobalParametrization.cpp @@ -181,7 +181,6 @@ struct WopPBSGLWEOpPattern : public mlir::OpRewritePattern { // Packing keyswitch key parameters cryptoParameters.largeInteger->wopPBS.packingKeySwitch .inputLweDimension, - cryptoParameters.largeInteger->wopPBS.packingKeySwitch.inputLweCount, cryptoParameters.largeInteger->wopPBS.packingKeySwitch .outputPolynomialSize, cryptoParameters.largeInteger->wopPBS.packingKeySwitch.level, diff --git a/compiler/lib/Conversion/TFHEToConcrete/TFHEToConcrete.cpp b/compiler/lib/Conversion/TFHEToConcrete/TFHEToConcrete.cpp index 8a02bcd82..53fc4f7a1 100644 --- a/compiler/lib/Conversion/TFHEToConcrete/TFHEToConcrete.cpp +++ b/compiler/lib/Conversion/TFHEToConcrete/TFHEToConcrete.cpp @@ -129,7 +129,6 @@ struct WopPBSGLWEOpPattern : public mlir::OpRewritePattern { wopOp.keyswitchLevel(), wopOp.keyswitchBaseLog(), // Packing keyswitch key parameters wopOp.packingKeySwitchInputLweDimension(), - wopOp.packingKeySwitchinputLweCount(), wopOp.packingKeySwitchoutputPolynomialSize(), wopOp.packingKeySwitchLevel(), wopOp.packingKeySwitchBaseLog(), // Circuit bootstrap parameters diff --git a/compiler/lib/Support/CompilerEngine.cpp b/compiler/lib/Support/CompilerEngine.cpp index 0b73ed0d0..05932255e 100644 --- a/compiler/lib/Support/CompilerEngine.cpp +++ b/compiler/lib/Support/CompilerEngine.cpp @@ -171,11 +171,16 @@ CompilerEngine::getConcreteOptimizerDescription(CompilationResult &res) { llvm::Error CompilerEngine::determineFHEParameters(CompilationResult &res) { if (compilerOptions.v0Parameter.hasValue()) { // parameters come from the compiler options - V0Parameter v0Params = compilerOptions.v0Parameter.value(); + auto v0Params = compilerOptions.v0Parameter.value(); if (compilerOptions.largeIntegerParameter.hasValue()) { v0Params.largeInteger = compilerOptions.largeIntegerParameter; } - res.fheContext.emplace(mlir::concretelang::V0FHEContext{{0, 0}, v0Params}); + V0FHEConstraint constraint; + if (compilerOptions.v0FHEConstraints.hasValue()) { + constraint = compilerOptions.v0FHEConstraints.value(); + } + res.fheContext.emplace( + mlir::concretelang::V0FHEContext{constraint, v0Params}); return llvm::Error::success(); } // compute parameters @@ -187,16 +192,13 @@ llvm::Error CompilerEngine::determineFHEParameters(CompilationResult &res) { if (!descr.get().hasValue()) { return llvm::Error::success(); } - auto optV0Params = + auto v0Params = getParameter(descr.get().value(), compilerOptions.optimizerConfig); - if (!optV0Params) { - return StreamStringError() - << "Could not determine V0 parameters for 2-norm of " - << (*descr)->constraint.norm2 << " and p of " - << (*descr)->constraint.p; + if (auto err = v0Params.takeError()) { + return err; } res.fheContext.emplace(mlir::concretelang::V0FHEContext{ - descr.get().value().constraint, optV0Params.getValue()}); + descr.get().value().constraint, v0Params.get()}); } return llvm::Error::success(); diff --git a/compiler/lib/Support/V0Parameters.cpp b/compiler/lib/Support/V0Parameters.cpp index 90c4fecd9..f78226594 100644 --- a/compiler/lib/Support/V0Parameters.cpp +++ b/compiler/lib/Support/V0Parameters.cpp @@ -16,8 +16,9 @@ #include "llvm/Support/raw_ostream.h" #include "concrete-optimizer.hpp" +#include "concretelang/Support/Error.h" #include "concretelang/Support/V0Parameters.h" -#include +#include "concretelang/Support/logging.h" namespace mlir { namespace concretelang { @@ -75,7 +76,7 @@ static void display(V0FHEConstraint constraint, o() << "---\n"; } -llvm::Optional getParameter(optimizer::Description &descr, +llvm::Expected getParameter(optimizer::Description &descr, optimizer::Config config) { namespace chrono = std::chrono; auto start = chrono::high_resolution_clock::now(); @@ -94,24 +95,45 @@ llvm::Optional getParameter(optimizer::Description &descr, if (sol.p_error == 1.0) { // The optimizer return a p_error = 1 if there is no solution - return llvm::None; + return StreamStringError() + << "Could not determine V0 parameters for 2-norm of " + << descr.constraint.norm2 << " and p of " << descr.constraint.p; } + V0Parameter params; + params.glweDimension = sol.glwe_dimension; + params.logPolynomialSize = (size_t)std::log2l(sol.glwe_polynomial_size); + params.nSmall = sol.internal_ks_output_lwe_dimension; + params.brLevel = sol.br_decomposition_level_count; + params.brLogBase = sol.br_decomposition_base_log; + params.ksLevel = sol.ks_decomposition_level_count; + params.ksLogBase = sol.ks_decomposition_base_log; + if (sol.use_wop_pbs) { - llvm::errs() - << "WARNING: a woppbs solution exists but woppbs is not available\n"; - return llvm::None; + if (sol.crt_decomposition.empty()) { + // TODO: FIXME + llvm::errs() << "FIXME: optimizer didn't returns the crt_decomposition\n"; + sol.crt_decomposition = {7, 8, 9, 11, 13}; + } + LargeIntegerParameter lParams; + for (auto m : sol.crt_decomposition) { + lParams.crtDecomposition.push_back(m); + } + lParams.wopPBS.circuitBootstrap.baseLog = sol.cb_decomposition_base_log; + lParams.wopPBS.circuitBootstrap.level = sol.cb_decomposition_level_count; + // FIXME: For now the packing keyswitch parameter are the same than the + // blind rotate one. But that should be done on the optimizer size and + // moreover this assumption could change. + lParams.wopPBS.packingKeySwitch.inputLweDimension = sol.input_lwe_dimension; + lParams.wopPBS.packingKeySwitch.outputPolynomialSize = + sol.glwe_polynomial_size; + lParams.wopPBS.packingKeySwitch.level = sol.br_decomposition_level_count; + lParams.wopPBS.packingKeySwitch.baseLog = sol.br_decomposition_base_log; + + params.largeInteger = lParams; } - return mlir::concretelang::V0Parameter{ - sol.glwe_dimension, - (size_t)std::log2l(sol.glwe_polynomial_size), - sol.internal_ks_output_lwe_dimension, - sol.br_decomposition_level_count, - sol.br_decomposition_base_log, - sol.ks_decomposition_level_count, - sol.ks_decomposition_base_log, - }; + return params; } } // namespace concretelang diff --git a/compiler/src/main.cpp b/compiler/src/main.cpp index 2e97abe7b..f7c8a3b12 100644 --- a/compiler/src/main.cpp +++ b/compiler/src/main.cpp @@ -230,8 +230,8 @@ llvm::cl::list largeIntegerPackingKeyswitch( llvm::cl::desc( "Use the large integer to lower FHE.eint with the given parameters for " "packing keyswitch, must be used with the other large-integers options " - "(experimental) [inputLweDimension, inputLweCount, " - "outputPolynomialSize, level, baseLog]"), + "(experimental) [inputLweDimension, outputPolynomialSize, level, " + "baseLog]"), llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated); llvm::cl::list largeIntegerCircuitBootstrap( @@ -330,14 +330,12 @@ cmdlineCompilationOptions() { cmdline::largeIntegerCRTDecomposition; options.largeIntegerParameter->wopPBS.packingKeySwitch.inputLweDimension = cmdline::largeIntegerPackingKeyswitch[0]; - options.largeIntegerParameter->wopPBS.packingKeySwitch.inputLweCount = - cmdline::largeIntegerPackingKeyswitch[1]; options.largeIntegerParameter->wopPBS.packingKeySwitch - .outputPolynomialSize = cmdline::largeIntegerPackingKeyswitch[2]; + .outputPolynomialSize = cmdline::largeIntegerPackingKeyswitch[1]; options.largeIntegerParameter->wopPBS.packingKeySwitch.level = - cmdline::largeIntegerPackingKeyswitch[3]; + cmdline::largeIntegerPackingKeyswitch[2]; options.largeIntegerParameter->wopPBS.packingKeySwitch.baseLog = - cmdline::largeIntegerPackingKeyswitch[4]; + cmdline::largeIntegerPackingKeyswitch[3]; options.largeIntegerParameter->wopPBS.circuitBootstrap.level = cmdline::largeIntegerCircuitBootstrap[0]; options.largeIntegerParameter->wopPBS.circuitBootstrap.baseLog =