def circuit_diagram_info(val: Any, args: Optional[CircuitDiagramInfoArgs] = None, default: TDefault = RaiseTypeErrorIfNotProvided, ) -> Union[CircuitDiagramInfo, TDefault]: """Requests information on drawing an operation in a circuit diagram. Calls _circuit_diagram_info_ on `val`. If `val` doesn't have _circuit_diagram_info_, or it returns NotImplemented, that indicates that diagram information is not available. Args: val: The operation or gate that will need to be drawn. args: A CircuitDiagramInfoArgs describing the desired drawing style. default: A default result to return if the value doesn't have circuit diagram information. If not specified, a TypeError is raised instead. Returns: If `val` has no _circuit_diagram_info_ method or it returns NotImplemented, then `default` is returned (or a TypeError is raised if no `default` is specified). Otherwise, the value returned by _circuit_diagram_info_ is returned. Raises: TypeError: `val` doesn't have circuit diagram information and `default` was not specified. """ # Attempt. if args is None: args = CircuitDiagramInfoArgs.UNINFORMED_DEFAULT getter = getattr(val, '_circuit_diagram_info_', None) result = NotImplemented if getter is None else getter(args) # TODO: remove compatibility shim when deleting TextDiagrammable. from cirq import ops, extension if result is NotImplemented and extension.can_cast(ops.TextDiagrammable, val): return extension.cast(ops.TextDiagrammable, val).text_diagram_info(args) # type: ignore # Success? if isinstance(result, str): return CircuitDiagramInfo(wire_symbols=(result,)) if isinstance(result, tuple): return CircuitDiagramInfo(wire_symbols=result) if result is not NotImplemented: return result # Failure. if default is not RaiseTypeErrorIfNotProvided: return default if getter is None: raise TypeError( "object of type '{}' " "has no _circuit_diagram_info_ method.".format(type(val))) raise TypeError("object of type '{}' does have a _circuit_diagram_info_ " "method, but it returned NotImplemented.".format(type(val)))
def with_parameters_resolved_by(self, param_resolver: 'study.ParamResolver', ) -> 'GateOperation': cast_gate = extension.cast(gate_features.ParameterizableEffect, self.gate) new_gate = cast_gate.with_parameters_resolved_by(param_resolver) return self.with_gate(cast(raw_types.Gate, new_gate))
def phase_by(self, phase_turns: float, qubit_index: int) -> 'GateOperation': cast_gate = extension.cast(gate_features.PhaseableEffect, self.gate) return self.with_gate( cast(raw_types.Gate, cast_gate.phase_by(phase_turns, qubit_index)))
def extrapolate_effect( self, factor: Union[float, value.Symbol]) -> 'GateOperation': cast_gate = extension.cast(gate_features.ExtrapolatableEffect, self.gate) return self.with_gate( cast(raw_types.Gate, cast_gate.extrapolate_effect(factor)))
def inverse(self) -> 'GateOperation': cast_gate = extension.cast(gate_features.ReversibleEffect, self.gate) return self.with_gate(cast(raw_types.Gate, cast_gate.inverse()))
def trace_distance_bound(self) -> float: cast_gate = extension.cast(gate_features.BoundedEffect, self.gate) return cast_gate.trace_distance_bound()
def text_diagram_info( self, args: gate_features.TextDiagramInfoArgs ) -> gate_features.TextDiagramInfo: cast_gate = extension.cast(gate_features.TextDiagrammable, self.gate) return cast_gate.text_diagram_info(args)
def matrix(self) -> np.ndarray: cast_gate = extension.cast(gate_features.KnownMatrix, self.gate) return cast_gate.matrix()
def known_qasm_output(self, args: gate_features.QasmOutputArgs) -> Optional[str]: cast_gate = extension.cast( # type: ignore gate_features.QasmConvertibleGate, self.gate) return cast_gate.known_qasm_output(self.qubits, args)
def is_parameterized(self) -> bool: cast_gate = extension.cast(gate_features.ParameterizableEffect, self.gate) return cast_gate.is_parameterized()
def phase_by(self, phase_turns: float, qubit_index: int) -> 'GateOperation': cast_gate = extension.cast(gate_features.PhaseableEffect, self.gate) return self.with_gate(cast(raw_types.Gate, cast_gate.phase_by(phase_turns, qubit_index)))
def extrapolate_effect(self, factor: float) -> 'GateOperation': cast_gate = extension.cast(gate_features.ExtrapolatableEffect, self.gate) return self.with_gate(cast(raw_types.Gate, cast_gate.extrapolate_effect(factor)))
def text_diagram_info(self, args: gate_features.TextDiagramInfoArgs ) -> gate_features.TextDiagramInfo: cast_gate = extension.cast(gate_features.TextDiagrammable, self.gate) return cast_gate.text_diagram_info(args)
def default_decompose(self): cast_gate = extension.cast(gate_features.CompositeGate, self.gate) return cast_gate.default_decompose(self.qubits)
def known_qasm_output(self, args: gate_features.QasmOutputArgs) -> Optional[str]: cast_gate = extension.cast(gate_features.QasmConvertableGate, self.gate) return cast_gate.known_qasm_output(self.qubits, args)