oqpy.base
Base classes and conversion methods for OQpy.
This class establishes how expressions are represented in oqpy and how they are converted to AST nodes.
- class oqpy.base.CachedExpressionConvertible(*args, **kwargs)[source]
Bases:
ProtocolThis is the protocol an object can implement in order to be usable as an expression.
The difference between this and ExpressionConvertible is that this requires that the result of _to_cached_oqpy_expression be constant across the lifetime of the OQPy Program. OQPy makes an effort to minimize the number of calls to the AST constructor, but no guarantees are made about this.
- class oqpy.base.ExpressionConvertible(*args, **kwargs)[source]
Bases:
ProtocolThis is the protocol an object can implement in order to be usable as an expression.
- class oqpy.base.HasToAst(*args, **kwargs)[source]
Bases:
ProtocolProtocol for objects which can be converted into ast nodes.
- class oqpy.base.OQPyBinaryExpression(op: BinaryOperator | str, lhs: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, rhs: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, ast_type: ClassicalType | None = None)[source]
Bases:
OQPyExpressionAn expression consisting of two subexpressions joined by an operator.
- class oqpy.base.OQPyExpression[source]
Bases:
objectBase class for OQPy expressions.
Subclasses must implement
to_astmethod and supply thetypeattributeExpressions can be composed via overloaded arithmetic and boolean comparison operators to create new expressions. Note this means you cannot evaluate expression equality via
==which produces a new expression instead of producing a python boolean.- type: ClassicalType | None
- class oqpy.base.OQPyUnaryExpression(op: UnaryOperator, exp: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression)[source]
Bases:
OQPyExpressionAn expression consisting of one expression preceded by an operator.
- class oqpy.base.Var(name: str, needs_declaration: bool = True)[source]
Bases:
ABCAbstract base class for both classical and quantum variables.
- oqpy.base.compute_product_types(left: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, right: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) ClassicalType[source]
Find the result type for a product of two terms.
- oqpy.base.compute_quotient_types(left: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, right: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) ClassicalType[source]
Find the result type for a quotient of two terms.
- oqpy.base.detect_and_convert_constants(val: float | np.floating[Any], program: Program) ast.Expression[source]
Construct a float ast expression which is either a literal or an expression using constants.
- oqpy.base.expr_matches(a: Any, b: Any) bool[source]
Check equality of the given objects.
This bypasses calling
__eq__on expr objects.
- oqpy.base.logical_and(first: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, second: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) OQPyBinaryExpression[source]
Logical AND.
- oqpy.base.logical_or(first: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, second: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) OQPyBinaryExpression[source]
Logical OR.
- oqpy.base.make_annotations(vals: Sequence[str | tuple[str, str]]) list[Annotation][source]
Convert strings/tuples of strings into Annotation ast nodes.
- oqpy.base.map_to_ast(program: Program, items: Iterable[AstConvertible]) list[ast.Expression][source]
Convert a sequence of items into a sequence of ast nodes.
oqpy.classical_types
Classes representing oqpy variables with classical types.
- class oqpy.classical_types.AngleVar(*args: Any, size: int | None | EllipsisType = Ellipsis, **kwargs: Any)[source]
Bases:
_SizedVarAn oqpy variable with angle type.
- default_size: int | None = 32
- type_cls
alias of
AngleType
- class oqpy.classical_types.ArrayVar(*args: ~typing.Any, dimensions: list[int], base_type: type[~oqpy.classical_types._SizedVar | ~oqpy.classical_types.DurationVar | ~oqpy.classical_types.BoolVar | ~oqpy.classical_types.ComplexVar] = <class 'oqpy.classical_types.IntVar'>, **kwargs: ~typing.Any)[source]
Bases:
_ClassicalVarAn oqpy array variable.
- base_type: type[_SizedVar | DurationVar | BoolVar | ComplexVar]
- dimensions: list[int]
- type_cls
alias of
ArrayType
- class oqpy.classical_types.BitVar(*args: Any, size: int | None | EllipsisType = Ellipsis, **kwargs: Any)[source]
Bases:
_SizedVarAn oqpy variable with bit type.
- type_cls
alias of
BitType
- class oqpy.classical_types.BoolVar(init_expression: AstConvertible | Literal['input', 'output'] | None = None, name: str | None = None, needs_declaration: bool = True, annotations: Sequence[str | tuple[str, str]] = (), **type_kwargs: Any)[source]
Bases:
_ClassicalVarAn (unsized) oqpy variable with bool type.
- type_cls
alias of
BoolType
- class oqpy.classical_types.ComplexVar(init_expression: AstConvertible | Literal['input', 'output'] | None = None, *args: Any, base_type: ast.FloatType = FloatType(span=None, size=IntegerLiteral(span=None, value=64)), **kwargs: Any)[source]
Bases:
_ClassicalVarAn oqpy variable with bit type.
- base_type: FloatType = FloatType(span=None, size=IntegerLiteral(span=None, value=64))
- type_cls
alias of
ComplexType
- class oqpy.classical_types.DurationVar(init_expression: AstConvertible | Literal['input', 'output'] | None = None, name: str | None = None, *args: Any, **type_kwargs: Any)[source]
Bases:
_ClassicalVarAn oqpy variable with duration type.
- type_cls
alias of
DurationType
- class oqpy.classical_types.FloatVar(*args: Any, size: int | None | EllipsisType = Ellipsis, **kwargs: Any)[source]
Bases:
_SizedVarAn oqpy variable with floating type.
- default_size: int | None = 64
- type_cls
alias of
FloatType
- class oqpy.classical_types.IntVar(*args: Any, size: int | None | EllipsisType = Ellipsis, **kwargs: Any)[source]
Bases:
_SizedVarAn oqpy variable with integer type.
- default_size: int | None = 32
- type_cls
alias of
IntType
- class oqpy.classical_types.OQFunctionCall(identifier: str | Identifier, args: Iterable[HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression] | dict[Any, HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression], return_type: ClassicalType | None, extern_decl: ExternDeclaration | None = None, subroutine_decl: SubroutineDefinition | None = None)[source]
Bases:
OQPyExpressionAn oqpy expression corresponding to a function call.
- class oqpy.classical_types.OQIndexExpression(collection: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, index: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, type_: ClassicalType)[source]
Bases:
OQPyExpressionAn oqpy expression corresponding to an index expression.
- class oqpy.classical_types.StretchVar(init_expression: AstConvertible | Literal['input', 'output'] | None = None, name: str | None = None, needs_declaration: bool = True, annotations: Sequence[str | tuple[str, str]] = (), **type_kwargs: Any)[source]
Bases:
_ClassicalVarAn oqpy variable with stretch type.
- type_cls
alias of
StretchType
- class oqpy.classical_types.UintVar(*args: Any, size: int | None | EllipsisType = Ellipsis, **kwargs: Any)[source]
Bases:
_SizedVarAn oqpy variable with unsigned integer type.
- default_size: int | None = 32
- type_cls
alias of
UintType
- oqpy.classical_types.arrayreference_(dtype: IntType | UintType | FloatType | AngleType | DurationType | BitType | BoolType | ComplexType, dims: int | list[int]) ArrayReferenceType[source]
Create an array reference type.
- oqpy.classical_types.complex_(size: int) ComplexType[source]
Create a sized complex type.
Note the size represents the total size, and thus the components have half of the requested size.
- oqpy.classical_types.convert_range(program: Program, item: slice | range) ast.RangeDefinition[source]
Convert a slice or range into an ast node.
- oqpy.classical_types.float_(size: int | None = None) FloatType[source]
Create a sized floating-point type.
oqpy.control_flow
Context manager objects used for creating control flow contexts.
- oqpy.control_flow.Else(program: Program) Iterator[None][source]
Context manager for conditional evaluation. Must come after an “If” context block.
i = IntVar(1) with If(program, i == 1): program.increment(i, 1) with Else(program): program.increment(i, 2)
- oqpy.control_flow.ForIn(program: Program, iterator: Iterable[AstConvertible] | range | AstConvertible, identifier_name: str | None) contextlib._GeneratorContextManager[IntVar][source]
- oqpy.control_flow.ForIn(program: Program, iterator: Iterable[AstConvertible] | range | AstConvertible, identifier_name: str | None, identifier_type: type[ClassicalVarT]) contextlib._GeneratorContextManager[ClassicalVarT]
Context manager for looping a particular portion of a program.
i = IntVar(1) with ForIn(program, range(1, 10)) as index: program.increment(i, index)
- oqpy.control_flow.If(program: Program, condition: OQPyExpression) Iterator[None][source]
Context manager for doing conditional evaluation.
i = IntVar(1) with If(program, i == 1): program.increment(i)
- class oqpy.control_flow.Range(start: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, stop: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, step: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression = 1)[source]
Bases:
objectAstConvertible which creates an integer range.
Unlike builtin python range, this allows the components to be AstConvertible, instead of just int.
- oqpy.control_flow.While(program: Program, condition: OQPyExpression) Iterator[None][source]
Context manager for looping a repeating a portion of a program while a condition is True.
i = IntVar(1) with While(program, i < 5) as index: program.increment(i, 1)
oqpy.program
Module containing Program and related classes.
This module contains the oqpy.Program class, which is the primary user interface for constructing openqasm/openpulse. The class follows the builder pattern in that it contains a representation of the state of a program (internally represented as AST components), and the class has methods which add to the current state.
- class oqpy.program.Program(version: str | None = '3.0', simplify_constants: bool = True)[source]
Bases:
objectA builder class for OpenQASM/OpenPulse programs.
- DURATION_MAX_DIGITS = 12
- annotate(keyword: str, command: str | None = None) Program[source]
Add an annotation to the next statement.
- autodeclare(encal: bool = False) None[source]
Declare any currently undeclared variables at the beginning of the program.
- barrier(qubits_or_frames: Iterable[HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression]) Program[source]
Apply a barrier to a set of qubits or frames.
- capture(frame: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, kernel: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Capture signal integrated against a kernel on a particular frame.
- declare(variables: list[Var] | Var, to_beginning: bool = False, encal: bool = False) Program[source]
Declare a variable.
- Parameters:
variables – A list of variables to declare, or a single variable to declare.
to_beginning – If true, insert the declaration at the beginning of the program, instead of at the current point.
encal – If true, wrap any declarations of undeclared variables with openpulse types in a cal block.
- decrement(var: _ClassicalVar, value: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Decrement a variable value.
- delay(time: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, qubits_or_frames: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression | Iterable[HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression] = ()) Program[source]
Apply a delay to a set of qubits or frames.
- do_expression(expression: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Add a statement which evaluates a given expression without assigning the output.
- expr_cache: dict[Hashable, Expression]
A cache of ast made by CachedExpressionConvertible objects used in this program.
This is used by to_ast to avoid repetitively evaluating ast conversion methods.
- property frame_vars: Iterator[FrameVar]
Returns an Iterator of any declared/undeclared FrameVar used in the program.
- function_call(name: str, args: Iterable[HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression], assigns_to: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression | None = None) None[source]
Add a function call with an optional output assignment.
- gate(qubits: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression | Iterable[HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression], name: str, *args: Any, control: Qubit | Iterable[Qubit] | None = None, neg_control: Qubit | Iterable[Qubit] | None = None, inv: bool = False, exp: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression = 1) Program[source]
Apply a gate with its modifiers to a qubit or set of qubits.
- Parameters:
qubits (AstConvertible | Iterable[AstConvertible]) – The qubit or list of qubits to which the gate will be applied
name (str) – The gate name
*args (Any) – A list of parameters passed to the gate
control (quantum_types.Qubit | Iterable[quantum_types.Qubit] | None) – The list of control qubits (default: None)
neg_control – (quantum_types.Qubit | Iterable[quantum_types.Qubit] | None): The list of negative control qubits (default: None)
inv (bool) – Flag to use the inverse gate (default: False)
exp (AstConvertible) – The exponent used with pow gate modifier
- Returns:
The OQpy program to which the gate is added
- Return type:
- increment(var: _ClassicalVar, value: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Increment a variable value.
- measure(qubit: Qubit, output_location: BitVar | None = None) Program[source]
Measure a particular qubit.
If provided, store the result in the given output location.
- mod_equals(var: IntVar, value: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
In-place update of a variable to be itself modulo value.
- play(frame: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, waveform: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Play a waveform on a particular frame.
- returns(expression: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Return a statement from a function definition or a defcal statement.
- set(var: _ClassicalVar | OQIndexExpression, value: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Set a variable value.
- set_frequency(frame: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, freq: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Set the frequency of a particular frame.
- set_phase(frame: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, phase: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Set the phase of a particular frame.
- set_scale(frame: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, scale: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Set the amplitude scaling of a particular frame.
- shift_frequency(frame: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, freq: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Shift the frequency of a particular frame.
- shift_phase(frame: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, phase: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Shift the phase of a particular frame.
- shift_scale(frame: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, scale: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) Program[source]
Shift the amplitude scaling of a particular frame.
- to_ast(encal: bool = False, include_externs: bool = True, ignore_needs_declaration: bool = False, encal_declarations: bool = False) Program[source]
Convert to an AST program.
- Parameters:
encal – If true, wrap all statements in a “Cal” block, ensuring that all openpulse statements are contained within a Cal block.
include_externs – If true, for all used extern statements, include an extern declaration at the top of the program.
ignore_needs_declaration – If true, the field _needs_declaration of undeclared variables is ignored and their declaration will not be added to the AST
encal_declarations – If true, when declaring undeclared variables, if the variables have openpulse types, automatically wrap the declarations in cal blocks.
- to_qasm(encal: bool = False, include_externs: bool = True, ignore_needs_declaration: bool = False, encal_declarations: bool = False) str[source]
Convert to QASM text.
See to_ast for option documentation.
- property waveform_vars: Iterator[WaveformVar]
Returns an Iterator of any declared/undeclared WaveformVar used in the program.
oqpy.pulse
Classes representing OpenPulse variable types.
- class oqpy.pulse.FrameVar(port: PortVar | None = None, frequency: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression | None = None, phase: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression = 0, name: str | None = None, needs_declaration: bool = True, annotations: Sequence[str | tuple[str, str]] = ())[source]
Bases:
_ClassicalVarA variable type corresponding to an OpenPulse frame.
- type_cls
alias of
FrameType
- class oqpy.pulse.PortVar(name: str | None = None, **kwargs: Any)[source]
Bases:
_ClassicalVarA variable type corresponding to an OpenPulse port.
- type_cls
alias of
PortType
- class oqpy.pulse.WaveformVar(init_expression: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression | None = None, name: str | None = None, **kwargs: Any)[source]
Bases:
_ClassicalVarA variable type corresponding to an OpenPulse waveform.
- type_cls
alias of
WaveformType
oqpy.quantum_types
Classes representing variables containing quantum types (i.e. Qubits).
- oqpy.quantum_types.Cal(program: Program) Iterator[None][source]
Context manager that begins a cal block.
- class oqpy.quantum_types.PhysicalQubits[source]
Bases:
objectProvides a means of accessing qubit variables corresponding to physical qubits.
For example, the openqasm qubit “$3” is accessed by
PhysicalQubits[3].
- class oqpy.quantum_types.Qubit(name: str, size: int | None = None, needs_declaration: bool = True, annotations: Sequence[str | tuple[str, str]] = ())[source]
Bases:
VarOQpy variable representing a single qubit.
- oqpy.quantum_types.defcal(program: Program, qubits: Qubit | list[Qubit], name: str, arguments: list[AstConvertible] | None = None, return_type: ast.ClassicalType | None = None) Iterator[None] | Iterator[list[_ClassicalVar]] | Iterator[_ClassicalVar][source]
Context manager for creating a defcal.
with defcal(program, q1, "X", [AngleVar(name="theta"), oqpy.pi/2], oqpy.bit) as theta: program.play(frame, waveform)
- oqpy.quantum_types.gate(program: Program, qubits: Qubit | list[Qubit], name: str, arguments: list[AstConvertible] | None = None, declare_here: bool = False) Iterator[None] | Iterator[list[AngleVar]] | Iterator[AngleVar][source]
Context manager for creating a gate.
with gate(program, q1, "HRzH", [AngleVar(name="theta")]) as theta: program.gate(q1, "H") program.gate(q1, "Rz", theta) program.gate(q1, "H")
oqpy.subroutines
Contains methods for producing subroutines and extern function calls.
- class oqpy.subroutines.OQPyArgument(name: str, dtype: ClassicalType, access: Literal['readonly', 'mutable'] | None = None)[source]
Bases:
objectAn oqpy argument to extern declaration..
- access: Literal['readonly', 'mutable'] | None = None
- dtype: ClassicalType
- name: str
- oqpy.subroutines.declare_extern(name: str, args: list[tuple[str, ClassicalType] | OQPyArgument], return_type: ClassicalType | None = None, annotations: Sequence[str | tuple[str, str]] = ()) Callable[[...], OQFunctionCall][source]
Declare an extern and return a callable which adds the extern.
sqrt = declare_extern( "sqrt", [("x", classical_types.float32)], classical_types.float32, ) var = FloatVar[32]() program.set(var, sqrt(0.5))
- oqpy.subroutines.declare_waveform_generator(name: str, argtypes: list[tuple[str, ClassicalType] | OQPyArgument], annotations: Sequence[str | tuple[str, str]] = ()) Callable[[...], OQFunctionCall][source]
Create a function which generates waveforms using a specified name and argument signature.
- oqpy.subroutines.subroutine(func: Callable[[Program, HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression], HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression | None], annotations: Sequence[str | tuple[str, str]] = ()) Callable[[Program, HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression], OQFunctionCall][source]
Decorator to declare a subroutine.
The function should take a program as well as any other arguments required. Note that the decorated function must include type hints for all arguments, and (other than the initial program) all of these type hints must be oqpy Variable types.
@subroutine(annotations=("optimize", "-O3")) def increment_variable(program: Program, i: IntVar): program.increment(i, 1) j = IntVar(0) increment_variable(j)
This should generate the following OpenQASM:
@optimize-O3 def increment_variable(int[32] i) { i += 1; } int[32] j = 0; increment_variable(j);
- Parameters:
func (Callable[[oqpy.Program, VarArg(AstConvertible)], AstConvertible | None]) – function to decorate. Its first argument must be an OQpy program.
annotations (Sequence[str | tuple[str, str]]) – a collection of strings or tuples of string that annotate the subroutine.
- Returns:
decorated function with added subroutine_declaration attribute.
- Return type:
Callable[[oqpy.Program, VarArg(AstConvertible)], AstConvertible | None]
oqpy.timing
Constructs for manipulating sequence timing.
- oqpy.timing.Box(program: Program, duration: AstConvertible | None = None) Iterator[None][source]
Creates a section of the program with a specified duration.
- oqpy.timing.convert_float_to_duration(time: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression, require_nonnegative: bool = False) HasToAst[source]
Make value into an expression representing a duration.
- Parameters:
time – the time
require_nonnegative – if True, raise an exception if the time value is known to be negative.
- oqpy.timing.make_duration(time: HasToAst | bool | int | float | complex | Iterable | ExpressionConvertible | CachedExpressionConvertible | Expression) HasToAst[source]
Make value into an expression representing a duration.