Changed the contains(BytePoint) method in BasicTriangle, so now it compares with some internal fields rather than computing values on the fly.  This didn't seem to make a big difference in performance.
git
Merge branch 'master' of https://github.com/maloneyg/substitution-search
Merge branch 'master' of https://github.com/maloneyg/substitution-search
The EdgeBreakdownTree field in PuzzleBoundary seems to be working properly.