Skip to content

Commit ea357a5

Browse files
MarquessVnotmgsk
andauthored
feat: Update quil-rs (#350)
* feat: Update quil-rs * Update crates/python/src/qpu/rewrite_arithmetic.rs Co-authored-by: Mark Skilbeck <[email protected]> * un-swap error messages --------- Co-authored-by: Mark Skilbeck <[email protected]>
1 parent 7e0d97d commit ea357a5

File tree

10 files changed

+56
-27
lines changed

10 files changed

+56
-27
lines changed

Cargo.lock

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ tokio = "1.24.2"
1515
# be a `quil-py` tag and should match the version used in `crates/python/pyproject.toml`
1616
# The version must also be specified in order to publish to crates.io. Cargo enforces
1717
# that the specified version is the same as the version in the git repository.
18-
quil-rs = { version = "0.20.0", git = "https://github.com/rigetti/quil-rs", tag = "quil-py/v0.4.0" }
18+
quil-rs = { version = "0.21.0", git = "https://github.com/rigetti/quil-rs", tag = "quil-py/v0.5.0" }
1919

2020
# ndarray is used by the `qcs` crate, but it is also used in the `python` crate via a
2121
# re-export through the numpy crate. They should be updated as a pair to keep both

crates/lib/src/compiler/quilc.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,7 @@ mod tests {
411411

412412
use super::*;
413413
use qcs_api_client_openapi::models::InstructionSetArchitecture;
414+
use quil_rs::quil::Quil;
414415
use regex::Regex;
415416
use std::{fs::File, num::NonZeroU16};
416417

@@ -433,7 +434,7 @@ mod tests {
433434
CompilerOpts::default(),
434435
)
435436
.expect("Could not compile");
436-
assert_eq!(output.program.to_string(), EXPECTED_H0_OUTPUT);
437+
assert_eq!(output.program.to_quil_or_debug(), EXPECTED_H0_OUTPUT);
437438
}
438439

439440
const BELL_STATE: &str = r##"DECLARE ro BIT[2]
@@ -455,7 +456,7 @@ MEASURE 1 ro[1]
455456
CompilerOpts::default(),
456457
)
457458
.expect("Could not compile");
458-
let mut results = crate::qvm::Execution::new(&output.program.to_string())
459+
let mut results = crate::qvm::Execution::new(&output.program.to_quil_or_debug())
459460
.unwrap()
460461
.run(
461462
NonZeroU16::new(10).expect("value is non-zero"),
@@ -490,7 +491,7 @@ MEASURE 1 ro[1]
490491
CompilerOpts::default(),
491492
)
492493
.expect("Should be able to compile");
493-
assert_eq!(output.program.to_string(), "DECLARE ro BIT[1]\n");
494+
assert_eq!(output.program.to_quil_or_debug(), "DECLARE ro BIT[1]\n");
494495
assert_ne!(output.native_quil_metadata, None);
495496
}
496497

crates/lib/src/executable.rs

+6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::time::Duration;
99

1010
use qcs_api_client_common::configuration::LoadError;
1111
use qcs_api_client_grpc::services::translation::TranslationOptions;
12+
use quil_rs::quil::ToQuilError;
1213

