Changelog
Stay up to date with the latest Boulder Opal release notes
Boulder Opal 19.7.3
December 9, 2022
Bug fixes
 We've fixed some broken links in the reference documentation.
Boulder Opal 19.7.2
December 8, 2022
What's new
 We've renamed the "pulses" toolkit to "signals". To update your code, change calls to, for instance,
graph.pulses.gaussian_pulse_pwc
tograph.signals.gaussian_pulse_pwc
. You can see the updated reference documentation .  We've added a
segmentation
parameter tograph.signals.square_pulse_pwc
,graph.signals.gaussian_pulse_pwc
,graph.signals.linear_ramp_pwc
, andgraph.signals.cosine_pulse_pwc
. It allows you to choose between a uniform segmentation (default) and a minimal segmentation (reserving most of the segments for the nonconstant parts of the signal). For more information, see the reference page of the nodes or of the segmentation type . You can also see an example in this user guide .  You can now provide Tensor operators to operations creating
SparsePwc
nodes (graph.sparse_pwc_operator and graph.constant_sparse_pwc_operator ). They will be internally converted into a sparse representation, and allows you to build the operators inside of the graph itself. You can see an example in this user guide .  We've added a new function to the Visualizer to plot Wigner functions . You can see it in action in this application note .
 We've added the following to the documentation
 We've added a new user guide for the gradientfree optimizer , which is useful when the gradient is very costly to compute or inaccessible.
 We've added a new application note on how to generate noiserobust gates for Rigetti QuilT with Boulder Opal.
 We've added examples of the new graphbased filter function and frequencydomain noise operator nodes. You can see some of them in this user guide and this application note .
 We've updated the documentation to use the new filter function and frequencydomain noise operator nodes. You can see examples in this user guide .
 We've improved the navigation of the user guides page with an updated organization for their categories.
Boulder Opal 19.7.1
November 22, 2022
Bug fix
 We've updated the
qctrltoolkit
version to fix an import error.
Boulder Opal 19.7.0
November 18, 2022
What's new
 We've built a new graphbased gradientfree optimization function . It provides an alternative to gradientbased optimization when the gradient is inaccessible or very costly to compute.
 We've added three new graph operations:
 You can compute the Wigner function
associated with a density matrix with
graph.wigner_transform
.  You can calculate filter functions
and their associated frequencydomain noise operators
in graphs with the operations
graph.filter_functions
andgraph.frequency_domain_noise_operator
.
 You can compute the Wigner function
associated with a density matrix with
 The QCTRL Visualizer function plot_filter_functions now also accepts filter functions as exported from graph calculations.
Boulder Opal 19.6.2
October 27, 2022
What's new
 Upgraded
gql
package version to 3.4.0.
Boulder Opal 19.6.1
October 24, 2022
What's new
 Added
organization
property toQctrl
session.
Boulder Opal 19.6.0
October 20, 2022
Breaking changes
 We've improved the usability of the QCTRL Visualizer through a few changes:
 The
figure
parameter for all functions is now an optional keywordonly argument. This means you can omit it when calling, for instance,plot_controls
, and just pass the dictionary with your controls:plot_controls(controls)
. You can still pass a figure for the function to place the plot in it, using its keyword:plot_controls(controls, figure=your_figure)
.  The default value of
y_axis_log
in plot_cost_history has been changed from True to False.  The parameter
seq
of plot_sequences has been renamed tosequences
.
 The
What's new
 We've added a new ions toolkit to streamline the workflow of performing calculations trapped ions systems in Boulder Opal. Find out more in the new tutorial
and the reference documentation
for the
ions
toolkit namespace.  We've added new graph operations to create displacement operators and squeeze operators in Fock spaces.
 We've added a
