GH-35786: [C++] Add pairwise_diff function - #35787

Merged
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel
Jun 29, 2023
Merged

GH-35786: [C++] Add pairwise_diff function#35787
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel

Conversation

@js8544

@js8544js8544 commented May 26, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Add a pairwise_diff function similar to pandas' Series.Diff, the function computes the first order difference of an array.

What changes are included in this PR?

I followed these instructions. The function is implemented for numerical, temporal and decimal types. Chuck arrays are not yet supported.

Are these changes tested?

Yes. They are tested in vector_pairwise_test.cc and in python/pyarrow/tests/compute.py.

Are there any user-facing changes?

Yes, and docs are also updated in this PR.

@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@js8544js8544 changed the title Add pairwise diff functionGH-35786: [C++] Add pairwise_diff functionMay 26, 2023
@github-actionsgithub-actionsBot added the awaiting review Awaiting review label May 26, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35786has been automatically assigned in GitHub to PR creator.

@js8544

Copy link
Copy Markdown
ContributorAuthor

@lidavidm@pitrou@westonpace Hi guys, would any of you mind taking a look at this PR? It's been sitting around for almost a month. Thanks in advance!

@lidavidmlidavidm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems reasonable to me

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels Jun 22, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

@pitrou@bkietz Would you mind having some extra look at this PR? Thanks!

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot removed the awaiting merge Awaiting merge label Jun 26, 2023
@js8544
js8544force-pushed the jinshang/diff_kernel branch from 3f037b6 to 6741ba2CompareJune 28, 2023 06:52
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 28, 2023
@js8544

js8544 commented Jun 28, 2023

Copy link
Copy Markdown
ContributorAuthor

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Hi @bkietz, do you mean something like this:

ARROW_ASSIGN_OR_RAISE(auto subtract_func, registry->GetFunction("subtract"));
for (constauto& type : types) {
ARROW_ASSIGN_OR_RAISE(auto kernel,
subtract_func->DispatchExact({type, type}));
// reuse kernel's exec and signature
}

@bkietz

bkietz commented Jun 28, 2023

Copy link
Copy Markdown
Member

@js8544 yes, exactly. I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

(sorry for the spurious close; bumped the wrong button)

@bkietzbkietz closed this Jun 28, 2023
@bkietzbkietz reopened this Jun 28, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

That sounds better indeed! I'll try this now.

js8544and others added 3 commits June 28, 2023 22:48
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544

Copy link
Copy Markdown
ContributorAuthor

@bkietz I've changed it to looping over subtract's kernels and wrapping their signature and kernel exec.

@js8544
js8544 requested a review from bkietzJune 28, 2023 14:53
Comment threadcpp/src/arrow/compute/kernel.h Outdated
Comment threadcpp/src/arrow/compute/kernel.h

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is looking great, thanks for refactoring!
Just a few nits

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment on lines +63 to +68
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nit: could we call these two regions "computed" and "margin"? I think that'll be more obvious for the next maintainer, and it'd help if we move all the start/length calculation to this preamble too

Suggested change
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;
// We only compute values in the region where the input-with-offset overlaps
// the original input. The margin where these do not overlap gets filled with null.
auto margin_length = std::min(abs(periods), input.length);
auto computed_length = input.length - margin_length;
auto margin_start = periods > 0 ? 0 : computed_length;
auto left_start = periods > 0 ? margin_length : 0;
auto right_start = periods > 0 ? 0 : margin_length;
// ...
// prepare bitmap

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated. It's much clearer now. thanks for the suggestion!

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels Jun 28, 2023
js8544and others added 2 commits June 29, 2023 11:19
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 29, 2023 03:21

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Jun 29, 2023
@bkietz

Copy link
Copy Markdown
Member

macOs glib&python failures are network failures while communicating with brew https://github.com/apache/arrow/actions/runs/5408688637/jobs/9835499198?pr=35787

macOS c++ failure is a known issue #36329

ubuntu c++ failure is an s3 flake https://github.com/apache/arrow/actions/runs/5408688635/jobs/9828017525?pr=35787#step:7:4892

R test failure is a known issue #36346

@bkietz
bkietz merged commit 26c25d1 into apache:mainJun 29, 2023
@bkietzbkietz removed the awaiting merge Awaiting merge label Jun 29, 2023
@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit 26c25d1b.

There were 4 benchmark results indicating a performance regression:

The full Conbench report has more details.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Add pairwise_diff function

3 participants

@js8544@bkietz@lidavidm
, '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

GH-35786: [C++] Add pairwise_diff function - #35787

Merged
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel
Jun 29, 2023
Merged

GH-35786: [C++] Add pairwise_diff function#35787
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel

