Add the missing built-in constant-expression functions (`popcount`, `rotl`, `rotr`, `mod`, `exp`, `log`, `pow`, `ceiling`, `floor`)
Maintainer thường phản hồi trong vòng 1 ngày
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 45/100
Hướng nghiên cứu
Start in src/pyqasm/maps/expressions.py, where FUNCTION_MAP is defined near line 196, and check how existing entries such as sqrt are applied in constant and gate-argument contexts. Reproduce with the pyqasm.loads(...).validate() snippets in the issue. Done means ceiling, floor, exp, log and mod validate in both const declarations and gate arguments, with tests added in tests/qasm3/test_expressions.py. Leave popcount, rotl, rotr and pow for a maintainer to scope, since they depend on a companion issue and an upstream parser problem.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Limitation
Table 2 — Built-in mathematical functions
lists the functions every OpenQASM 3 implementation must provide in constant expressions:
arccos, arcsin, arctan, ceiling, cos, exp, floor, log, mod, popcount,
pow, rotl, rotr, sin, sqrt, tan.
pyqasm's FUNCTION_MAP provides only abs, real, imag, sqrt, sin, cos, tan,
arccos, arcsin, arctan. Nine of the spec's functions are missing:
ceiling, floor, exp, log, mod, popcount, pow, rotl, rotr.
Example QASM failure
Every one of these is a valid constant expression per the spec:
import pyqasm
for decl in [
"const uint c = popcount(37);",
'const bit[8] c = rotl("00101010", 3);',
'const bit[8] c = rotr("00101010", 3);',
"const int c = mod(7, 2);",
"const float[64] c = exp(1.0);",
"const float[64] c = log(2.0);",
"const int c = ceiling(1.2);",
"const int c = floor(1.8);",
]:
m = pyqasm.loads("OPENQASM 3.0;\n" + decl)
m.validate()
ValidationError: Invalid initialization value for constant 'c'
They fail as gate arguments too, where sqrt already works:
OPENQASM 3.0;
include "stdgates.inc";
qubit[1] q;
rx(sqrt(2.0)) q[0]; // OK today
rx(exp(1.0)) q[0]; // ValidationError: Invalid parameter 'exp(1.0)' for gate 'rx'
The spec's own example under Built-in constant expression functions exercises most of them:
const float[64] f2 = 2.0 * exp(f1);
const int[8] i2 = pow(i1, u1);
const bit[8] b2 = rotl(b1, 3);
Change Requested
- Add
ceiling,floor,exp,log,modtoFUNCTION_MAPwith the spec's signatures. - Add
popcount,rotl,rotr, which operate onbit[n]anduint[n]and must preserve
the input width. - Add
pow(a, b)as a function. Note the parser caveat below — this one is not purely a
FUNCTION_MAPentry. - Report an unknown function name and an arity or type mismatch as a
ValidationErrornaming
the function, rather than the current generic"Invalid initialization value"message,
which gives the user no indication that the function was the problem.
Implementation Details
FUNCTION_MAPis insrc/pyqasm/maps/expressions.py:196. Most additions are one line each:
"exp": np.exp,"log": np.log,"ceiling": np.ceil,"floor": np.floor,
"mod": np.mod.popcount/rotl/rotrare defined onbit[n]and depend on a width-carrying bit
representation — see the companion issue onbit[n]operators. Widths must be preserved:
rotl(a, n) == rotr(a, -n), and the output width equals the input width.powhas a known blocker.const int c = pow(2, 3);fails at parse time in
openqasm31.0.1 becausepowis also the gate-modifier keyword. Verify against the
current upstream release and, if it still reproduces, open an issue on
openqasm/openqasmand link it here; the pyqasm-side change can land independently for the
other eight functions.- Spec overload resolution matters for the error messages:
pow(int, uint) -> intis
preferred overpow(float, float) -> float, which is preferred over thecomplexoverload.
expandsqrteach havefloat -> floatandcomplex -> complexforms. - Tests:
tests/qasm3/test_expressions.py— one case per function covering aconst
declaration and a gate argument, plus arity and type-error cases.
- Ngôn ngữ chính
- Python
- Star
- 29
- Fork
- 33
- Merge trung bình
- 2 ngày 4 giờ
- Pull request đã merge (30 ngày)
- 15
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- 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 qBraid/pyqasm
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 63/100
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement error-handling program-validation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Move the QASM 2 printer and its branch pre-processing out of qasm2.pyCó thể đã có người làm @danielgaskins đã nhận 9 ngày trước. Đang mởenhancement qasm2
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 22/100
qBraid/pyqasm#447 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[BUG] dumps() emits extern calls without a semicolon, producing unparsable QASMCó thể đã có người làm @Jah-yee đã nhận 17 ngày trước. Đang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 25/100
qBraid/pyqasm#438 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Parse failures raise ValidationError with an empty message; the ANTLR diagnostic is lostCó thể đã có người làm @tonycoder-hub đã nhận 11 ngày trước. Đang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 22/100
qBraid/pyqasm#436 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của qBraid/pyqasm
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
foxglove/mcap#1907 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
namespace operations
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 72/100
EclipseFdn/open-vsx.org#14623 ·
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 76/100
developmentseed/titiler-cmr#261 ·
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
andrewyng/openworker#774 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
aggfuncĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
worldbank/blackmarblepy#160 ·