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)))
Exemple #2
0
 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))
Exemple #3
0
 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)))
Exemple #4
0
 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)))
Exemple #5
0
 def inverse(self) -> 'GateOperation':
     cast_gate = extension.cast(gate_features.ReversibleEffect, self.gate)
     return self.with_gate(cast(raw_types.Gate, cast_gate.inverse()))
Exemple #6
0
 def trace_distance_bound(self) -> float:
     cast_gate = extension.cast(gate_features.BoundedEffect, self.gate)
     return cast_gate.trace_distance_bound()
Exemple #7
0
 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)
Exemple #8
0
 def matrix(self) -> np.ndarray:
     cast_gate = extension.cast(gate_features.KnownMatrix, self.gate)
     return cast_gate.matrix()
Exemple #9
0
 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)
Exemple #10
0
 def is_parameterized(self) -> bool:
     cast_gate = extension.cast(gate_features.ParameterizableEffect,
                                self.gate)
     return cast_gate.is_parameterized()
Exemple #11
0
 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)))
Exemple #12
0
 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)))
Exemple #13
0
 def inverse(self) -> 'GateOperation':
     cast_gate = extension.cast(gate_features.ReversibleEffect, self.gate)
     return self.with_gate(cast(raw_types.Gate, cast_gate.inverse()))
Exemple #14
0
 def trace_distance_bound(self) -> float:
     cast_gate = extension.cast(gate_features.BoundedEffect, self.gate)
     return cast_gate.trace_distance_bound()
Exemple #15
0
 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)
Exemple #16
0
 def is_parameterized(self) -> bool:
     cast_gate = extension.cast(gate_features.ParameterizableEffect,
                                self.gate)
     return cast_gate.is_parameterized()
Exemple #17
0
 def default_decompose(self):
     cast_gate = extension.cast(gate_features.CompositeGate, self.gate)
     return cast_gate.default_decompose(self.qubits)
Exemple #18
0
 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)
Exemple #19
0
 def matrix(self) -> np.ndarray:
     cast_gate = extension.cast(gate_features.KnownMatrix, self.gate)
     return cast_gate.matrix()
Exemple #20
0
 def default_decompose(self):
     cast_gate = extension.cast(gate_features.CompositeGate, self.gate)
     return cast_gate.default_decompose(self.qubits)