Conversation

@js8544

@js8544js8544 commented May 26, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Add a pairwise_diff function similar to pandas' Series.Diff, the function computes the first order difference of an array.

What changes are included in this PR?

I followed these instructions. The function is implemented for numerical, temporal and decimal types. Chuck arrays are not yet supported.

Are these changes tested?

Yes. They are tested in vector_pairwise_test.cc and in python/pyarrow/tests/compute.py.

Are there any user-facing changes?

Yes, and docs are also updated in this PR.

@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@js8544js8544 changed the title Add pairwise diff functionGH-35786: [C++] Add pairwise_diff functionMay 26, 2023
@github-actionsgithub-actionsBot added the awaiting review Awaiting review label May 26, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35786has been automatically assigned in GitHub to PR creator.

@js8544

Copy link
Copy Markdown
ContributorAuthor

@lidavidm@pitrou@westonpace Hi guys, would any of you mind taking a look at this PR? It's been sitting around for almost a month. Thanks in advance!

@lidavidmlidavidm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems reasonable to me

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels Jun 22, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

@pitrou@bkietz Would you mind having some extra look at this PR? Thanks!

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot removed the awaiting merge Awaiting merge label Jun 26, 2023
@js8544
js8544force-pushed the jinshang/diff_kernel branch from 3f037b6 to 6741ba2CompareJune 28, 2023 06:52
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 28, 2023
@js8544

js8544 commented Jun 28, 2023

Copy link
Copy Markdown
ContributorAuthor

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Hi @bkietz, do you mean something like this:

ARROW_ASSIGN_OR_RAISE(auto subtract_func, registry->GetFunction("subtract"));
for (constauto& type : types) {
ARROW_ASSIGN_OR_RAISE(auto kernel,
subtract_func->DispatchExact({type, type}));
// reuse kernel's exec and signature
}

@bkietz

bkietz commented Jun 28, 2023

Copy link
Copy Markdown
Member

@js8544 yes, exactly. I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

(sorry for the spurious close; bumped the wrong button)

@bkietzbkietz closed this Jun 28, 2023
@bkietzbkietz reopened this Jun 28, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

That sounds better indeed! I'll try this now.

js8544and others added 3 commits June 28, 2023 22:48
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544

Copy link
Copy Markdown
ContributorAuthor

@bkietz I've changed it to looping over subtract's kernels and wrapping their signature and kernel exec.

@js8544
js8544 requested a review from bkietzJune 28, 2023 14:53
Comment threadcpp/src/arrow/compute/kernel.h Outdated
Comment threadcpp/src/arrow/compute/kernel.h

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is looking great, thanks for refactoring!
Just a few nits

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment on lines +63 to +68
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nit: could we call these two regions "computed" and "margin"? I think that'll be more obvious for the next maintainer, and it'd help if we move all the start/length calculation to this preamble too

Suggested change
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;
// We only compute values in the region where the input-with-offset overlaps
// the original input. The margin where these do not overlap gets filled with null.
auto margin_length = std::min(abs(periods), input.length);
auto computed_length = input.length - margin_length;
auto margin_start = periods > 0 ? 0 : computed_length;
auto left_start = periods > 0 ? margin_length : 0;
auto right_start = periods > 0 ? 0 : margin_length;
// ...
// prepare bitmap

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated. It's much clearer now. thanks for the suggestion!

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels Jun 28, 2023
js8544and others added 2 commits June 29, 2023 11:19
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 29, 2023 03:21

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Jun 29, 2023
@bkietz

Copy link
Copy Markdown
Member

macOs glib&python failures are network failures while communicating with brew https://github.com/apache/arrow/actions/runs/5408688637/jobs/9835499198?pr=35787

macOS c++ failure is a known issue #36329

ubuntu c++ failure is an s3 flake https://github.com/apache/arrow/actions/runs/5408688635/jobs/9828017525?pr=35787#step:7:4892

R test failure is a known issue #36346

@bkietz
bkietz merged commit 26c25d1 into apache:mainJun 29, 2023
@bkietzbkietz removed the awaiting merge Awaiting merge label Jun 29, 2023
@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit 26c25d1b.

There were 4 benchmark results indicating a performance regression:

The full Conbench report has more details.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Add pairwise_diff function

3 participants

@js8544@bkietz@lidavidm
, '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

GH-35786: [C++] Add pairwise_diff function - #35787

Merged
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel
Jun 29, 2023
Merged

GH-35786: [C++] Add pairwise_diff function#35787
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel

Conversation

@js8544

@js8544js8544 commented May 26, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Add a pairwise_diff function similar to pandas' Series.Diff, the function computes the first order difference of an array.

