GH-32190: [C++][Compute] Implement cumulative prod, max and min functions - #36020

Merged
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions
Jun 22, 2023
Merged

GH-32190: [C++][Compute] Implement cumulative prod, max and min functions#36020
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions

Conversation

@js8544

@js8544js8544 commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Implement cumulative prod, max and min compute functions

What changes are included in this PR?

  1. Add implementations, docs and tests for the three functions.
  2. Refactor CumulativeSumOptions to CumulativeOptions for reusability.
  3. Fix a bug where GenericFromScalar(GenericToScalar(std::nullopt)) != std::nullopt.
  4. Remove an unnecessary Cast with the default start value.
  5. Add tests to check behavior with NaN.

I'll explain some of the changes in comments.

Are these changes tested?

Yes, in vector_accumulative_ops_test.cc and test_compute.py

Are there any user-facing changes?

No. The data members of CumulativeSumOptions are changed, but the member functions behave as before. And std::optional also can be constructed directly from T. So users should not feel any difference.

@github-actions

Copy link
Copy Markdown

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

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Jun 10, 2023
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated

@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.

Thanks for doing this!

This looks good, a few minor comments:

Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/compute.py Outdated

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.

@jorisvandenbossche Does this need an alias?

Suggested change
CumulativeOptions,
CumulativeOptions,
CumulativeOptionsasCumulativeSumOptions,

@jorisvandenbosschejorisvandenbosscheJun 22, 2023

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.

For backwards compatibility, that's probably useful, yes (also on the C++ side this was done).

(although we should maybe actually add it as its own class and deprecate it, so we can remove the alias at some point. But this can also be done as a follow-up later)

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.

Follow up issue here #36240

Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Jun 20, 2023
@js8544
js8544force-pushed the jinshang/cumulative_functions branch from f4de821 to 4bd7ca2CompareJune 21, 2023 16:17
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
js8544and others added 2 commits June 22, 2023 00:23
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 21, 2023 16:35
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment on lines +689 to +690
template <typename Value>
static constexpr Value value{std::numeric_limits<Value>::min()};

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.

These cumulative ops aren't currently instantiated for decimal types anyway: https://github.com/apache/arrow/blob/44edc27/cpp/src/arrow/compute/kernels/codegen_internal.h#L1070-L1100

... if you feel like filing a follow up issue for them, it should be fairly straightforward to specify these as specializations:

Suggested change
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<>
static constexpr Decimal128value<Decimal128>=Decimal128::GetMinSentinel();

Multiplication will require more effort since we can't construct 1 without knowing the scale.

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.

I'll remove them for this pr. Will send another pr for decimals.

Comment threadpython/pyarrow/_compute.pyx Outdated
@github-actionsgithub-actionsBot removed the awaiting change review Awaiting change review label Jun 21, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
@js8544
js8544 requested a review from bkietzJune 22, 2023 00:13
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 22, 2023

@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 changes Awaiting changes labels Jun 22, 2023
@bkietz

Copy link
Copy Markdown
Member

CI failure is a backpressure test flake-out in AsOfJoin, unrelated.

js8544and others added 2 commits June 22, 2023 20:32
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@icexelloss

Copy link
Copy Markdown
Contributor

Thanks @bkietz - created #36248 to track the Asof Join backpresure test issue

@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit e3eb5898.

There were 6 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++] Implement cumulative product, max, and min compute functions

4 participants

@js8544@bkietz@icexelloss@jorisvandenbossche
, '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-32190: [C++][Compute] Implement cumulative prod, max and min functions - #36020

Merged
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions
Jun 22, 2023
Merged

GH-32190: [C++][Compute] Implement cumulative prod, max and min functions#36020
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions

Conversation

@js8544

@js8544js8544 commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Implement cumulative prod, max and min compute functions

What changes are included in this PR?

  1. Add implementations, docs and tests for the three functions.
  2. Refactor CumulativeSumOptions to CumulativeOptions for reusability.
  3. Fix a bug where GenericFromScalar(GenericToScalar(std::nullopt)) != std::nullopt.
  4. Remove an unnecessary Cast with the default start value.
  5. Add tests to check behavior with NaN.

