⍝ Performance profiling: ⍝ [profile] uses ⎕← to display profiling information in the session. ⍝ For testing, we modify the temporary copy of the operator in this ⍝ namespace to output profiling information directly as result. The ⍝ second (timing) column is removed from the result. Otherwise, small ⍝ variations in timing would cause the test to fail. s1 ← '⎕←trim⍕vcol,tcol' 'vcol' ⍝ remove timing column s2 ← '1:shy←rslt⊣' '⍪' ⍝ return profiling information ⎕fx s1 subs s2 subs ⎕cr'profile' ⍝ fix modified profile operator 1 disp profile'disp' ⍳2 3 4 ⍝ hits for 1 disp ⍳2 3 4 ┌──────────────────────────────────────────────────────────────────────────────────┐ │ 1 disp←{⎕IO ⎕ML←0 1 ⍝ Boxed sketch of nested array. │ │ 1 │ │ 1 ⍺←⍬ ⋄ dec ctd←2↑⍺ ⍝ 1:decorated, 1:centred. │ │ 1 │ │25 box←{ ⍝ Recursive boxing of nested array.│ │25 isor ⍵:⎕FMT⊂⍵ ⍝ ⎕or: '∇name'. │ │25 1=≡,⍵:dec open ⎕FMT dec open ⍵ ⍝ simple array: format. │ │ 1 mat←matr 1/dec open ⍵ ⍝ matrix of opened subarrays. │ │ 1 r c←×⍴mat ⍝ non-null rows/cols. │ │ 1 dec<0∊r c:c/r⌿∇ 1 open mat ⍝ undecorated null: empty result. │ │ 1 subs←aligned ∇¨mat ⍝ aligned boxed subarrays. │ │ 1 (≢⍴⍵)gaps ⍵ plane subs ⍝ collection into single plane. │ │ 1 } │ │ 1 │ │ 1 aligned←{ ⍝ Alignment and centring. │ │ 1 rows cols←sepr⍴¨⍵ ⍝ subarray dimensions. │ │ 1 sizes←(⌈/rows)∘.,⌈⌿cols ⍝ aligned subarray sizes. │ │ 1 ctd=0:sizes↑¨⍵ ⍝ top-left alignment. │ │ v h←sepr⌈0.5×↑(⍴¨⍵)-sizes ⍝ vertical and horizontal rotation.│ │ v⊖¨h⌽¨sizes↑¨⍵ ⍝ centred aligned subarrays. │ │ 1 } │ │ 1 │ │ 3 gaps←{ ⍝ Gap-separated sub-planes. │ │ 3 ⍺≤2:⍵ ⍝ lowish rank: done. │ │ 1 subs←(⍺-1)∇¨⍵ ⍝ sub-hyperplanes. │ │ 1 width←⊃⌽⍴⊃subs ⍝ width of inter-plane gap. │ │ 1 fill←(⍺ width-3 0)⍴' ' ⍝ inter-plane gap. │ │ 1 ↑{⍺⍪fill⍪⍵}/1 open subs ⍝ gap-separated planes. │ │ 1 } │ │ 1 │ │ 3 plane←{ ⍝ Boxed rank-2 plane. │ │ 3 2<⍴⍴⍺:⍺ join ⍵ ⍝ gap-separated sub-planes. │ │ 2 odec←(dec shape ⍺)outer ⍵ ⍝ outer type and shape decoration. │ │ 2 idec←inner ⍺ ⍝ inner type and shape decorations.│ │ 2 (odec,idec)collect ⍵ ⍝ collected, formatted subarrays. │ │ 1 } │ │ 1 │ │ 1 join←{ ⍝ Join of gap-separated sub-planes.│ │ 1 sep←(≢⍵)÷1⌈≢⍺ ⍝ sub plane separation. │ │ 1 split←(0=sep|⍳≢⍵)⊂[0]⍵ ⍝ separation along first axis. │ │ 1 (⊂⍤¯1⊢⍺)plane¨split ⍝ sub-plane join. │ │ 1 } │ │ 1 │ │ 2 outer←{ ⍝ Outer decoration. │ │ 2 sizes←1 0{⊃↓(⍉⍣⍺)⍵}¨sepr⍴¨⍵ ⍝ row and col sizes of subarrays. │ │ 2 sides←sizes/¨¨'│─' ⍝ vert and horiz cell sides. │ │ 2 bords←dec↓¨'├┬'glue¨sides ⍝ joined up outer borders. │ │ 2 ↑,¨/('┌' '')⍺ bords'└┐' ⍝ vertical and horizontal borders. │ │ 1 } │ │ 1 │ │ 2 inner←{ ⍝ Inner subarray decorations. │ │26 deco←{(type ⍵),1 shape ⍵} ⍝ type and shape decorators. │ │ 2 sepr deco¨matr dec open ⍵ ⍝ decorators: tt vv hh . │ │ 1 } │ │ 1 │ │ 2 collect←{ ⍝ Collected subarrays. │ │ 2 lft top tt vv hh←⍺ ⍝ array and subarray decorations. │ │ 2 cells←vv right 1 open tt hh lower ⍵ ⍝ cells boxed right and below. │ │ 2 boxes←(dec∨0∊⍴⍵)open cells ⍝ opened to avoid ,/⍬ problem. │ │ 2 lft,top⍪↑⍪⌿,/boxes ⍝ completed collection. │ │ 1 } │ │ 1 │ │ 2 right←{ ⍝ Border right each subarray. │ │ 2 types←2⊥¨(⍳⍴⍵)=⊂¯1+⍴⍵ ⍝ right border lower corner types. │ │ 2 chars←'┼┤┴┘'[types] ⍝ .. .. .. chars. │ │26 rgt←{⍵,(-≢⍵)↑(≢⍵)1 1/'│',⍺} ⍝ form right border. │ │ 2 ((matr 1 open ⍺),¨chars)rgt¨⍵ ⍝ cells bordered right. │ │ 1 } │ │ 1 │ │ 2 lower←{ ⍝ Border below each subarray. │ │26 bot←{⍵⍪(-1⊃⍴⍵)↑⍺ split ⍵} ⍝ lower border. │ │26 split←{((¯2+1⊃⍴⍵)/'─')glue ⍺} ⍝ decorators split with horiz line.│ │ 2 (matr↑,¨/⍺)bot¨matr ⍵ ⍝ cells bordered below. │ │ 1 } │ │ 1 │ │24 type←{ ⍝ Type decoration char. │ │24 dec<|≡⍵:'─' ⍝ nested: '─' │ │24 isor ⍵:'∇' ⍝ ⎕or: '∇' │ │72 sst←{ ⍝ simple scalar type. │ │72 0=dec×⍴⍴⍵:'─' ⍝ undecorated or scalar ⍕⍵: char, │ │72 (⊃⍵∊'¯',⎕D)⊃'#~' ⍝ otherwise, number or space ref. │ │24 }∘⍕ ⍝ ⍕ distinguishes type of scalar. │ │24 0=≡⍵:sst ⍵ ⍝ simple scalar: type. │ │24 {(1=⍴⍵)⊃'+'⍵}∪,sst¨dec open ⍵ ⍝ array: mixed or uniform type. │ │ 1 } │ │ 1 │ │26 shape←{ ⍝ Row and column shape decorators. │ │26 dec≤0=⍴⍴⍵:⍺/¨'│─' ⍝ no decoration or scalar. │ │26 cols←(ׯ1↑⍴⍵)⊃'⊖→' ⍝ zero or more cols. │ │26 rsig←(××/¯1↓⍴⍵)⊃'⌽↓' ⍝ zero or more rows. │ │26 rows←(¯1+3⌊⍴⍴⍵)⊃'│'rsig'⍒' ⍝ high rank decorator overrides. │ │26 rows cols ⍝ shape decorators. │ │ 1 } │ │ 1 │ │10 matr←{↑,↓⍵} ⍝ matrix from non-scalar array. │ │ 6 sepr←{+/¨1⊂↑⍵} ⍝ vec-of-mats from mat-of-vecs. │ │83 open←{16::(1⌈⍴⍵)⍴⊂'[ref]' ⋄ (⍺⌈⍴⍵)⍴⍵} ⍝ stretched to expose nulls. │ │51 isor←{1 ⍬≡(≡⍵)(⍴⍵)} ⍝ is ⎕or of object? │ │29 glue←{0=⍴⍵:⍵ ⋄ ↑⍺{⍺,⍺⍺,⍵}/⍵} ⍝ ⍵ interspersed with ⍺s. │ │ 1 │ │ 1 isor ⍵:⎕FMT⊂⍵ ⍝ simple ⎕OR: done. │ │ 1 1=≡,⍵:⎕FMT ⍵ ⍝ simple array: done. │ │ 1 box ⍵ ⍝ recursive boxing of array. │ │ = } │ └──────────────────────────────────────────────────────────────────────────────────┘ osc¨(profile'osc')⍳10 ⍝ multiple applications of subject function ┌────────────────────────────────────────────────────────┐ │77 osc←{ ⍝ Oscillate - probably returns 1.│ │77 1=⍵:1 │ │67 2|⍵:∇ 1+3×⍵ │ │50 ∇ ⍵÷2 │ │ = } │ └────────────────────────────────────────────────────────┘ osc←{ 1=⍵:⍵ 2|⍵:odd ⍵ even ⍵ } odd←{ osc 1+3×⍵ } even←{ osc ⍵÷2 } P ← profile'osc' 'odd' 'even' ⍝ profiling operator osc¨P ⍳100 ⍝ profile of three functions ┌──────────────────────┐ │3242 osc←{ │ │3242 1=⍵:⍵ │ │3142 2|⍵:odd ⍵│ │2137 even ⍵ │ │ = } │ ├──────────────────────┤ │1005 odd←{ │ │1005 osc 1+3×⍵│ │ = } │ ├──────────────────────┤ │2137 even←{ │ │2137 osc ⍵÷2 │ │ = } │ └──────────────────────┘ ⍝∇ profile osc subs Back to: code Back to: Workspaces