Ah, now I get what you're trying to do. Glad you figured it out!

Best,
--Tim

On Sunday, February 14, 2016 01:01:07 AM Greg Plowman wrote:
> I created a type that I think more or less works:
> 
> immutable CartesianSubRange{I<:CartesianIndex}
>     range::CartesianRange{I}
>     start::I
>     stop::I
>     done::I     # one past stop
> 
>     function CartesianSubRange(range::CartesianRange{I}, start::I, stop::I)
>         item, done = next(range, stop)
>         new(range, start, stop, done)
>     end
> end
> 
> CartesianSubRange{I<:CartesianIndex}(range::CartesianRange{I}, start::I,
> stop::I) =
>     CartesianSubRange{I}(range, start, stop)
> 
> CartesianSubRange{N}(dims::NTuple{N,Int}, start::NTuple{N,Int},
> stop::NTuple{N,Int}) =
>     CartesianSubRange(CartesianRange(dims), CartesianIndex(start),
> CartesianIndex(stop))
> 
> Base.start(iter::CartesianSubRange) = iter.start
> Base.next{I}(iter::CartesianSubRange{I}, state::I) = next(iter.range, state)
> Base.done{I}(iter::CartesianSubRange{I}, state::I) = (state == iter.done)
> 
> 
> I can now do something like:
> 
> @everywhere function SubCycleSimulation(csr::CartesianSubRange)
>     println(csr.start.I, " - ", csr.stop.I)
>     for ci in csr
>         #...
>     end
>     return length(csr)
> end
> 
> dims = (30,34,28,90,44)
> cr = CartesianRange(CartesianIndex(dims))
> cycle = length(cr)
> numSubCycles = nworkers()*10
> subCycleLength = div(cycle, numSubCycles)
> subRanges = Array{CartesianSubRange}(numSubCycles)
> 
> for subCycle = 1:numSubCycles
>     cyclePosFrom = (subCycle - 1) * subCycleLength + 1
>     cyclePosTo = (subCycle == numSubCycles) ? cycle : subCycle *
> subCycleLength
>     start = CartesianIndex(ind2sub(dims, cyclePosFrom))
>     stop = CartesianIndex(ind2sub(dims, cyclePosTo))
>     subRanges[subCycle] = CartesianSubRange(cr, start, stop)
> end
> 
> results = pmap(SubCycleSimulation, subRanges)

Reply via email to