User:Igor Zhuravlov/Extended forks
Jump to navigation
Jump to search
Very often a need arises to overcome trains dataflow restrictions. Usual workaround is excessive boxing, i.e. aggregating pieces of data by Link (;), then dealing with boxed data: either extracting it before operating or operating directly inside boxes. This problem may be partially worked around by using generalized forks. Following code may be downloaded as single J script File:Fork.ijs.
2-fork
First of all, let's define traditional fork with 2-depth execution tree, just to eludicate generalized forks idea:
Execution tree
b / \ a0 a1
Definition
NB. Description:
NB. 2-fork, the traditional fork with 2-depth execution
NB. graph
NB.
NB. Syntax:
NB. vapp=. a0`b`a1 fork2
NB. vapp=. a0`b`a1`:6
NB. vapp=. a0 b a1
NB. where
NB. ax - ambivalent verbs to define input nodes of
NB. execution graph
NB. b - dyad to define output node of execution graph
NB. vapp - 2-fork, is evoked as:
NB. out=. vapp y
NB. out=. x vapp y
fork2=: 1 : 0
'`a0 b a1'=. m
a0o=. a0 y
a1o=. a1 y
bo=. a0o b a1o
:
'`a0 b a1'=. m
a0o=. x a0 y
a1o=. x a1 y
bo=. a0o b a1o
)
3-fork
Execution graph
c / \ b0 b1 / \ / \ a0 a1 a2
Definition
NB. Description:
NB. 3-fork, generalized fork with 3-depth execution graph
NB.
NB. Syntax:
NB. vapp=. a0`b0`a1`c`b1`a2 fork3
NB. where
NB. ax - ambivalent verbs to define input nodes of
NB. execution graph
NB. bx - dyads to define intermediate nodes of execution
NB. graph
NB. c - dyad to define output node of execution graph
NB. vapp - 3-fork, is evoked as:
NB. out=. vapp y
NB. out=. x vapp y
NB.
NB. Notes:
NB. - another 2-fork compatible traverse order is possible:
NB. a0 b0 c b1 a2 a1
fork3=: 1 : 0
'`a0 b0 a1 c b1 a2'=. m
a0o=. a0 y
a1o=. a1 y
a2o=. a2 y
b0o=. a0o b0 a1o
b1o=. a1o b1 a2o
co=. b0o c b1o
:
'`a0 b0 a1 c b1 a2'=. m
a0o=. x a0 y
a1o=. x a1 y
a2o=. x a2 y
b0o=. a0o b0 a1o
b1o=. a1o b1 a2o
co=. b0o c b1o
)
4-fork
Execution graph
d / \ c0 c1 / \ / \ b0 b1 b2 / \ / \ / \ a0 a1 a2 a3
Definition
NB. Description:
NB. 4-fork, generalized fork with 4-depth execution graph
NB.
NB. Syntax:
NB. vapp=. a0`b0`a1`c0`b1`a2`d`c1`b2`a3 fork4
NB. where
NB. ax - ambivalent verbs to define input nodes of
NB. execution graph
NB. bx cx - dyads to define intermediate nodes of execution
NB. graph
NB. d - dyad to define output node of execution graph
NB. vapp - 4-fork, is evoked as:
NB. out=. vapp y
NB. out=. x vapp y
NB.
NB. Notes:
NB. - another 2-fork compatible traverse order is possible:
NB. a0 b0 c0 d c1 b2 a3 a1 b1 a2
fork4=: 1 : 0
'`a0 b0 a1 c0 b1 a2 d c1 b2 a3'=. m
a0o=. a0 y
a1o=. a1 y
a2o=. a2 y
a3o=. a3 y
b0o=. a0o b0 a1o
b1o=. a1o b1 a2o
b2o=. a2o b2 a3o
c0o=. b0o c0 b1o
c1o=. b1o c1 b2o
do=. c0o d c1o
:
'`a0 b0 a1 c0 b1 a2 d c1 b2 a3'=. m
a0o=. x a0 y
a1o=. x a1 y
a2o=. x a2 y
a3o=. x a3 y
b0o=. a0o b0 a1o
b1o=. a1o b1 a2o
b2o=. a2o b2 a3o
c0o=. b0o c0 b1o
c1o=. b1o c1 b2o
do=. c0o d c1o
)
5-fork
Execution graph
e / \ d0 d1 / \ / \ c0 c1 c2 / \ / \ / \ b0 b1 b2 b3 / \ / \ / \ / \ a0 a1 a2 a3 a4
Definition
NB. Description:
NB. 5-fork, generalized fork with 5-depth execution graph
NB.
NB. Syntax:
NB. vapp=. a0`b0`a1`c0`b1`a2`d0`c1`b2`a3`e`d1`c2`b3`a4 fork5
NB. where
NB. axx - ambivalent verbs to define input nodes of
NB. execution graph
NB. bx cx dx - dyads to define intermediate nodes of
NB. execution graph
NB. e - dyad to define output node of execution
NB. graph
NB. vapp - 5-fork, is evoked as:
NB. out=. vapp y
NB. out=. x vapp y
NB.
NB. Notes:
NB. - another 2-fork compatible traverse order is possible:
NB. a0 b0 c0 d0 e d1 c2 b3 a4 a1 b1 c1 b2 a3 a2
fork5=: 1 : 0
'`a0 b0 a1 c0 b1 a2 d0 c1 b2 a3 e d1 c2 b3 a4'=. m
a0o=. a0 y
a1o=. a1 y
a2o=. a2 y
a3o=. a3 y
a4o=. a4 y
b0o=. a0o b0 a1o
b1o=. a1o b1 a2o
b2o=. a2o b2 a3o
b3o=. a3o b3 a4o
c0o=. b0o c0 b1o
c1o=. b1o c1 b2o
c2o=. b2o c2 b3o
d0o=. c0o d0 c1o
d1o=. c1o d1 c2o
eo=. d0o e d1o
:
'`a0 b0 a1 c0 b1 a2 d0 c1 b2 a3 e d1 c2 b3 a4'=. m
a0o=. x a0 y
a1o=. x a1 y
a2o=. x a2 y
a3o=. x a3 y
a4o=. x a4 y
b0o=. a0o b0 a1o
b1o=. a1o b1 a2o
b2o=. a2o b2 a3o
b3o=. a3o b3 a4o
c0o=. b0o c0 b1o
c1o=. b1o c1 b2o
c2o=. b2o c2 b3o
d0o=. c0o d0 c1o
d1o=. c1o d1 c2o
eo=. d0o e d1o
)
n-fork
Cases n>5 are left to the reader.