I'll explain some of the changes in comments.

Are these changes tested?

Yes, in vector_accumulative_ops_test.cc and test_compute.py

Are there any user-facing changes?

No. The data members of CumulativeSumOptions are changed, but the member functions behave as before. And std::optional also can be constructed directly from T. So users should not feel any difference.

@github-actions

Copy link
Copy Markdown

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

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Jun 10, 2023
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated

@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.

Thanks for doing this!

This looks good, a few minor comments:

Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/compute.py Outdated

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.

@jorisvandenbossche Does this need an alias?

Suggested change
CumulativeOptions,
CumulativeOptions,
CumulativeOptionsasCumulativeSumOptions,

@jorisvandenbosschejorisvandenbosscheJun 22, 2023

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.

For backwards compatibility, that's probably useful, yes (also on the C++ side this was done).

(although we should maybe actually add it as its own class and deprecate it, so we can remove the alias at some point. But this can also be done as a follow-up later)

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.

Follow up issue here #36240

Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Jun 20, 2023
@js8544
js8544force-pushed the jinshang/cumulative_functions branch from f4de821 to 4bd7ca2CompareJune 21, 2023 16:17
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
js8544and others added 2 commits June 22, 2023 00:23
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 21, 2023 16:35
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment on lines +689 to +690
template <typename Value>
static constexpr Value value{std::numeric_limits<Value>::min()};

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.

These cumulative ops aren't currently instantiated for decimal types anyway: https://github.com/apache/arrow/blob/44edc27/cpp/src/arrow/compute/kernels/codegen_internal.h#L1070-L1100

... if you feel like filing a follow up issue for them, it should be fairly straightforward to specify these as specializations:

Suggested change
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<>
static constexpr Decimal128value<Decimal128>=Decimal128::GetMinSentinel();

Multiplication will require more effort since we can't construct 1 without knowing the scale.

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.

I'll remove them for this pr. Will send another pr for decimals.

Comment threadpython/pyarrow/_compute.pyx Outdated
@github-actionsgithub-actionsBot removed the awaiting change review Awaiting change review label Jun 21, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
@js8544
js8544 requested a review from bkietzJune 22, 2023 00:13
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 22, 2023

@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 changes Awaiting changes labels Jun 22, 2023
@bkietz

Copy link
Copy Markdown
Member

CI failure is a backpressure test flake-out in AsOfJoin, unrelated.

js8544and others added 2 commits June 22, 2023 20:32
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@icexelloss

Copy link
Copy Markdown
Contributor

Thanks @bkietz - created #36248 to track the Asof Join backpresure test issue

@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit e3eb5898.

There were 6 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++] Implement cumulative product, max, and min compute functions

4 participants

@js8544@bkietz@icexelloss@jorisvandenbossche
, '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-32190: [C++][Compute] Implement cumulative prod, max and min functions - #36020

Merged
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions
Jun 22, 2023
Merged

GH-32190: [C++][Compute] Implement cumulative prod, max and min functions#36020
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions

Conversation

@js8544

@js8544js8544 commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Implement cumulative prod, max and min compute functions

What changes are included in this PR?

  1. Add implementations, docs and tests for the three functions.
  2. Refactor CumulativeSumOptions to CumulativeOptions for reusability.
  3. Fix a bug where GenericFromScalar(GenericToScalar(std::nullopt)) != std::nullopt.
  4. Remove an unnecessary Cast with the default start value.
  5. Add tests to check behavior with NaN.

I'll explain some of the changes in comments.

Are these changes tested?

Yes, in vector_accumulative_ops_test.cc and test_compute.py

Are there any user-facing changes?

No. The data members of CumulativeSumOptions are changed, but the member functions behave as before. And std::optional also can be constructed directly from T. So users should not feel any difference.

@github-actions

Copy link
Copy Markdown

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

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Jun 10, 2023
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated

@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.

Thanks for doing this!

This looks good, a few minor comments:

Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/compute.py Outdated

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.

@jorisvandenbossche Does this need an alias?

