Disaggregate Translate Plan

Disaggregate Translate Tree

DisaggregateTranslatePlan describes disaggregation traversal together with translations. It specifies which disaggregation nodes are visited and, for each receiving node, which translating nodes contribute to it.

This is a translating disaggregation plan. Its counterpart for a matrix-vector product is AggregatePlan.

Building a DisaggregateTranslatePlan

Conceptually, DisaggregateTranslatePlan is built from a tree and a translating-nodes iterator. There are two supported forms:

  • DisaggregateTranslatePlan(tree, TranslatingNodesIterator)
  • DisaggregateTranslatePlan(testtree, trialtree, TranslatingNodesIterator)

Single-tree form:

  • TranslatingNodesIterator(node) provides translating nodes for receiving node node in the same tree.

Two-tree form:

  • the plan is built on testtree, so receiving/disaggregation nodes in the plan are testtree nodes,
  • translating nodes are selected with respect to trialtree,
  • each value translatingnodes[level][receivingnode] is a vector of translating nodes from trialtree.

Nodes are visited if they receive translated data directly, or if an ancestor does. This keeps the downward traversal complete for all translated contributions.

Fields

A DisaggregateTranslatePlan stores:

  • translatingnodes: per-level dictionary mapping receiving nodes to translating nodes. In two-tree form: keys are receiving nodes in testtree; values are translating nodes in trialtree.
  • nodes: disaggregation nodes grouped by level; these are nodes in the disaggregation tree (two-tree form: testtree).
  • levels: contiguous disaggregation levels, ordered root-to-leaves.
  • isdisaggregationnode: booleans over disaggregation-tree node indices indicating whether a node is reached by disaggregation traversal.
  • rootoffset: offset used to convert nodes to compact 1-based indices.
  • tree: the tree associated with the plan (two-tree form: testtree).

Example

The example below constructs Galerkin plans in AggregateMode() and extracts the test-side DisaggregateTranslatePlan.

