Liking cljdoc? Tell your friends :D

org.soulspace.qclojure.domain.circuit-transformation

Circuit transformation utilities for quantum backends.

This namespace provides functionality for adapting quantum circuits to specific hardware backends by transforming operations not supported by the backend into equivalent sequences of supported operations.

Circuit transformation utilities for quantum backends.

This namespace provides functionality for adapting quantum circuits
to specific hardware backends by transforming operations not supported
by the backend into equivalent sequences of supported operations.
raw docstring

analyze-qubit-usageclj

(analyze-qubit-usage circuit)

Analyze which qubits are actually used in a circuit.

Parameters:

  • circuit: Quantum circuit to analyze

Returns: Map containing:

  • :used-qubits - Set of qubit IDs that are actually used
  • :total-qubits - Total number of qubits declared in circuit
  • :unused-qubits - Set of qubit IDs that are declared but unused
  • :max-qubit-id - Highest qubit ID used
  • :qubit-usage-efficiency - Ratio of used qubits to total qubits
Analyze which qubits are actually used in a circuit.

Parameters:
- circuit: Quantum circuit to analyze

Returns:
Map containing:
- :used-qubits - Set of qubit IDs that are actually used
- :total-qubits - Total number of qubits declared in circuit
- :unused-qubits - Set of qubit IDs that are declared but unused
- :max-qubit-id - Highest qubit ID used
- :qubit-usage-efficiency - Ratio of used qubits to total qubits
sourceraw docstring

compose-circuitsclj

(compose-circuits circuit1 circuit2 & [options])

Compose two quantum circuits sequentially.

Creates a new circuit that applies the first circuit followed by the second. If the circuits have different numbers of qubits, the one with fewer qubits will be automatically extended to match the larger one.

With optional parameters, you can control how the circuits are composed:

  • qubit-mapping: Function to map circuit2's qubit indices to the combined circuit
  • offset: Simple integer offset for circuit2's qubits (shorthand for adding offset)
  • control-qubits-only: Boolean flag to indicate circuit2 should only operate on the first n qubits of circuit1 where n is the number of qubits in circuit2

Parameters:

  • circuit1: First quantum circuit to execute
  • circuit2: Second quantum circuit to execute after the first
  • options: (Optional) Map with composition options:
    • :qubit-mapping - Function mapping circuit2's qubit indices
    • :offset - Integer to add to circuit2's qubit indices
    • :control-qubits-only - Boolean indicating circuit2 operates on control qubits only

Returns: New quantum circuit containing all operations from circuit1 followed by all operations from circuit2

Examples: (compose-circuits (h-gate (create-circuit 1) 0) (x-gate (create-circuit 1) 0)) ;=> Circuit that applies H then X on qubit 0

(compose-circuits (h-gate (create-circuit 1) 0) (cnot-gate (create-circuit 2) 0 1)) ;=> 2-qubit circuit that applies H on qubit 0, then CNOT from qubit 0 to 1

;; With offset, apply second circuit starting at qubit 3 (compose-circuits (create-circuit 5) (h-gate (create-circuit 2) 0) {:offset 3}) ;=> 5-qubit circuit with H gate on qubit 3

Compose two quantum circuits sequentially.

Creates a new circuit that applies the first circuit followed by the second.
If the circuits have different numbers of qubits, the one with fewer qubits
will be automatically extended to match the larger one.

With optional parameters, you can control how the circuits are composed:
- qubit-mapping: Function to map circuit2's qubit indices to the combined circuit
- offset: Simple integer offset for circuit2's qubits (shorthand for adding offset)
- control-qubits-only: Boolean flag to indicate circuit2 should only operate on the
  first n qubits of circuit1 where n is the number of qubits in circuit2

Parameters:
- circuit1: First quantum circuit to execute
- circuit2: Second quantum circuit to execute after the first
- options: (Optional) Map with composition options:
  - :qubit-mapping - Function mapping circuit2's qubit indices
  - :offset - Integer to add to circuit2's qubit indices
  - :control-qubits-only - Boolean indicating circuit2 operates on control qubits only

Returns:
New quantum circuit containing all operations from circuit1 followed by all operations from circuit2

Examples:
(compose-circuits (h-gate (create-circuit 1) 0) (x-gate (create-circuit 1) 0))
;=> Circuit that applies H then X on qubit 0

(compose-circuits (h-gate (create-circuit 1) 0) (cnot-gate (create-circuit 2) 0 1))
;=> 2-qubit circuit that applies H on qubit 0, then CNOT from qubit 0 to 1

;; With offset, apply second circuit starting at qubit 3
(compose-circuits (create-circuit 5) (h-gate (create-circuit 2) 0) {:offset 3})
;=> 5-qubit circuit with H gate on qubit 3
sourceraw docstring