Suggested change
CumulativeOptions,
CumulativeOptions,
CumulativeOptionsasCumulativeSumOptions,

@jorisvandenbosschejorisvandenbosscheJun 22, 2023

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.

For backwards compatibility, that's probably useful, yes (also on the C++ side this was done).

(although we should maybe actually add it as its own class and deprecate it, so we can remove the alias at some point. But this can also be done as a follow-up later)

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.

Follow up issue here #36240

Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Jun 20, 2023
@js8544
js8544force-pushed the jinshang/cumulative_functions branch from f4de821 to 4bd7ca2CompareJune 21, 2023 16:17
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
js8544and others added 2 commits June 22, 2023 00:23
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 21, 2023 16:35
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment on lines +689 to +690
template <typename Value>
static constexpr Value value{std::numeric_limits<Value>::min()};

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.

These cumulative ops aren't currently instantiated for decimal types anyway: https://github.com/apache/arrow/blob/44edc27/cpp/src/arrow/compute/kernels/codegen_internal.h#L1070-L1100

... if you feel like filing a follow up issue for them, it should be fairly straightforward to specify these as specializations:

Suggested change
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<>
static constexpr Decimal128value<Decimal128>=Decimal128::GetMinSentinel();

Multiplication will require more effort since we can't construct 1 without knowing the scale.

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.

I'll remove them for this pr. Will send another pr for decimals.

Comment threadpython/pyarrow/_compute.pyx Outdated
@github-actionsgithub-actionsBot removed the awaiting change review Awaiting change review label Jun 21, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
@js8544
js8544 requested a review from bkietzJune 22, 2023 00:13
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 22, 2023

@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 changes Awaiting changes labels Jun 22, 2023
@bkietz

Copy link
Copy Markdown
Member

CI failure is a backpressure test flake-out in AsOfJoin, unrelated.

js8544and others added 2 commits June 22, 2023 20:32
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@icexelloss

Copy link
Copy Markdown
Contributor

Thanks @bkietz - created #36248 to track the Asof Join backpresure test issue

@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit e3eb5898.

There were 6 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++] Implement cumulative product, max, and min compute functions

4 participants

@js8544@bkietz@icexelloss@jorisvandenbossche
, '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-32190: [C++][Compute] Implement cumulative prod, max and min functions - #36020

Merged
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions
Jun 22, 2023
Merged

GH-32190: [C++][Compute] Implement cumulative prod, max and min functions#36020
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions

Conversation

@js8544

@js8544js8544 commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Implement cumulative prod, max and min compute functions

What changes are included in this PR?

  1. Add implementations, docs and tests for the three functions.
  2. Refactor CumulativeSumOptions to CumulativeOptions for reusability.
  3. Fix a bug where GenericFromScalar(GenericToScalar(std::nullopt)) != std::nullopt.
  4. Remove an unnecessary Cast with the default start value.
  5. Add tests to check behavior with NaN.

I'll explain some of the changes in comments.

Are these changes tested?

Yes, in vector_accumulative_ops_test.cc and test_compute.py

Are there any user-facing changes?

No. The data members of CumulativeSumOptions are changed, but the member functions behave as before. And std::optional also can be constructed directly from T. So users should not feel any difference.

@github-actions

Copy link
Copy Markdown

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

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Jun 10, 2023
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated

@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.

Thanks for doing this!

This looks good, a few minor comments:

Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/compute.py Outdated

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.

@jorisvandenbossche Does this need an alias?

Suggested change
CumulativeOptions,
CumulativeOptions,
CumulativeOptionsasCumulativeSumOptions,

@jorisvandenbosschejorisvandenbosscheJun 22, 2023

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.

For backwards compatibility, that's probably useful, yes (also on the C++ side this was done).

(although we should maybe actually add it as its own class and deprecate it, so we can remove the alias at some point. But this can also be done as a follow-up later)

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.

