lean4-htt/tests/bench/binarytrees.st.swift
2023-01-19 14:44:20 +01:00

64 lines
1.5 KiB
Swift

// see binarytrees.swift for original
import Dispatch
import Foundation
class TreeNode {
var left, right: TreeNode?
init(left: TreeNode?, right: TreeNode?) {
self.left = left
self.right = right
}
func check() -> Int {
if left != nil {
return left!.check() + right!.check() + 1
} else {
return 1
}
}
}
func createTree(_ depth: Int) -> TreeNode? {
if depth > 0 {
let node = TreeNode(left: createTree(depth-1),
right: createTree(depth-1))
return node
} else {
let node = TreeNode(left: nil, right: nil)
return node
}
}
let n: Int
if CommandLine.argc > 1 {
n = Int(CommandLine.arguments[1]) ?? 10
} else {
n = 10
}
let minDepth = 4
let maxDepth = (n > minDepth + 2) ? n : minDepth + 2
// Create big tree in first pool
let tree = createTree(maxDepth+1)
let check = tree!.check()
print("stretch tree of depth \(maxDepth+1)\t check: \(check)")
// Cleal first pool and allocate long living tree
let longLivingTree = createTree(maxDepth)
// Allocate binary trees of increasing depth up to maxDepth depth
for currentDepth in stride(from: minDepth, through: maxDepth, by: 2) {
let iterations = 1 << (maxDepth - currentDepth + minDepth)
var totalChecksum = 0
for _ in 1...iterations {
let tree1 = createTree(currentDepth)
totalChecksum += tree1!.check()
}
print("\(iterations)\t trees of depth \(currentDepth)\t check: \(totalChecksum)")
}
// Check long living tree and print out check info
print("long lived tree of depth \(maxDepth)\t check: \(longLivingTree!.check())")