Free interleaving of two record arrays #
Two global circuits may compute different fields for every record. Running them once each and interleaving their outputs by fixed wiring combines those fields without duplicating either computation.
def
Algebraic.MassProduction.Nonuniform.RecordArray.outputWire
(records leftWidth rightWidth : ℕ)
(output : Fin (records * (leftWidth + rightWidth)))
:
Interleave the left and right field blocks within every record.
Equations
- One or more equations did not get rendered due to their size.
Instances For
def
Algebraic.MassProduction.Nonuniform.RecordArray.combine
{signature : Signature}
{inputs records leftWidth rightWidth : ℕ}
(left : Circuit signature inputs (records * leftWidth))
(right : Circuit signature inputs (records * rightWidth))
:
Compute both field arrays once, then interleave by free output wiring.
Equations
- Algebraic.MassProduction.Nonuniform.RecordArray.combine left right = (left.parallel right).mapOutputs (Algebraic.MassProduction.Nonuniform.RecordArray.outputWire records leftWidth rightWidth)
Instances For
theorem
Algebraic.MassProduction.Nonuniform.RecordArray.combine_eval
{signature : Signature}
{inputs records leftWidth rightWidth : ℕ}
{Value : Type u_2}
(left : Circuit signature inputs (records * leftWidth))
(right : Circuit signature inputs (records * rightWidth))
(interpretation : Interpretation signature Value)
(input : Fin inputs → Value)
(record : Fin records)
(bit : Fin (leftWidth + rightWidth))
:
(combine left right).eval interpretation input (finProdFinEquiv (record, bit)) = Fin.append (fun (field : Fin leftWidth) => left.eval interpretation input (finProdFinEquiv (record, field)))
(fun (field : Fin rightWidth) => right.eval interpretation input (finProdFinEquiv (record, field))) bit
Each combined record is the concatenation of the two computed fields.
theorem
Algebraic.MassProduction.Nonuniform.RecordArray.combine_cost
{signature : Signature}
{inputs records leftWidth rightWidth : ℕ}
(left : Circuit signature inputs (records * leftWidth))
(right : Circuit signature inputs (records * rightWidth))
(cost : OperationCost signature)
:
Interleaving adds no cost to the two global computations.