Follow up issue here #36240

Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Jun 20, 2023
@js8544
js8544force-pushed the jinshang/cumulative_functions branch from f4de821 to 4bd7ca2CompareJune 21, 2023 16:17
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
js8544and others added 2 commits June 22, 2023 00:23
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 21, 2023 16:35
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment on lines +689 to +690
template <typename Value>
static constexpr Value value{std::numeric_limits<Value>::min()};

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.

These cumulative ops aren't currently instantiated for decimal types anyway: https://github.com/apache/arrow/blob/44edc27/cpp/src/arrow/compute/kernels/codegen_internal.h#L1070-L1100

... if you feel like filing a follow up issue for them, it should be fairly straightforward to specify these as specializations:

Suggested change
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<>
static constexpr Decimal128value<Decimal128>=Decimal128::GetMinSentinel();

Multiplication will require more effort since we can't construct 1 without knowing the scale.

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.

I'll remove them for this pr. Will send another pr for decimals.

Comment threadpython/pyarrow/_compute.pyx Outdated
@github-actionsgithub-actionsBot removed the awaiting change review Awaiting change review label Jun 21, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
@js8544
js8544 requested a review from bkietzJune 22, 2023 00:13
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 22, 2023

@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 changes Awaiting changes labels Jun 22, 2023
@bkietz

Copy link
Copy Markdown
Member

CI failure is a backpressure test flake-out in AsOfJoin, unrelated.

js8544and others added 2 commits June 22, 2023 20:32
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@icexelloss

Copy link
Copy Markdown
Contributor

Thanks @bkietz - created #36248 to track the Asof Join backpresure test issue

@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit e3eb5898.

There were 6 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++] Implement cumulative product, max, and min compute functions

4 participants

@js8544@bkietz@icexelloss@jorisvandenbossche
, '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-32190: [C++][Compute] Implement cumulative prod, max and min functions - #36020

Merged
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions
Jun 22, 2023
Merged

GH-32190: [C++][Compute] Implement cumulative prod, max and min functions#36020
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions

Conversation

@js8544

@js8544js8544 commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Implement cumulative prod, max and min compute functions

What changes are included in this PR?

  1. Add implementations, docs and tests for the three functions.
  2. Refactor CumulativeSumOptions to CumulativeOptions for reusability.
  3. Fix a bug where GenericFromScalar(GenericToScalar(std::nullopt)) != std::nullopt.
  4. Remove an unnecessary Cast with the default start value.
  5. Add tests to check behavior with NaN.

I'll explain some of the changes in comments.

Are these changes tested?

Yes, in vector_accumulative_ops_test.cc and test_compute.py

Are there any user-facing changes?

No. The data members of CumulativeSumOptions are changed, but the member functions behave as before. And std::optional also can be constructed directly from T. So users should not feel any difference.

@github-actions

Copy link
Copy Markdown

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

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Jun 10, 2023
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated

@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.

Thanks for doing this!

This looks good, a few minor comments:

Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/compute.py Outdated

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.

@jorisvandenbossche Does this need an alias?

Suggested change
CumulativeOptions,
CumulativeOptions,
CumulativeOptionsasCumulativeSumOptions,

@jorisvandenbosschejorisvandenbosscheJun 22, 2023

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.

For backwards compatibility, that's probably useful, yes (also on the C++ side this was done).

(although we should maybe actually add it as its own class and deprecate it, so we can remove the alias at some point. But this can also be done as a follow-up later)

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.

Follow up issue here #36240

Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Jun 20, 2023
@js8544
js8544force-pushed the jinshang/cumulative_functions branch from f4de821 to 4bd7ca2CompareJune 21, 2023 16:17
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
js8544and others added 2 commits June 22, 2023 00:23
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 21, 2023 16:35
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment on lines +689 to +690
template <typename Value>
static constexpr Value value{std::numeric_limits<Value>::min()};

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.

These cumulative ops aren't currently instantiated for decimal types anyway: https://github.com/apache/arrow/blob/44edc27/cpp/src/arrow/compute/kernels/codegen_internal.h#L1070-L1100

... if you feel like filing a follow up issue for them, it should be fairly straightforward to specify these as specializations:

Suggested change
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<>
static constexpr Decimal128value<Decimal128>=Decimal128::GetMinSentinel();

