internal CountMinSketch(CountMinSketchState state)
 {
     this.epsilon = state.Epsilon;
     this.delta   = state.Delta;
     this.Width   = (uint)(Math.Ceiling(Math.E / state.Epsilon));
     this.Depth   = (uint)(Math.Ceiling(Math.Log(1 / state.Delta)));
     lock (_lock)
     {
         this.Matrix = state.Matrix;
     }
     this.Hash = Defaults.GetDefaultHashAlgorithm();
 }
        public CountMinSketch Deserialize(Stream stream)
        {
            using (var br = new BinaryReader(stream))
            {
                int dataFormatMajorVersion = br.ReadUInt16();
                int dataFormatMinorVersion = br.ReadUInt16();

                AssertDataVersionCanBeRead(dataFormatMajorVersion, dataFormatMinorVersion);

                var count   = br.ReadUInt64();
                var epsilon = br.ReadDouble();
                var delta   = br.ReadDouble();

                var width = (uint)(Math.Ceiling(Math.E / epsilon));
                var depth = (uint)(Math.Ceiling(Math.Log(1 / delta)));

                var matrix = new ulong[depth][];

                for (var i = 0; i < depth; i++)
                {
                    matrix[i] = new ulong[width];
                    for (var j = 0; j < width; j++)
                    {
                        var element = br.ReadUInt64();
                        matrix[i][j] = element;
                    }
                }

                var data = new CountMinSketchState
                {
                    Count   = count,
                    Epsilon = epsilon,
                    Delta   = delta,
                    Matrix  = matrix
                };

                var result = new CountMinSketch(data);

                return(result);
            }
        }