aboutsummaryrefslogtreecommitdiff
path: root/src/r.bqn
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2021-04-28 14:01:15 -0400
committerMarshall Lochbaum <mwlochbaum@gmail.com>2021-04-28 14:01:15 -0400
commit5199bc3835b6509f01560660750cd102cd5cf033 (patch)
treeb4a114fa0fc251be7b8b025094c9a166fb2c48c3 /src/r.bqn
parenta4de4b3f2d3a0b38588c013e2200f08f100fc1d5 (diff)
Split r.bqn into r0.bqn and r1.bqn, but compile as one unit
Diffstat (limited to 'src/r.bqn')
-rw-r--r--src/r.bqn862
1 files changed, 0 insertions, 862 deletions
diff --git a/src/r.bqn b/src/r.bqn
deleted file mode 100644
index 9208a598..00000000
--- a/src/r.bqn
+++ /dev/null
@@ -1,862 +0,0 @@
-# BQN runtime. Requires:
-# Type Fill Log GroupLen GroupOrd _fillBy_
-# !+-×÷⋆⌊=≤≢⥊⊑↕⌜`⊘
-# Filled in by runtime: glyphs and default PrimInd
-Decompose ← {0‿𝕩}
-PrimInd ← {𝕩}
-SetPrims ← {Decompose‿PrimInd ↩ 𝕩}
-
-◶ ← {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # LIMITED to number left operand result
-⊢ ← {𝕩}
-⊣ ← {𝕩}⊘{𝕨}
-˙ ← {𝕩⋄𝕗}
-˜ ← {𝕩𝔽𝕨⊣𝕩}
-∘ ← {𝔽𝕨𝔾𝕩}
-○ ← {(𝔾𝕨)𝔽𝔾𝕩}
-⊸ ← {(𝔽𝕨⊣𝕩)𝔾𝕩}
-⟜ ← {(𝕨⊣𝕩)𝔽𝔾𝕩}
-⍟ ← {𝕨((𝕨𝔾𝕩)⊑⊢‿𝕗){𝔽}𝕩} # LIMITED to boolean right operand result
-
-IsArray←0=Type
-Int←(1=Type)◶⟨0,⌊⊸=⟩
-Nat←(1=Type)◶⟨0,0⊸≤×⌊⊸=⟩
-Deshape←IsArray◶{𝕩Fill⟨𝕩⟩}‿⥊
-Pair ← {⟨𝕩⟩} ⊘ {⟨𝕨,𝕩⟩}
-Box ← {𝕩Fill⟨⟩⥊⟨𝕩⟩}
-ToArray ← Box⍟(1-IsArray)
-
-# LIMITED to numeric arguments for arithmetic cases
-≥ ← ≤˜
-< ← Box ⊘ (1-≥)
-> ← (1-≤)
-⌊ ↩ ⌊ ⊘ (⊣-≥×-)
-⌈ ← -∘⌊∘- ⊘ (⊣-≤×-)
-| ← 0⊸≤◶-‿⊢
-≠ ← (0<=)◶⟨1⋄0⊑≢⟩ # LIMITED to monadic case
-
-_fold←{
- "´: 𝕩 must be a list" ! 1==𝕩
- l←≠v←𝕩 ⋄ F←𝔽
- r←𝕨 (0<l)◶{𝕩⋄Identity f}‿{l↩l-1⋄l⊑𝕩}⊘⊣ 𝕩
- ({r↩𝕩 F r}(l-1)⊸-⊑𝕩˙)⌜↕l
- r
-}
-´ ← _fold
-
-∾ ← {k←≠𝕨⋄k⊸≤◶⟨⊑⟜𝕨⋄-⟜k⊑𝕩˜⟩⌜↕k+≠𝕩} # LIMITED to two list arguments
-↑ ← {⊑⟜𝕩⌜↕𝕨} # LIMITED to number 𝕨 and list 𝕩
-↓ ← {(𝕨⊸+⊑𝕩˙)⌜↕(≠𝕩)-𝕨} # LIMITED to number 𝕨 and list 𝕩
-Cell ← ↓⟜≢
-
-GetCells←(1==∘⊢)◶{
- c←1×´s←1 Cell 𝕩
- (c⊸×⌜𝕨)(+⊑(⥊𝕩)˙)⌜s⥊↕c
-}‿{
- ⊑⟜𝕩⌜𝕨
-} _fillBy_ ⊢
-⊏ ← GetCells # LIMITED to depth-1 natural number left argument
-
-_qSearch ← {+´·×`𝕗(1-=)⌜<}
-_glyphLookup_ ← {
- {PrimInd𝕩} ⊑ ((𝕘⊑˜𝕗_qSearch)⌜glyphs)˙
-}
-_isGlyph ← { (glyphs _qSearch 𝕗) = {PrimInd𝕩} }
-IsJoin ← '∾'_isGlyph
-
-Split2 ← { s←2⊸×⌜↕(≠𝕩)÷2 ⋄ ⟨s⊏𝕩,(1⊸+⌜s)⊏𝕩⟩ }
-_lookup_ ← {
- k‿v←Split2 𝕘 ⋄ k _glyphLookup_ (v∾⟨𝕗⟩)
-}
-Identity ← {𝕏0} ("´: Identity not found"!0˙) _lookup_ ⟨
- '+',0 , '-',0
- '×',1 , '÷',1
- '⋆',1 , '¬',1
- '⌊',∞ , '⌈',¯∞
- '∨',0 , '∧',1
- '≠',0 , '=',1
- '>',0 , '≥',1
-⟩
-
-_eachd←{
- _d←{ # Equal ranks
- p←≢𝕨
- "Mapping: Equal-rank argument shapes don't agree" ! 1(⊑⟜p=⊑⟜(≢𝕩))⊸×´↕=𝕨
- p⥊ (⊑⟜(⥊𝕨)𝔽⊑⟜(⥊𝕩))⌜↕1×´p
- }
- _e←{ # 𝕨 has smaller or equal rank
- p←≢𝕨 ⋄ k←=𝕨 ⋄ q←≢𝕩
- "Mapping: Argument shape prefixes don't agree" ! 1(⊑⟜p=⊑⟜q)⊸×´↕k
- l←1(q⊑˜k⊸+)⊸×´↕(=𝕩)-k
- a←⥊𝕨 ⋄ b←⥊𝕩
- q⥊⥊(≠a) (⊑⟜a𝔽l⊸×⊸+⊑b˙)⌜○↕ l
- }
- =○=◶⟨>○=◶⟨𝔽_e⋄𝔽˜_e˜⟩⋄𝔽_d⟩
-}
-
-_perv←{ # Pervasion
- R←𝔽{𝕨𝔽_perv𝕩}
- +○IsArray◶⟨
- 𝔽
- R⌜⊘(>○IsArray◶{𝕨{𝕗R𝕩}⌜𝕩}‿{𝕩{𝕩R𝕗}⌜𝕨}) _fillBy_ R
- R _eachd _fillBy_ R
- ⟩
-}
-
-# Sorting
-Cmp0 ← ≥-≤
-Cmp1 ← (0<1×´≢∘⊢)◶⟨1, IsArray∘⊢◶(1-2×≤)‿{𝕨Cmp1𝕩}⟜(0⊑⥊)⟩
-CmpLen ← {
- e←𝕨-○(1×´0⊸<⌜)𝕩
- 𝕨(e=0)◶⟨e,0⟩‿{
- SM←Cmp0 Pair ≥⊑Pair
- c‿r←𝕨SM○≠𝕩
- l←𝕨{
- i←0+´×`𝕨=_eachd𝕩
- m←1×´i↕⊸⊏𝕨
- {k‿l←SM´𝕩⋄c↩k⋄m×↩l}∘(<⊑⌜𝕨‿𝕩˙)⍟(r⊸>)i
- m
- }○{(𝕩⊑˜(¯1+≠𝕩)⊸-)⌜↕r}𝕩
- ⟨c,l⟩
- }𝕩
-}
-_getCellCmp ← {
- Ci←𝔽⋄c←𝕨⊣0⋄l←𝕩
- Cc←{
- a←𝕨⋄b←𝕩
- S←(l⊸=)◶{S∘(1+𝕩)⍟(0⊸=)a Ci○(𝕩⊸+)b}‿c
- S 0
- }
- (𝕨 ⊢⊘{𝕨⍟(0⊸=)𝕏} ci˙)⍟(1=l) cc
-}
-Cmp ← +○IsArray◶⟨
- Cmp0
- IsArray∘⊣◶⟨Cmp1,-Cmp1˜⟩
- {
- lc←𝕨CmpLen○≢𝕩
- cc ← (⊑⟜(⥊𝕨))⊸Cmp⟜(⊑⟜(⥊𝕩)) _getCellCmp´ lc
- Cc˜0
- }
-⟩
-
-_grade ← {
- gt ← 𝕗
- cmps ← {𝕏˜}⌜⍟𝕗⟨Cmp,Cmp0,Cmp≤0˙,≤⟩
- 0 Fill {
- "⍋𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩
- l←≠𝕩
- (2≤l)◶⟨↕∘l,{
- m1←1=m←1×´1 Cell 𝕩
- 𝕩↩⥊𝕩
- a0←1⋄ts←0⋄{a0×↩1≤𝕩⋄ts+↩𝕩}∘Type⌜𝕩
- cs←a0+2×m1
- Merge ← { # Merge sort
- le ← m {(𝕏 _getCellCmp m)≤0˙}⍟(1-m1) 𝕩{𝕏○(⊑⟜𝕗)} cs⊑cmps
- B←l⊸≤◶⊢‿l
- (↕l){
- i←-d←𝕨 ⋄ j←ei←ej←0
- e←3 ⋄ G←LE○(⊑⟜(m⊸×⌜⍟(1-m=1)𝕩)) ⋄ c←⟨1-G,0,1,2⟩
- s←(8≤d)⊑⟨+,{(𝕩-1){𝕩⋄e↩2⋄j↩i⋄i↩𝕩}⍟G⍟(1-e)𝕩}⟩
- N←{i↩d+𝕨⋄ej↩B d+ei↩B j↩d+𝕩⋄e↩l≤j⋄S ei⋄i R j}
- R←{𝕨e◶c𝕩}◶{e+↩2×ei=i↩1+𝕨⋄𝕨}‿{e+↩ej=j↩1+𝕩⋄𝕩}‿N
- {(i R j)⊑𝕩}⟜𝕩⌜𝕩
- }´(2⋆ni-1+⊢)⌜↕ni←⌈2 Log l+l=0
- }
- # Counting sort for small-range ints
- bl←bu←0 ⋄ Count←{GroupLen⊸GroupOrd (gt⊑⟨-⟜bl,bu⊸-⟩)⌜𝕩}
- sr←((3=cs)×ts=l)◶⟨0,(1×´⌊⊸=⌜)◶0‿{((bu↩⌈´𝕩)-bl↩⌊´𝕩)≤2×l}⟩𝕩
- sr◶Merge‿Count 𝕩
- }⟩𝕩
- }
-}
-_binSearch ← {
- B ← 𝔽
- {
- R←{𝕨{a←B m←𝕩+h←⌊𝕨÷2⋄(h+a×𝕨-2×h)R a⊑𝕩‿m}⍟(>⟜1)𝕩}
- 1+(𝕩+1)R ¯1
- }⍟(0⊸<)
-}
-_bins←{
- c←1-˜=𝕨
- "⍋ or ⍒: Rank of 𝕨 must be at least 1" ! 0≤c
- "⍋ or ⍒: Rank of 𝕩 must be at least cell rank of 𝕨" ! c≤=𝕩
- 𝕩↩ToArray 𝕩
- lw←1×´sw←1 Cell 𝕨
- cw←𝔽○(⊑⟜(⥊𝕨)) _getCellCmp lw
- "⍋ or ⍒: 𝕨 must be sorted" ! 0⊸<◶⟨1,1×´·(Cw≤0˙)⟜(lw⊸+)∘(lw⊸×)⌜↕∘-⟜1⟩≠𝕨
- cx←c-˜=𝕩
- sx←cx Cell 𝕩 ⋄ lc←sw CmpLen sx
- cc ← (⊑⟜(⥊𝕨))⊸𝔽⟜(⊑⟜(⥊𝕩)) _getCellCmp´ lc
- B←(1×´sw)⊸×⊸Cc≤0˙
- 0 Fill (≠𝕨)⊸{B⟜𝕩 _binSearch 𝕨}⌜ (1×´sx)⊸×⌜ ⥊⟜(↕1×´⊢)⊑⟜(≢𝕩)⌜↕cx
-}
-
-⍋ ← 0 _grade ⊘ (Cmp _bins)
-⍒ ← 1 _grade ⊘ (Cmp˜ _bins)
-
-# Searching
-_search←{ # 0 for ∊˜, 1 for ⊐
- ind ← 𝕗
- red ← 𝕗⊑⟨1-×´,+´×`⟩
- 0 Fill {
- c←1-˜=𝕨
- "p⊐𝕩 or 𝕨∊p: p must have rank at least 1" ! 0≤c
- "p⊐n or n∊p: Rank of n must be at least cell rank of p" ! c≤=𝕩
- n←≠𝕨 ⋄ k←1×´s←1 Cell 𝕨 ⋄ cx←c-˜=𝕩
- lx←1×´sh←cx↑≢𝕩
- sh ⥊ 𝕨 (0<n)◶⟨0,s MatchS cx⊸Cell⟩◶{𝕩⋄(ind×n)⌜↕lx}‿{
- cc ← (⊑⟜(⥊𝕨))⊸(1-Match)⟜(⊑⟜(⥊𝕩)) _getCellCmp k
- 𝕨 ×○(8<≠∘⥊)◶{𝕩
- i‿j←(k⊸×⌜↕)⌜n‿lx ⋄ {Red CC⟜𝕩⌜i}⌜j
- }‿{
- g←Reverse⍒𝕨
- i←(g⊑˜0⌈-⟜1)⌜(g⊏𝕨)⍋𝕩
- adj←ind⊑⟨1⊸-,⊣--⟜n⊸×⟩
- ⊑⟜i⊸(⊣ Adj CC○(k⊸×))⌜↕lx
- } 𝕩
- } ToArray𝕩
- }
-}
-
-Indices←{
- "/: Replication argument must have rank 1" ! 1==𝕩
- l←≠𝕩
- 0 Fill {
- "/: Amounts to replicate must be natural numbers" ! 1×´Nat⌜𝕩
- k←l-1
- N ← ((⊢+-×0=𝕩⊑˜⊢)`k⊸-⌜↕l)⊑˜k-⊢ # Next nonzero
- E ← ⊑⟜(+`𝕩)
- ei←E i←N 0
- {{ei↩E i↩N𝕩+1⋄i}⍟(𝕩=ei)i}⌜↕E k
- }⍟(0<l)𝕩
-}
-Rep ← Indices⊸⊏
-
-Transpose←(0<=)◶⟨ToArray,{
- l←≠𝕩 ⋄ m←1×´c←1 Cell 𝕩
- (c⥊↕m)(+⟜(m⊸×)⊑(⥊𝕩)˙)⌜↕l
-}_fillBy_⊢⟩
-TransposeInv←{
- r←1-˜=𝕩 ⋄ s←≢𝕩 ⋄ l←r⊑s ⋄ c←r↑s
- (↕l)(+⟜(l⊸×)⊑(⥊𝕩)˙)⌜c⥊↕1×´c
-}_fillBy_⊢⍟{IX IsArray𝕩⋄0<=𝕩}
-
-Reverse←{
- "⌽𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩
- l←≠𝕩
- ((l-1)⊸-⌜↕l) ⊏ 𝕩
-}
-Rot←{
- "𝕨⌽𝕩: 𝕨 must consist of integers" ! Int𝕨
- l←≠𝕩 ⋄ 𝕨-↩l×⌊𝕨÷l+l=0 ⋄ ((𝕨+⊢-l×(l-𝕨)≤⊢)⌜↕l) ⊏ 𝕩
-}
-
-Prefixes←{
- "↑𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩
- 0⊸⊑⊸Fill ↕⊸⊏⟜𝕩⌜ ↕1+≠𝕩
-}
-Suffixes←{
- "↓𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩
- l←≠𝕩
- l⊸⊑⊸Fill {𝕩⊸+⌜↕l-𝕩}⊸⊏⟜𝕩⌜ ↕1+l
-}
-
-NormIndP‿NormIndS←{
- ei‿er←𝕩 ⋄ _cr←{⊢⊣er!𝔽}
- 0⊸≤◶⟨0⊸≤_cr+, >_cr⟩ ⊣ ei!Int∘⊢
-}⌜⟨
- "𝕨⊑𝕩: Indices in 𝕨 must consist of integers"‿"𝕨⊑𝕩: Index out of range"
- "𝕨⊏𝕩: Indices in 𝕨 must be integers"‿"𝕨⊏𝕩: Indices out of range"
-⟩
-Pick0←{
- "𝕨⊑𝕩: 𝕩 must be a list when 𝕨 is a number" ! 1==𝕩
- 𝕩⊑˜(≠𝕩)NormIndP𝕨
-}
-Pick1←{
- "𝕨⊑𝕩: Indices in compound 𝕨 must be lists" ! 1==𝕨
- "𝕨⊑𝕩: Index length in 𝕨 must match rank of 𝕩" ! 𝕨=○≠s←≢𝕩
- i←0⋄(⊑⟜𝕨{i↩(𝕩NormIndP𝕨)+𝕩×i}⊑⟜s)⌜↕≠𝕨
- i⊑Deshape𝕩
-}⟜ToArray
-Pickd←(0<0+´IsArray⌜∘⥊∘⊣)◶Pick1‿{Pickd⟜𝕩⌜𝕨}
-Pick←IsArray∘⊣◶Pick0‿Pickd
-
-FirstCell←{
- "⊏𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩
- "⊏𝕩: 𝕩 cannot have length 0" ! 0<≠𝕩
- (<0) ⊏ 𝕩
-}
-SelSub←{
- "𝕨⊏𝕩: 𝕨 must be an array" ! IsArray 𝕨
- 𝕨 (≠𝕩)⊸NormIndS⌜⊸⊏ 𝕩
-}
-First ← IsArray◶⟨⊢, (0<≠)◶⟨Fill,0⊸⊑⟩⥊⟩
-
-IsPure ← {d←Decompose𝕩 ⋄ 2⊸≤◶⟨≤⟜0, 1×´·𝕊⌜1↓d˙⟩0⊑d}
-_fillByPure_←{
- 𝕘 (3≤Type∘⊣)◶⟨{𝕨Fill𝕏},{(𝕨HomFil𝕩)_fillBy_𝕨}⍟(IsPure⊣)⟩ 𝕗
-}
-
-StructErr←{𝕩}
-IsStructErr ← (3=Type)◶⟨0,StructErr˙⊸=⟩
-_under_←{
- val←𝕨𝔽○𝔾𝕩
- # Construct indices
- Inds ← IsArray◶⟨0,⥊⟜(↕1×´⊢)≢⟩ 𝕩 ⊑⟜⥊⍟(IsArray⊢)´ Reverse
- _s_ ← {
- f←𝕗
- st‿d‿o←𝕩
- g←𝕨 St Inds∘{f↩f(IsArray⊣)◶⟨⟩‿∾⟨𝕩⟩}⍟(d>IsArray) 𝕘
- {f _s_ 𝕩}⍟o g
- }
- IsStruct ← (5=0⊸⊑)◶⟨0,s˙=2⊸⊑⟩ Decompose
- sf ← isStruct StructFn 𝕘 ⋄ SR ← ¯1 _s_ 0
- root‿ind ← IsStruct◶⟨0‿StructErr,1‿3⊏Decompose⟩ SF sr
-
- # Traverse indices 𝕩 and values 𝕨.
- # Return flat lists ⟨indices,values⟩, or structErr if 𝕨 doesn't capture 𝕩.
- GetInserts←{
- count←0⋄depth←{IsArray◶⟨{𝕩⋄count+↩1⋄0},1+0⌈´𝕊⌜∘⥊⟩𝕩}𝕩
- 𝕩 (2⌊depth)◶(Pair○Pair)‿(StructConform◶⟨StructErr˙,Pair○⥊⟩)‿{
- Fail←{𝕊‿0}
- # 𝕎 is parent traversal; 𝕩 is current components of ind and val
- Trav←(IsArray 0⊑⊢)◶⟨Pair, StructConform´∘⊢◶Fail‿{
- Parent←𝕎 ⋄ n←≠0⊑a←⥊⌜𝕩 ⋄ j←¯1
- Child←Trav⟜{𝕩⊸⊑⌜a}
- { j+↩1 ⋄ f←n⊸≤◶⟨𝕊˙⊸Child,Parent˙⟩j ⋄ F 0 }
- }⟩
- next ← 0 Trav 𝕨‿𝕩
- res ← {n‿o←Next𝕩⋄next↩n⋄o}⌜ ↕count
- (next=fail)◶⟨0⊸⊑⌜ Pair 1⊸⊑⌜, StructErr˙⟩ res
- } 𝕨
- }⍟(1-IsStructErr∘⊢)
- Struct←{
- i‿v←𝕨
- Set1←𝕨⊸{
- 𝕩↩ToArray𝕩
- s←≢𝕩⋄l←≠d←⥊𝕩
- gl←l GroupLen i ⋄ g←gl GroupOrd i
- Sel←v⊑˜⊑⟜g
- j←0⋄Adv←Sel{(j+↩𝕩)-1}
- CM←"⌾: Incompatible result elements in structural Under"!Match⟜Sel
- s⥊2⊸⌊◶⟨⊑⟜d,Adv,Adv{(𝕨CM(j-𝕩)⊸+)⌜↕𝕩-1⋄𝕨}⊢⟩⟜(⊑⟜gl)⌜↕l
- }
- _at_ ← {𝔽⍟((𝔾𝕩)=⊣)⟜(⊑⟜𝕩)⌜ ↕≠𝕩}
- Set ← 0⊸{ (𝕨≥≠root)◶⟨≢⥊(1+𝕨)⊸𝕊_at_(𝕨⊑root˙)∘⥊, Set1⟩ 𝕩 }
- IsArray∘root◶⟨0⊑v˙, Set⟩ 𝕩
- } _fillBy_ ⊢
- IsStructErr◶⟨Struct⟜(𝕩˙), {𝕏val}·Inverse𝔾˙⟩ val GetInserts ind
-}
-
-MatchS ← 1×´=_eachd
-match←{(0⊑𝕨)◶(1⊑𝕨)‿𝕩}´⟨
- ⟨=○IsArray, 0⟩
- ⟨IsArray∘⊢, =⟩
- ⟨=○= , 0⟩
- ⟨MatchS○≢ , 0⟩
- {1×´⥊𝕨 Match _eachd 𝕩}
-⟩
-structConform ← {𝕎◶0‿𝕏}´⟨IsArray⊢, =○=, MatchS○≢⟩
-Depth←IsArray◶0‿{1+0⌈´Depth⌜⥊𝕩}
-
-≡ ← Depth ⊘ Match
-≢ ↩ IsArray◶⟨⟩‿≢ ⊘ (1-Match)
-¨ ← {𝕨𝔽⌜⊘(𝔽_eachd)_fillByPure_𝔽○ToArray𝕩}
-
-IF ← ⊢⊣!∘≡ # Intersect fill
-IEF← (0<≠)◶⟨⊢_fillBy_ Fill, ⊢_fillBy_ IF´⟩∘⥊
-_fillMerge_ ← {(0<≠∘⥊)◶⟨(𝔾○≢⥊⟨⟩˙)_fillBy_⊢⟜Fill, 𝔽 ⊣_fillBy_⊢ IEF⟩}
-Merge←{
- c←≢0⊑⥊𝕩
- (">𝕩: Elements of 𝕩 must have matching shapes" ! c =○≠◶0‿MatchS ≢)⌜⥊𝕩
- (Deshape⌜𝕩)⊑˜⌜c⥊↕1×´c
-}_fillMerge_∾⍟IsArray
-
-Join1←{
- # List of lists
- i←j←¯1 ⋄ e←⟨⟩ ⋄ a←𝕩
- {{e↩a⊑˜i↩𝕩⋄j↩¯1}⍟(1-i⊸=)𝕩⋄(j↩j+1)⊑e}⌜Indices≠⌜𝕩
-}
-JoinM←{
- # Multidimensional
- n←≠z←⥊𝕩 ⋄ s←≢⌜z ⋄ d←≠0⊑s ⋄ r←=𝕩
- "∾𝕩: Elements of 𝕩 must all have the same rank" ! 1×´(d=≠)⌜s
- "∾𝕩: 𝕩 element rank must be at least argument rank" ! d≥r
- _s0←{s←𝕨⋄F←𝔽⋄{o←s⋄s F↩𝕩⋄o}⌜𝕩}
- sh←≢𝕩 ⋄ p←1 ⋄ i←j←<0
- (Reverse 1×_s0 Reverse sh){
- q←𝕨
- a←𝕩⊑sh
- m←𝕩⊸⊑⌜s
- l←(q⊸×⊑m˙)⌜↕a
- "∾𝕩: 𝕩 element shapes must be compatible" ! m MatchS ⥊(↕p)⊢⌜l⊣⌜↕q
- k ← Indices l
- c ← -⟜(⊑⟜(k ⊏ 0+_s0 l))⌜ ↕≠k
- i ↩ (i ×⟜(⊑⟜l)⌜ k) +¨ i⊢⌜c
- j ↩ j ×⟜a⊸+⌜ k
- p×↩a
- }¨↕r
- G←(⥊⌜z){𝕨⊑𝕩⊑𝕗}¨
- i (r<d)◶G‿{
- t←r↓0⊑s
- "∾𝕩: 𝕩 element trailing shapes must match" ! 1×´(t MatchS r⊸↓)⌜s
- ti←t⥊↕tp←×´t⋄(𝕨tp⊸×⊸+⌜ti)G𝕩⊣⌜ti
- } j
-}
-Join←(2⌊=)◶⟨
- Merge, (1×´(1==)⌜)◶JoinM‿Join1, JoinM
-⟩_fillMerge_{
- r←≠𝕨 ⋄ d←≠𝕩
- "∾𝕩: empty 𝕩 fill rank must be at least argument rank" ! d≥r
- (r≤⊣)◶⟨⊑⟜𝕨⊸×,⊢⟩⟜(⊑⟜𝕩)⌜↕d
-} ⊣ "∾𝕩: 𝕩 must be an array"!IsArray
-
-Recompose ← ⊣◶⟨
- ⊢ # 0 primitive
- ⊢ # 1 block
- {𝕎𝕏}´⊢ # 2-train
- {F‿G‿H←𝕩⋄F G H} # 3-train
- {F‿m←𝕩⋄F _m} # 4 1-modifier
- {F‿m‿G←𝕩⋄F _m_ G} # 5 2-modifier
-⟩
-structFn ← {
- E←StructErr˙
- _errIf←{⊢⊘×○(1-𝔽)◶⟨StructErr˙,𝕏⟩}
- SE ← IsStructErr _errIf⍟(3≥Type)
-
- _sfn_ ← {(𝕎⊢)◶⟨𝕏, 𝕩‿𝕗‿𝕘{𝕨𝕏𝕗}⟩}
- Mon←{𝕏⊘E} ⋄ Dy←{E⊘𝕏}
- k‿v ← Split2 ⟨
- "⊢⊣˜∘○⊸⟜⊘◶", ⊢
- "=≠≢", Mon 1 _sfn_ 0
- "<", Mon 0 _sfn_ 1
- "≍", Mon 1 _sfn_ 1 # Dyad combines
- "↕/»«⊔", Dy 1 _sfn_ 1
- "⥊↑↓⌽⍉⊏⊑", 1 _sfn_ 1
- # ">", Mon 2 _sfn_ 1
- # "∾", Mon 2 _sfn_ 1 # Dyad combines
- # "˘⎉¨⌜",
- # "⚇",
- ⟩
- SP ← (Join1 k)_glyphLookup_((k≠⌜⊸Rep v)∾⟨{
- NS ← 𝕎 _errIf
- (Type-3˙)◶⟨NS, {m←𝕩⋄{NS(𝕗_m)˙0}}, {m←𝕩⋄{NS(𝕗_m_𝕘)˙0}}⟩ 𝕩
- }⟩)
- StructPrim ← {p←SP𝕩⋄𝕨P𝕩}
-
- 0⊸≤◶⟨3,2⊸≤◶⊢‿2⟩∘(0⊑⊢)◶⟨
- SE ⊣ StructPrim 1⊑⊢ # 0 primitive
- StructErr˙˙ # 1 block
- 0⊸⊑ Recompose {𝕨˙⊸StructFn⌜1↓𝕩} # other operation
- SE 1⊑⊢ # ¯1 constant
- ⟩⟜{Decompose𝕩}
-}
-
-_takeDrop←{
- ⟨gl,Noop,_inds⟩←𝕗
- pre ← "𝕨"∾gl∾"𝕩: 𝕨 must "
- ernk ← "have rank at most 1"
- eint ← "consist of integers"
- {
- ernk ! 1≥=𝕨
- 𝕨 ↩ Deshape 𝕨
- eint ! 1×´Int⌜𝕨
- r ← ≠𝕨
- s ← r {(1⌜∘↕𝕨-≠𝕩)∾𝕩}⍟(>⟜≠) ≢𝕩
- _c ← { (×⟜𝕗⌜𝕨) +⌜ 𝕩 }
- i←<0 ⋄ k←1 ⋄ UIk←{ i (k×𝕨)_c↩ k ↕⊸(𝕨_c)⍟(1-=⟜1) 𝕩 ⋄ k↩1 ⋄ ≠𝕩 }
- doFil←0
- sh ← (⊑⟜s Noop◶{k×↩𝕨⋄𝕨}‿(⊣ UIk {𝕩⋄doFil↩1}_inds) ⊑⟜𝕨)⌜ ↕r
- (0<=i)◶(s⊸⥊)‿{
- sh ∾↩ t ← r↓s
- {i 𝕩_c↩ ↕𝕩}⍟(1-1⊸=) k×´t
- Sel ← ⊑⟜(⥊𝕩)
- 𝕩{Sel↩0⊸≤◶⟨(Fill𝕨)˙,Sel⟩}⍟⊢doFil
- Sel⌜ sh ⥊ i
- }_fillBy_⊢ ToArray 𝕩
- }
-}
-Take ← ⟨"↑" ⋄ 1-=⟜| ⋄ { 𝔽⍟(𝕨⊸<)a←|𝕩 ⋄ (0<𝕩)◶⟨¯∞⍟(<⟜0)⌜+⟜(𝕨+𝕩)⌜, ¯∞⍟(𝕨⊸≤)⌜⟩↕a }⟩_takeDrop
-Drop ← ⟨"↓" ⋄ 1-0⊸= ⋄ { 𝔽 ⋄ 0⊸<◶⟨↕0⌈+,<∘⊢+⌜·↕0⌈-⟩ }⟩_takeDrop
-
-ShiftCheck←{
- "« or »: 𝕩 must have rank at least 1" ! 1≤=𝕩
- d←𝕩-○=𝕨
- "« or »: 𝕨 must not have higher rank than 𝕩" ! 0≤d
- "« or »: Rank of 𝕨 must be at least rank of 𝕩 minus 1" ! 1≥d
- s←1 Cell 𝕩
- "« or »: 𝕨 must share 𝕩's major cell shape" ! s MatchS (1-d)↓≢𝕨
- 1×´s
-}
-ShiftBefore←{
- c←𝕨 ShiftCheck 𝕩
- n←c×(𝕩≤○=⊢)◶1‿≠𝕨
- (≢𝕩)⥊n⊸≤◶⟨⊑⟜(Deshape𝕨),-⟜n⊑(⥊𝕩)˙⟩⌜↕c×≠𝕩
-}
-ShiftAfter←{
- c←𝕨 ShiftCheck 𝕩
- l←c×≠𝕩
- n←c×(𝕩≤○=⊢)◶1‿≠𝕨
- m←l-n
- (≢𝕩)⥊m⊸≤◶⟨+⟜n⊑(⥊𝕩)˙,-⟜m⊑(Deshape𝕨)˙⟩⌜↕l
-}
-FC←{ # Fill cell
- "« or »: 𝕩 must have rank at least 1" ! 1≤=𝕩
- (Fill 𝕩)⌜ ⥊⟜(↕1×´⊢) 1 Cell 𝕩
-}
-
-Range←{
- I←{"↕𝕩: 𝕩 must consist of natural numbers"!Nat𝕩⋄↕𝕩}
- M←{"↕𝕩: 𝕩 must be a number or list"!1==𝕩⋄(0⌜𝕩)Fill(<⟨⟩)Pair⊸∾⌜´I⌜𝕩}
- IsArray◶I‿M 𝕩
-}
-Windows←{
- "𝕨↕𝕩: 𝕨 must have rank at most 1" ! 1≥=𝕨
- r←≠𝕨↩Deshape 𝕨
- 𝕨{
- "𝕨↕𝕩: Length of 𝕨 must be at most rank of 𝕩" ! r≤=𝕩
- "𝕨↕𝕩: 𝕨 must consist of natural numbers" ! ×´Nat⌜𝕨
- s←≢𝕩
- l←(1+⊑⟜s-⊑⟜𝕨)⌜↕r
- "𝕨↕𝕩: Window length 𝕨 must be at most axis length plus one" ! ×´0⊸≤⌜l
- k←1×´t←r↓s
- str ← Reverse ×`⟨k⟩∾{(s⊑˜𝕩⊸-)⌜↕𝕩}r-1
- ⊑⟜(⥊𝕩)⌜ k +⌜⟜(t⥊↕)˜⍟(1-=⟜1) l +⌜○(+⌜´str{𝕨⊸×⌜↕𝕩}¨⊢) 𝕨
- }_fillBy_⊢⍟(0<r)𝕩
-}
-
-˘ ← {𝕨 𝔽 _rankOp_ ¯1 𝕩}
-_onAxes_←{
- F←𝔽
- (𝔾<≡)∘⊣◶{ # One axis
- "First-axis primitive: 𝕩 must have rank at least 1" ! 1≤=𝕩
- 𝕨F𝕩
- }‿{ # Multiple axes
- "Multi-axis primitive: 𝕨 must have rank at most 1" ! 1≥=𝕨
- "Multi-axis primitive: Length of 𝕨 must be at most rank of 𝕩" ! 𝕨≤○≠≢𝕩
- l←≠𝕨 ⋄ W←⊑⟜(⥊𝕨)
- 0{(W𝕨)F(1+𝕨)⊸𝕊˘⍟(𝕨<l-1)𝕩}⍟(0<l)𝕩
- }⟜ToArray
-}
-
-Replicate ← (0<=∘⊣)◶{
- 𝕨↩(0⊑⥊)⍟IsArray𝕨
- "/: Amounts to replicate must be natural numbers" ! Nat 𝕨
- e←r←𝕨
- ({e+↩r⋄1+𝕩}⍟{e=𝕨}˜`↕r×≠𝕩) ⊏ 𝕩
-}‿{
- "𝕨/𝕩: Lengths of components of 𝕨 must match 𝕩" ! 𝕨=○≠𝕩
- 𝕨 Rep 𝕩
-} _onAxes_ (1-0=≠) _fillBy_ ⊢
-
-PermInv ← 1¨⊸GroupOrd
-_self←{
- "∊𝕩 or ⊐𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩
- g←⍋𝕩
- 0 Fill (PermInv g) ⊏ g 𝔽 0⊸<◶⟨1,-⟜1≢○(⊑⟜(g⊏<˘⍟(1<=)𝕩))⊢⟩⌜↕≠𝕩
-}
-SelfClas ← (PermInv∘⍋∘(Indices⊸⊏)˜⊏˜¯1+`⊢) _self
-
-ReshapeT ← "∘⌊⌽↑"_glyphLookup_(↕5)
-Reshape←{
- "𝕨⥊𝕩: 𝕨 must have rank at most 1" ! 1≥=𝕨
- s←Deshape 𝕨
- sp←0+´p←(1-Nat)⌜s
- "𝕨⥊𝕩: 𝕨 must consist of natural numbers" ! 1≥sp
- n←≠d←Deshape 𝕩
- l←sp◶(1×´⊢)‿{
- lp←1×´p⊣◶⊢‿1¨𝕩
- "𝕨⥊𝕩: Can't compute axis length when rest of shape is empty" ! 0<lp
- i←0+´⊑⟜p⊸×⌜↕≠p
- t←ReshapeT i⊑s
- "𝕨⥊𝕩: 𝕨 must consist of natural numbers or ∘ ⌊ ⌽ ↑" ! t<4
- Chk ← ⊢ ⊣ "𝕨⥊𝕩: Shape must be exact when reshaping with ∘" ! ⌊⊸=
- a←(2⌊t)◶⟨Chk,⌊,⌈⟩n÷lp
- s↩p⊣◶⊢‿a¨s
- {d∾↩(Fill d)⌜↕𝕩-n⋄n}⍟(n⊸<)⍟(3=t)lp×a
- } s
- s⥊{
- 𝕩(0<n)◶⟨<∘Fill⊸(⊣⌜)⋄{i←¯1⋄m←n-1⋄{𝕩⋄(i+↩1-n×i=m)⊑d}⌜𝕩}⟩↕l
- }_fillBy_⊢⍟(1-l=n)d
-}
-⥊ ↩ Deshape ⊘ ⥊
-
-_group←{
- "⊔: Grouping argument must consist of integers" ! 1×´Int⌜𝕩
- "⊔: Grouping argument values cannot be less than ¯1" ! 1×´¯1⊸≤⌜𝕩
- GL←GroupLen⋄𝕩↩𝕨(-˜⟜≠{GL↩(𝕨⊑𝕩)GL⊢⋄𝕨↑𝕩}⊢)⍟(0⊘⊣)𝕩
- d←(l←GL𝕩)GroupOrd𝕩
- i←0⋄(𝔽{𝕩⋄(i↩i+1)⊢i⊑d}⌜∘↕)⌜l
-}
-GroupInds←{
- "⊔𝕩: 𝕩 must be a list" ! 1==𝕩
- G←⊢_group
- (1<≡)◶⟨
- ↕∘0 Fill G
- ((⊢Fill⥊⟜⟨⟩)0⌜) Fill (<<⟨⟩) ∾⌜⌜´ {⊏⟜(⥊Range≢𝕩)⌜ G⥊𝕩}⌜
- ⟩ 𝕩
-}
-Group1←ToArray⊸{
- n←=𝕨
- "𝕨⊔𝕩: Rank of simple 𝕨 must be at most rank of 𝕩" ! n≤=𝕩
- ld←(≢𝕨)-¨n↑s←≢𝕩
- dr←(1=n)◶⟨0,1=0⊸⊑⟩ld
- "𝕨⊔𝕩: Lengths of 𝕨 must equal to 𝕩, or one more only in a rank-1 component" ! dr◶⟨1×´0⊸=⌜,1⟩ld
- SX←((n==𝕩)◶{c←1×´t←n↓s⋄(𝕩⊑˜c⊸×⊸+)⌜⟜(t⥊↕c)}‿{⊑⟜𝕩⌜} ⥊𝕩)∘⊣ _fillBy_ ⊢⟜𝕩
- (SX⟨⟩) Fill dr SX _group ⥊𝕨
-}
-GroupGen←{
- "𝕨⊔𝕩: 𝕩 must be an array" ! IsArray 𝕩
- 𝕨(2≤≡𝕨)◶Group1‿GroupM𝕩
-}
-
-÷ ↩ ÷ _perv
-⋆ ↩ ⋆ _perv
-√ ← ⋆⟜(÷2) ⊘ (⋆⟜÷˜)
-| ← (| ⊘ {𝕩-𝕨×⌊𝕩÷𝕨}) _perv
-⌊ ↩ (⌊ ⊘ {(𝕨>𝕩)⊑𝕨‿𝕩}) _perv
-⌈ ↩ (-∘⌊∘- ⊘ {(𝕨<𝕩)⊑𝕨‿𝕩}) _perv
-∧ ← ⍋⊸⊏ ⊘ (× _perv)
-∨ ← ⍒⊸⊏ ⊘ ((+-×) _perv)
-× ↩ (0⊸(<->) ⊘ ×) _perv
-< ↩ Box ⊘ ((1-≥) _perv)
-> ↩ Merge ⊘ ((1-≤) _perv)
-≠ ↩ ≠ ⊘ ((1-=) _perv)
-= ↩ = ⊘ (= _perv)
-≥ ← ("≥: No monadic form"!0˙) ⊘ (≥ _perv)
-≤ ↩ ("≤: No monadic form"!0˙) ⊘ (≤ _perv)
-+ ↩ + _perv
-- ↩ - _perv
-¬ ← 1+-
-HomFil ← {((𝕎0) Fill 𝕏)⊘𝕏}⍟(+´⟨=,≠,≡,≢⟩=⊣)
-
-ValidateRanks←{
- "⎉ or ⚇: 𝔽 result must have rank at most 1" ! 1≥=𝕩
- 𝕩↩⥊𝕩
- "⎉ or ⚇: 𝔽 result must have 1 to 3 elements" ! (1⊸≤∧≤⟜3)≠𝕩
- "⎉ or ⚇: 𝔽 result must consist of integers" ! 1∧´Int⌜𝕩
- 𝕩
-}
-_ranks ← {⟨2⟩⊘⟨1,0⟩ ((⊣-1+|)˜⟜≠⊑¨<∘⊢) ValidateRanks∘𝔽}
-_depthOp_←{
- neg←0>n←𝕨𝔾_ranks𝕩 ⋄ F←𝔽
- _d←{
- R←(𝕗+neg)_d
- 𝕨(×⟜2⊸+´2 Reshape (neg∧𝕗≥0)∨(0⌈𝕗)≥Pair○≡)◶⟨R¨⋄R⟜𝕩⌜∘⊣⋄(𝕨R⊢)⌜∘⊢⋄F⟩𝕩
- }
- 𝕨 n _d 𝕩
-}
-_rankOp_←{
- k←𝕨(Pair○= (0≤⊢)◶⟨⌊⟜-,0⌈-⟩¨ 𝔾_ranks)𝕩
- Enc←{
- f←(↕𝕨)⊏≢𝕩
- c←1×´s←𝕨Cell𝕩⋄i←s⥊↕c
- (f⥊((⥊𝕩)⊏˜i+c×⊢)⌜↕1×´f)˙_fillBy_{(<𝕩)⌜i} 𝕩
- }
- Enc↩(>⟜0×1+≥⟜=)◶⟨<⊢,Enc,<⌜⊢⟩
- > ((0⊑k)Enc𝕨) 𝔽¨ ((1-˜≠)⊸⊑k)Enc𝕩
-}
-_insert←{
- "˝: 𝕩 must have rank at least 1" ! 1≤=𝕩
- F←𝔽
- Id ← {
- s ← 1↓≢𝕩
- JoinSh ← {"˝: Identity does not exist"!0<≠𝕨 ⋄ 𝕨×0<↕≠𝕨}
- s ¬∘IsJoin∘⊢◶⟨JoinSh⥊𝕩˙, Reshape⟜Identity⟩ f
- }
- 𝕨 (0<≠)⊘1◶Id‿{𝕨F´<˘𝕩} 𝕩
-}
-
-JoinTo←∨○(1<=)◶(∾○⥊)‿{
- s←𝕨Pair○≢𝕩
- a←1⌈´k←≠⌜s
- "𝕨∾𝕩: Rank of 𝕨 and 𝕩 must differ by at most 1" ! 1∧´1≥a-k
- c←(k¬a)+⟜(↕a-1)⊸⊏¨s
- "𝕨∾𝕩: Cell shapes of 𝕨 and 𝕩 must match" ! MatchS´c
- l←0+´(a=k)⊣◶1‿(0⊑⊢)¨s
- (⟨l⟩∾0⊑c)⥊𝕨∾○⥊𝕩
-} _fillBy_ IF
-
-_repeat_←{
- F←𝔽 ⋄ b←𝕨{𝕏⊣}˙⊘{𝕨˙{𝔽𝕏⊣}}0
- n←𝕨𝔾𝕩
- Multi←{
- l←u←0
- {"⍟: Repetition numbers in 𝕨𝔾𝕩 must be integers"!Int𝕩⋄l↩l⌊𝕩⋄u↩u⌈𝕩}_perv n
- i←⟨𝕩⟩⋄P←B⊸{𝕎`i∾↕𝕩}
- pos←f P u
- neg←f 0⊸<◶⟨i,Inverse⊸P⟩ -l
- (|⊑<⟜0⊑pos‿neg˙)_perv n
- }
- (Nat n)◶Multi‿{𝕩(B f)∘⊢´↕n} 𝕩
-}
-
-↕ ↩ Range ⊘ Windows
-⌽ ← Reverse ⊘ (Rot _onAxes_ 0)
-/ ← Indices ⊘ Replicate
-» ← FC⊸ShiftBefore ⊘ ShiftBefore _fillBy_ (⊢⊘IF)
-« ← FC⊸ShiftAfter ⊘ ShiftAfter _fillBy_ (⊢⊘IF)
-
-GroupM←{
- "𝕨⊔𝕩: Compound 𝕨 must be a list" ! 1==𝕨
- n←0+´r←=⌜𝕨
- "𝕨⊔𝕩: Total rank of 𝕨 must be at most rank of 𝕩" ! n≤=𝕩
- ld←(Join≢⌜𝕨)-n↑≢𝕩
- "𝕨⊔𝕩: Lengths of 𝕨 must equal to 𝕩, or one more only in a rank-1 component" ! 1∧´(0⊸≤∧≤⟜(r/1=r))ld
- dr←r⌊(0»+`r)⊏ld∾⟨0⟩
- l←dr-˜≠⌜𝕨↩⥊⌜𝕨 ⋄ LS←∾⟜(n Cell 𝕩) Reshape 𝕩˙
- S←⊏⟜(LS⟨1×´l⟩)
- (LS 0⌜𝕨) Fill dr (1≠≠∘⊢)◶⟨S _group○(0⊸⊑), S⌜ ·+⌜⌜´ (⌽×`1»⌽l) × ⊢_group¨⟩ 𝕨
-}
-
-↑ ↩ Prefixes ⊘ Take
-↓ ↩ Suffixes ⊘ Drop
-⊔ ← GroupInds ⊘ GroupGen
-⊐ ← SelfClas ⊘ (1 _search)
-∊ ← ⊢_self ⊘ (0 _search˜)
-⎉ ← _rankOp_
-
-Find←{
- r←=𝕨
- "⍷𝕩: Rank of 𝕨 cannot exceed rank of 𝕩" ! r≤=𝕩
- 0 Fill 𝕨 ≡⎉r ((1+r-⊸↑≢𝕩)⌊≢𝕨)⊸↕⎉r 𝕩
-}○ToArray
-
-OccurrenceCount ← 0 Fill ⊐˜(⊢-⊏)⍋∘⍋
-ProgressiveIndexOf ← 0 Fill {
- c←1-˜=𝕨
- "⊒: Rank of 𝕨 must be at least 1" ! 0≤c
- "⊒: Rank of 𝕩 must be at least cell rank of 𝕨" ! c≤=𝕩
- 𝕨⊐○(Pair¨⟜(≢⥊OccurrenceCount∘⥊) 𝕨⊸⊐)𝕩
-}
-
-ReorderChk←{
- "𝕨⍉𝕩: 𝕨 must have rank at most 1" ! 1≥=𝕨
- "𝕨⍉𝕩: Length of 𝕨 must not exceed rank of 𝕩" ! 𝕨≤○≠≢𝕩
- "𝕨⍉𝕩: 𝕨 must consist of natural numbers" ! 1∧´Nat⌜⥊𝕨
-}
-ReorderAxesSub←{
- (𝕨⊸⊏Pick𝕩˙)⌜↕⌊´⌜𝕨⊔≢𝕩
-} _fillBy_ ⊢
-ReorderAxes←{
- 𝕨 ReorderChk 𝕩
- 𝕨↩⥊𝕨
- r←(=𝕩)-0+´¬∊𝕨
- "𝕨⍉𝕩: Skipped result axis" ! 1∧´𝕨<r
- (𝕨∾𝕨(¬∘∊˜/⊢)↕r) ReorderAxesSub 𝕩
-}
-ReorderAxesInv←{
- 𝕨 ReorderChk 𝕩
- 𝕨↩⥊𝕨
- r←=𝕩
- IA 1∧´(∊∧<⟜r)𝕨
- (PermInv 𝕨∾𝕨(¬∘∊˜/⊢)↕r) ReorderAxesSub 𝕩
-}
-
-⁼ ← {Inverse 𝕗}
-_inv_ ← {𝕘⋄𝕨𝔽𝕩}
-_undo ← {𝕗 (≢∧INF˙⊸≢)◶0‿((5=0⊸⊑)◶1‿(inv˙≢(≠-2˙)⊸⊑)∘Decompose⊢)◶⊢‿{𝕏_inv_(𝕎_invChk_𝕏)} Inverse 𝕗}
-IsConstant ← (3≤Type)◶⟨1 ⋄ (4=0⊸⊑)◶0‿('˙'_isGlyph(≠-1˙)⊸⊑)∘{Decompose𝕩}⊢⟩
-AtopInverse ← {(𝕏𝕎)⊘(𝕏⟜𝕎)}○{Inverse𝕩}
-TrainInverse ← {
- t‿f‿g‿h←𝕩
- K←¬IsConstant
- f K∘⊣◶⟨{𝕏⁼{𝕨𝔽𝔾𝕩}(𝕨G⁼⊢)},K∘⊢◶⟨{𝕎⁼𝕩G{SwapInverse𝕗}⊢},INF˙⟩⟩ h
-}
-FuncInverse ← (0⊸⊑ ⊣◶⟨
- {PrimInverse𝕩} 1⊸⊑ # 0 primitive
- ("Cannot currently invert blocks"!0˙)˙ # 1 block
- 1⊸⊑ AtopInverse 2⊸⊑ # 2-train
- TrainInverse # 3-train
- 1⊸⊑ {𝕏𝕨}⟜{Mod1Inverse𝕩} 2⊸⊑ # 4 1-modifier
- 1‿3⊸⊏ {𝕏´𝕨}⟜{Mod2Inverse𝕩} 2⊸⊑ # 5 2-modifier
-⟩ ⊢) {Decompose𝕩}
-Inverse ← Type◶(3‿1‿2/{⊢⊣𝕩IX∘≡⊢}‿FuncInverse‿("Cannot invert modifier"!0˙))
-
-∾ ↩ Join ⊘ JoinTo
-IA ← "⁼: Inverse failed"⊸!
-IX ← "⁼: Inverse does not exist"⊸!
-INF← "⁼: Inverse not found"!0˙
-_invChk_ ← {i←𝕨𝔽𝕩⋄IX 𝕩≡𝕨𝔾i⋄i}
-GroupIndsInv ← {
- IA 2=≡𝕩
- IX 1∧´1==⌜𝕩
- j←∾𝕩
- IX 1∧´Nat⌜j
- IX 1∧´j>∾¯1»¨𝕩
- g←GroupLen j
- IX 1∧´g≤1
- o←/¬g
- (⍋j∾o)⊏(/≠¨𝕩)∾¯1¨o
-}
-GroupInv ← {
- IA 1==𝕨
- IA 1∧´Nat⌜𝕨
- i←⊔𝕨
- IX i≡○(≠¨)𝕩
- i ⍋⊸⊏○∾ 𝕩
-}
-⊏ ↩ FirstCell ⊘ (ToArray⊸(SelSub _onAxes_ 1)) _fillBy_ ⊢
-PrimInverse ← INF _lookup_ ⟨
- '+', +⊘(-˜)
- '-', -
- '×', ⊢_invChk_×⊘(÷˜)
- '÷', ÷
- '⋆', Log _perv
- '√', ט⊘(⋆˜)
- '∧', ⊢_invChk_∧⊘(÷˜)
- '∨', ⊢_invChk_∨⊘(-˜÷1-⊣)
- '¬', ¬
- '<', {IX IsArray𝕩⋄IX 0==𝕩⋄0⊑⥊𝕩}⊘(IA∘0)
- '⊢', ⊢
- '⊣', ⊢⊘(⊢⊣IX∘≡)
- '∾', IA∘0 ⊘ {d←𝕩-○=𝕨⋄IX(0⊸≤∧≤⟜1)d⋄l←d◶1‿≠𝕨⋄IX l≤≠𝕩⋄IX 𝕨≡d◶⟨⊏,l⊸↑⟩𝕩⋄l↓𝕩}
- '≍', {IX 1=≠𝕩⋄⊏𝕩} ⊘ {IX 2=≠𝕩⋄IX 𝕨≡⊏𝕩⋄1⊏𝕩}
- '↑', ¯1⊸⊑_invChk_↑ ⊘ (IA∘0)
- '↓', 0⊸⊑_invChk_↓ ⊘ (IA∘0)
- '↕', ≢_invChk_↕ ⊘ (IA∘0) # Should trace edge and invChk
- '⌽', ⌽ ⊘ (-⊸⌽)
- '⍉', TransposeInv ⊘ ReorderAxesInv
- '/', {IA 1==𝕩⋄IA 1∧´Nat⌜𝕩⋄IX(1∧´¯1⊸↓≤1⊸↓)𝕩⋄GroupLen𝕩}⊘(IA∘0)
- '⊔', GroupIndsInv ⊘ GroupInv
-⟩
-SwapInverse ← INF _lookup_ ⟨
- '+', ÷⟜2⊘(-˜)
- '-', IA∘0⊘+
- '×', √⊘(÷˜)
- '÷', IA∘0⊘×
- '⋆', IA∘0⊘√
- '√', IA∘0⊘(÷Log)
- '∧', √⊘(÷˜)
- '∨', (¬√∘¬)⊘(-˜÷1-⊣)
- '¬', IA∘0⊘(+-1˙)
-⟩
-⌜ ↩ {𝕨𝔽⌜_fillByPure_𝔽○ToArray𝕩}
-Mod1Inverse ← INF˙ _lookup_ ⟨
- '˜', SwapInverse
- '¨', {𝕏⁼¨ ⊣·IX 0<≡∘⊢}
- '⌜', {𝕏⁼⌜⊘(IA∘0) ⊣·IX 0<≡∘⊢}
- '˘', {(IX∘IsArray⊸⊢𝕏⁼)˘ ⊣·IX 0<=∘⊢}
- '`', {(⊏∾¯1⊸↓𝕏1⊸↓)⍟(1<≠)⊘(»𝕏⊢)⊣·IX 0<=∘⊢}∘{𝕏⁼¨}
-⟩
-⍟ ↩ _repeat_
-⌾ ← _under_
-Mod2Inverse ← INF˙ _lookup_ ⟨
- '∘', AtopInverse
- '○', {Fi←𝕎⁼⋄𝕏⁼ Fi⊘(𝕏⊸Fi)}
- '⌾', {𝕎⁼⌾𝕏} # Need to verify for computation Under
- '⍟', Int∘⊢◶⟨IA∘0˙,0⊸≤◶{𝕎⍟(-𝕩)_invChk_(𝕎⍟𝕩)}‿{𝕎⍟(-𝕩)}⟩
- '⊘', {(𝕎⁼)⊘(𝕏⁼)}
- '⊸', IsConstant∘⊣ ⊣◶{INF⊘𝕏}‿⊢ {𝕎⊸(𝕏⁼)}
- '⟜', {(𝕨IsConstant∘⊢◶⟨IA∘0˙,{𝕩𝕎{SwapInverse𝕗}⊢}⟩𝕩)⊘(𝕏⁼𝕎⁼)}
-⟩ { inv˙⊸=◶⟨𝔽,{𝕏_inv_𝕎}˙⟩ }
-
-˝ ← _insert
-⁼ ↩ _undo
-⊑ ↩ First ⊘ Pick
-◶ ↩ {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # Same definition, new Pick
-⚇ ← _depthOp_
-⥊ ↩ Deshape ⊘ Reshape
-≍ ← >∘Pair _fillBy_ (⊢⊘IF)
-⍉ ← Transpose ⊘ ReorderAxes
-⊒ ← OccurrenceCount⊘ ProgressiveIndexOf
-⍷ ← ∊⊸/ ⊘ Find