code: func (tp *treePermutations) computeDescendantPermutations() {
  	it := newBFSIterator(tp.originalRoot)
  	for {
  		v := it.Next()
  		if v == nil {
  			return
  		}
  
  		// Skip leaves
  		if len(v.Descendants) == 0 {
  			continue
  		}
  
  		// Iterate over all options of selecting the threshold out of the descendants
  		for _, el := range chooseKoutOfN(len(v.Descendants), v.Threshold) {
  			// And for each such option, append it to the current TreeVertex
  			tp.descendantPermutations[v] = append(tp.descendantPermutations[v], v.selectDescendants(el.indices))
  		}
  	}
  }
docs: // computeDescendantPermutations computes all possible combinations of sub-trees
  // for all vertices, based on the thresholds.