# benchmark registry

import os

def tokwargs(**kwargs): return kwargs

INSTALL_PREFIX = '/opt/usr'

DURATION = '1.3' #seconds

GRAS_ENV = {
    'PATH': os.path.join(INSTALL_PREFIX, 'gras/bin:$PATH:%s'%os.getenv('PATH')),
    'LD_LIBRARY_PATH': os.path.join(INSTALL_PREFIX, 'gras/lib:%s'%os.getenv('LD_LIBRARY_PATH')),
    'PYTHONPATH': os.path.join(INSTALL_PREFIX, 'gras/lib/python2.7/dist-packages:%s'%os.getenv('PYTHONPATH')),
}

GR_ENV = {
    'PATH': os.path.join(INSTALL_PREFIX, 'gr/bin:$PATH:%s'%os.getenv('PATH')),
    'LD_LIBRARY_PATH': os.path.join(INSTALL_PREFIX, 'gr/lib:%s'%os.getenv('LD_LIBRARY_PATH')),
    'PYTHONPATH': os.path.join(INSTALL_PREFIX, 'gr/lib/python2.7/dist-packages:%s'%os.getenv('PYTHONPATH')),
}

BENCHMARK_LINEAR_CHAIN = tokwargs(
    wat='Benchmark the schedulers with linear chain topology',
    moar='''\
- Topology is a linear chain of one input/one output blocks.
- GRAS will use only the buffer pool allocator,
and every work will fully consume available buffers.''',
    tests = [
        tokwargs(wat='GRAS',     args=['tb_linear_chain.py', DURATION], env=GRAS_ENV, expand=True),
        tokwargs(wat='GRSS',     args=['tb_linear_chain.py', DURATION], env=GR_ENV),
    ],
)

BENCHMARK_COMBINER_ARRAY = tokwargs(
    wat='Benchmark the schedulers with combiner array topology',
    moar='''\
- Topology is a tower of two input math blocks.
- GRAS will use only the buffer pool allocator,
and every work will fully consume available buffers.''',
    tests = [
        tokwargs(wat='GRAS',     args=['tb_combiner_array.py', DURATION], env=GRAS_ENV, expand=True),
        tokwargs(wat='GRSS',     args=['tb_combiner_array.py', DURATION], env=GR_ENV),
    ],
)

BENCHMARK_MANY_RATE_BLOCKS = tokwargs(
    wat='Benchmark the schedulers with many rate changing blocks',
    moar='''\
- Compare simultaneous changing ratio blocks in each scheduler.
- GRAS will use only the buffer pool allocator,
and every work will fully consume available buffers.''',
    tests = [
        tokwargs(wat='GRAS',     args=['tb_many_rate_changes.py', '--dur', DURATION], env=GRAS_ENV, expand=True),
        tokwargs(wat='GRSS',     args=['tb_many_rate_changes.py', '--dur', DURATION], env=GR_ENV),
    ],
)

BENCHMARK_DFIR_BLOCK = tokwargs(
    wat='Benchmark the schedulers with a FIR block',
    moar='''\
- Compare filter blocks in each scheduler.
- Shows both schedulers using circular buffer.''',
    tests = [
        tokwargs(wat='GRAS',     args=['tb_filter_block.py', '--dur', DURATION, '--which', 'dfir'], env=GRAS_ENV, expand=True),
        tokwargs(wat='GRSS',     args=['tb_filter_block.py', '--dur', DURATION, '--which', 'dfir'], env=GR_ENV),
    ],
)

BENCHMARK_RESAMP_BLOCK = tokwargs(
    wat='Benchmark the schedulers with a resampler block',
    moar='''\
- Compare filter blocks in each scheduler.
- Shows both schedulers using circular buffer.''',
    tests = [
        tokwargs(wat='GRAS',     args=['tb_filter_block.py', '--dur', DURATION, '--which', 'resamp'], env=GRAS_ENV, expand=True),
        tokwargs(wat='GRSS',     args=['tb_filter_block.py', '--dur', DURATION, '--which', 'resamp'], env=GR_ENV),
    ],
)

BENCHMARK_ADD_OPS = tokwargs(
    wat='Benchmark GrExtras vs gr-blocks adder blocks',
    moar='''\
- Compare math block implementations using GRAS.
- All blocks are using vector optimization.
- GrExtras math blocks avoid an unnecessary memcpy.
- GrExtras math blocks enable automatic bufer in-placing.''',
    tests = [
        tokwargs(wat='GrExtras\n(GRAS)',        args=['tb_grextras_math.py', DURATION, 'extras_add'], env=GRAS_ENV, expand=True),
        tokwargs(wat='gr-blocks\n(GRAS)',       args=['tb_grextras_math.py', DURATION, 'blocks_add'], env=GRAS_ENV, expand=True),
        tokwargs(wat='gr-blocks\n(GRSS)',       args=['tb_grextras_math.py', DURATION, 'blocks_add'], env=GR_ENV),
    ],
)

BENCHMARK_MULT_OPS = tokwargs(
    wat='Benchmark GrExtras vs gr-blocks multiplier blocks',
    moar='''\
- Compare math block implementations using GRAS.
- All blocks are using vector optimization.
- GrExtras math blocks avoid an unnecessary memcpy.
- GrExtras math blocks enable automatic bufer in-placing.''',
    tests = [
        tokwargs(wat='GrExtras\n(GRAS)',       args=['tb_grextras_math.py', DURATION, 'extras_mult'], env=GRAS_ENV, expand=True),
        tokwargs(wat='gr-blocks\n(GRAS)',      args=['tb_grextras_math.py', DURATION, 'blocks_mult'], env=GRAS_ENV, expand=True),
        tokwargs(wat='gr-blocks\n(GRSS)',      args=['tb_grextras_math.py', DURATION, 'blocks_mult'], env=GR_ENV),
    ],
)

BENCHMARK_DELAY_BLOCKS = tokwargs(
    wat='Benchmark GrExtras vs gr-core delay block',
    moar='''\
- Compare delay block implementations using GRAS.
- The GrExtras implementation uses zero-copy.''',
    tests = [
        tokwargs(wat='GrExtras\n(GRAS)',          args=['tb_grextras_delay.py', DURATION, 'extras_delay'], env=GRAS_ENV, expand=True),
        tokwargs(wat='gr-core\n(GRAS)',           args=['tb_grextras_delay.py', DURATION, 'core_delay'], env=GRAS_ENV, expand=True),
        tokwargs(wat='gr-core\n(GRSS)',           args=['tb_grextras_delay.py', DURATION, 'core_delay'], env=GR_ENV),
    ],
)

BENCHMARKS = (
    BENCHMARK_LINEAR_CHAIN,
    BENCHMARK_COMBINER_ARRAY,
    BENCHMARK_MANY_RATE_BLOCKS,
    BENCHMARK_DFIR_BLOCK,
    BENCHMARK_RESAMP_BLOCK,
    BENCHMARK_ADD_OPS,
    BENCHMARK_MULT_OPS,
    BENCHMARK_DELAY_BLOCKS,
)