Make grad() an in-planner rewrite (via FFI) so it works inside any query — recursive CTEs, DML
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
- #205 của @JHON12091986 — đã đóng, không merge
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 25/100
Hướng nghiên cứu
Start by reading the autograd implementation and the DataFusion FFI UDF code in datafusion-ffi 52, especially datafusion/ffi/src/udf/mod.rs. The preferred direction is to forward ScalarUDFImpl::simplify across the FFI boundary, including a way to pass argument Expr values. Done means grad() can be rewritten inside recursive CTEs, DML, and scalar subqueries without the plan-level Substrait round trip.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Context
The autograd grad() surface (#192) is applied by round-tripping the whole logical plan through Substrait: XarrayContext.sql() plans the query, produces a Substrait plan, the native extension (grad_rewrite) consumes it, rewrites every grad(...) into the differentiated expression, and re-produces Substrait for Python to execute.
This works for ordinary SELECT / aggregate / join plans, but Substrait can't represent every plan shape, so grad() can't appear inside:
- Recursive CTEs —
to_substrait_planrejectsRecursiveQuery(NotImplemented("Unsupported plan type: RecursiveQuery ...")). This is what blocks a fully-declarative training loop withgradinside the recursion. - DML —
INSERT ... SELECT grad(...)doesn't convert (DML plans aren't produced to Substrait). - Scalar subqueries also don't convert (
Cannot convert <subquery> to Substrait).
In the gradient-descent demo (#195) we worked around this with differentiate_sql (differentiate once to SQL text, then iterate it in a recursive CTE that contains no grad marker). That's a good pattern, but the original goal — grad() directly inside the query, including recursive/DML — needs an upstream change.
Root cause
The native engine is a separate cdylib that statically links its own copy of DataFusion, so it can't share Expr/LogicalPlan objects with datafusion-python — hence the Substrait serialization bridge. Substrait is then the limiting factor: any plan shape Substrait can't carry, grad() can't be rewritten in.
The fix is to stop round-tripping plans and instead run the rewrite in-planner, as a native DataFusion rewrite that fires for any query shape. That requires one of the following upstream capabilities.
Upstream changes that would enable it
Option 1 (preferred): datafusion-ffi — forward ScalarUDFImpl::simplify for foreign UDFs
If a foreign (FFI-registered) scalar UDF could implement simplify, grad/jvp/vjp would be self-rewriting UDFs: their simplify() differentiates the argument Expr during the SimplifyExpressions pass, which runs for every query shape (recursive CTEs, DML, subqueries) with no Substrait involved.
- Today
FFI_ScalarUDF/ForeignScalarUDFonly forwardname,signature,return_type/return_field_from_args,coerce_types,invoke_with_args(seedatafusion/ffi/src/udf/mod.rsin datafusion-ffi 52) — notsimplify, so the default (identity) is used. - Fix: add
simplifyto theFFI_ScalarUDFvtable (anextern "C"entry) and call it fromForeignScalarUDF::simplify. The hard part is passing the argumentExprs across the C ABI — needs an FFI representation ofExpr(e.g. reuse datafusion-proto'sExpr(de)serialization, or SubstraitExtendedExpression, for just the UDF's args). This is the smallest, most surgical change and unblocks all query shapes at once. It would also let us delete the whole plan-level Substrait bridge.
Option 2: datafusion-python + datafusion-ffi — register a foreign AnalyzerRule / FunctionRewrite over FFI
Expose registering a foreign analyzer/optimizer rule on the SessionContext (e.g. SessionContext.register_analyzer_rule(<capsule>)), backed by a new FFI_AnalyzerRule in datafusion-ffi. Then grad is an analyzer rule that rewrites grad(...) during analysis for any plan. Broader than Option 1 (general extension point) but more API surface.
Option 3 (narrower / long path): Substrait support for recursion + DML
Keep the current bridge but teach it the missing plan shapes:
- DML: Substrait has a
WriteRel;datafusion-substraitwould need producer/consumer support for it soINSERT ... SELECT grad(...)round-trips. - Recursion: Substrait the spec has no recursive-relation construct, so this is an upstream substrait-io spec gap, not just a
datafusion-substraitchange — the longest path.
Recommendation
Pursue Option 1 (FFI simplify forwarding). It's the smallest upstream change, removes the Substrait round-trip and its codec complexity entirely, and makes grad() work inside recursive CTEs, DML, and subqueries — i.e. the fully-declarative training loop with grad in the query. Until then, differentiate_sql + a recursive CTE (see #195) is the supported way to express an in-SQL training loop.
Filed as a follow-up to the autograd feature (#192) and its demos (#195); related to the mutable-state discussion in #194.
- Ngôn ngữ chính
- Python
- Star
- 142
- Fork
- 19
- Merge trung bình
- 1 ngày 9 giờ
- Pull request đã merge (30 ngày)
- 9
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của xqlsystems/xarray-sql
-
documentation
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 85/100
xqlsystems/xarray-sql#268 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 64/100
xqlsystems/xarray-sql#267 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 74/100
xqlsystems/xarray-sql#243 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
publish.yml: the TestPyPI verification step is unreachable (and installs the wrong package name)Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
xqlsystems/xarray-sql#242 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
xqlsystems/xarray-sql#237 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của xqlsystems/xarray-sql
Issue tương tự
-
get_page_thumbnail modifies cached page images, affecting later thumbnails and picture exportsĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
docling-project/docling-mcp#147 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 80/100
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
autowarefoundation/autoware_carla_scenario#405 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 79/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
mohitmishra786/readprism#322 ·
Maintainer thường phản hồi trong vòng 1 ngày