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()); }
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, }); }
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); }