Multiplication will require more effort since we can't construct 1 without knowing the scale.

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.

I'll remove them for this pr. Will send another pr for decimals.

Comment threadpython/pyarrow/_compute.pyx Outdated
@github-actionsgithub-actionsBot removed the awaiting change review Awaiting change review label Jun 21, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
@js8544
js8544 requested a review from bkietzJune 22, 2023 00:13
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 22, 2023

@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 changes Awaiting changes labels Jun 22, 2023
@bkietz

Copy link
Copy Markdown
Member

CI failure is a backpressure test flake-out in AsOfJoin, unrelated.

js8544and others added 2 commits June 22, 2023 20:32
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@icexelloss

Copy link
Copy Markdown
Contributor

Thanks @bkietz - created #36248 to track the Asof Join backpresure test issue

@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit e3eb5898.

There were 6 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++] Implement cumulative product, max, and min compute functions

4 participants

@js8544@bkietz@icexelloss@jorisvandenbossche
, '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-32190: [C++][Compute] Implement cumulative prod, max and min functions - #36020

Merged
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions
Jun 22, 2023
Merged

GH-32190: [C++][Compute] Implement cumulative prod, max and min functions#36020
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions

Conversation

@js8544

@js8544js8544 commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Implement cumulative prod, max and min compute functions

What changes are included in this PR?

  1. Add implementations, docs and tests for the three functions.
  2. Refactor CumulativeSumOptions to CumulativeOptions for reusability.
  3. Fix a bug where GenericFromScalar(GenericToScalar(std::nullopt)) != std::nullopt.
  4. Remove an unnecessary Cast with the default start value.
  5. Add tests to check behavior with NaN.

I'll explain some of the changes in comments.

Are these changes tested?

Yes, in vector_accumulative_ops_test.cc and test_compute.py

Are there any user-facing changes?

No. The data members of CumulativeSumOptions are changed, but the member functions behave as before. And std::optional also can be constructed directly from T. So users should not feel any difference.

@github-actions

Copy link
Copy Markdown

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

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Jun 10, 2023
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated

@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.

Thanks for doing this!

This looks good, a few minor comments:

Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/compute.py Outdated

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.

@jorisvandenbossche Does this need an alias?

Suggested change
CumulativeOptions,
CumulativeOptions,
CumulativeOptionsasCumulativeSumOptions,

@jorisvandenbosschejorisvandenbosscheJun 22, 2023

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.

For backwards compatibility, that's probably useful, yes (also on the C++ side this was done).

(although we should maybe actually add it as its own class and deprecate it, so we can remove the alias at some point. But this can also be done as a follow-up later)

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.

Follow up issue here #36240

Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Jun 20, 2023
@js8544
js8544force-pushed the jinshang/cumulative_functions branch from f4de821 to 4bd7ca2CompareJune 21, 2023 16:17
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
js8544and others added 2 commits June 22, 2023 00:23
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 21, 2023 16:35
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment on lines +689 to +690
template <typename Value>
static constexpr Value value{std::numeric_limits<Value>::min()};

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.

These cumulative ops aren't currently instantiated for decimal types anyway: https://github.com/apache/arrow/blob/44edc27/cpp/src/arrow/compute/kernels/codegen_internal.h#L1070-L1100

... if you feel like filing a follow up issue for them, it should be fairly straightforward to specify these as specializations:

Suggested change
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<>
static constexpr Decimal128value<Decimal128>=Decimal128::GetMinSentinel();

Multiplication will require more effort since we can't construct 1 without knowing the scale.

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.

I'll remove them for this pr. Will send another pr for decimals.

Comment threadpython/pyarrow/_compute.pyx Outdated
@github-actionsgithub-actionsBot removed the awaiting change review Awaiting change review label Jun 21, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
@js8544
js8544 requested a review from bkietzJune 22, 2023 00:13
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 22, 2023

@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 changes Awaiting changes labels Jun 22, 2023
@bkietz

Copy link
Copy Markdown
Member

CI failure is a backpressure test flake-out in AsOfJoin, unrelated.

