// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using Microsoft.Research.SEAL; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; namespace SEALNetExamples { public static class Utilities { /// /// Helper function: Prints the name of the example in a fancy banner. /// public static void PrintExampleBanner(string title) { if (!string.IsNullOrEmpty(title)) { int titleLength = title.Length; int bannerLength = titleLength + 2 * 10; string bannerTop = "+" + new string('-', bannerLength - 2) + "+"; string bannerMiddle = "|" + new string(' ', 9) + title + new string(' ', 9) + "|"; Console.WriteLine(); Console.WriteLine(bannerTop); Console.WriteLine(bannerMiddle); Console.WriteLine(bannerTop); } } /// /// Helper function: Prints the parameters in a SEALContext. /// public static void PrintParameters(SEALContext context) { // Verify parameters if (null == context) { throw new ArgumentNullException("context is not set"); } SEALContext.ContextData contextData = context.KeyContextData; /* Which scheme are we using? */ string schemeName = null; switch (contextData.Parms.Scheme) { case SchemeType.BFV: schemeName = "BFV"; break; case SchemeType.CKKS: schemeName = "CKKS"; break; case SchemeType.BGV: schemeName = "BGV"; break; default: throw new ArgumentException("unsupported scheme"); } Console.WriteLine("/"); Console.WriteLine("| Encryption parameters:"); Console.WriteLine($"| Scheme: {schemeName}"); Console.WriteLine("| PolyModulusDegree: {0}", contextData.Parms.PolyModulusDegree); /* Print the size of the true (product) coefficient modulus. */ Console.Write("| CoeffModulus size: {0} (", contextData.TotalCoeffModulusBitCount); List coeffModulus = (List)contextData.Parms.CoeffModulus; for (int i = 0; i < coeffModulus.Count - 1; i++) { Console.Write($"{coeffModulus[i].BitCount} + "); } Console.WriteLine($"{coeffModulus.Last().BitCount}) bits"); /* For the BFV scheme print the PlainModulus parameter. */ if (contextData.Parms.Scheme == SchemeType.BFV) { Console.WriteLine("| PlainModulus: {0}", contextData.Parms.PlainModulus.Value); } Console.WriteLine("\\"); } /// /// Helper function: Print the first and last printSize elements /// of a 2 row matrix. /// public static void PrintMatrix(IEnumerable matrixPar, int rowSize, int printSize = 5) { ulong[] matrix = matrixPar.ToArray(); Console.WriteLine(); /* We're not going to print every column of the matrix (may be big). Instead print printSize slots from beginning and end of the matrix. */ Console.Write(" ["); for (int i = 0; i < printSize; i++) { Console.Write("{0,3}, ", matrix[i]); } Console.Write(" ..."); for (int i = rowSize - printSize; i < rowSize; i++) { Console.Write(", {0,3}", matrix[i]); } Console.WriteLine(" ]"); Console.Write(" ["); for (int i = rowSize; i < rowSize + printSize; i++) { Console.Write("{0,3}, ", matrix[i]); } Console.Write(" ..."); for (int i = 2 * rowSize - printSize; i < 2 * rowSize; i++) { Console.Write(", {0,3}", matrix[i]); } Console.WriteLine(" ]"); Console.WriteLine(); } /// /// Helper function: Convert a ulong to a hex string representation /// public static string ULongToString(ulong value) { byte[] bytes = BitConverter.GetBytes(value); if (BitConverter.IsLittleEndian) { Array.Reverse(bytes); } return BitConverter.ToString(bytes).Replace("-", ""); } /// /// Helper function: Prints a vector of floating-point values. /// public static void PrintVector( IEnumerable vec, int printSize = 4, int prec = 3) { string numFormat = string.Format("{{0:N{0}}}", prec); T[] veca = vec.ToArray(); int slotCount = veca.Length; Console.WriteLine(); if (slotCount <= 2 * printSize) { Console.Write(" ["); for (int i = 0; i < slotCount; i++) { Console.Write(" " + string.Format(numFormat, veca[i])); if (i != (slotCount - 1)) Console.Write(","); else Console.Write(" ]"); } Console.WriteLine(); } else { Console.Write(" ["); for (int i = 0; i < printSize; i++) { Console.Write(" "+ string.Format(numFormat, veca[i]) + ", "); } if (veca.Length > 2 * printSize) { Console.Write(" ..."); } for (int i = slotCount - printSize; i < slotCount; i++) { Console.Write(", " + string.Format(numFormat, veca[i])); } Console.WriteLine(" ]"); } Console.WriteLine(); } public static void PrintLine([CallerLineNumber] int lineNumber = 0) { Console.Write("Line {0,3} --> ", lineNumber); } } }