tfiterator = H2Trees.TranslatingNodesIterator(; isnear=H2Trees.isnear(; additionalbufferboxes=1) ) #hide
plans = H2Trees.galerkinplans(tree, aggregatenode, tfiterator, H2Trees.AggregateMode())
disaggregatetranslateplan = plans.testdisaggregationplan
disaggregatetranslateplan
DisaggregateTranslatePlan{TwoNTree{3, BoxData{3, Float64}, Float64}}([Dict(695 => [3, 4, 18, 37, 66, 76, 80, 101, 156, 157  …  407, 410, 430, 444, 487, 501, 502, 514, 546, 560], 501 => [3, 4, 18, 37, 51, 66, 72, 76, 80, 101  …  628, 647, 661, 662, 676, 695, 710, 743, 762, 809], 724 => [3, 4, 66, 76, 80, 101, 142, 156, 157, 171  …  272, 278, 306, 320, 321, 335, 373, 387, 546, 560], 444 => [3, 66, 72, 80, 101, 142, 156, 157, 171, 175  …  546, 560, 561, 575, 628, 647, 661, 662, 676, 695], 272 => [3, 4, 18, 37, 51, 66, 72, 101, 142, 156  …  662, 676, 695, 710, 724, 743, 762, 776, 795, 809], 320 => [3, 37, 51, 66, 72, 80, 101, 142, 156, 157  …  662, 676, 695, 710, 724, 743, 762, 776, 795, 809], 762 => [80, 101, 142, 156, 157, 171, 175, 178, 213, 257  …  502, 514, 546, 560, 561, 575, 628, 647, 661, 662], 4 => [142, 156, 157, 171, 175, 178, 257, 258, 272, 278  …  628, 647, 661, 662, 676, 695, 710, 724, 795, 809], 575 => [3, 4, 18, 37, 51, 66, 76, 101, 156, 306  …  430, 444, 487, 501, 710, 743, 762, 776, 795, 809], 661 => [3, 4, 18, 37, 51, 66, 76, 80, 101, 156  …  487, 501, 502, 514, 546, 560, 762, 776, 795, 809]…), Dict(35 => [5, 6, 48, 49, 52, 59, 67, 69, 70, 73  …  764, 765, 766, 774, 796, 797, 805, 806, 807, 808], 797 => [19, 27, 28, 35, 36, 38, 39, 40, 48, 49  …  697, 698, 706, 707, 708, 711, 744, 745, 755, 764], 711 => [19, 27, 28, 35, 36, 38, 39, 40, 48, 49  …  778, 779, 786, 787, 796, 797, 805, 806, 807, 808], 308 => [5, 6, 7, 8, 9, 10, 19, 27, 28, 35  …  435, 443, 445, 446, 454, 455, 456, 530, 537, 538], 67 => [6, 7, 8, 9, 19, 28, 35, 36, 38, 75  …  764, 765, 766, 774, 775, 777, 778, 779, 786, 787], 808 => [19, 27, 28, 35, 36, 38, 39, 40, 48, 49  …  744, 745, 747, 755, 763, 764, 765, 775, 777, 778], 215 => [5, 6, 7, 8, 9, 10, 19, 27, 28, 35  …  576, 583, 591, 592, 593, 629, 630, 631, 632, 640], 73 => [5, 6, 7, 8, 9, 10, 19, 27, 28, 35  …  764, 765, 766, 774, 775, 777, 778, 779, 786, 787], 115 => [5, 6, 7, 8, 9, 10, 19, 27, 28, 35  …  677, 685, 686, 693, 694, 744, 745, 746, 747, 755], 404 => [5, 6, 7, 8, 9, 10, 19, 27, 28, 35  …  592, 593, 594, 599, 607, 777, 778, 779, 786, 787]…), Dict(56 => [41, 42, 43, 44, 46, 47, 107, 108, 109, 110  …  756, 757, 758, 767, 768, 769, 770, 771, 772, 773], 425 => [376, 377, 378, 379, 380, 381, 382, 390, 391, 393  …  438, 439, 440, 505, 506, 507, 508, 509, 510, 511], 429 => [376, 377, 378, 379, 380, 381, 382, 397, 398, 399  …  440, 441, 442, 505, 506, 507, 508, 509, 510, 511], 60 => [11, 12, 13, 14, 15, 16, 17, 42, 43, 107, 108, 110, 112, 113, 756, 757, 758, 759, 760, 761], 220 => [226, 227, 229, 250, 251, 252, 253, 254, 265, 266  …  298, 299, 300, 301, 339, 340, 341, 342, 343, 344], 719 => [621, 622, 623, 624, 625, 626, 726, 727, 728, 729  …  792, 793, 794, 798, 799, 800, 801, 802, 803, 804], 734 => [621, 622, 623, 624, 625, 626, 717, 719, 767, 768, 769, 770, 771, 772, 773, 798, 799, 801, 803, 804], 699 => [613, 614, 615, 616, 617, 618, 619, 621, 622, 623  …  689, 690, 691, 692, 726, 727, 728, 729, 730, 731], 673 => [127, 128, 129, 130, 131, 132, 613, 614, 615, 616  …  688, 689, 690, 691, 692, 699, 700, 701, 704, 705], 319 => [225, 226, 227, 228, 229, 230, 325, 327, 328, 329  …  390, 391, 392, 393, 394, 398, 399, 400, 401, 402]…)], [[3, 4, 18, 37, 51, 66, 72, 76, 80, 101  …  662, 676, 695, 710, 724, 743, 762, 776, 795, 809], [5, 6, 7, 8, 9, 10, 19, 27, 28, 35  …  778, 779, 786, 787, 796, 797, 805, 806, 807, 808], [11, 12, 13, 14, 15, 16, 17, 20, 21, 22  …  792, 793, 794, 798, 799, 800, 801, 802, 803, 804]], 3:5, Bool[0, 0, 1, 1, 1, 1, 1, 1, 1, 1  …  1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 0, TwoNTree{3, BoxData{3, Float64}, Float64}
 level: 1 with 1 node(s) with on average 18750.0 points and 8.0 children and halfsize: 0.9995217120782627
- level: 2 with 8 node(s) with on average 2343.75 points and 7.0 children and halfsize: 0.49976085603913134
-- level: 3 with 56 node(s) with on average 334.82 points and 4.71 children and halfsize: 0.24988042801956567
--- level: 4 with 264 node(s) with on average 69.39 points and 1.82 children and halfsize: 0.12494021400978284
---- level: 5 with 480 node(s) with on average 16.59 points and 0.0 children and halfsize: 0.06247010700489142
)