extend-circuitclj

(extend-circuit circuit
                new-num-qubits
                &
                {:keys [qubit-mapping] :or {qubit-mapping identity}})

Extend a quantum circuit to support a larger number of qubits.

This function creates a new circuit with the specified number of qubits while preserving all the operations of the original circuit. The original circuit operations will apply to the same qubits as before.

With the optional qubit-mapping parameter, you can specify a function to map original qubit indices to new indices in the extended circuit.

Parameters:

  • circuit: Original quantum circuit to extend
  • new-num-qubits: New total number of qubits (must be >= original)
  • qubit-mapping: (Optional) Function that maps original qubit indices to new indices

Returns: A new circuit with increased qubit count and remapped qubit operations if specified

Examples: (extend-circuit (h-gate (create-circuit 1) 0) 3) ;=> 3-qubit circuit with Hadamard gate on qubit 0

;; Shift all qubits by 2 positions
(extend-circuit (h-gate (create-circuit 1) 0) 3 #(+ % 2)) ;=> 3-qubit circuit with Hadamard gate on qubit 2

Extend a quantum circuit to support a larger number of qubits.

This function creates a new circuit with the specified number of qubits
while preserving all the operations of the original circuit. The original 
circuit operations will apply to the same qubits as before.

With the optional qubit-mapping parameter, you can specify a function
to map original qubit indices to new indices in the extended circuit.

Parameters:
- circuit: Original quantum circuit to extend
- new-num-qubits: New total number of qubits (must be >= original)
- qubit-mapping: (Optional) Function that maps original qubit indices to new indices

Returns:
A new circuit with increased qubit count and remapped qubit operations if specified

Examples:
(extend-circuit (h-gate (create-circuit 1) 0) 3)
;=> 3-qubit circuit with Hadamard gate on qubit 0

;; Shift all qubits by 2 positions  
(extend-circuit (h-gate (create-circuit 1) 0) 3 #(+ % 2))
;=> 3-qubit circuit with Hadamard gate on qubit 2
sourceraw docstring

get-transformation-summaryclj

(get-transformation-summary transformation-result)

Get a human-readable summary of a circuit transformation.

Parameters:

  • transformation-result: Result from transform-circuit

Returns: String with transformation summary

Get a human-readable summary of a circuit transformation.

Parameters:
- transformation-result: Result from transform-circuit

Returns:
String with transformation summary
sourceraw docstring

optimizeclj

(optimize circuit supported-operations)
(optimize circuit supported-operations options)

Comprehensive circuit optimization for specific supported operations.

This function combines multiple optimization strategies:

  1. Transform operations to supported equivalents
  2. Optimize qubit usage to minimize qubit count
  3. Optionally apply operation sequence optimizations

Parameters:

  • circuit: Quantum circuit to optimize
  • supported-operations: Set of supported operations for optimization
  • options: Optional map with optimization options: :optimize-qubits? - Whether to optimize qubit usage (default: true) :transform-operations? - Whether to transform unsupported operations (default: true) :max-iterations - Maximum decomposition iterations (default: 100)

Returns: Map containing:

  • :quantum-circuit - The fully optimized circuit
  • :transformation-result - Result from operation transformation
  • :qubit-optimization-result - Result from qubit optimization (if enabled)
  • :optimization-summary - Human-readable summary of all optimizations

Example: (optimize my-circuit #{:h :x :z :cnot} {:optimize-qubits? true}) ;=> {:quantum-circuit <optimized-circuit>, ; :transformation-result {...}, ; :qubit-optimization-result {...}, ; :optimization-summary "..."}

Comprehensive circuit optimization for specific supported operations.

This function combines multiple optimization strategies:
1. Transform operations to supported equivalents
2. Optimize qubit usage to minimize qubit count
3. Optionally apply operation sequence optimizations

Parameters:
- circuit: Quantum circuit to optimize
- supported-operations: Set of supported operations for optimization
- options: Optional map with optimization options:
    :optimize-qubits? - Whether to optimize qubit usage (default: true)
    :transform-operations? - Whether to transform unsupported operations (default: true)
    :max-iterations - Maximum decomposition iterations (default: 100)

Returns:
Map containing:
- :quantum-circuit - The fully optimized circuit
- :transformation-result - Result from operation transformation
- :qubit-optimization-result - Result from qubit optimization (if enabled)
- :optimization-summary - Human-readable summary of all optimizations

Example:
(optimize my-circuit #{:h :x :z :cnot} {:optimize-qubits? true})
;=> {:quantum-circuit <optimized-circuit>, 
;    :transformation-result {...}, 
;    :qubit-optimization-result {...},
;    :optimization-summary "..."}
sourceraw docstring

optimize-qubit-usageclj

(optimize-qubit-usage circuit)

Optimize a circuit to use the minimum number of qubits.

This function compacts qubit IDs to eliminate gaps and unused qubits, reducing the total number of qubits required for the circuit.

Parameters:

  • circuit: Quantum circuit to optimize

Returns: Map containing:

  • :quantum-circuit - Circuit with optimized qubit usage
  • :qubit-mapping - Map from old qubit IDs to new qubit IDs
  • :qubits-saved - Number of qubits saved by optimization
  • :original-qubits - Original number of qubits
  • :optimized-qubits - Final number of qubits after optimization

Example: ;; Circuit using qubits [0, 2, 5] out of 6 total qubits ;; After optimization: uses qubits [0, 1, 2] out of 3 total qubits (optimize-qubit-usage circuit) ;=> {:quantum-circuit <optimized-circuit>, :qubit-mapping {0 0, 2 1, 5 2}, ; :qubits-saved 3, :original-qubits 6, :optimized-qubits 3}

Optimize a circuit to use the minimum number of qubits.

This function compacts qubit IDs to eliminate gaps and unused qubits,
reducing the total number of qubits required for the circuit.

Parameters:
- circuit: Quantum circuit to optimize

Returns:
Map containing:
- :quantum-circuit - Circuit with optimized qubit usage
- :qubit-mapping - Map from old qubit IDs to new qubit IDs
- :qubits-saved - Number of qubits saved by optimization
- :original-qubits - Original number of qubits
- :optimized-qubits - Final number of qubits after optimization

Example:
;; Circuit using qubits [0, 2, 5] out of 6 total qubits
;; After optimization: uses qubits [0, 1, 2] out of 3 total qubits
(optimize-qubit-usage circuit)
;=> {:quantum-circuit <optimized-circuit>, :qubit-mapping {0 0, 2 1, 5 2}, 
;    :qubits-saved 3, :original-qubits 6, :optimized-qubits 3}
sourceraw docstring

transform-circuitclj

(transform-circuit circuit supported-operations)
(transform-circuit circuit supported-operations options)

Transform a quantum circuit to use only operations supported by a given backend.

This function takes a quantum circuit and the supported operations, and returns a new circuit where all operations have been decomposed into the supported operations.

Parameters:

  • circuit: Quantum circuit to transform
  • supported-operations: Set of operation types supported
  • options: Optional map with transformation options: :max-iterations - Maximum number of decomposition iterations (default: 100) :transform-unsupported? - Whether to transform unsupported operations (default: true)

Returns: A map containing:

  • :quantum-circuit - The transformed circuit
  • :transformed-operation-count - Count of operations that were transformed
  • :unsupported-operations - List of operation types that couldn't be transformed

Example: (transform-circuit my-circuit #{:h :x :cnot} {:max-iterations 50}) ;=> {:quantum-circuit <transformed-circuit>, :transformed-operation-count 3, :unsupported-operations []}

Transform a quantum circuit to use only operations supported by a given backend.

This function takes a quantum circuit and the supported operations, and returns a new circuit
where all operations have been decomposed into the supported operations.

Parameters:
- circuit: Quantum circuit to transform
- supported-operations: Set of operation types supported
- options: Optional map with transformation options:
    :max-iterations - Maximum number of decomposition iterations (default: 100)
    :transform-unsupported? - Whether to transform unsupported operations (default: true)

Returns:
A map containing:
- :quantum-circuit - The transformed circuit
- :transformed-operation-count - Count of operations that were transformed
- :unsupported-operations - List of operation types that couldn't be transformed

Example:
(transform-circuit my-circuit #{:h :x :cnot} {:max-iterations 50})
;=> {:quantum-circuit <transformed-circuit>, :transformed-operation-count 3, :unsupported-operations []}
sourceraw docstring

update-operation-paramsclj

(update-operation-params operation mapping-fn)

Update operation parameters based on a qubit mapping function.

This function handles all types of quantum operations (gates and measurements) and updates any qubit indices in their parameters based on the provided mapping function.

Parameters:

  • operation: The quantum operation to update
  • mapping-fn: Function that takes a qubit index and returns a new index

Returns: Updated operation with remapped qubit indices

Update operation parameters based on a qubit mapping function.

This function handles all types of quantum operations (gates and measurements) 
and updates any qubit indices in their parameters based on the provided mapping function.

Parameters:
- operation: The quantum operation to update
- mapping-fn: Function that takes a qubit index and returns a new index

Returns:
Updated operation with remapped qubit indices
sourceraw docstring

cljdoc is a website building & hosting documentation for Clojure/Script libraries

× close