js8544and others added 2 commits June 22, 2023 20:32
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@icexelloss

Copy link
Copy Markdown
Contributor

Thanks @bkietz - created #36248 to track the Asof Join backpresure test issue

@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit e3eb5898.

There were 6 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++] Implement cumulative product, max, and min compute functions

4 participants

@js8544@bkietz@icexelloss@jorisvandenbossche
, '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-32190: [C++][Compute] Implement cumulative prod, max and min functions - #36020

Merged
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions
Jun 22, 2023
Merged

GH-32190: [C++][Compute] Implement cumulative prod, max and min functions#36020
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions

Conversation

@js8544

@js8544js8544 commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Implement cumulative prod, max and min compute functions

What changes are included in this PR?

  1. Add implementations, docs and tests for the three functions.
  2. Refactor CumulativeSumOptions to CumulativeOptions for reusability.
  3. Fix a bug where GenericFromScalar(GenericToScalar(std::nullopt)) != std::nullopt.
  4. Remove an unnecessary Cast with the default start value.
  5. Add tests to check behavior with NaN.

I'll explain some of the changes in comments.

Are these changes tested?

Yes, in vector_accumulative_ops_test.cc and test_compute.py

Are there any user-facing changes?

No. The data members of CumulativeSumOptions are changed, but the member functions behave as before. And std::optional also can be constructed directly from T. So users should not feel any difference.

@github-actions

Copy link
Copy Markdown

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

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Jun 10, 2023
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated

@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.

Thanks for doing this!

This looks good, a few minor comments:

Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/compute.py Outdated

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.

@jorisvandenbossche Does this need an alias?

Suggested change
CumulativeOptions,
CumulativeOptions,
CumulativeOptionsasCumulativeSumOptions,

@jorisvandenbosschejorisvandenbosscheJun 22, 2023

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.

For backwards compatibility, that's probably useful, yes (also on the C++ side this was done).

(although we should maybe actually add it as its own class and deprecate it, so we can remove the alias at some point. But this can also be done as a follow-up later)

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.

Follow up issue here #36240

Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Jun 20, 2023
@js8544
js8544force-pushed the jinshang/cumulative_functions branch from f4de821 to 4bd7ca2CompareJune 21, 2023 16:17
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
js8544and others added 2 commits June 22, 2023 00:23
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 21, 2023 16:35
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment on lines +689 to +690
template <typename Value>
static constexpr Value value{std::numeric_limits<Value>::min()};

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.

These cumulative ops aren't currently instantiated for decimal types anyway: https://github.com/apache/arrow/blob/44edc27/cpp/src/arrow/compute/kernels/codegen_internal.h#L1070-L1100

... if you feel like filing a follow up issue for them, it should be fairly straightforward to specify these as specializations:

Suggested change
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<>
static constexpr Decimal128value<Decimal128>=Decimal128::GetMinSentinel();

Multiplication will require more effort since we can't construct 1 without knowing the scale.

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.

I'll remove them for this pr. Will send another pr for decimals.

Comment threadpython/pyarrow/_compute.pyx Outdated
@github-actionsgithub-actionsBot removed the awaiting change review Awaiting change review label Jun 21, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
@js8544
js8544 requested a review from bkietzJune 22, 2023 00:13
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 22, 2023

@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 changes Awaiting changes labels Jun 22, 2023
@bkietz

Copy link
Copy Markdown
Member

CI failure is a backpressure test flake-out in AsOfJoin, unrelated.

js8544and others added 2 commits June 22, 2023 20:32
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@icexelloss

Copy link
Copy Markdown
Contributor

Thanks @bkietz - created #36248 to track the Asof Join backpresure test issue

@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit e3eb5898.

There were 6 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++] Implement cumulative product, max, and min compute functions

4 participants

@js8544@bkietz@icexelloss@jorisvandenbossche
, '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-32190: [C++][Compute] Implement cumulative prod, max and min functions - #36020

Merged
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions
Jun 22, 2023
Merged

GH-32190: [C++][Compute] Implement cumulative prod, max and min functions#36020
bkietz merged 9 commits into
apache:mainfrom
js8544:jinshang/cumulative_functions