1314
use crate::client::Qcs;
1415
use crate::compiler::quilc::CompilerOpts;
@@ -621,6 +622,9 @@ pub enum Error {
621622
/// some parameters.
622623
#[error("There was a problem with the Quil program: {0}")]
623624
Quil(#[from] ProgramError),
625+
/// There was some problem converting the provided Quil program to valid Quil.
626+
#[error("There was a problem converting the program to valid Quil: {0}")]
627+
ToQuil(#[from] ToQuilError),
624628
/// There was a problem when compiling the Quil program.
625629
#[error("There was a problem compiling the Quil program: {0}")]
626630
Compilation(String),
@@ -687,6 +691,7 @@ impl From<ExecutionError> for Error {
687691
ExecutionError::IsaError(v) => Self::Unexpected(format!("{v:?}")),
688692
ExecutionError::ReadoutParse(v) => Self::Unexpected(format!("{v:?}")),
689693
ExecutionError::Quil(e) => Self::Quil(e),
694+
ExecutionError::ToQuil(e) => Self::ToQuil(e),
690695
ExecutionError::Compilation { details } => Self::Compilation(details),
691696
ExecutionError::RewriteArithmetic(e) => Self::RewriteArithmetic(e),
692697
ExecutionError::Substitution(message) => Self::Substitution(message),
@@ -701,6 +706,7 @@ impl From<qvm::Error> for Error {
701706
qvm::Error::QvmCommunication { .. } | qvm::Error::Client { .. } => {
702707
Self::Connection(Service::Qvm)
703708
}
709+
qvm::Error::ToQuil(q) => Self::ToQuil(q),
704710
qvm::Error::Parsing(_)
705711
| qvm::Error::ShotsMustBePositive
706712
| qvm::Error::RegionSizeMismatch { .. }

crates/lib/src/qpu/execution.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::time::Duration;
88

99
use qcs_api_client_grpc::services::translation::TranslationOptions;
1010
use quil_rs::program::ProgramError;
11+
use quil_rs::quil::ToQuilError;
1112
use tokio::task::{spawn_blocking, JoinError};
1213

1314
#[cfg(feature = "tracing")]
@@ -43,6 +44,8 @@ pub(crate) struct Execution<'a> {
4344
pub(crate) enum Error {
4445
#[error("problem processing the provided Quil: {0}")]
4546
Quil(#[from] ProgramError),
47+
#[error("problem converting the program to valid Quil: {0}")]
48+
ToQuil(#[from] ToQuilError),
4649
#[error("An error that is not expected to occur. If this shows up it may be a bug in this SDK or QCS")]
4750
Unexpected(#[from] Unexpected),
4851
#[error("Problem communicating with quilc at {uri}: {details}")]
@@ -176,7 +179,7 @@ impl<'a> Execution<'a> {
176179
) -> Result<EncryptedTranslationResult, Error> {
177180
let encrpyted_translation_result = translate(
178181
self.quantum_processor_id.as_ref(),
179-
&self.program.to_string().0,
182+
&self.program.to_string()?.0,
180183
self.shots.get().into(),
181184
self.client.as_ref(),
182185
options,

crates/lib/src/qpu/rewrite_arithmetic.rs

+18-12
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use quil_rs::{
1212
SetFrequency, SetPhase, SetScale, ShiftFrequency, ShiftPhase, Vector,
1313
},
1414
program::{FrameSet, MemoryRegion},
15+
quil::{Quil, ToQuilError},
1516
Program,
1617
};
1718

@@ -125,7 +126,12 @@ pub fn get_substitutions(
125126
.map(|substitution: &Expression| {
126127
substitution
127128
.evaluate(&HashMap::new(), &params)
128-
.map_err(|e| format!("Could not evaluate expression {substitution}: {e:?}"))
129+
.map_err(|e| {
130+
format!(
131+
"Could not evaluate expression {}: {e:?}",
132+
substitution.to_quil_or_debug()
133+
)
134+
})
129135
.and_then(|complex| {
130136
if complex.im == 0.0 {
131137
Ok(complex.re)
@@ -356,16 +362,16 @@ impl TryFrom<Program> for RewrittenProgram {
356362
}
357363

358364
impl RewrittenProgram {
359-
pub(crate) fn to_string(&self) -> RewrittenQuil {
360-
RewrittenQuil(self.inner.to_string())
365+
pub(crate) fn to_string(&self) -> Result<RewrittenQuil, ToQuilError> {
366+
Ok(RewrittenQuil(self.inner.to_quil()?))
361367
}
362368
}
363369

364370
#[cfg(test)]
365371
mod describe_rewrite_arithmetic {
366372
use std::str::FromStr;
367373

368-
use quil_rs::Program;
374+
use quil_rs::{quil::Quil, Program};
369375

370376
use crate::qpu::rewrite_arithmetic::rewrite_arithmetic;
371377

@@ -378,7 +384,7 @@ mod describe_rewrite_arithmetic {
378384
let (actual, substitutions) = rewrite_arithmetic(program).unwrap();
379385
assert_eq!(actual, expected);
380386
assert_eq!(substitutions.len(), 1);
381-
insta::assert_snapshot!(substitutions[0].to_string());
387+
insta::assert_snapshot!(substitutions[0].to_quil_or_debug());
382388
}
383389

384390
#[test]
@@ -400,7 +406,7 @@ mod describe_rewrite_arithmetic {
400406
let (actual, substitutions) = rewrite_arithmetic(program).unwrap();
401407
assert_eq!(actual, expected);
402408
assert_eq!(substitutions.len(), 1);
403-
insta::assert_snapshot!(substitutions[0].to_string());
409+
insta::assert_snapshot!(substitutions[0].to_quil_or_debug());
404410
}
405411

406412
#[test]
@@ -427,8 +433,8 @@ RZ(__SUBST[1]) 0
427433
let (actual, substitutions) = rewrite_arithmetic(program).unwrap();
428434
assert_eq!(actual, expected);
429435
assert_eq!(substitutions.len(), 2);
430-
insta::assert_snapshot!(substitutions[0].to_string());
431-
insta::assert_snapshot!(substitutions[1].to_string());
436+
insta::assert_snapshot!(substitutions[0].to_quil_or_debug());
437+
insta::assert_snapshot!(substitutions[1].to_quil_or_debug());
432438
}
433439

434440
#[test]
@@ -453,7 +459,7 @@ SET-SCALE 0 "rf" __SUBST[0]
453459
let (actual, substitutions) = rewrite_arithmetic(program).unwrap();
454460
assert_eq!(actual, expected);
455461
assert_eq!(substitutions.len(), 1);
456-
insta::assert_snapshot!(substitutions[0].to_string());
462+
insta::assert_snapshot!(substitutions[0].to_quil_or_debug());
457463
}
458464

459465
#[test]
@@ -490,8 +496,8 @@ SET-FREQUENCY 1 "rf" __SUBST[1]
490496
let (actual, substitutions) = rewrite_arithmetic(program).unwrap();
491497
assert_eq!(actual, expected);
492498
assert_eq!(substitutions.len(), 2);
493-
insta::assert_snapshot!(substitutions[0].to_string());
494-
insta::assert_snapshot!(substitutions[1].to_string());
499+
insta::assert_snapshot!(substitutions[0].to_quil_or_debug());
500+
insta::assert_snapshot!(substitutions[1].to_quil_or_debug());
495501
}
496502

497503
#[test]
@@ -550,7 +556,7 @@ SHIFT-PHASE 0 "rf" __SUBST[0]
550556
let (actual, substitutions) = rewrite_arithmetic(program).unwrap();
551557
assert_eq!(actual, expected);
552558
assert_eq!(substitutions.len(), 1);
553-
insta::assert_snapshot!(substitutions[0].to_string());
559+
insta::assert_snapshot!(substitutions[0].to_quil_or_debug());
554560
}
555561
}
556562

crates/lib/src/qvm/mod.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::{collections::HashMap, num::NonZeroU16, str::FromStr, time::Duration};
66
use quil_rs::{
77
instruction::{ArithmeticOperand, Instruction, MemoryReference, Move},
88
program::ProgramError,
9+
quil::{Quil, ToQuilError},
910
Program,
1011
};
1112
use serde::Deserialize;
@@ -97,7 +98,7 @@ pub async fn run_program(
9798
);
9899
let program = apply_parameters_to_program(program, params)?;
99100
let request = api::MultishotRequest::new(
100-
program.to_string(),
101+
program.to_quil()?,
101102
shots,
102103
addresses,
103104
measurement_noise,
@@ -188,6 +189,8 @@ impl Default for QvmOptions {
188189
pub enum Error {
189190
#[error("Error parsing Quil program: {0}")]
190191
Parsing(#[from] ProgramError),
192+
#[error("Error converting program to valid Quil: {0}")]
193+
ToQuil(#[from] ToQuilError),
191194
#[error("Shots must be a positive integer.")]
192195
ShotsMustBePositive,
193196
#[error("Declared region {name} has size {declared} but parameters have size {parameters}.")]
@@ -213,7 +216,7 @@ pub enum Error {
213216
mod test {
214217
use std::{collections::HashMap, str::FromStr};
215218

216-
use quil_rs::Program;
219+
use quil_rs::{quil::Quil, Program};
217220
use rstest::{fixture, rstest};
218221

219222
use super::apply_parameters_to_program;
@@ -237,7 +240,7 @@ mod test {
237240
let parameterized_program = apply_parameters_to_program(&program, &params)
238241
.expect("should not error for empty parameters");
239242

240-
insta::assert_snapshot!(parameterized_program.to_string());
243+
insta::assert_snapshot!(parameterized_program.to_quil_or_debug());
241244
}
242245

243246
#[rstest]

crates/python/pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ classifiers = [
2020
"Programming Language :: Python :: 3.11",
2121
"Operating System :: OS Independent",
2222
]
23-
dependencies = ["quil==0.4.0"]
23+
dependencies = ["quil==0.5.0"]
2424

2525
# PEP 621 specifies the [project] table as the source for project metadata. However, Poetry only supports [tool.poetry]
2626
# We can remove this table once this issue is resolved: https://github.com/python-poetry/poetry/issues/3332

crates/python/src/compiler/quilc.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use qcs::compiler::quilc::{
44
RandomizedBenchmarkingRequest, TargetDevice, DEFAULT_COMPILER_TIMEOUT,
55
};
66
use qcs_api_client_openapi::models::InstructionSetArchitecture;
7+
use quil_rs::quil::Quil;
78
use rigetti_pyo3::{
89
create_init_submodule, impl_repr, py_wrap_data_struct, py_wrap_error, py_wrap_struct,
910
py_wrap_type,
@@ -113,7 +114,7 @@ py_function_sync_async! {
113114
.map_err(RustQuilcError::from)
114115
.map_err(RustQuilcError::to_py_err)
115116
.map(|result| PyCompilationResult {
116-
program: result.program.to_string(),
117+
program: result.program.to_quil().expect("successfully compiled program should convert to valid quil"),
117118
native_quil_metadata: result.native_quil_metadata.map(PyNativeQuilMetadata)
118119
})
119120

crates/python/src/qpu/rewrite_arithmetic.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use std::{collections::HashMap, str::FromStr};
33

44
use pyo3::{exceptions::PyRuntimeError, pyclass, pyfunction, PyResult};
5-
use quil_rs::expression::Expression;
5+
use quil_rs::{expression::Expression, quil::Quil};
66
use rigetti_pyo3::{create_init_submodule, py_wrap_error, ToPythonError};
77

88
create_init_submodule! {
@@ -74,8 +74,17 @@ pub fn rewrite_arithmetic(native_quil: String) -> PyResult<PyRewriteArithmeticRe
7474
.map_err(RustRewriteArithmeticError::from)
7575
.map_err(RustRewriteArithmeticError::to_py_err)?;
7676

77-
let program = program.to_string();
78-
let recalculation_table = index_set.into_iter().map(|e| e.to_string()).collect();
77+
let program = program
78+
.to_quil()
79+
.expect("Successfully parsed program should convert to valid Quil.");
80+
let recalculation_table = index_set
81+
.into_iter()
82+
.map(|e| {
83+
e.to_quil().expect(
84+
"Expressions built from a successfully parsed program should convert to valid Quil.",
85+
)
86+
})
87+
.collect();
7988

8089
Ok(PyRewriteArithmeticResult {
8190
program,

0 commit comments

Comments
 (0)