@@ -2,24 +2,85 @@ using DiskArrayEngine
22import DiskArrayEngine as DAE
33using DiskArrays: ChunkType, RegularChunks
44using Statistics
5- using Zarr, DiskArrays, OffsetArrays
6- # using DiskArrayEngine: MWOp, internal_size, ProductArray, InputArray, getloopinds, UserOp, mysub, ArrayBuffer, NoFilter, AllMissing,
7- # create_buffers, read_range, generate_inbuffers, generate_outbuffers, get_bufferindices, offset_from_range, generate_outbuffer_collection, put_buffer,
8- # Output, _view, Input, applyfilter, apply_function, LoopWindows, GMDWop, results_as_diskarrays, create_userfunction, steps_per_chunk, apparent_chunksize,
9- # find_adjust_candidates, generate_LoopRange, get_loopsplitter, split_loopranges_threads, merge_loopranges_threads, LocalRunner,
10- # merge_outbuffer_collection, DistributedRunner
5+ using Zarr, DiskArrays
116using StatsBase: rle, mode
127using CFTime: timedecode
138using Dates
149using OnlineStats
1510using Logging
1611using Distributed
17- # global_logger(SimpleLogger(stdout,Logging.Debug))
18- # global_logger(SimpleLogger(stdout))
1912using LoggingExtras
2013using Test
2114using DataStructures: OrderedSet
2215
16+
17+
18+
19+ inwindows1 = DAE. MovingWindow (1 , 5 , 5 , 4 )
20+ outwindows1 = 1 : 4
21+ inwindows2 = DAE. MovingWindow (1 , 2 , 2 , 2 )
22+ outwindows2 = 1 : 2
23+
24+ inar = DAE. InputArray (1 : 20 , windows= (inwindows1,))
25+ outspecs = (DAE. create_outwindows (4 , windows= (outwindows1,)),)
26+ f = create_userfunction (sum, Float64)
27+ op1 = DAE. GMDWop ((inar,), outspecs, f)
28+ r = results_as_diskarrays (op1)[1 ]
29+
30+ inar2 = DAE. InputArray (r, windows= (inwindows2,))
31+ outspecs2 = (DAE. create_outwindows (4 , windows= (outwindows2,)),)
32+ f2 = create_userfunction (sum, Float64)
33+ op2 = DAE. GMDWop ((inar2,), outspecs2, f2)
34+ r2 = results_as_diskarrays (op2)[1 ]
35+
36+ g = DAE. result_to_graph (r2)
37+
38+ @test length (g. nodes) == 3
39+ @test g. nodes[1 ] == DAE. MwopOutNode (false , nothing , (2 ,), Float64)
40+ @test g. nodes[2 ] == DAE. MwopOutNode (false , nothing , (4 ,), Float64)
41+ @test g. nodes[3 ] == 1 : 20
42+
43+ @test length (g. connections) == 2
44+ conn1, conn2 = g. connections
45+ @test conn1. inputids == [3 ]
46+ @test conn1. outputids == [2 ]
47+ @test conn2. inputids == [2 ]
48+ @test conn2. outputids == [1 ]
49+
50+ nodemergestrategies = DAE. collect_strategies (g)
51+
52+ @test only (nodemergestrategies[2 ]) isa DAE. BlockMerge
53+ @test nodemergestrategies[1 ] == [nothing ]
54+ @test nodemergestrategies[3 ] == [nothing ]
55+
56+ dimmap = DAE. create_loopdimmap (conn1, conn2, 2 )
57+ @test dimmap isa DAE. DimMap
58+ @test dimmap. d == Dict (1 => 1 )
59+
60+ newop = DAE. merge_operations (DAE. BlockMerge, conn1, conn2, 2 , dimmap)
61+ @test newop isa DAE. UserOp
62+ @test newop. f isa DAE. BlockFunctionChain
63+ @test newop. f. funcs[1 ] === f. f
64+ @test newop. f. funcs[2 ] === f2. f
65+ @test newop. f. args == [((1 ,), (1 ,)), ((2 ,), (2 ,))]
66+ @test newop. f. transfers == [1 => [2 ]]
67+
68+ newconn, newnodes = DAE. merged_connection (DAE. BlockMerge, g, conn1, conn2, 2 , newop, nodemergestrategies, dimmap)
69+
70+ @test newconn isa DAE. MwopConnection
71+ @test newconn. f === newop
72+ @test newconn. inputids == [3 , 4 ]
73+ @test newconn. outputids == [2 , 1 ]
74+
75+ newconn. inwindows[1 ]. windows. members[1 ]
76+ newconn. inwindows[2 ]. windows. members[1 ]
77+ newconn. outwindows[1 ]. windows. members[1 ]
78+ newconn. outwindows[2 ]. windows. members[1 ]
79+
80+
81+
82+
83+
2384g = zopen (" https://s3.bgc-jena.mpg.de:9000/esdl-esdc-v2.1.1/esdc-8d-0.25deg-184x90x90-2.1.1.zarr" )
2485
2586
@@ -30,29 +91,121 @@ t = g["time"]
3091tvec = timedecode (t[:], t. attrs[" units" ]);
3192groups = yearmonth .(tvec)
3293
33- r = aggregate_diskarray (a, mean, (1 => nothing , 2 => 8 , 3 => groups), strategy= :reduce )
94+ r = aggregate_diskarray (a, mean, (1 => nothing , 2 => 8 , 3 => groups), strategy= :direct )
3495
3596# a = compute(r)
3697
3798r2 = aggregate_diskarray (r, maximum, (2 => nothing ,))
3899
100+
101+
39102r3 = r .+ 273.15
40103
41104finalres = r2 .+ r3
42105
43- finalres[45 , 100 ]
106+ finalres[1 , 45 , 100 ]
44107
45108g = DAE. MwopGraph ()
46109outnode = DAE. to_graph! (g, r2);
110+
47111DAE. remove_aliases! (g)
112+
48113using CairoMakie, GraphMakie
49- # p = graphplot(g,elabels=DAE.edgenames(g),ilabels=DAE.nodenames(g))
114+ p = graphplot (g, elabels= DAE. edgenames (g), ilabels= DAE. nodenames (g))
115+
116+ # DAE.fuse_step_direct!(g)
50117
51- dg = DAE. DimensionGraph (g)
52- dg. concomps
53118
119+ nodemergestrategies = DAE. collect_strategies (g)
120+ i_eliminate = findfirst (nodemergestrategies) do strat
121+ ! isempty (strat) && ! all (isnothing, strat)
122+ end
123+ # ## DAE.eliminate_node(g, i_eliminate, nodemergestrategies[i_eliminate], BlockMerge)
124+ nodegraph = g
125+ inconids = DAE. inconnections (nodegraph, i_eliminate)
126+ outconids = DAE. outconnections (nodegraph, i_eliminate)
127+ inconns = nodegraph. connections[inconids]
128+ outconns = nodegraph. connections[outconids]
129+
130+ inconn = only (inconns)
131+ outconn = only (outconns)
132+
133+ dimmap = DAE. create_loopdimmap (inconn, outconn, i_eliminate)
134+
135+ newop = DAE. merge_operations (DAE. BlockMerge, inconn, outconn, i_eliminate, dimmap)
136+
137+ newconn = DAE. merged_connection (DAE. BlockMerge, nodegraph, inconn, outconn, i_eliminate, newop, nodemergestrategies, dimmap)
138+
139+ newconn. inputids
140+ newconn. outputids
141+ newconn. inwindows[2 ]. windows. members[2 ]
142+
143+
144+ nodemergestrategies = DAE. collect_strategies (g)
145+ i_eliminate = findfirst (nodemergestrategies) do strat
146+ ! isempty (strat) && ! all (isnothing, strat)
147+ end
148+
149+ nodegraph = g;
150+ inconids = DAE. inconnections (nodegraph, i_eliminate)
151+ outconids = DAE. outconnections (nodegraph, i_eliminate)
152+ inconns = nodegraph. connections[inconids]
153+ outconns = nodegraph. connections[outconids]
154+
155+ inconn = only (inconns)
156+ outconn = only (outconns)
157+
158+ dimmap = DAE. create_loopdimmap (inconn, outconn, i_eliminate)
159+
160+ chain1 = DAE. BlockFunctionChain (inconn)
161+ chain2 = DAE. BlockFunctionChain (outconn)
162+
163+ to_eliminate = i_eliminate
164+
165+ chain1. args
166+ chain2. args
167+ ifrom = findfirst (== (to_eliminate), inconn. outputids)
168+ ito = findall (== (to_eliminate), outconn. inputids)
169+ transfer = ifrom => ito
170+
171+ newfunc = DAE. build_chain (chain1, chain2, dimmap, transfer)
172+
173+
174+ newop = DAE. merge_operations (DAE. BlockMerge, inconn, outconn, i_eliminate, dimmap)
175+
176+ newconn = DAE. merged_connection (DAE. BlockMerge, nodegraph, inconn, outconn, i_eliminate, newop, nodemergestrategies, dimmap)
177+
178+ deleteat! (nodegraph. connections, [inconids; outconids])
179+ push! (nodegraph. connections, newconn)
180+
181+ nodegraph. connections
182+
183+ conn = only (nodegraph. connections)
184+ op = conn. f
185+ inputs = InputArray .(g. nodes[conn. inputids], conn. inwindows)
186+ outspecs = map (g. nodes[conn. outputids], conn. outwindows) do outnode, outwindow
187+ (; lw= outwindow, chunks= outnode. chunks, ismem= outnode. ismem)
188+ end
189+
190+
191+ function gmwop_from_conn (conn)
192+ op = conn. f
193+ inputs = InputArray .(g. nodes[conn. inputids], conn. inwindows)
194+ outspecs = map (g. nodes[conn. outputids], conn. outwindows) do outnode, outwindow
195+ (; lw= outwindow, chunks= outnode. chunks, ismem= outnode. ismem)
196+ end
197+ DAE. GMDWop (inputs, outspecs, op)
198+ end
199+
200+
201+ using Graphs: nv, outneighbors, inneighbors
202+ ioutnodes = (findall (n -> ! isempty (inneighbors (g, n)) && isempty (outneighbors (g, n)), 1 : nv (g)))
203+ lastop = findall (conn -> all (in (conn. outputids), ioutnodes), g. connections) |> only
204+ op = gmwop_from_conn (g. connections[lastop])
205+ rgraph = results_as_diskarrays (op)[1 ]
206+
207+ runner = rgraph[1 , 45 , 100 ]
54208
55- DAE. fuse_step_direct! (g)
56209
57210
58211
@@ -98,13 +251,7 @@ remaining_conn.outputids
98251remaining_conn. outwindows[1 ]
99252
100253
101- op = remaining_conn. f
102- inputs = InputArray .(g. nodes[remaining_conn. inputids], remaining_conn. inwindows)
103- outspecs = map (g. nodes[remaining_conn. outputids], remaining_conn. outwindows) do outnode, outwindow
104- (; lw= outwindow, chunks= outnode. chunks, ismem= outnode. ismem)
105- end
106254
107- mergedop = DAE. GMDWop (inputs, outspecs, op)
108255
109256rnow = DAE. results_as_diskarrays (mergedop)[2 ]
110257
0 commit comments