What changes are included in this PR?

I followed these instructions. The function is implemented for numerical, temporal and decimal types. Chuck arrays are not yet supported.

Are these changes tested?

Yes. They are tested in vector_pairwise_test.cc and in python/pyarrow/tests/compute.py.

Are there any user-facing changes?

Yes, and docs are also updated in this PR.

@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@js8544js8544 changed the title Add pairwise diff functionGH-35786: [C++] Add pairwise_diff functionMay 26, 2023
@github-actionsgithub-actionsBot added the awaiting review Awaiting review label May 26, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35786has been automatically assigned in GitHub to PR creator.

@js8544

Copy link
Copy Markdown
ContributorAuthor

@lidavidm@pitrou@westonpace Hi guys, would any of you mind taking a look at this PR? It's been sitting around for almost a month. Thanks in advance!

@lidavidmlidavidm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems reasonable to me

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels Jun 22, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

@pitrou@bkietz Would you mind having some extra look at this PR? Thanks!

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot removed the awaiting merge Awaiting merge label Jun 26, 2023
@js8544
js8544force-pushed the jinshang/diff_kernel branch from 3f037b6 to 6741ba2CompareJune 28, 2023 06:52
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 28, 2023
@js8544

js8544 commented Jun 28, 2023

Copy link
Copy Markdown
ContributorAuthor

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Hi @bkietz, do you mean something like this:

ARROW_ASSIGN_OR_RAISE(auto subtract_func, registry->GetFunction("subtract"));
for (constauto& type : types) {
ARROW_ASSIGN_OR_RAISE(auto kernel,
subtract_func->DispatchExact({type, type}));
// reuse kernel's exec and signature
}

@bkietz

bkietz commented Jun 28, 2023

Copy link
Copy Markdown
Member

@js8544 yes, exactly. I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

(sorry for the spurious close; bumped the wrong button)

@bkietzbkietz closed this Jun 28, 2023
@bkietzbkietz reopened this Jun 28, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

That sounds better indeed! I'll try this now.

js8544and others added 3 commits June 28, 2023 22:48
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544

Copy link
Copy Markdown
ContributorAuthor

@bkietz I've changed it to looping over subtract's kernels and wrapping their signature and kernel exec.

@js8544
js8544 requested a review from bkietzJune 28, 2023 14:53
Comment threadcpp/src/arrow/compute/kernel.h Outdated
Comment threadcpp/src/arrow/compute/kernel.h

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is looking great, thanks for refactoring!
Just a few nits

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment on lines +63 to +68
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nit: could we call these two regions "computed" and "margin"? I think that'll be more obvious for the next maintainer, and it'd help if we move all the start/length calculation to this preamble too

Suggested change
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;
// We only compute values in the region where the input-with-offset overlaps
// the original input. The margin where these do not overlap gets filled with null.
auto margin_length = std::min(abs(periods), input.length);
auto computed_length = input.length - margin_length;
auto margin_start = periods > 0 ? 0 : computed_length;
auto left_start = periods > 0 ? margin_length : 0;
auto right_start = periods > 0 ? 0 : margin_length;
// ...
// prepare bitmap

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated. It's much clearer now. thanks for the suggestion!

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels Jun 28, 2023
js8544and others added 2 commits June 29, 2023 11:19
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 29, 2023 03:21

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Jun 29, 2023
@bkietz

Copy link
Copy Markdown
Member

macOs glib&python failures are network failures while communicating with brew https://github.com/apache/arrow/actions/runs/5408688637/jobs/9835499198?pr=35787

macOS c++ failure is a known issue #36329

ubuntu c++ failure is an s3 flake https://github.com/apache/arrow/actions/runs/5408688635/jobs/9828017525?pr=35787#step:7:4892

R test failure is a known issue #36346

@bkietz
bkietz merged commit 26c25d1 into apache:mainJun 29, 2023
@bkietzbkietz removed the awaiting merge Awaiting merge label Jun 29, 2023
@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit 26c25d1b.

There were 4 benchmark results indicating a performance regression:

The full Conbench report has more details.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Add pairwise_diff function

3 participants

@js8544@bkietz@lidavidm
, '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

GH-35786: [C++] Add pairwise_diff function - #35787

Merged
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel
Jun 29, 2023
Merged

GH-35786: [C++] Add pairwise_diff function#35787
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel

Conversation

@js8544

@js8544js8544 commented May 26, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Add a pairwise_diff function similar to pandas' Series.Diff, the function computes the first order difference of an array.

What changes are included in this PR?

I followed these instructions. The function is implemented for numerical, temporal and decimal types. Chuck arrays are not yet supported.

Are these changes tested?