seed
parameter to the calculate_optimization and calculate_stochastic_optimization functions. You can use it to obtain deterministic results from the initial values of optimizable graph nodes. Note that if your graph contains random operations , you need to set seeds for them as well for the optimization to be fully deterministic.  We've added a
cost_tolerance
parameter to thecalculate_optimization
function. You can use it to set an early stop condition for the optimizer, halting the optimization when the relative cost improvement over an iteration is smaller than the tolerance. See the reference documentation for more information.  We've added two parameters to the superconducting toolkit
optimize
function:
max_iteration_count
: You can use this to set an early stop condition for the optimizer, halting the optimization if these many iterations have been taken. 
cost_history
: You can use this to retrieve the history of the cost function at each iteration during the optimization.  See the reference documentation for more information.

 We've improved the performance of the neural network closedloop optimizer up to 3X speedup, especially for large test points, by introducing early stopping threshold and parallelizing training.
 We've made changes to the layout of the documentation in order to improve accessibility and ease of navigation. You can see them in the Boulder Opal documentation .
 We've added a new user guide on obtaining optimized controls using a Hann basis .
Boulder Opal 19.5.0
September 19, 2022
What's new
 We've added a new closedloop optimization toolkit to streamline the workflow of setting up and running closedloop optimizations in Boulder Opal. Find out more in the updated tutorial and user guide .
 We've removed the reminder about using
qctrl.get_result
that was shown when running calculations on the cloud. You can find more information about retrieving results in this user guide .  We've added the following new documentation
 New topic on libraries of pulses for Boulder Opal .
 New user guide on how to perform optimization and simulation in the same calculation .
 New user guide on how to reuse graph definitions in different calculations .
 New application note on performing noise spectroscopy in superconducting hardware .
Boulder Opal 19.4.0
September 2, 2022
What's new
 We have added a function to the QCTRL Visualizer to plot histograms of counts from quantum circuits: qctrlvisualizer.plot_bitstring_probabilities_histogram .
Boulder Opal 19.3.0
August 18, 2022
What's new
 You can now mute and unmute status messages when running calculations. See an example in this user guide .
 We have added a function that makes it easier for you to cite Boulder Opal in papers and other works. See an example in this user guide .
Boulder Opal 19.2.0
August 9, 2022
What's new
 We've added the QCTRL Visualizer package as a dependency of the QCTRL Python package. Now you can keep uptodate with the Visualizer’s latest features without having to install or upgrade it separately.
Boulder Opal 19.1.0
August 8, 2022
What's new
 We've added four new nongraph pulses to the pulse library:
 Linear ramps: qctrl.pulses.linear_ramp
 Hyperbolic tangent ramp: qctrl.pulses.tanh_ramp
 Hyperbolic secant pulse: qctrl.pulses.sech_ramp
 Gaussian pulse: qctrl.pulses.gaussian_pulse
 The optimization algorithm CMAES is now available to choose among the options for closedloop optimization. To use it, pass the object CmaesInitializer when using the Boulder Opal function qctrl.functions.closed_loop_optimization_step .
Boulder Opal 19.0.0
August 3, 2022
Breaking changes
 We have removed the following deprecated graph operations and parameters:
 The graph operations
graph.pwc_operator_hermitian_part
andgraph.stf_operator_hermitian_part
have been deprecated in favor of the unified operation graph.hermitian_part .  The parameter
cut_off_frequency
of the operation graph.sinc_convolution_kernel has been deprecated in favor ofcutoff_frequency
.
 The graph operations
What's new
 We have added two nongraph pulses to the pulse library:
 Hann series: qctrl.pulses.hann_series
 Sinusoid: qctrl.pulses.sinusoid
 The message alerting you when there's a new version of the QCTRL Python package available now also contains a URL to this Changelog page.
Boulder Opal 18.9.0
July 27, 2022
What's new
 We've added new STF pulses
in the pulse library.
 Sech pulse: graph.pulses.sech_pulse_stf
 Sinusoid pulse: graph.pulses.sinusoid_stf
 Linear ramp: graph.pulses.linear_ramp_stf
 We've added nongraph pulses to the pulse library. You can use the Pulse class
methods to sample and export them to your hardware.
 Cosine pulse: qctrl.pulses.cosine_pulse
 Square pulse: qctrl.pulses.square_pulse
 We've added an
initial_values
parameter to graph.utils.real_optimizable_pwc_signal and graph.utils.complex_optimizable_pwc_signal nodes to initialize optimization searches with your desired values.
Bug fixes
 We've fixed an authentication issue when using
qctrl
commands in the terminal.
Boulder Opal 18.8.0
July 25, 2022
What's new
 We've added new toolkit functions for creating the following STF pulses:
 Gaussian pulses: graph.pulse.gaussian_pulse_stf .
 Hann series: graph.pulse.hann_series_stf .
 Hyperbolic tangent ramp: graph.pulse.tanh_ramp_stf .
