aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/r.bqn49
1 files changed, 28 insertions, 21 deletions
diff --git a/src/r.bqn b/src/r.bqn
index e927c8a3..e67e45bb 100644
--- a/src/r.bqn
+++ b/src/r.bqn
@@ -12,9 +12,14 @@
⟜ ← {(𝕨⊣𝕩)𝔽𝔾𝕩}
⍟ ← {𝕨((𝕨𝔾𝕩)⊑⊢‿𝕗){𝔽}𝕩} # LIMITED to boolean right operand result
+Int←IsArray◶⟨⌊⊸=,0⟩
+Nat←IsArray◶⟨0⊸≤×⌊⊸=,0⟩
+
# LIMITED to numeric arguments for scalar cases
< ← {⟨⟩⥊⟨𝕩⟩} ⊘ (1-≤˜)
> ← (1-≤)
+⌊ ↩ ⌊ ⊘ (>⊑{𝕨‿𝕩})
+⌈ ← -∘⌊∘- ⊘ (<⊑{𝕨‿𝕩})
≢ ↩ IsArray◶⟨⟩‿≢ # LIMITED to monadic case
≠ ← (0<=)◶⟨1⋄0⊑≢⟩ # LIMITED to monadic case
@@ -27,10 +32,7 @@ _fold←{
}
´ ← _fold
-
ToArray ← <⍟(1-IsArray)
-Int←IsArray◶⟨⌊⊸=,0⟩
-Nat←IsArray◶⟨0⊸≤×⌊⊸=,0⟩
Cell←{(𝕨⊸+⊑𝕩˜)⌜↕(≠𝕩)-𝕨}⟜≢
∾ ← {k←≠𝕨⋄k⊸≤◶⟨⊑⟜𝕨⋄-⟜k⊑𝕩˜⟩⌜↕k+≠𝕩} # LIMITED to two vector arguments
@@ -67,21 +69,26 @@ Cmp ← +○IsArray◶⟨
Cc˜0
}
-_grade←{
+_grade_←{
! 1≤=𝕩
- m←1×´1 Cell 𝕩
- cc←m 𝔽○(⊑⟜(⥊𝕩)) _getCellCmp 0
- GT←Cc>0˜
l←≠𝕩
- B←l⊸≤◶⊢‿l
- (↕l){
- i←-d←𝕨 ⋄ j←ei←ej←0
- e←3 ⋄ G←GT○(⊑⟜(m⊸×⌜⍟(1-m=1)𝕩)) ⋄ c←⟨G,0,1,2⟩
- s←(8≤d)⊑⟨+,{(𝕩-1){𝕩⋄e↩2⋄j↩i⋄i↩𝕩}⍟(1-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
+ m←1×´1 Cell 𝕩
+ d←⥊𝕩
+ # Counting sort for small-range ints
+ bl←bu←0⋄r←1-{((bu↩⌈´𝕩)-bl↩⌊´𝕩)≤2×l}⟜𝕩⍟⊢((m=1)×32<l)◶0‿(1×´Int⌜)d
+ r◶⟨GroupLen⊸GroupOrd (𝕘⊑⟨-⟜bl,bu⊸-⟩)⌜ ⋄ 𝔽{𝕩⋄
+ # Merge sort
+ GT←(m 𝔽○(⊑⟜d) _getCellCmp 0)>0˜
+ B←l⊸≤◶⊢‿l
+ (↕l){
+ i←-d←𝕨 ⋄ j←ei←ej←0
+ e←3 ⋄ G←GT○(⊑⟜(m⊸×⌜⍟(1-m=1)𝕩)) ⋄ c←⟨G,0,1,2⟩
+ s←(8≤d)⊑⟨+,{(𝕩-1){𝕩⋄e↩2⋄j↩i⋄i↩𝕩}⍟(1-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
+ }⟩𝕩
}
Indices←{
@@ -118,7 +125,7 @@ SelSub←{
_under_←{
i←↕l←1×´s←≢𝕩
v←⥊𝕨𝔽○𝔾𝕩
- g←Cmp0 _grade gi←⥊𝔾s⥊i
+ g←Cmp0 _grade_ 0 gi←⥊𝔾s⥊i
P←(≠g)⊸≤◶⟨(⊑⟜g)⊑gi˜,l⟩
e←P j←0
s⥊{e=𝕩}◶⟨⊑⟜(⥊𝕩),{𝕩⋄r←(j⊑g)⊑v⋄e↩P j↩1+j⋄r}⟩⌜i
@@ -151,7 +158,7 @@ Merge←{
√ ← ⋆⟜(÷2) ⊘ (⋆⟜÷˜)
| ← (×⟜× ⊘ {𝕩-𝕨×⌊𝕩÷𝕨}) _perv
⌊ ↩ (⌊ ⊘ {(𝕨>𝕩)⊑𝕨‿𝕩}) _perv
-⌈ ← (-∘⌊∘- ⊘ {(𝕨<𝕩)⊑𝕨‿𝕩}) _perv
+⌈ ↩ (-∘⌊∘- ⊘ {(𝕨<𝕩)⊑𝕨‿𝕩}) _perv
¬ ← 1+-
∧ ← ×
∨ ← (+-×)
@@ -342,7 +349,7 @@ IndexOf←{
}
UniqueMask←{
! 1≤=𝕩
- g←Cmp _grade 𝕩
+ g←Cmp _grade_ 0 𝕩
(1¨⊸GroupOrd g)⊏0⊸<◶⟨1,-⟜1≢○(⊑⟜(g⊏<˘⍟(1<=)𝕩))⊢⟩⌜↕≠𝕩
}
Find←{
@@ -414,8 +421,8 @@ _bins←{
(≠𝕨)⊸{B⟜𝕩 _binSearch 𝕨}⌜ (×´sx) × ⥊⟜(↕×´)⊑⟜(≢𝕩)⌜↕cx
}
-⍋ ← Cmp _grade ⊘ ( Cmp _bins)
-⍒ ← -∘Cmp _grade ⊘ (-∘Cmp _bins)
+⍋ ← Cmp _grade_ 0 ⊘ (Cmp _bins)
+⍒ ← Cmp˜ _grade_ 1 ⊘ (Cmp˜ _bins)
∧ ↩ ⍋⊸⊏ ⊘ ∧
∨ ↩ ⍒⊸⊏ ⊘ ∨