Conversation

@js8544

@js8544js8544 commented Jun 10, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Implement cumulative prod, max and min compute functions

What changes are included in this PR?

  1. Add implementations, docs and tests for the three functions.
  2. Refactor CumulativeSumOptions to CumulativeOptions for reusability.
  3. Fix a bug where GenericFromScalar(GenericToScalar(std::nullopt)) != std::nullopt.
  4. Remove an unnecessary Cast with the default start value.
  5. Add tests to check behavior with NaN.

I'll explain some of the changes in comments.

Are these changes tested?

Yes, in vector_accumulative_ops_test.cc and test_compute.py

Are there any user-facing changes?

No. The data members of CumulativeSumOptions are changed, but the member functions behave as before. And std::optional also can be constructed directly from T. So users should not feel any difference.

@github-actions

Copy link
Copy Markdown

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

Comment threadcpp/src/arrow/compute/api_vector.h Outdated
@github-actionsgithub-actionsBot added awaiting committer review Awaiting committer review and removed awaiting review Awaiting review labels Jun 10, 2023
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated

@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.

Thanks for doing this!

This looks good, a few minor comments:

Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/function_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/compute.py Outdated

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.

@jorisvandenbossche Does this need an alias?

Suggested change
CumulativeOptions,
CumulativeOptions,
CumulativeOptionsasCumulativeSumOptions,

@jorisvandenbosschejorisvandenbosscheJun 22, 2023

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.

For backwards compatibility, that's probably useful, yes (also on the C++ side this was done).

(although we should maybe actually add it as its own class and deprecate it, so we can remove the alias at some point. But this can also be done as a follow-up later)

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.

Follow up issue here #36240

Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting committer review Awaiting committer review labels Jun 20, 2023
@js8544
js8544force-pushed the jinshang/cumulative_functions branch from f4de821 to 4bd7ca2CompareJune 21, 2023 16:17
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
Comment threadcpp/src/arrow/compute/kernels/vector_cumulative_ops.cc Outdated
js8544and others added 2 commits June 22, 2023 00:23
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@js8544
js8544 requested a review from bkietzJune 21, 2023 16:35
Comment threadcpp/src/arrow/compute/kernels/base_arithmetic_internal.h Outdated
Comment on lines +689 to +690
template <typename Value>
static constexpr Value value{std::numeric_limits<Value>::min()};

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.

These cumulative ops aren't currently instantiated for decimal types anyway: https://github.com/apache/arrow/blob/44edc27/cpp/src/arrow/compute/kernels/codegen_internal.h#L1070-L1100

... if you feel like filing a follow up issue for them, it should be fairly straightforward to specify these as specializations:

Suggested change
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<typenameValue>
static constexpr Valuevalue{std::numeric_limits<Value>::min()};
template<>
static constexpr Decimal128value<Decimal128>=Decimal128::GetMinSentinel();

Multiplication will require more effort since we can't construct 1 without knowing the scale.

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.

I'll remove them for this pr. Will send another pr for decimals.

Comment threadpython/pyarrow/_compute.pyx Outdated
@github-actionsgithub-actionsBot removed the awaiting change review Awaiting change review label Jun 21, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 21, 2023
@js8544
js8544 requested a review from bkietzJune 22, 2023 00:13
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 22, 2023

@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 changes Awaiting changes labels Jun 22, 2023
@bkietz

Copy link
Copy Markdown
Member

CI failure is a backpressure test flake-out in AsOfJoin, unrelated.

js8544and others added 2 commits June 22, 2023 20:32
Co-authored-by: Benjamin Kietzman <bengilgit@gmail.com>
@icexelloss

Copy link
Copy Markdown
Contributor

Thanks @bkietz - created #36248 to track the Asof Join backpresure test issue

@conbench-apache-arrow

Copy link
Copy Markdown

Conbench analyzed the 6 benchmark runs on commit e3eb5898.

There were 6 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++] Implement cumulative product, max, and min compute functions

4 participants

@js8544@bkietz@icexelloss@jorisvandenbossche