Boulder Opal 18.7.0
July 11, 2022
What's new
 The graph operation density_matrix_evolution_pwc , which you can use to simulate the evolution of open systems, now can also accept Tensors for Lindblad operators. This means that now you can pass the output of other graph operations as the Lindblad terms that describe the evolution of the open system.
Boulder Opal 18.6.0
June 22, 2022
What's new
We’ve created the Boulder Opal Toolkits (beta), built on top of the existing Boulder Opal functions and graph operations, to provide convenience functions, nodes, and classes that enable you to develop and implement workflows faster and with less code. You can access these toolkit operations from the corresponding namespaces in the Qctrl or Graph object (for example, qctrl.utils.confidence_ellipse_matrix
or graph.pulses.gaussian_pulse_pwc
). You can find more information about these in the toolkit topic
and their reference documentation
.
Please note that the toolkits are currently in beta phase of development. Breaking changes may be introduced.
The main toolkit capabilities include:
 Superconducting toolkit
 We have created a toolkit to easily set up simulation and optimization of superconducting systems composed of transmons and cavities. Find more information in the superconducting namespace reference and an example in the superconducting toolkit tutorial .
 Convenience graph operations
 We have introduced nodes to easily create and filter optimizable signals. Find out more in the utils namespace reference , and an example in the optimization tutorial .
 We have created a library of common control signals, such as a Gaussian pulse or a hyperbolic tangent ramp. Find more information in the pulses namespace reference and an example in this user guide .
 System identification
 You can now calculate confidence ellipses for estimated parameters in system identification workflows. Find out more information in the function's reference and an example in the system identification tutorial . You can also easily visualize these confidence ellipses using the plot_confidence_ellipses function from the QCTRL Visualizer.
 Format conversion
 We have created functions to convert between two formats representing a piecewiseconstant function: a list of value/duration dictionaries (as in the outputs of Boulder Opal functions or the inputs for the plot_controls function from the QCTRL Visualizer) and two NumPy arrays with its durations and values. Find out more information in the utils namespace reference and examples in the simulation tutorial and the optimization tutorial .
Boulder Opal 18.4.0
June 14, 2022
What's new
 We have added two new graph operations for calculating the minimum and the maximum values of a tensor.
Boulder Opal 18.3.0
May 30, 2022
What's new
 We have added two new graph operations for creating operators in composite Hilbert spaces:
 The operation embed_operators creates operators in a composite Hilbert space by calculating the tensor product of operators in subsystems with the appropriate identity operators.
 The operation kronecker_product_list performs the sequential tensor product of a list of operators.
Boulder Opal 18.2.0
May 16, 2022
What’s new
 We've added simpler ways to create common operations of quantum mechanics:
 The new operation number_operator creates the number operator in the Fock space.
 The operation pauli_matrix now can also create the raising and lowering matrices.
 We've added the operation ms_phases_multitone to calculate the phases produced by a Mølmer–Sørensen gate created with a multitone global beam.
 We've added the unified graph operation hermitian_part for taking the Hermitian part of any of the data types used in our graphs (Tensors, PWCs, or STFs).
 You can now pass any kind of SciPy sparse matrix format to graph operations that use sparse matrices, such as density_matrix_evolution_pwc .
Boulder Opal 18.1.0
April 26, 2022
What’s new
 We've added new graph operations to create Pauli operators.
 pauli_matrix creates Pauli matrices.
 pauli_kronecker_product creates products of Pauli matrices in composite systems.
Boulder Opal 18.0.0
April 14, 2022
Breaking changes
 We’ve removed support for Python 3.6.
What’s new
 We’ve added support for Python 3.10.
 We’ve added new graph operations to work with quantum harmonic oscillatorlike systems. You can use them to easily create states and operators in Fock spaces.
 creation_operator generate creation operators for truncated Fock spaces.
 annihilation_operator generate annihilation operators for truncated Fock spaces.
 fock_state generates a basis state in a Fock basis.
 coherent_state generates a coherent state.
 The
cut_off_frequency
parameter in the sinc_convolution_kernel node is now deprecated and will be removed in the future. Please usecutoff_frequency
instead.