static OutputToInputMap createDimensionMap(const Dimension& outputSize,
    const Dimension& inputSize, const Dimension& inputStride)
{
    size_t inputIndex = 0;
    size_t inputRemainder = inputSize.front();

    OutputToInputMap map;

    for(size_t outputIndex = 0; outputIndex < outputSize.size(); ++outputIndex)
    {
        InputMap localMap;

        size_t outputDimSize = outputSize[outputIndex];

        while(outputDimSize > inputRemainder)
        {
            if(inputRemainder > 1)
            {
                localMap.push_back(inputIndex);
            }

            ++inputIndex;
            inputRemainder *= inputSize[inputIndex];
        }

        localMap.push_back(inputIndex);
        inputRemainder /= outputDimSize;

        map.push_back(localMap);
    }

    return map;
}