Yes. They are tested in vector_pairwise_test.cc and in python/pyarrow/tests/compute.py.

Are there any user-facing changes?

Yes, and docs are also updated in this PR.

@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@js8544js8544 changed the title Add pairwise diff functionGH-35786: [C++] Add pairwise_diff functionMay 26, 2023
@github-actionsgithub-actionsBot added the awaiting review Awaiting review label May 26, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35786has been automatically assigned in GitHub to PR creator.

@js8544

Copy link
Copy Markdown
ContributorAuthor

@lidavidm@pitrou@westonpace Hi guys, would any of you mind taking a look at this PR? It's been sitting around for almost a month. Thanks in advance!

@lidavidmlidavidm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems reasonable to me

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels Jun 22, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

@pitrou@bkietz Would you mind having some extra look at this PR? Thanks!

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot removed the awaiting merge Awaiting merge label Jun 26, 2023
@js8544
js8544force-pushed the jinshang/diff_kernel branch from 3f037b6 to 6741ba2CompareJune 28, 2023 06:52
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 28, 2023
@js8544

js8544 commented Jun 28, 2023

Copy link
Copy Markdown
ContributorAuthor

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Hi @bkietz, do you mean something like this:

ARROW_ASSIGN_OR_RAISE(auto subtract_func, registry->GetFunction("subtract"));
for (constauto& type : types) {
ARROW_ASSIGN_OR_RAISE(auto kernel,
subtract_func->DispatchExact({type, type}));
// reuse kernel's exec and signature
}

@bkietz

bkietz commented Jun 28, 2023

Copy link
Copy Markdown
Member

@js8544 yes, exactly. I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

(sorry for the spurious close; bumped the wrong button)

@bkietzbkietz closed this Jun 28, 2023
@bkietzbkietz reopened this Jun 28, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

That sounds better indeed! I'll try this now.

js8544and others added 3 commits June 28, 2023 22:48
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544

Copy link
Copy Markdown
ContributorAuthor

@bkietz I've changed it to looping over subtract's kernels and wrapping their signature and kernel exec.

@js8544
js8544 requested a review from bkietzJune 28, 2023 14:53
Comment threadcpp/src/arrow/compute/kernel.h Outdated
Comment threadcpp/src/arrow/compute/kernel.h

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is looking great, thanks for refactoring!
Just a few nits

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment on lines +63 to +68
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nit: could we call these two regions "computed" and "margin"? I think that'll be more obvious for the next maintainer, and it'd help if we move all the start/length calculation to this preamble too

Suggested change
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;
// We only compute values in the region where the input-with-offset overlaps
// the original input. The margin where these do not overlap gets filled with null.
auto margin_length = std::min(abs(periods), input.length);
auto computed_length = input.length - margin_length;
auto margin_start = periods > 0 ? 0 : computed_length;
auto left_start = periods > 0 ? margin_length : 0;
auto right_start = periods > 0 ? 0 : margin_length;
// ...
// prepare bitmap

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated. It's much clearer now. thanks for the suggestion!

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels Jun 28, 2023
js8544and others added 2 commits June 29, 2023 11:19
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 29, 2023 03:21

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Jun 29, 2023
@bkietz

Copy link
Copy Markdown
Member

macOs glib&python failures are network failures while communicating with brew https://github.com/apache/arrow/actions/runs/5408688637/jobs/9835499198?pr=35787

macOS c++ failure is a known issue #36329

ubuntu c++ failure is an s3 flake https://github.com/apache/arrow/actions/runs/5408688635/jobs/9828017525?pr=35787#step:7:4892

R test failure is a known issue #36346

@bkietz
bkietz merged commit 26c25d1 into apache:mainJun 29, 2023
@bkietzbkietz removed the awaiting merge Awaiting merge label Jun 29, 2023
@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit 26c25d1b.

There were 4 benchmark results indicating a performance regression:

The full Conbench report has more details.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Add pairwise_diff function

3 participants

@js8544@bkietz@lidavidm
, '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

GH-35786: [C++] Add pairwise_diff function - #35787

Merged
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel
Jun 29, 2023
Merged

GH-35786: [C++] Add pairwise_diff function#35787
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel

Conversation

@js8544

@js8544js8544 commented May 26, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Add a pairwise_diff function similar to pandas' Series.Diff, the function computes the first order difference of an array.

What changes are included in this PR?

I followed these instructions. The function is implemented for numerical, temporal and decimal types. Chuck arrays are not yet supported.

Are these changes tested?

Yes. They are tested in vector_pairwise_test.cc and in python/pyarrow/tests/compute.py.

Are there any user-facing changes?

Yes, and docs are also updated in this PR.

