Input reindexing and parallel circuits #
This file provides the structural circuit operations used by simultaneous
evaluation arguments. Circuit.mapInputs rewires the original inputs without
adding gates, Circuit.mapOutputs selects or repeats designated outputs, and
Circuit.parallel places two circuits with the same input namespace side by
side. Parallel composition preserves sharing within each operand and has
exactly additive cost.
Transport a circuit along equalities of its input and output counts. This is a structural cast; it changes no gate or wire.
Equations
- Cslib.Circuits.Circuit.castCounts inputCount outputCount circuit = inputCount ▸ outputCount ▸ circuit
Instances For
Casting circuit counts transports inputs and outputs by the corresponding finite-index equalities and otherwise preserves evaluation.
Casting circuit counts preserves weighted cost.
Reindex the original inputs of a wire while leaving its gate index unchanged.
Equations
Instances For
Reindex every original input of a program without changing its gates.
Equations
- Cslib.Circuits.Program.mapInputs inputMap Cslib.Circuits.Program.empty = Cslib.Circuits.Program.empty
- Cslib.Circuits.Program.mapInputs inputMap (program.gate line) = (Cslib.Circuits.Program.mapInputs inputMap program).gate (line.mapWires (Cslib.Circuits.Wire.mapInputs inputMap))
Instances For
Input reindexing evaluates a program after precomposing its input.
Input reindexing preserves the value of every mapped wire.
Input reindexing leaves every gate label, and hence every weighted cost, unchanged.
Rewire the original inputs of a circuit without adding gates. The map may identify, duplicate, permute, or discard inputs.
Equations
- circuit.mapInputs inputMap = { size := circuit.size, program := Cslib.Circuits.Program.mapInputs inputMap circuit.program, outputs := Cslib.Circuits.Wire.mapInputs inputMap ∘ circuit.outputs }
Instances For
Place two circuits with the same original inputs side by side and concatenate their designated outputs.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Parallel composition concatenates the two output vectors.
Parallel composition has exactly additive weighted cost.
Put two equally wide output vectors into the row-major two-block layout
Fin (2 * width).
Equations
- left.parallelPair right = (left.parallel right).mapOutputs (Fin.cast ⋯)
Instances For
Evaluation of parallelPair selects the indicated row-major block.
Place a finite family of scalar circuits with a common input namespace
side by side. Each member may have a different gate count; the resulting gate
count is their finite sum (Circuit.size_parallelFin).
Equations
- One or more equations did not get rendered due to their size.
- Cslib.Circuits.Circuit.parallelFin 0 x_2 = (Cslib.Circuits.Circuit.id σ n).mapOutputs Fin.elim0
Instances For
parallelFin returns, at each output coordinate, the corresponding
member circuit's scalar value.
Exact weighted cost of a finite parallel family.
Place a finite family of equally wide vector circuits side by side in
row-major (member, coordinate) order. The resulting gate count is the sum of
the members' gate counts (Circuit.size_parallelFinVector).
Equations
- One or more equations did not get rendered due to their size.
- Cslib.Circuits.Circuit.parallelFinVector 0 x✝¹ x✝ = (Cslib.Circuits.Circuit.id σ n).mapOutputs fun (output : Fin (0 * x✝¹)) => (Fin.cast ⋯ output).elim0
Instances For
parallelFinVector evaluates the indicated member and coordinate.
Exact weighted cost of a finite parallel vector family.