Add AA Tree and tests
I wasn't able to run the test in this repository as I don't have .NET 6.0.401 SDK installed (only a version matching .NET 7), but I don't expect anything to break since it was just mostly a copy-paste from my other repository.
Appreciate the time taken in reviewing this.
Checking.
I think all of these are good suggestions and appreciate your rigorous standards. I'll have them implemented in the next few days hopefully.
Hi @gdziadkiewicz and thanks again for the feedback. (I personally think it's easier to reply "here" rather than you jumping up/down the page navigating to different comments, but let me know if you prefer the other way of individual threads.)
- I divided the tests to have one assertion each test and gave more descriptive test names as asked (good idea).
- I used non-empty assertion messages in my new commit, but to be honest I think the messages I wrote are a bit tautologous with the test's name. (I didn't find much clear guidance on what to write from the other tests here like IntMap.fs but happy to revise them if asked.)
- I tried to rewrite some/most of the compact tests to use AAA as recommended (good idea again).
- You suggested using Expect.containsAll for some of the "Conversion from tests" (
AaTree.ofList/Array/Seq), which I understand over the for loop that iterates over the input list and assertsAaTree.existsfor each of them.
- I think your way is definitely cleaner, but if we wanted to use
Expect.containsAllwe would need to useAaTree.toList/Array/Seqto build a list from the tree first. - I'm not sure if the mutual recursion with conversion methods (testing
ofListwithtoList) is something I should worry about, but happy to make use of it in the test if asked (we have conversiontoList/Array/Seqmethods that build a list withofand check the output withto, so I think in that case we would be collapsing the conversion to/from tests since their logic would be exactly the same.
- It's guaranteed that AaTree's conversion to methods will be sorted, as it does an in-order traversal of the AA Tree.
- Good point. Replaced with
toSeqas suggested, but the:>cast is still there (get a type inference error which I'm not sure how to solve in an OOP-style definition). - I haven't really worked with
Sequences in F# (kind of new to the language/FP in general), so I don't feel confident writing a lazytoSeqimplementation but I think it's a good idea. Happy to replace the current impplementation with your code (although I can't write test for a lazy function because of my inexperience with them). - Removed the
openforExpecto.Flipas suggested and have the tests running successfully.
I reviewed my code and compared it with the paper (and also with the Isabelle HOL proof linked below which corrects the paper in a couple of places) and made some changes.
Summary of my mistakes (now fixed):
- My code only called the
adjustfunction when deleting the left child when it should call the function in all cases (less than, greater than, equal).
Summary of changes from the proof (corrects errors in the paper, and corrections now implemented in code):
- The function
dellrgwhich the proof callssplit_maxrecursed the left subtree in the original but is meant to recurse the right sutree. - Fixed calculation for the
nlvlhelper function.
Isabelle HOL proof for reference: https://isabelle.in.tum.de/library/HOL/HOL-Data_Structures/AA_Set.html .
@hummy123 the CI build is failing due to problems with code formatting. Could you resolve that?
@gdziadkiewicz Got it working thanks to your help (haven't used FAKE/GitHub actions much before).
Here's the action running successfully on my own fork: https://github.com/hummy123/FSharpx.Collections/actions/runs/3841007372/jobs/6540731078 .
(Also updated FAKE as it was giving me errors.)
@hummy123 I'm sorry that I'm not able to work on it quicker. Would you mind if I add some property tests to your code and change the toSeq implementation to the one I proposed?
@gdziadkiewicz No worries - appreciate your time. Anything that makes the code better and tests more resilient sounds good to me, so go ahead.