@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@js8544js8544 changed the title Add pairwise diff functionGH-35786: [C++] Add pairwise_diff functionMay 26, 2023
@github-actionsgithub-actionsBot added the awaiting review Awaiting review label May 26, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35786has been automatically assigned in GitHub to PR creator.

@js8544

Copy link
Copy Markdown
ContributorAuthor

@lidavidm@pitrou@westonpace Hi guys, would any of you mind taking a look at this PR? It's been sitting around for almost a month. Thanks in advance!

@lidavidmlidavidm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems reasonable to me

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels Jun 22, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

@pitrou@bkietz Would you mind having some extra look at this PR? Thanks!

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot removed the awaiting merge Awaiting merge label Jun 26, 2023
@js8544
js8544force-pushed the jinshang/diff_kernel branch from 3f037b6 to 6741ba2CompareJune 28, 2023 06:52
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 28, 2023
@js8544

js8544 commented Jun 28, 2023

Copy link
Copy Markdown
ContributorAuthor

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Hi @bkietz, do you mean something like this:

ARROW_ASSIGN_OR_RAISE(auto subtract_func, registry->GetFunction("subtract"));
for (constauto& type : types) {
ARROW_ASSIGN_OR_RAISE(auto kernel,
subtract_func->DispatchExact({type, type}));
// reuse kernel's exec and signature
}

@bkietz

bkietz commented Jun 28, 2023

Copy link
Copy Markdown
Member

@js8544 yes, exactly. I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

(sorry for the spurious close; bumped the wrong button)

@bkietzbkietz closed this Jun 28, 2023
@bkietzbkietz reopened this Jun 28, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

That sounds better indeed! I'll try this now.

js8544and others added 3 commits June 28, 2023 22:48
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544

Copy link
Copy Markdown
ContributorAuthor

@bkietz I've changed it to looping over subtract's kernels and wrapping their signature and kernel exec.

@js8544
js8544 requested a review from bkietzJune 28, 2023 14:53
Comment threadcpp/src/arrow/compute/kernel.h Outdated
Comment threadcpp/src/arrow/compute/kernel.h

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is looking great, thanks for refactoring!
Just a few nits

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment on lines +63 to +68
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nit: could we call these two regions "computed" and "margin"? I think that'll be more obvious for the next maintainer, and it'd help if we move all the start/length calculation to this preamble too

Suggested change
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;
// We only compute values in the region where the input-with-offset overlaps
// the original input. The margin where these do not overlap gets filled with null.
auto margin_length = std::min(abs(periods), input.length);
auto computed_length = input.length - margin_length;
auto margin_start = periods > 0 ? 0 : computed_length;
auto left_start = periods > 0 ? margin_length : 0;
auto right_start = periods > 0 ? 0 : margin_length;
// ...
// prepare bitmap

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated. It's much clearer now. thanks for the suggestion!

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels Jun 28, 2023
js8544and others added 2 commits June 29, 2023 11:19
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 29, 2023 03:21

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Jun 29, 2023
@bkietz

Copy link
Copy Markdown
Member

macOs glib&python failures are network failures while communicating with brew https://github.com/apache/arrow/actions/runs/5408688637/jobs/9835499198?pr=35787

macOS c++ failure is a known issue #36329

ubuntu c++ failure is an s3 flake https://github.com/apache/arrow/actions/runs/5408688635/jobs/9828017525?pr=35787#step:7:4892

R test failure is a known issue #36346

@bkietz
bkietz merged commit 26c25d1 into apache:mainJun 29, 2023
@bkietzbkietz removed the awaiting merge Awaiting merge label Jun 29, 2023
@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit 26c25d1b.

There were 4 benchmark results indicating a performance regression:

The full Conbench report has more details.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Add pairwise_diff function

3 participants

@js8544@bkietz@lidavidm
, '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

GH-35786: [C++] Add pairwise_diff function - #35787

Merged
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel
Jun 29, 2023
Merged

GH-35786: [C++] Add pairwise_diff function#35787
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel

Conversation

@js8544

@js8544js8544 commented May 26, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Add a pairwise_diff function similar to pandas' Series.Diff, the function computes the first order difference of an array.

What changes are included in this PR?

I followed these instructions. The function is implemented for numerical, temporal and decimal types. Chuck arrays are not yet supported.

Are these changes tested?

Yes. They are tested in vector_pairwise_test.cc and in python/pyarrow/tests/compute.py.

Are there any user-facing changes?

Yes, and docs are also updated in this PR.

@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@js8544js8544 changed the title Add pairwise diff functionGH-35786: [C++] Add pairwise_diff functionMay 26, 2023
@github-actionsgithub-actionsBot added the awaiting review Awaiting review label May 26, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35786has been automatically assigned in GitHub to PR creator.

