Exemplo n.º 1
0
        private static ushort[] Get16BitMasks(SliceInfo data)
        {
            var masks = new List <ushort>();

            if (data.TotalNonZeros == 0)
            {
                return(new ushort[] { });
            }

            if (data.TotalNonZeros >= 1)
            {
                // create first node is cutoff
                masks.Add(0x1);
            }

            if (data.TotalNonZeros >= 2)
            {
                // create second node is 15 item check
                masks.Add(0xfffe);
            }

            if (data.TotalNonZeros > 15)
            {
                // keep create nodes until empty

                var remaining = data.TotalNonZeros - 15;

                var noOfNodes = Math.DivRem(remaining, 16, out int rem);

                for (var i = 0; i < noOfNodes; i += 1)
                {
                    masks.Add(0xffff);
                }

                if (rem > 0)
                {
                    ushort lastMask = 0;
                    for (var i = 0; i < rem; i += 1)
                    {
                        lastMask |= (ushort)(1 << i);
                    }

                    masks.Add(lastMask);
                }
            }

            return(masks.ToArray());
        }
Exemplo n.º 2
0
        public RowTree ProcessRow(SliceInfo data)
        {
            //var data = new SliceInfo
            //{
            //    TotalNonZeros = 4,
            //    Branches = new ushort[] { 10, 12, 60, 80 },
            //    Leaves = new int[] { 0, 3, 4, 5 },
            //};
            var masks  = mRuler.GetBitMasks(data.TotalNonZeros);
            var branch = CreateRowBranch(data.TotalNonZeros);

            CopyBranchNodes(data.Branches, 0, data.TotalNonZeros, branch.Keys.Length, branch);

            // Build test chunk
            // 1. branch vector
            // 2. leaf offset
            // 3. leaf array
            mRuler.GetChunkInfo(data.TotalNonZeros, out int wholeBuckets, out int remainder);

            var chunks = new TestChunk[branch.NoOfBuckets];
            var offset = 0;

            for (var i = 0; i < branch.NoOfBuckets; i += 1)
            {
                chunks[i] = new TestChunk
                {
                    KeyOffset  = offset,
                    LeafOffset = offset,
                    LeafLength = (i < wholeBuckets) ? mRuler.BucketSize : remainder,
                };

                offset += mRuler.BucketSize;
            }

            // generate instruction set
            // 1. set chunk no
            // 2. branch mask
            var instructions = new Instruction[masks.Length];

            if (masks.Length <= 1)
            {
                instructions[0] = new Instruction
                {
                    Chunk = 0,
                    Mask  = masks[0],
                };
            }

            if (masks.Length <= 2)
            {
                instructions[1] = new Instruction
                {
                    Chunk = 0,
                    Mask  = masks[1],
                };
            }

            for (var i = 2; i < masks.Length; i += 1)
            {
                instructions[i] = new Instruction
                {
                    Chunk = i - 1,
                    Mask  = masks[i],
                };
            }

            return(new RowTree
            {
                Branches = data.Branches,
                Leaves = data.Leaves,
                TestChunks = chunks,
                Instructions = instructions,
            });
        }
Exemplo n.º 3
0
 private static void GetChunkInfo(SliceInfo data, out int BUCKET_SIZE, out int wholeBuckets, out int remainder)
 {
     BUCKET_SIZE  = 16;
     wholeBuckets = Math.DivRem(data.TotalNonZeros, BUCKET_SIZE, out remainder);
 }