// counts the number of mines already placed
        private BigInteger CountPlacedMines(ProbabilityLine pl, NextWitness nw)
        {
            BigInteger result = 0;

            foreach (Box b in nw.GetOldBoxes())
            {
                result = result + pl.GetMineBoxCount(b.GetUID());
            }

            return(result);
        }
        // calculate how many ways this solution can be generated and roll them into one
        private void MergeLineProbabilities(ProbabilityLine npl, ProbabilityLine pl)
        {
            BigInteger solutions = 1;

            for (int i = 0; i < this.boxes.Count; i++)
            {
                solutions = solutions * (BigInteger)SMALL_COMBINATIONS[this.boxes[i].GetTiles().Count][(int)pl.GetMineBoxCount(i)];
            }

            npl.SetSolutionCount(npl.GetSolutionCount() + solutions);

            for (int i = 0; i < this.boxes.Count; i++)
            {
                if (this.mask[i])    // if this box has been involved in this solution - if we don't do this the hash gets corrupted by boxes = 0 mines because they weren't part of this edge
                {
                    npl.SetMineBoxCount(i, npl.GetMineBoxCount(i) + pl.GetMineBoxCount(i) * solutions);
                }
            }
        }