@js8544

Copy link
Copy Markdown
ContributorAuthor

@lidavidm@pitrou@westonpace Hi guys, would any of you mind taking a look at this PR? It's been sitting around for almost a month. Thanks in advance!

@lidavidmlidavidm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems reasonable to me

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels Jun 22, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

@pitrou@bkietz Would you mind having some extra look at this PR? Thanks!

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot removed the awaiting merge Awaiting merge label Jun 26, 2023
@js8544
js8544force-pushed the jinshang/diff_kernel branch from 3f037b6 to 6741ba2CompareJune 28, 2023 06:52
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 28, 2023
@js8544

js8544 commented Jun 28, 2023

Copy link
Copy Markdown
ContributorAuthor

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Hi @bkietz, do you mean something like this:

ARROW_ASSIGN_OR_RAISE(auto subtract_func, registry->GetFunction("subtract"));
for (constauto& type : types) {
ARROW_ASSIGN_OR_RAISE(auto kernel,
subtract_func->DispatchExact({type, type}));
// reuse kernel's exec and signature
}

@bkietz

bkietz commented Jun 28, 2023

Copy link
Copy Markdown
Member

@js8544 yes, exactly. I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

(sorry for the spurious close; bumped the wrong button)

@bkietzbkietz closed this Jun 28, 2023
@bkietzbkietz reopened this Jun 28, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

That sounds better indeed! I'll try this now.

js8544and others added 3 commits June 28, 2023 22:48
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544

Copy link
Copy Markdown
ContributorAuthor

@bkietz I've changed it to looping over subtract's kernels and wrapping their signature and kernel exec.

@js8544
js8544 requested a review from bkietzJune 28, 2023 14:53
Comment threadcpp/src/arrow/compute/kernel.h Outdated
Comment threadcpp/src/arrow/compute/kernel.h

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is looking great, thanks for refactoring!
Just a few nits

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment on lines +63 to +68
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nit: could we call these two regions "computed" and "margin"? I think that'll be more obvious for the next maintainer, and it'd help if we move all the start/length calculation to this preamble too

Suggested change
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;
// We only compute values in the region where the input-with-offset overlaps
// the original input. The margin where these do not overlap gets filled with null.
auto margin_length = std::min(abs(periods), input.length);
auto computed_length = input.length - margin_length;
auto margin_start = periods > 0 ? 0 : computed_length;
auto left_start = periods > 0 ? margin_length : 0;
auto right_start = periods > 0 ? 0 : margin_length;
// ...
// prepare bitmap

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated. It's much clearer now. thanks for the suggestion!

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels Jun 28, 2023
js8544and others added 2 commits June 29, 2023 11:19
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 29, 2023 03:21

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Jun 29, 2023
@bkietz

Copy link
Copy Markdown
Member

macOs glib&python failures are network failures while communicating with brew https://github.com/apache/arrow/actions/runs/5408688637/jobs/9835499198?pr=35787

macOS c++ failure is a known issue #36329

ubuntu c++ failure is an s3 flake https://github.com/apache/arrow/actions/runs/5408688635/jobs/9828017525?pr=35787#step:7:4892

R test failure is a known issue #36346

@bkietz
bkietz merged commit 26c25d1 into apache:mainJun 29, 2023
@bkietzbkietz removed the awaiting merge Awaiting merge label Jun 29, 2023
@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit 26c25d1b.

There were 4 benchmark results indicating a performance regression:

The full Conbench report has more details.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Add pairwise_diff function

3 participants

@js8544@bkietz@lidavidm
, '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

GH-35786: [C++] Add pairwise_diff function - #35787

Merged
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel
Jun 29, 2023
Merged

GH-35786: [C++] Add pairwise_diff function#35787
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel

Conversation

@js8544

@js8544js8544 commented May 26, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Add a pairwise_diff function similar to pandas' Series.Diff, the function computes the first order difference of an array.

What changes are included in this PR?

I followed these instructions. The function is implemented for numerical, temporal and decimal types. Chuck arrays are not yet supported.

Are these changes tested?

Yes. They are tested in vector_pairwise_test.cc and in python/pyarrow/tests/compute.py.

Are there any user-facing changes?

Yes, and docs are also updated in this PR.

@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@js8544js8544 changed the title Add pairwise diff functionGH-35786: [C++] Add pairwise_diff functionMay 26, 2023
@github-actionsgithub-actionsBot added the awaiting review Awaiting review label May 26, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35786has been automatically assigned in GitHub to PR creator.

@js8544

Copy link
Copy Markdown
ContributorAuthor

