proofs/kernel_packing_certificate.bend

stelliferous@0.0.3.0 · 39 lines · 0 definitions

1import Base
2import stelliferous@0.0.3.0/kernel_spatial_packing.bend as Packing
3import stelliferous@0.0.3.0/kernel_tile.bend as Tile
4import stelliferous@0.0.3.0/proofs/kernel_packing_witness.bend as PackingWitness
5import stelliferous@0.0.3.0/proofs/storage_tree_model.bend as Tree
6import stelliferous@0.0.3.0/proofs/storage_certificate.bend as Certificate
7import stelliferous@0.0.3.0/proofs/traversal_witness.bend as TraversalWitness
8import stelliferous@0.0.3.0/proofs/traversal_certificate.bend as TraversalCertificate
9
10type WindowCall is Data:
11  WindowCall{window: Packing.Stencil,count: Nat,start: U32}
12
13def window_operation(call: WindowCall,input: Array<F32>,output: Array<Tile.Tile8>) -> Array<F32> & Array<Tile.Tile8>:
14  WindowCall{window,count,start} = call
15  Packing.pack_window(window,count,start,input,output)
16
17def window_preserves(+depth: Nat,call: WindowCall,-input: Array<F32>,-output: Array<Tile.Tile8>,input_certificate: Certificate.Certificate<F32,input>,
18  equation: {output == Tree.pack(Tile.Tile8,Certificate.normalized(Tile.Tile8,depth,Tree.reflect(Tile.Tile8,output))) : Array<Tile.Tile8>}) ->
19  TraversalWitness.ResultEvidence<Array<F32>,Tile.Tile8,input,depth,window_operation(call,input,output)>:
20  WindowCall{window,count,start} = call
21  PackingWitness.pack_window(depth,window,count,start,input,output,Certificate.witness(F32,input,input_certificate),Certificate.witness_at(Tile.Tile8,depth,output,equation))
22
23def window_certificates(window: Packing.Stencil,count: Nat,start: U32,-input: Array<F32>,-output: Array<Tile.Tile8>,input_certificate: Certificate.Certificate<F32,input>,output_certificate: Certificate.Certificate<Tile.Tile8,output>) ->
24  TraversalCertificate.Certificates<Array<F32>,Tile.Tile8,Certificate.family(~F32),Packing.pack_window(window,count,start,input,output)>:
25  Certificate.Certificate{+depth,+equation} = input_certificate
26  TraversalCertificate.operation(~Array<F32>,~Tile.Tile8,~WindowCall,~Certificate.family(~F32),~window_operation,~window_preserves,
27    WindowCall{window,count,start},input,output,Certificate.Certificate{depth,equation},Certificate.Certificate{depth,equation},Certificate.Certificate{depth,equation},output_certificate)
28
29def preserves(+depth: Nat,call: Packing.Call,-input: Array<F32>,-output: Array<Tile.Tile8>,input_certificate: Certificate.Certificate<F32,input>,
30  equation: {output == Tree.pack(Tile.Tile8,Certificate.normalized(Tile.Tile8,depth,Tree.reflect(Tile.Tile8,output))) : Array<Tile.Tile8>}) ->
31  TraversalWitness.ResultEvidence<Array<F32>,Tile.Tile8,input,depth,Packing.run(call,input,output)>:
32  Packing.Call{+count,+start,+h,+w,+k,+s,+p,+ow,+inner} = call
33  PackingWitness.pack(depth,count,start,input,output,h,w,k,s,p,ow,inner,Certificate.witness(F32,input,input_certificate),Certificate.witness_at(Tile.Tile8,depth,output,equation))
34
35def certificates(call: Packing.Call,-input: Array<F32>,-output: Array<Tile.Tile8>,input_certificate: Certificate.Certificate<F32,input>,output_certificate: Certificate.Certificate<Tile.Tile8,output>) ->
36  TraversalCertificate.Certificates<Array<F32>,Tile.Tile8,Certificate.family(~F32),Packing.run(call,input,output)>:
37  Certificate.Certificate{+depth,+equation} = input_certificate
38  TraversalCertificate.operation(~Array<F32>,~Tile.Tile8,~Packing.Call,~Certificate.family(~F32),~Packing.run,~preserves,
39    call,input,output,Certificate.Certificate{depth,equation},Certificate.Certificate{depth,equation},Certificate.Certificate{depth,equation},output_certificate)