Direct Solver: Recursive Skeletonization - #164

Open
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion
Open

Direct Solver: Recursive Skeletonization#164
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion

Conversation

@alexfikl

@alexfiklalexfikl commented Jun 30, 2022

Copy link
Copy Markdown
Collaborator

Attempting to break up the direct solver MR into smaller, more reviewable pieces. As a rundown

The code for this is mostly in the deprecated https://gitlab.tiker.net/inducer/pytential/-/merge_requests/137.

@alexfiklalexfikl changed the title Direct Solver: Direct Solver: Recursive SkeletonizationJun 30, 2022
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 39e8347 to 80bb8e1CompareJuly 1, 2022 15:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 8e3731d to 78699ecCompareJuly 14, 2022 12:30
@alexfikl
alexfikl marked this pull request as ready for review July 14, 2022 12:31
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer This should be ready for a look. It doesn't do much:

  • adds a data structure to hold the hierarchical cluster info from boxtree.Tree and merge cluster indices.
  • adds some helper functions to do the recursive skeletonization + simple tests.

@alexfikl
alexfikl requested a review from inducerJuly 14, 2022 15:12
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 7ed33f4 to ea42c82CompareAugust 2, 2022 06:24
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 80fe1fb to b44f4a8CompareAugust 4, 2022 18:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from cc4be24 to 0176d32CompareAugust 12, 2022 12:57
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 0176d32 to f71a21bCompareAugust 22, 2022 06:19

@inducerinducer left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed a pending review. Figured it'd be better to submit it. :) Don't quite know how old this is.

Comment threadpytential/linalg/cluster.py Outdated

Current level that is represented.

.. attribute:: nlevels

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this avoidable?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reworked this a while back, so not quite sure if your comment still applies?

Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/cluster.py Outdated
# {{{ cluster tree

@dataclass(frozen=True)
class ClusterTreeLevel:

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this two things rather than one?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, separated into a ClusterTree and ClusterLevel with a ClusterTree.levels() iterator to go through them for the recursive skeletonization.

Naming could still be better probably?

logger.info("\n%s", case)

run_skeletonize_by_proxy(actx, case, case.resolutions[0], visualize=visualize)
dd = sym.DOFDescriptor(case.name, discr_stage=case.skel_discr_stage)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update the test docstring to describe precisely what's being tested here.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9a8db7f to ce00d4eCompareAugust 23, 2022 16:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from c1e986c to 814b8acCompareSeptember 14, 2022 07:10
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9630b4f to 32ecc58CompareAugust 4, 2023 06:54
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f79175f to 19f4098CompareSeptember 8, 2023 07:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 19f4098 to e9643ccCompareOctober 17, 2023 06:44