@lidavidm@pitrou@westonpace Hi guys, would any of you mind taking a look at this PR? It's been sitting around for almost a month. Thanks in advance!

@lidavidmlidavidm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems reasonable to me

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels Jun 22, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

@pitrou@bkietz Would you mind having some extra look at this PR? Thanks!

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot removed the awaiting merge Awaiting merge label Jun 26, 2023
@js8544
js8544force-pushed the jinshang/diff_kernel branch from 3f037b6 to 6741ba2CompareJune 28, 2023 06:52
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 28, 2023
@js8544

js8544 commented Jun 28, 2023

Copy link
Copy Markdown
ContributorAuthor

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Hi @bkietz, do you mean something like this:

ARROW_ASSIGN_OR_RAISE(auto subtract_func, registry->GetFunction("subtract"));
for (constauto& type : types) {
ARROW_ASSIGN_OR_RAISE(auto kernel,
subtract_func->DispatchExact({type, type}));
// reuse kernel's exec and signature
}

@bkietz

bkietz commented Jun 28, 2023

Copy link
Copy Markdown
Member

@js8544 yes, exactly. I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

(sorry for the spurious close; bumped the wrong button)

@bkietzbkietz closed this Jun 28, 2023
@bkietzbkietz reopened this Jun 28, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

That sounds better indeed! I'll try this now.

js8544and others added 3 commits June 28, 2023 22:48
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544

Copy link
Copy Markdown
ContributorAuthor

@bkietz I've changed it to looping over subtract's kernels and wrapping their signature and kernel exec.

@js8544
js8544 requested a review from bkietzJune 28, 2023 14:53
Comment threadcpp/src/arrow/compute/kernel.h Outdated
Comment threadcpp/src/arrow/compute/kernel.h

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is looking great, thanks for refactoring!
Just a few nits

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment on lines +63 to +68
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nit: could we call these two regions "computed" and "margin"? I think that'll be more obvious for the next maintainer, and it'd help if we move all the start/length calculation to this preamble too

Suggested change
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;
// We only compute values in the region where the input-with-offset overlaps
// the original input. The margin where these do not overlap gets filled with null.
auto margin_length = std::min(abs(periods), input.length);
auto computed_length = input.length - margin_length;
auto margin_start = periods > 0 ? 0 : computed_length;
auto left_start = periods > 0 ? margin_length : 0;
auto right_start = periods > 0 ? 0 : margin_length;
// ...
// prepare bitmap

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated. It's much clearer now. thanks for the suggestion!

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels Jun 28, 2023
js8544and others added 2 commits June 29, 2023 11:19
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 29, 2023 03:21

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Jun 29, 2023
@bkietz

Copy link
Copy Markdown
Member

macOs glib&python failures are network failures while communicating with brew https://github.com/apache/arrow/actions/runs/5408688637/jobs/9835499198?pr=35787

macOS c++ failure is a known issue #36329

ubuntu c++ failure is an s3 flake https://github.com/apache/arrow/actions/runs/5408688635/jobs/9828017525?pr=35787#step:7:4892

R test failure is a known issue #36346

@bkietz
bkietz merged commit 26c25d1 into apache:mainJun 29, 2023
@bkietzbkietz removed the awaiting merge Awaiting merge label Jun 29, 2023
@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit 26c25d1b.

There were 4 benchmark results indicating a performance regression:

The full Conbench report has more details.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Add pairwise_diff function

3 participants

@js8544@bkietz@lidavidm
, '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

GH-35786: [C++] Add pairwise_diff function - #35787

Merged
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel
Jun 29, 2023
Merged

GH-35786: [C++] Add pairwise_diff function#35787
bkietz merged 17 commits into
apache:mainfrom
js8544:jinshang/diff_kernel

Conversation

@js8544

@js8544js8544 commented May 26, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Add a pairwise_diff function similar to pandas' Series.Diff, the function computes the first order difference of an array.

What changes are included in this PR?

I followed these instructions. The function is implemented for numerical, temporal and decimal types. Chuck arrays are not yet supported.

Are these changes tested?

Yes. They are tested in vector_pairwise_test.cc and in python/pyarrow/tests/compute.py.

Are there any user-facing changes?

Yes, and docs are also updated in this PR.

@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@js8544js8544 changed the title Add pairwise diff functionGH-35786: [C++] Add pairwise_diff functionMay 26, 2023
@github-actionsgithub-actionsBot added the awaiting review Awaiting review label May 26, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35786has been automatically assigned in GitHub to PR creator.

@js8544

Copy link
Copy Markdown
ContributorAuthor

@lidavidm@pitrou@westonpace Hi guys, would any of you mind taking a look at this PR? It's been sitting around for almost a month. Thanks in advance!

@lidavidmlidavidm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Seems reasonable to me

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting review Awaiting review labels Jun 22, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

@pitrou@bkietz Would you mind having some extra look at this PR? Thanks!

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot removed the awaiting merge Awaiting merge label Jun 26, 2023
@js8544
js8544force-pushed the jinshang/diff_kernel branch from 3f037b6 to 6741ba2CompareJune 28, 2023 06:52
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 28, 2023
@js8544

js8544 commented Jun 28, 2023

Copy link
Copy Markdown
ContributorAuthor

This mostly looks good to me. However, in light of the strong relationship between this Function and subtract I'd prefer to see more reuse of that function's existing logic. For example when retrieving the output type for pairwise_diff($in_type), couldn't we just as easily call subtract's DispatchExact with ($in_type, $in_type)? And instead of referencing Subtract's Ops directly, couldn't we use the kernel retrieved from subtract's DispatchExact- just passing the relevant slices of the input as the arguments to the subtract kernel? I think this would have negligible impact on performance and would greatly reduce the future maintenance burden for this function, since any new types added to subtract will then automatically be supported by pairwise_diff.

Hi @bkietz, do you mean something like this:

ARROW_ASSIGN_OR_RAISE(auto subtract_func, registry->GetFunction("subtract"));
for (constauto& type : types) {
ARROW_ASSIGN_OR_RAISE(auto kernel,
subtract_func->DispatchExact({type, type}));
// reuse kernel's exec and signature
}

@bkietz

bkietz commented Jun 28, 2023

Copy link
Copy Markdown
Member

@js8544 yes, exactly. I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

(sorry for the spurious close; bumped the wrong button)

@bkietzbkietz closed this Jun 28, 2023
@bkietzbkietz reopened this Jun 28, 2023
@js8544

Copy link
Copy Markdown
ContributorAuthor

I think we might be able to go a step further and loop over subtract's kernels directly, without the need to list input types explicitly and go through DispatchExact.

That sounds better indeed! I'll try this now.

js8544and others added 3 commits June 28, 2023 22:48
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544

Copy link
Copy Markdown
ContributorAuthor

@bkietz I've changed it to looping over subtract's kernels and wrapping their signature and kernel exec.

@js8544
js8544 requested a review from bkietzJune 28, 2023 14:53
Comment threadcpp/src/arrow/compute/kernel.h Outdated
Comment threadcpp/src/arrow/compute/kernel.h

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This is looking great, thanks for refactoring!
Just a few nits

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment on lines +63 to +68
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Nit: could we call these two regions "computed" and "margin"? I think that'll be more obvious for the next maintainer, and it'd help if we move all the start/length calculation to this preamble too

Suggested change
auto offset = abs(periods);
offset = std::min(offset, input.length);
auto exec_length = input.length - offset;
// prepare bitmap
auto null_start = periods > 0 ? 0 : exec_length;
auto non_null_start = periods > 0 ? offset : 0;
// We only compute values in the region where the input-with-offset overlaps
// the original input. The margin where these do not overlap gets filled with null.
auto margin_length = std::min(abs(periods), input.length);
auto computed_length = input.length - margin_length;
auto margin_start = periods > 0 ? 0 : computed_length;
auto left_start = periods > 0 ? margin_length : 0;
auto right_start = periods > 0 ? 0 : margin_length;
// ...
// prepare bitmap

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Updated. It's much clearer now. thanks for the suggestion!

Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_pairwise.cc Outdated
Comment threaddocs/source/cpp/compute.rst Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels Jun 28, 2023
js8544and others added 2 commits June 29, 2023 11:19
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 29, 2023 03:21

@bkietzbkietz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thanks!

@github-actionsgithub-actionsBot added awaiting merge Awaiting merge and removed awaiting change review Awaiting change review labels Jun 29, 2023
@bkietz

Copy link
Copy Markdown
Member

macOs glib&python failures are network failures while communicating with brew https://github.com/apache/arrow/actions/runs/5408688637/jobs/9835499198?pr=35787

macOS c++ failure is a known issue #36329

ubuntu c++ failure is an s3 flake https://github.com/apache/arrow/actions/runs/5408688635/jobs/9828017525?pr=35787#step:7:4892

R test failure is a known issue #36346

@bkietz
bkietz merged commit 26c25d1 into apache:mainJun 29, 2023
@bkietzbkietz removed the awaiting merge Awaiting merge label Jun 29, 2023
@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit 26c25d1b.

There were 4 benchmark results indicating a performance regression:

The full Conbench report has more details.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[C++] Add pairwise_diff function

3 participants

@js8544@bkietz@lidavidm