def make_cluster_parent_map(parent_ids: np.ndarray) -> np.ndarray:
"""Construct a parent map for :attr:`ClusterLevel.parent_map`."""

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rephrase/rework? "All children in a bucket"?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from e9643cc to 20fbc31CompareOctober 29, 2023 09:01
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer I think inducer/ci-support@1475971 broke pylint (it's not finding the cython stuff anymore?). Any suggestion for a fix?

@inducer

Copy link
Copy Markdown
Owner

#225

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 20fbc31 to 6983a42CompareNovember 1, 2023 15:52
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 6983a42 to ab228e6CompareMay 29, 2024 07:01
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ab228e6 to c92b7f0CompareJuly 6, 2024 06:30
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f6e7c6e to 78eebbfCompareAugust 2, 2024 11:48
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from c479984 to 8aa200fCompareSeptember 1, 2024 08:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 9c5bb68 to a7c5d19CompareSeptember 20, 2024 11:51
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 8bef46c to ae443aaCompareNovember 16, 2024 09:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ae443aa to 85033dbCompareDecember 17, 2024 08:13
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 85033db to 15eee49CompareJanuary 8, 2025 08:41
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 15eee49 to 78c496dCompareFebruary 8, 2025 09:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from ba99713 to 963f568CompareFebruary 27, 2025 08:16
@alexfiklalexfikl mentioned this pull request Aug 12, 2025

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR advances the direct solver work by introducing hierarchical clustering infrastructure and wiring it into proxy-based skeletonization to enable recursive (multi-level) skeletonization, along with the associated test and documentation updates.

Changes:

  • Add a new pytential.linalg.cluster module providing cluster trees/levels, clustering helpers, and partition_by_nodes.
  • Extend skeletonization to produce richer results (including diagonal blocks) and add rec_skeletonize_by_proxy for multi-level skeletonization.
  • Update proxy and skeletonization tests (and docs) to match the new clustering/tree and neighbor-gathering APIs.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
pytential/linalg/cluster.pyNew clustering module (cluster tree/levels, partitioning, visualization utilities).
pytential/linalg/skeletonization.pyAdds recursive skeletonization and augments skeletonization results/weighting/logging.
pytential/linalg/proxy.pyRemoves partition_by_nodes (moved to cluster module) and updates neighbor gathering API.
pytential/linalg/utils.pyDocuments/exports helper utilities used by skeletonization (make_flat_cluster_diag, interp_decomp).
test/extra_matrix_data.pyUpdates test fixtures to return (index, tree) and import partitioning from linalg.cluster.
test/test_linalg_cluster.pyNew tests for cluster tree construction and (un)clustering behavior.
test/test_linalg_proxy.pyAdapts tests to updated cluster index return type and neighbor gathering signature.
test/test_linalg_skeletonization.pyUpdates tests to exercise multilevel skeletonization flow.
test/test_matrix.pyAdapts callers to updated get_cluster_index / get_tgt_src_cluster_index return type.
doc/linalg.rstIncludes pytential.linalg.cluster in the linalg documentation.
doc/conf.pyAdds/adjusts intersphinx mappings for new referenced types.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadpytential/linalg/cluster.py Outdated
Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/cluster.py Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@alexfikl@inducer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Direct Solver: Recursive Skeletonization - #164

Open
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion
Open

Direct Solver: Recursive Skeletonization#164
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion

Conversation

@alexfikl

@alexfiklalexfikl commented Jun 30, 2022

Copy link
Copy Markdown
Collaborator

Attempting to break up the direct solver MR into smaller, more reviewable pieces. As a rundown

The code for this is mostly in the deprecated https://gitlab.tiker.net/inducer/pytential/-/merge_requests/137.

@alexfiklalexfikl changed the title Direct Solver: Direct Solver: Recursive SkeletonizationJun 30, 2022
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 39e8347 to 80bb8e1CompareJuly 1, 2022 15:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 8e3731d to 78699ecCompareJuly 14, 2022 12:30
@alexfikl
alexfikl marked this pull request as ready for review July 14, 2022 12:31
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer This should be ready for a look. It doesn't do much:

  • adds a data structure to hold the hierarchical cluster info from boxtree.Tree and merge cluster indices.
  • adds some helper functions to do the recursive skeletonization + simple tests.

@alexfikl
alexfikl requested a review from inducerJuly 14, 2022 15:12
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 7ed33f4 to ea42c82CompareAugust 2, 2022 06:24
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 80fe1fb to b44f4a8CompareAugust 4, 2022 18:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from cc4be24 to 0176d32CompareAugust 12, 2022 12:57
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 0176d32 to f71a21bCompareAugust 22, 2022 06:19

@inducerinducer left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed a pending review. Figured it'd be better to submit it. :) Don't quite know how old this is.

Comment threadpytential/linalg/cluster.py Outdated

Current level that is represented.

.. attribute:: nlevels

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this avoidable?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reworked this a while back, so not quite sure if your comment still applies?

Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/cluster.py Outdated
# {{{ cluster tree

@dataclass(frozen=True)
class ClusterTreeLevel:

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this two things rather than one?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, separated into a ClusterTree and ClusterLevel with a ClusterTree.levels() iterator to go through them for the recursive skeletonization.

Naming could still be better probably?

logger.info("\n%s", case)

run_skeletonize_by_proxy(actx, case, case.resolutions[0], visualize=visualize)
dd = sym.DOFDescriptor(case.name, discr_stage=case.skel_discr_stage)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update the test docstring to describe precisely what's being tested here.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9a8db7f to ce00d4eCompareAugust 23, 2022 16:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from c1e986c to 814b8acCompareSeptember 14, 2022 07:10
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9630b4f to 32ecc58CompareAugust 4, 2023 06:54
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f79175f to 19f4098CompareSeptember 8, 2023 07:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 19f4098 to e9643ccCompareOctober 17, 2023 06:44


def make_cluster_parent_map(parent_ids: np.ndarray) -> np.ndarray:
"""Construct a parent map for :attr:`ClusterLevel.parent_map`."""

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rephrase/rework? "All children in a bucket"?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from e9643cc to 20fbc31CompareOctober 29, 2023 09:01
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer I think inducer/ci-support@1475971 broke pylint (it's not finding the cython stuff anymore?). Any suggestion for a fix?

@inducer

Copy link
Copy Markdown
Owner

#225

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 20fbc31 to 6983a42CompareNovember 1, 2023 15:52
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 6983a42 to ab228e6CompareMay 29, 2024 07:01
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ab228e6 to c92b7f0CompareJuly 6, 2024 06:30
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f6e7c6e to 78eebbfCompareAugust 2, 2024 11:48
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from c479984 to 8aa200fCompareSeptember 1, 2024 08:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 9c5bb68 to a7c5d19CompareSeptember 20, 2024 11:51
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 8bef46c to ae443aaCompareNovember 16, 2024 09:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ae443aa to 85033dbCompareDecember 17, 2024 08:13
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 85033db to 15eee49CompareJanuary 8, 2025 08:41
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 15eee49 to 78c496dCompareFebruary 8, 2025 09:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from ba99713 to 963f568CompareFebruary 27, 2025 08:16
@alexfiklalexfikl mentioned this pull request Aug 12, 2025

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR advances the direct solver work by introducing hierarchical clustering infrastructure and wiring it into proxy-based skeletonization to enable recursive (multi-level) skeletonization, along with the associated test and documentation updates.

Changes:

  • Add a new pytential.linalg.cluster module providing cluster trees/levels, clustering helpers, and partition_by_nodes.
  • Extend skeletonization to produce richer results (including diagonal blocks) and add rec_skeletonize_by_proxy for multi-level skeletonization.
  • Update proxy and skeletonization tests (and docs) to match the new clustering/tree and neighbor-gathering APIs.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
pytential/linalg/cluster.pyNew clustering module (cluster tree/levels, partitioning, visualization utilities).
pytential/linalg/skeletonization.pyAdds recursive skeletonization and augments skeletonization results/weighting/logging.
pytential/linalg/proxy.pyRemoves partition_by_nodes (moved to cluster module) and updates neighbor gathering API.
pytential/linalg/utils.pyDocuments/exports helper utilities used by skeletonization (make_flat_cluster_diag, interp_decomp).
test/extra_matrix_data.pyUpdates test fixtures to return (index, tree) and import partitioning from linalg.cluster.
test/test_linalg_cluster.pyNew tests for cluster tree construction and (un)clustering behavior.
test/test_linalg_proxy.pyAdapts tests to updated cluster index return type and neighbor gathering signature.
test/test_linalg_skeletonization.pyUpdates tests to exercise multilevel skeletonization flow.
test/test_matrix.pyAdapts callers to updated get_cluster_index / get_tgt_src_cluster_index return type.
doc/linalg.rstIncludes pytential.linalg.cluster in the linalg documentation.
doc/conf.pyAdds/adjusts intersphinx mappings for new referenced types.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadpytential/linalg/cluster.py Outdated
Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/cluster.py Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@alexfikl@inducer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Direct Solver: Recursive Skeletonization - #164

Open
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion
Open

Direct Solver: Recursive Skeletonization#164
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion

Conversation

@alexfikl

@alexfiklalexfikl commented Jun 30, 2022

Copy link
Copy Markdown
Collaborator

Attempting to break up the direct solver MR into smaller, more reviewable pieces. As a rundown

The code for this is mostly in the deprecated https://gitlab.tiker.net/inducer/pytential/-/merge_requests/137.

@alexfiklalexfikl changed the title Direct Solver: Direct Solver: Recursive SkeletonizationJun 30, 2022
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 39e8347 to 80bb8e1CompareJuly 1, 2022 15:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 8e3731d to 78699ecCompareJuly 14, 2022 12:30
@alexfikl
alexfikl marked this pull request as ready for review July 14, 2022 12:31
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer This should be ready for a look. It doesn't do much:

  • adds a data structure to hold the hierarchical cluster info from boxtree.Tree and merge cluster indices.
  • adds some helper functions to do the recursive skeletonization + simple tests.

@alexfikl
alexfikl requested a review from inducerJuly 14, 2022 15:12
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 7ed33f4 to ea42c82CompareAugust 2, 2022 06:24
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 80fe1fb to b44f4a8CompareAugust 4, 2022 18:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from cc4be24 to 0176d32CompareAugust 12, 2022 12:57
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 0176d32 to f71a21bCompareAugust 22, 2022 06:19

@inducerinducer left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed a pending review. Figured it'd be better to submit it. :) Don't quite know how old this is.

Comment threadpytential/linalg/cluster.py Outdated

Current level that is represented.

.. attribute:: nlevels

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this avoidable?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reworked this a while back, so not quite sure if your comment still applies?

Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/cluster.py Outdated
# {{{ cluster tree

@dataclass(frozen=True)
class ClusterTreeLevel:

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this two things rather than one?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, separated into a ClusterTree and ClusterLevel with a ClusterTree.levels() iterator to go through them for the recursive skeletonization.

Naming could still be better probably?

logger.info("\n%s", case)

run_skeletonize_by_proxy(actx, case, case.resolutions[0], visualize=visualize)
dd = sym.DOFDescriptor(case.name, discr_stage=case.skel_discr_stage)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update the test docstring to describe precisely what's being tested here.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9a8db7f to ce00d4eCompareAugust 23, 2022 16:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from c1e986c to 814b8acCompareSeptember 14, 2022 07:10
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9630b4f to 32ecc58CompareAugust 4, 2023 06:54
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f79175f to 19f4098CompareSeptember 8, 2023 07:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 19f4098 to e9643ccCompareOctober 17, 2023 06:44


def make_cluster_parent_map(parent_ids: np.ndarray) -> np.ndarray:
"""Construct a parent map for :attr:`ClusterLevel.parent_map`."""

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rephrase/rework? "All children in a bucket"?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from e9643cc to 20fbc31CompareOctober 29, 2023 09:01
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer I think inducer/ci-support@1475971 broke pylint (it's not finding the cython stuff anymore?). Any suggestion for a fix?

@inducer

Copy link
Copy Markdown
Owner

#225

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 20fbc31 to 6983a42CompareNovember 1, 2023 15:52
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 6983a42 to ab228e6CompareMay 29, 2024 07:01
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ab228e6 to c92b7f0CompareJuly 6, 2024 06:30
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f6e7c6e to 78eebbfCompareAugust 2, 2024 11:48
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from c479984 to 8aa200fCompareSeptember 1, 2024 08:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 9c5bb68 to a7c5d19CompareSeptember 20, 2024 11:51
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 8bef46c to ae443aaCompareNovember 16, 2024 09:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ae443aa to 85033dbCompareDecember 17, 2024 08:13
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 85033db to 15eee49CompareJanuary 8, 2025 08:41
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 15eee49 to 78c496dCompareFebruary 8, 2025 09:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from ba99713 to 963f568CompareFebruary 27, 2025 08:16
@alexfiklalexfikl mentioned this pull request Aug 12, 2025

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR advances the direct solver work by introducing hierarchical clustering infrastructure and wiring it into proxy-based skeletonization to enable recursive (multi-level) skeletonization, along with the associated test and documentation updates.

Changes:

  • Add a new pytential.linalg.cluster module providing cluster trees/levels, clustering helpers, and partition_by_nodes.
  • Extend skeletonization to produce richer results (including diagonal blocks) and add rec_skeletonize_by_proxy for multi-level skeletonization.
  • Update proxy and skeletonization tests (and docs) to match the new clustering/tree and neighbor-gathering APIs.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
pytential/linalg/cluster.pyNew clustering module (cluster tree/levels, partitioning, visualization utilities).
pytential/linalg/skeletonization.pyAdds recursive skeletonization and augments skeletonization results/weighting/logging.
pytential/linalg/proxy.pyRemoves partition_by_nodes (moved to cluster module) and updates neighbor gathering API.
pytential/linalg/utils.pyDocuments/exports helper utilities used by skeletonization (make_flat_cluster_diag, interp_decomp).
test/extra_matrix_data.pyUpdates test fixtures to return (index, tree) and import partitioning from linalg.cluster.
test/test_linalg_cluster.pyNew tests for cluster tree construction and (un)clustering behavior.
test/test_linalg_proxy.pyAdapts tests to updated cluster index return type and neighbor gathering signature.
test/test_linalg_skeletonization.pyUpdates tests to exercise multilevel skeletonization flow.
test/test_matrix.pyAdapts callers to updated get_cluster_index / get_tgt_src_cluster_index return type.
doc/linalg.rstIncludes pytential.linalg.cluster in the linalg documentation.
doc/conf.pyAdds/adjusts intersphinx mappings for new referenced types.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadpytential/linalg/cluster.py Outdated
Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/cluster.py Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@alexfikl@inducer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Direct Solver: Recursive Skeletonization - #164

Open
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion
Open

Direct Solver: Recursive Skeletonization#164
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion

Conversation

@alexfikl

@alexfiklalexfikl commented Jun 30, 2022

Copy link
Copy Markdown
Collaborator

Attempting to break up the direct solver MR into smaller, more reviewable pieces. As a rundown

The code for this is mostly in the deprecated https://gitlab.tiker.net/inducer/pytential/-/merge_requests/137.

@alexfiklalexfikl changed the title Direct Solver: Direct Solver: Recursive SkeletonizationJun 30, 2022
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 39e8347 to 80bb8e1CompareJuly 1, 2022 15:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 8e3731d to 78699ecCompareJuly 14, 2022 12:30
@alexfikl
alexfikl marked this pull request as ready for review July 14, 2022 12:31
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer This should be ready for a look. It doesn't do much:

  • adds a data structure to hold the hierarchical cluster info from boxtree.Tree and merge cluster indices.
  • adds some helper functions to do the recursive skeletonization + simple tests.

@alexfikl
alexfikl requested a review from inducerJuly 14, 2022 15:12
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 7ed33f4 to ea42c82CompareAugust 2, 2022 06:24
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 80fe1fb to b44f4a8CompareAugust 4, 2022 18:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from cc4be24 to 0176d32CompareAugust 12, 2022 12:57
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 0176d32 to f71a21bCompareAugust 22, 2022 06:19

@inducerinducer left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed a pending review. Figured it'd be better to submit it. :) Don't quite know how old this is.

Comment threadpytential/linalg/cluster.py Outdated

Current level that is represented.

.. attribute:: nlevels

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this avoidable?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reworked this a while back, so not quite sure if your comment still applies?

Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/cluster.py Outdated
# {{{ cluster tree

@dataclass(frozen=True)
class ClusterTreeLevel:

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this two things rather than one?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, separated into a ClusterTree and ClusterLevel with a ClusterTree.levels() iterator to go through them for the recursive skeletonization.

Naming could still be better probably?

logger.info("\n%s", case)

run_skeletonize_by_proxy(actx, case, case.resolutions[0], visualize=visualize)
dd = sym.DOFDescriptor(case.name, discr_stage=case.skel_discr_stage)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update the test docstring to describe precisely what's being tested here.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9a8db7f to ce00d4eCompareAugust 23, 2022 16:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from c1e986c to 814b8acCompareSeptember 14, 2022 07:10
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9630b4f to 32ecc58CompareAugust 4, 2023 06:54
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f79175f to 19f4098CompareSeptember 8, 2023 07:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 19f4098 to e9643ccCompareOctober 17, 2023 06:44


def make_cluster_parent_map(parent_ids: np.ndarray) -> np.ndarray:
"""Construct a parent map for :attr:`ClusterLevel.parent_map`."""

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rephrase/rework? "All children in a bucket"?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from e9643cc to 20fbc31CompareOctober 29, 2023 09:01
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer I think inducer/ci-support@1475971 broke pylint (it's not finding the cython stuff anymore?). Any suggestion for a fix?

@inducer

Copy link
Copy Markdown
Owner

#225

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 20fbc31 to 6983a42CompareNovember 1, 2023 15:52
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 6983a42 to ab228e6CompareMay 29, 2024 07:01
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ab228e6 to c92b7f0CompareJuly 6, 2024 06:30
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f6e7c6e to 78eebbfCompareAugust 2, 2024 11:48
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from c479984 to 8aa200fCompareSeptember 1, 2024 08:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 9c5bb68 to a7c5d19CompareSeptember 20, 2024 11:51
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 8bef46c to ae443aaCompareNovember 16, 2024 09:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ae443aa to 85033dbCompareDecember 17, 2024 08:13
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 85033db to 15eee49CompareJanuary 8, 2025 08:41
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 15eee49 to 78c496dCompareFebruary 8, 2025 09:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from ba99713 to 963f568CompareFebruary 27, 2025 08:16
@alexfiklalexfikl mentioned this pull request Aug 12, 2025

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR advances the direct solver work by introducing hierarchical clustering infrastructure and wiring it into proxy-based skeletonization to enable recursive (multi-level) skeletonization, along with the associated test and documentation updates.

Changes:

  • Add a new pytential.linalg.cluster module providing cluster trees/levels, clustering helpers, and partition_by_nodes.
  • Extend skeletonization to produce richer results (including diagonal blocks) and add rec_skeletonize_by_proxy for multi-level skeletonization.
  • Update proxy and skeletonization tests (and docs) to match the new clustering/tree and neighbor-gathering APIs.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
pytential/linalg/cluster.pyNew clustering module (cluster tree/levels, partitioning, visualization utilities).
pytential/linalg/skeletonization.pyAdds recursive skeletonization and augments skeletonization results/weighting/logging.
pytential/linalg/proxy.pyRemoves partition_by_nodes (moved to cluster module) and updates neighbor gathering API.
pytential/linalg/utils.pyDocuments/exports helper utilities used by skeletonization (make_flat_cluster_diag, interp_decomp).
test/extra_matrix_data.pyUpdates test fixtures to return (index, tree) and import partitioning from linalg.cluster.
test/test_linalg_cluster.pyNew tests for cluster tree construction and (un)clustering behavior.
test/test_linalg_proxy.pyAdapts tests to updated cluster index return type and neighbor gathering signature.
test/test_linalg_skeletonization.pyUpdates tests to exercise multilevel skeletonization flow.
test/test_matrix.pyAdapts callers to updated get_cluster_index / get_tgt_src_cluster_index return type.
doc/linalg.rstIncludes pytential.linalg.cluster in the linalg documentation.
doc/conf.pyAdds/adjusts intersphinx mappings for new referenced types.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadpytential/linalg/cluster.py Outdated
Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/cluster.py Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@alexfikl@inducer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Direct Solver: Recursive Skeletonization - #164

Open
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion
Open

Direct Solver: Recursive Skeletonization#164
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion

Conversation

@alexfikl

@alexfiklalexfikl commented Jun 30, 2022

Copy link
Copy Markdown
Collaborator

Attempting to break up the direct solver MR into smaller, more reviewable pieces. As a rundown

The code for this is mostly in the deprecated https://gitlab.tiker.net/inducer/pytential/-/merge_requests/137.

@alexfiklalexfikl changed the title Direct Solver: Direct Solver: Recursive SkeletonizationJun 30, 2022
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 39e8347 to 80bb8e1CompareJuly 1, 2022 15:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 8e3731d to 78699ecCompareJuly 14, 2022 12:30
@alexfikl
alexfikl marked this pull request as ready for review July 14, 2022 12:31
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer This should be ready for a look. It doesn't do much:

  • adds a data structure to hold the hierarchical cluster info from boxtree.Tree and merge cluster indices.
  • adds some helper functions to do the recursive skeletonization + simple tests.

@alexfikl
alexfikl requested a review from inducerJuly 14, 2022 15:12
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 7ed33f4 to ea42c82CompareAugust 2, 2022 06:24
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 80fe1fb to b44f4a8CompareAugust 4, 2022 18:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from cc4be24 to 0176d32CompareAugust 12, 2022 12:57
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 0176d32 to f71a21bCompareAugust 22, 2022 06:19

@inducerinducer left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed a pending review. Figured it'd be better to submit it. :) Don't quite know how old this is.

Comment threadpytential/linalg/cluster.py Outdated

Current level that is represented.

.. attribute:: nlevels

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this avoidable?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reworked this a while back, so not quite sure if your comment still applies?

Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/cluster.py Outdated
# {{{ cluster tree

@dataclass(frozen=True)
class ClusterTreeLevel:

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this two things rather than one?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, separated into a ClusterTree and ClusterLevel with a ClusterTree.levels() iterator to go through them for the recursive skeletonization.

Naming could still be better probably?

logger.info("\n%s", case)

run_skeletonize_by_proxy(actx, case, case.resolutions[0], visualize=visualize)
dd = sym.DOFDescriptor(case.name, discr_stage=case.skel_discr_stage)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update the test docstring to describe precisely what's being tested here.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9a8db7f to ce00d4eCompareAugust 23, 2022 16:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from c1e986c to 814b8acCompareSeptember 14, 2022 07:10
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9630b4f to 32ecc58CompareAugust 4, 2023 06:54
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f79175f to 19f4098CompareSeptember 8, 2023 07:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 19f4098 to e9643ccCompareOctober 17, 2023 06:44


def make_cluster_parent_map(parent_ids: np.ndarray) -> np.ndarray:
"""Construct a parent map for :attr:`ClusterLevel.parent_map`."""

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rephrase/rework? "All children in a bucket"?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from e9643cc to 20fbc31CompareOctober 29, 2023 09:01
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer I think inducer/ci-support@1475971 broke pylint (it's not finding the cython stuff anymore?). Any suggestion for a fix?

@inducer

Copy link
Copy Markdown
Owner

#225

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 20fbc31 to 6983a42CompareNovember 1, 2023 15:52
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 6983a42 to ab228e6CompareMay 29, 2024 07:01
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ab228e6 to c92b7f0CompareJuly 6, 2024 06:30
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f6e7c6e to 78eebbfCompareAugust 2, 2024 11:48
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from c479984 to 8aa200fCompareSeptember 1, 2024 08:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 9c5bb68 to a7c5d19CompareSeptember 20, 2024 11:51
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 8bef46c to ae443aaCompareNovember 16, 2024 09:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ae443aa to 85033dbCompareDecember 17, 2024 08:13
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 85033db to 15eee49CompareJanuary 8, 2025 08:41
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 15eee49 to 78c496dCompareFebruary 8, 2025 09:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from ba99713 to 963f568CompareFebruary 27, 2025 08:16
@alexfiklalexfikl mentioned this pull request Aug 12, 2025

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR advances the direct solver work by introducing hierarchical clustering infrastructure and wiring it into proxy-based skeletonization to enable recursive (multi-level) skeletonization, along with the associated test and documentation updates.

Changes:

  • Add a new pytential.linalg.cluster module providing cluster trees/levels, clustering helpers, and partition_by_nodes.
  • Extend skeletonization to produce richer results (including diagonal blocks) and add rec_skeletonize_by_proxy for multi-level skeletonization.
  • Update proxy and skeletonization tests (and docs) to match the new clustering/tree and neighbor-gathering APIs.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
pytential/linalg/cluster.pyNew clustering module (cluster tree/levels, partitioning, visualization utilities).
pytential/linalg/skeletonization.pyAdds recursive skeletonization and augments skeletonization results/weighting/logging.
pytential/linalg/proxy.pyRemoves partition_by_nodes (moved to cluster module) and updates neighbor gathering API.
pytential/linalg/utils.pyDocuments/exports helper utilities used by skeletonization (make_flat_cluster_diag, interp_decomp).
test/extra_matrix_data.pyUpdates test fixtures to return (index, tree) and import partitioning from linalg.cluster.
test/test_linalg_cluster.pyNew tests for cluster tree construction and (un)clustering behavior.
test/test_linalg_proxy.pyAdapts tests to updated cluster index return type and neighbor gathering signature.
test/test_linalg_skeletonization.pyUpdates tests to exercise multilevel skeletonization flow.
test/test_matrix.pyAdapts callers to updated get_cluster_index / get_tgt_src_cluster_index return type.
doc/linalg.rstIncludes pytential.linalg.cluster in the linalg documentation.
doc/conf.pyAdds/adjusts intersphinx mappings for new referenced types.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadpytential/linalg/cluster.py Outdated
Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/cluster.py Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@alexfikl@inducer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Direct Solver: Recursive Skeletonization - #164

Open
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion
Open

Direct Solver: Recursive Skeletonization#164
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion

Conversation

@alexfikl

@alexfiklalexfikl commented Jun 30, 2022

Copy link
Copy Markdown
Collaborator

Attempting to break up the direct solver MR into smaller, more reviewable pieces. As a rundown

The code for this is mostly in the deprecated https://gitlab.tiker.net/inducer/pytential/-/merge_requests/137.

@alexfiklalexfikl changed the title Direct Solver: Direct Solver: Recursive SkeletonizationJun 30, 2022
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 39e8347 to 80bb8e1CompareJuly 1, 2022 15:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 8e3731d to 78699ecCompareJuly 14, 2022 12:30
@alexfikl
alexfikl marked this pull request as ready for review July 14, 2022 12:31
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer This should be ready for a look. It doesn't do much:

  • adds a data structure to hold the hierarchical cluster info from boxtree.Tree and merge cluster indices.
  • adds some helper functions to do the recursive skeletonization + simple tests.

@alexfikl
alexfikl requested a review from inducerJuly 14, 2022 15:12
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 7ed33f4 to ea42c82CompareAugust 2, 2022 06:24
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 80fe1fb to b44f4a8CompareAugust 4, 2022 18:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from cc4be24 to 0176d32CompareAugust 12, 2022 12:57
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 0176d32 to f71a21bCompareAugust 22, 2022 06:19

@inducerinducer left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed a pending review. Figured it'd be better to submit it. :) Don't quite know how old this is.

Comment threadpytential/linalg/cluster.py Outdated

Current level that is represented.

.. attribute:: nlevels

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this avoidable?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reworked this a while back, so not quite sure if your comment still applies?

Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/cluster.py Outdated
# {{{ cluster tree

@dataclass(frozen=True)
class ClusterTreeLevel:

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this two things rather than one?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, separated into a ClusterTree and ClusterLevel with a ClusterTree.levels() iterator to go through them for the recursive skeletonization.

Naming could still be better probably?

logger.info("\n%s", case)

run_skeletonize_by_proxy(actx, case, case.resolutions[0], visualize=visualize)
dd = sym.DOFDescriptor(case.name, discr_stage=case.skel_discr_stage)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update the test docstring to describe precisely what's being tested here.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9a8db7f to ce00d4eCompareAugust 23, 2022 16:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from c1e986c to 814b8acCompareSeptember 14, 2022 07:10
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9630b4f to 32ecc58CompareAugust 4, 2023 06:54
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f79175f to 19f4098CompareSeptember 8, 2023 07:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 19f4098 to e9643ccCompareOctober 17, 2023 06:44


def make_cluster_parent_map(parent_ids: np.ndarray) -> np.ndarray:
"""Construct a parent map for :attr:`ClusterLevel.parent_map`."""

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rephrase/rework? "All children in a bucket"?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from e9643cc to 20fbc31CompareOctober 29, 2023 09:01
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer I think inducer/ci-support@1475971 broke pylint (it's not finding the cython stuff anymore?). Any suggestion for a fix?

@inducer

Copy link
Copy Markdown
Owner

#225

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 20fbc31 to 6983a42CompareNovember 1, 2023 15:52
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 6983a42 to ab228e6CompareMay 29, 2024 07:01
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ab228e6 to c92b7f0CompareJuly 6, 2024 06:30
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f6e7c6e to 78eebbfCompareAugust 2, 2024 11:48
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from c479984 to 8aa200fCompareSeptember 1, 2024 08:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 9c5bb68 to a7c5d19CompareSeptember 20, 2024 11:51
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 8bef46c to ae443aaCompareNovember 16, 2024 09:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ae443aa to 85033dbCompareDecember 17, 2024 08:13
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 85033db to 15eee49CompareJanuary 8, 2025 08:41
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 15eee49 to 78c496dCompareFebruary 8, 2025 09:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from ba99713 to 963f568CompareFebruary 27, 2025 08:16
@alexfiklalexfikl mentioned this pull request Aug 12, 2025

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR advances the direct solver work by introducing hierarchical clustering infrastructure and wiring it into proxy-based skeletonization to enable recursive (multi-level) skeletonization, along with the associated test and documentation updates.

Changes:

  • Add a new pytential.linalg.cluster module providing cluster trees/levels, clustering helpers, and partition_by_nodes.
  • Extend skeletonization to produce richer results (including diagonal blocks) and add rec_skeletonize_by_proxy for multi-level skeletonization.
  • Update proxy and skeletonization tests (and docs) to match the new clustering/tree and neighbor-gathering APIs.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
pytential/linalg/cluster.pyNew clustering module (cluster tree/levels, partitioning, visualization utilities).
pytential/linalg/skeletonization.pyAdds recursive skeletonization and augments skeletonization results/weighting/logging.
pytential/linalg/proxy.pyRemoves partition_by_nodes (moved to cluster module) and updates neighbor gathering API.
pytential/linalg/utils.pyDocuments/exports helper utilities used by skeletonization (make_flat_cluster_diag, interp_decomp).
test/extra_matrix_data.pyUpdates test fixtures to return (index, tree) and import partitioning from linalg.cluster.
test/test_linalg_cluster.pyNew tests for cluster tree construction and (un)clustering behavior.
test/test_linalg_proxy.pyAdapts tests to updated cluster index return type and neighbor gathering signature.
test/test_linalg_skeletonization.pyUpdates tests to exercise multilevel skeletonization flow.
test/test_matrix.pyAdapts callers to updated get_cluster_index / get_tgt_src_cluster_index return type.
doc/linalg.rstIncludes pytential.linalg.cluster in the linalg documentation.
doc/conf.pyAdds/adjusts intersphinx mappings for new referenced types.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadpytential/linalg/cluster.py Outdated
Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/cluster.py Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@alexfikl@inducer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Direct Solver: Recursive Skeletonization - #164

Open
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion
Open

Direct Solver: Recursive Skeletonization#164
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion

Conversation

@alexfikl

@alexfiklalexfikl commented Jun 30, 2022

Copy link
Copy Markdown
Collaborator

Attempting to break up the direct solver MR into smaller, more reviewable pieces. As a rundown

The code for this is mostly in the deprecated https://gitlab.tiker.net/inducer/pytential/-/merge_requests/137.

@alexfiklalexfikl changed the title Direct Solver: Direct Solver: Recursive SkeletonizationJun 30, 2022
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 39e8347 to 80bb8e1CompareJuly 1, 2022 15:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 8e3731d to 78699ecCompareJuly 14, 2022 12:30
@alexfikl
alexfikl marked this pull request as ready for review July 14, 2022 12:31
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer This should be ready for a look. It doesn't do much:

  • adds a data structure to hold the hierarchical cluster info from boxtree.Tree and merge cluster indices.
  • adds some helper functions to do the recursive skeletonization + simple tests.

@alexfikl
alexfikl requested a review from inducerJuly 14, 2022 15:12
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 7ed33f4 to ea42c82CompareAugust 2, 2022 06:24
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 80fe1fb to b44f4a8CompareAugust 4, 2022 18:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from cc4be24 to 0176d32CompareAugust 12, 2022 12:57
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 0176d32 to f71a21bCompareAugust 22, 2022 06:19

@inducerinducer left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed a pending review. Figured it'd be better to submit it. :) Don't quite know how old this is.

Comment threadpytential/linalg/cluster.py Outdated

Current level that is represented.

.. attribute:: nlevels

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this avoidable?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reworked this a while back, so not quite sure if your comment still applies?

Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/cluster.py Outdated
# {{{ cluster tree

@dataclass(frozen=True)
class ClusterTreeLevel:

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this two things rather than one?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, separated into a ClusterTree and ClusterLevel with a ClusterTree.levels() iterator to go through them for the recursive skeletonization.

Naming could still be better probably?

logger.info("\n%s", case)

run_skeletonize_by_proxy(actx, case, case.resolutions[0], visualize=visualize)
dd = sym.DOFDescriptor(case.name, discr_stage=case.skel_discr_stage)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update the test docstring to describe precisely what's being tested here.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9a8db7f to ce00d4eCompareAugust 23, 2022 16:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from c1e986c to 814b8acCompareSeptember 14, 2022 07:10
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9630b4f to 32ecc58CompareAugust 4, 2023 06:54
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f79175f to 19f4098CompareSeptember 8, 2023 07:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 19f4098 to e9643ccCompareOctober 17, 2023 06:44


def make_cluster_parent_map(parent_ids: np.ndarray) -> np.ndarray:
"""Construct a parent map for :attr:`ClusterLevel.parent_map`."""

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rephrase/rework? "All children in a bucket"?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from e9643cc to 20fbc31CompareOctober 29, 2023 09:01
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer I think inducer/ci-support@1475971 broke pylint (it's not finding the cython stuff anymore?). Any suggestion for a fix?

@inducer

Copy link
Copy Markdown
Owner

#225

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 20fbc31 to 6983a42CompareNovember 1, 2023 15:52
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 6983a42 to ab228e6CompareMay 29, 2024 07:01
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ab228e6 to c92b7f0CompareJuly 6, 2024 06:30
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f6e7c6e to 78eebbfCompareAugust 2, 2024 11:48
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from c479984 to 8aa200fCompareSeptember 1, 2024 08:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 9c5bb68 to a7c5d19CompareSeptember 20, 2024 11:51
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 8bef46c to ae443aaCompareNovember 16, 2024 09:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ae443aa to 85033dbCompareDecember 17, 2024 08:13
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 85033db to 15eee49CompareJanuary 8, 2025 08:41
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 15eee49 to 78c496dCompareFebruary 8, 2025 09:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from ba99713 to 963f568CompareFebruary 27, 2025 08:16
@alexfiklalexfikl mentioned this pull request Aug 12, 2025

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR advances the direct solver work by introducing hierarchical clustering infrastructure and wiring it into proxy-based skeletonization to enable recursive (multi-level) skeletonization, along with the associated test and documentation updates.

Changes:

  • Add a new pytential.linalg.cluster module providing cluster trees/levels, clustering helpers, and partition_by_nodes.
  • Extend skeletonization to produce richer results (including diagonal blocks) and add rec_skeletonize_by_proxy for multi-level skeletonization.
  • Update proxy and skeletonization tests (and docs) to match the new clustering/tree and neighbor-gathering APIs.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
pytential/linalg/cluster.pyNew clustering module (cluster tree/levels, partitioning, visualization utilities).
pytential/linalg/skeletonization.pyAdds recursive skeletonization and augments skeletonization results/weighting/logging.
pytential/linalg/proxy.pyRemoves partition_by_nodes (moved to cluster module) and updates neighbor gathering API.
pytential/linalg/utils.pyDocuments/exports helper utilities used by skeletonization (make_flat_cluster_diag, interp_decomp).
test/extra_matrix_data.pyUpdates test fixtures to return (index, tree) and import partitioning from linalg.cluster.
test/test_linalg_cluster.pyNew tests for cluster tree construction and (un)clustering behavior.
test/test_linalg_proxy.pyAdapts tests to updated cluster index return type and neighbor gathering signature.
test/test_linalg_skeletonization.pyUpdates tests to exercise multilevel skeletonization flow.
test/test_matrix.pyAdapts callers to updated get_cluster_index / get_tgt_src_cluster_index return type.
doc/linalg.rstIncludes pytential.linalg.cluster in the linalg documentation.
doc/conf.pyAdds/adjusts intersphinx mappings for new referenced types.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadpytential/linalg/cluster.py Outdated
Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/cluster.py Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@alexfikl@inducer
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Direct Solver: Recursive Skeletonization - #164

Open
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion
Open

Direct Solver: Recursive Skeletonization#164
alexfikl wants to merge 1 commit into
inducer:mainfrom
alexfikl:direct-solver-recursion

Conversation

@alexfikl

@alexfiklalexfikl commented Jun 30, 2022

Copy link
Copy Markdown
Collaborator

Attempting to break up the direct solver MR into smaller, more reviewable pieces. As a rundown

The code for this is mostly in the deprecated https://gitlab.tiker.net/inducer/pytential/-/merge_requests/137.

@alexfiklalexfikl changed the title Direct Solver: Direct Solver: Recursive SkeletonizationJun 30, 2022
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 39e8347 to 80bb8e1CompareJuly 1, 2022 15:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 8e3731d to 78699ecCompareJuly 14, 2022 12:30
@alexfikl
alexfikl marked this pull request as ready for review July 14, 2022 12:31
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer This should be ready for a look. It doesn't do much:

  • adds a data structure to hold the hierarchical cluster info from boxtree.Tree and merge cluster indices.
  • adds some helper functions to do the recursive skeletonization + simple tests.

@alexfikl
alexfikl requested a review from inducerJuly 14, 2022 15:12
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 7ed33f4 to ea42c82CompareAugust 2, 2022 06:24
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 5 times, most recently from 80fe1fb to b44f4a8CompareAugust 4, 2022 18:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from cc4be24 to 0176d32CompareAugust 12, 2022 12:57
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 0176d32 to f71a21bCompareAugust 22, 2022 06:19

@inducerinducer left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed a pending review. Figured it'd be better to submit it. :) Don't quite know how old this is.

Comment threadpytential/linalg/cluster.py Outdated

Current level that is represented.

.. attribute:: nlevels

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this avoidable?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reworked this a while back, so not quite sure if your comment still applies?

Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/cluster.py Outdated
# {{{ cluster tree

@dataclass(frozen=True)
class ClusterTreeLevel:

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this two things rather than one?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, separated into a ClusterTree and ClusterLevel with a ClusterTree.levels() iterator to go through them for the recursive skeletonization.

Naming could still be better probably?

logger.info("\n%s", case)

run_skeletonize_by_proxy(actx, case, case.resolutions[0], visualize=visualize)
dd = sym.DOFDescriptor(case.name, discr_stage=case.skel_discr_stage)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update the test docstring to describe precisely what's being tested here.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9a8db7f to ce00d4eCompareAugust 23, 2022 16:09
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from c1e986c to 814b8acCompareSeptember 14, 2022 07:10
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 9630b4f to 32ecc58CompareAugust 4, 2023 06:54
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f79175f to 19f4098CompareSeptember 8, 2023 07:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 19f4098 to e9643ccCompareOctober 17, 2023 06:44


def make_cluster_parent_map(parent_ids: np.ndarray) -> np.ndarray:
"""Construct a parent map for :attr:`ClusterLevel.parent_map`."""

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rephrase/rework? "All children in a bucket"?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from e9643cc to 20fbc31CompareOctober 29, 2023 09:01
@alexfikl

Copy link
Copy Markdown
CollaboratorAuthor

@inducer I think inducer/ci-support@1475971 broke pylint (it's not finding the cython stuff anymore?). Any suggestion for a fix?

@inducer

Copy link
Copy Markdown
Owner

#225

@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 20fbc31 to 6983a42CompareNovember 1, 2023 15:52
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 6983a42 to ab228e6CompareMay 29, 2024 07:01
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ab228e6 to c92b7f0CompareJuly 6, 2024 06:30
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from f6e7c6e to 78eebbfCompareAugust 2, 2024 11:48
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from c479984 to 8aa200fCompareSeptember 1, 2024 08:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 3 times, most recently from 9c5bb68 to a7c5d19CompareSeptember 20, 2024 11:51
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from 8bef46c to ae443aaCompareNovember 16, 2024 09:00
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from ae443aa to 85033dbCompareDecember 17, 2024 08:13
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 85033db to 15eee49CompareJanuary 8, 2025 08:41
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch from 15eee49 to 78c496dCompareFebruary 8, 2025 09:19
@alexfikl
alexfiklforce-pushed the direct-solver-recursion branch 2 times, most recently from ba99713 to 963f568CompareFebruary 27, 2025 08:16
@alexfiklalexfikl mentioned this pull request Aug 12, 2025

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR advances the direct solver work by introducing hierarchical clustering infrastructure and wiring it into proxy-based skeletonization to enable recursive (multi-level) skeletonization, along with the associated test and documentation updates.

Changes:

  • Add a new pytential.linalg.cluster module providing cluster trees/levels, clustering helpers, and partition_by_nodes.
  • Extend skeletonization to produce richer results (including diagonal blocks) and add rec_skeletonize_by_proxy for multi-level skeletonization.
  • Update proxy and skeletonization tests (and docs) to match the new clustering/tree and neighbor-gathering APIs.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
pytential/linalg/cluster.pyNew clustering module (cluster tree/levels, partitioning, visualization utilities).
pytential/linalg/skeletonization.pyAdds recursive skeletonization and augments skeletonization results/weighting/logging.
pytential/linalg/proxy.pyRemoves partition_by_nodes (moved to cluster module) and updates neighbor gathering API.
pytential/linalg/utils.pyDocuments/exports helper utilities used by skeletonization (make_flat_cluster_diag, interp_decomp).
test/extra_matrix_data.pyUpdates test fixtures to return (index, tree) and import partitioning from linalg.cluster.
test/test_linalg_cluster.pyNew tests for cluster tree construction and (un)clustering behavior.
test/test_linalg_proxy.pyAdapts tests to updated cluster index return type and neighbor gathering signature.
test/test_linalg_skeletonization.pyUpdates tests to exercise multilevel skeletonization flow.
test/test_matrix.pyAdapts callers to updated get_cluster_index / get_tgt_src_cluster_index return type.
doc/linalg.rstIncludes pytential.linalg.cluster in the linalg documentation.
doc/conf.pyAdds/adjusts intersphinx mappings for new referenced types.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadpytential/linalg/cluster.py Outdated
Comment threadpytential/linalg/cluster.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/skeletonization.py
Comment threadpytential/linalg/cluster.py Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@alexfikl@inducer