#!/usr/bin/env python
import sys, re
spaces = '[\s]*'
symbols = '[\s\w\d,.:|]*'
def pattern1(prefix, test):
    return re.compile(spaces + prefix + '_' + test + '::' + symbols + '::' + '\(' + symbols + '\)' + spaces)
def pattern2(prefix, test, param1):
    return re.compile(spaces + prefix + '_' + test + '::' + symbols + '::' + '\(' + symbols + param1 + symbols + '\)' + spaces)
def pattern3(prefix, test, param1, param2):
    return re.compile(spaces + prefix + '_' + test + '::' + symbols + '::' + '\(' + symbols + param1 + symbols + param2 + symbols + '\)' + spaces)
def pattern4(prefix, test, param1, param2, param3):
    return re.compile(spaces + prefix + '_' + test + '::' + symbols + '::' + '\(' + symbols + param1 + symbols + param2 + symbols + param3 + symbols + '\)' + spaces)
def pattern5(prefix, test, param1, param2, param3, param5):
    return re.compile(spaces + prefix + '_' + test + '::' + symbols + '::' + '\(' + symbols + param1 + symbols + param2 + symbols + param3 + symbols + param4 + symbols + '\)' + spaces)
npp_patterns = [
    ###############################################################
    # Core
    # Core_AddMat (CV_8U | CV_16U | CV_32F)
    pattern2('Core', 'AddMat', '8U'),
    pattern2('Core', 'AddMat', '16U'),
    pattern2('Core', 'AddMat', '32F'),
    # Core_AddScalar (CV_8U | CV_16U | CV_32F)
    pattern2('Core', 'AddScalar', '8U'),
    pattern2('Core', 'AddScalar', '16U'),
    pattern2('Core', 'AddScalar', '32F'),
    # Core_SubtractMat (CV_8U | CV_16U | CV_32F)
    pattern2('Core', 'SubtractMat', '8U'),
    pattern2('Core', 'SubtractMat', '16U'),
    pattern2('Core', 'SubtractMat', '32F'),
    # Core_SubtractScalar (CV_8U | CV_16U | CV_32F)
    pattern2('Core', 'SubtractScalar', '8U'),
    pattern2('Core', 'SubtractScalar', '16U'),
    pattern2('Core', 'SubtractScalar', '32F'),
    # Core_MultiplyMat (CV_8U | CV_16U | CV_32F)
    pattern2('Core', 'MultiplyMat', '8U'),
    pattern2('Core', 'MultiplyMat', '16U'),
    pattern2('Core', 'MultiplyMat', '32F'),
    # Core_MultiplyScalar (CV_8U | CV_16U | CV_32F)
    pattern2('Core', 'MultiplyScalar', '8U'),
    pattern2('Core', 'MultiplyScalar', '16U'),
    pattern2('Core', 'MultiplyScalar', '32F'),
    # Core_DivideMat (CV_8U | CV_16U | CV_32F)
    pattern2('Core', 'DivideMat', '8U'),
    pattern2('Core', 'DivideMat', '16U'),
    pattern2('Core', 'DivideMat', '32F'),
    # Core_Divide_Scalar (CV_8U | CV_16U | CV_32F)
    pattern2('Core', 'DivideScalar', '8U'),
    pattern2('Core', 'DivideScalar', '16U'),
    pattern2('Core', 'DivideScalar', '32F'),
    # Core_AbsDiff_Mat (CV_8U | CV_16U | CV_32F)
    pattern2('Core', 'AbsDiffMat', '8U'),
    pattern2('Core', 'AbsDiffMat', '16U'),
    pattern2('Core', 'AbsDiffMat', '32F'),
    # Core_AbsDiffScalar (CV_8U | CV_16U | CV_32F)
    pattern2('Core', 'AbsDiffScalar', '8U'),
    pattern2('Core', 'AbsDiffScalar', '16U'),
    pattern2('Core', 'AbsDiffScalar', '32F'),
    # Core_Abs
    pattern1('Core', 'Abs'),
    # Core_Sqr
    pattern1('Core', 'Sqr'),
    # Core_Sqrt
    pattern1('Core', 'Sqrt'),
    # Core_Log
    pattern1('Core', 'Log'),
    # Core_Exp
    pattern1('Core', 'Exp'),
    # Core_BitwiseAndScalar
    pattern1('Core', 'BitwiseAndScalar'),
    # Core_BitwiseOrScalar
    pattern1('Core', 'BitwiseOrScalar'),
    # Core_BitwiseXorScalar
    pattern1('Core', 'BitwiseXorScalar'),
    # Core_RShift
    pattern1('Core', 'RShift'),
    # Core_LShift
    pattern1('Core', 'LShift'),
    # Core_Transpose
    pattern1('Core', 'Transpose'),
    # Core_Flip
    pattern1('Core', 'Flip'),
    # Core_LutOneChannel
    pattern1('Core', 'LutOneChannel'),
    # Core_LutMultiChannel
    pattern1('Core', 'LutMultiChannel'),
    # Core_MagnitudeComplex
    pattern1('Core', 'MagnitudeComplex'),
    # Core_MagnitudeSqrComplex
    pattern1('Core', 'MagnitudeSqrComplex'),
    # Core_MeanStdDev
    pattern1('Core', 'MeanStdDev'),
    # Core_NormDiff
    pattern1('Core', 'NormDiff'),
    ##############################################################
    # Filters
    # Filters_Blur
    pattern1('Filters', 'Blur'),
    # Filters_Erode
    pattern1('Filters', 'Erode'),
    # Filters_Dilate
    pattern1('Filters', 'Dilate'),
    # Filters_MorphologyEx
    pattern1('Filters', 'MorphologyEx'),
    ##############################################################
    # ImgProc
    # ImgProc_Resize (8U, 1 | 4, INTER_NEAREST | INTER_LINEAR)
    pattern4('ImgProc', 'Resize', '8U', '1', 'INTER_NEAREST'),
    pattern4('ImgProc', 'Resize', '8U', '4', 'INTER_NEAREST'),
    pattern4('ImgProc', 'Resize', '8U', '1', 'INTER_LINEAR'),
    pattern4('ImgProc', 'Resize', '8U', '4', 'INTER_LINEAR'),
    # ImgProc_Resize (8U, 4, INTER_CUBIC)
    pattern4('ImgProc', 'Resize', '8U', '4', 'INTER_CUBIC'),
    # ImgProc_WarpAffine (8U | 32F, INTER_NEAREST | INTER_LINEAR | INTER_CUBIC, BORDER_CONSTANT)
    pattern4('ImgProc', 'WarpAffine', '8U' , 'INTER_NEAREST', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'WarpAffine', '8U' , 'INTER_LINEAR', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'WarpAffine', '8U' , 'INTER_CUBIC', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'WarpAffine', '32F', 'INTER_NEAREST', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'WarpAffine', '32F', 'INTER_LINEAR', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'WarpAffine', '32F', 'INTER_CUBIC', 'BORDER_CONSTANT'),
    # ImgProc_WarpPerspective (8U | 32F, INTER_NEAREST | INTER_LINEAR | INTER_CUBIC, BORDER_CONSTANT)
    pattern4('ImgProc', 'WarpPerspective', '8U' , 'INTER_NEAREST', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'WarpPerspective', '8U' , 'INTER_LINEAR', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'WarpPerspective', '8U' , 'INTER_CUBIC', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'WarpPerspective', '32F', 'INTER_NEAREST', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'WarpPerspective', '32F', 'INTER_LINEAR', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'WarpPerspective', '32F', 'INTER_CUBIC', 'BORDER_CONSTANT'),
    # ImgProc_CopyMakeBorder (8UC1 | 8UC4 | 32SC1 | 32FC1, BORDER_CONSTANT)
    pattern4('ImgProc', 'CopyMakeBorder', '8U' , '1', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'CopyMakeBorder', '8U' , '4', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'CopyMakeBorder', '32S', '1', 'BORDER_CONSTANT'),
    pattern4('ImgProc', 'CopyMakeBorder', '32F', '1', 'BORDER_CONSTANT'),
    # ImgProc_Threshold (32F, THRESH_TRUNC)
    pattern3('ImgProc', 'Threshold', '32F', 'THRESH_TRUNC'),
    # ImgProc_IntegralSqr
    pattern1('ImgProc', 'IntegralSqr'),
    # ImgProc_HistEven_OneChannel
    pattern1('ImgProc', 'HistEvenOneChannel'),
    # ImgProc_HistEven_FourChannel
    pattern1('ImgProc', 'HistEvenFourChannel'),
    # ImgProc_Rotate
    pattern1('ImgProc', 'Rotate'),
    # ImgProc_SwapChannels
    pattern1('ImgProc', 'SwapChannels'),
    # ImgProc_AlphaComp
    pattern1('ImgProc', 'AlphaComp'),
    # ImgProc_ImagePyramidBuild
    pattern1('ImgProc', 'ImagePyramidBuild'),
    # ImgProc_ImagePyramid_getLayer
    pattern1('ImgProc', 'ImagePyramidGetLayer'),
    ##############################################################
    # MatOp
    # MatOp_SetTo (8UC4 | 16UC1 | 16UC4 | 32FC1 | 32FC4)
    pattern3('MatOp', 'SetTo', '8U' , '4'),
    pattern3('MatOp', 'SetTo', '16U', '1'),
    pattern3('MatOp', 'SetTo', '16U', '4'),
    pattern3('MatOp', 'SetTo', '32F', '1'),
    pattern3('MatOp', 'SetTo', '32F', '4'),
    # MatOp_SetToMasked (8UC4 | 16UC1 | 16UC4 | 32FC1 | 32FC4)
    pattern3('MatOp', 'SetToMasked', '8U' , '4'),
    pattern3('MatOp', 'SetToMasked', '16U', '1'),
    pattern3('MatOp', 'SetToMasked', '16U', '4'),
    pattern3('MatOp', 'SetToMasked', '32F', '1'),
    pattern3('MatOp', 'SetToMasked', '32F', '4'),
    # MatOp_CopyToMasked (8UC1 | 8UC3 |8UC4 | 16UC1 | 16UC3 | 16UC4 | 32FC1 | 32FC3 | 32FC4)
    pattern3('MatOp', 'CopyToMasked', '8U' , '1'),
    pattern3('MatOp', 'CopyToMasked', '8U' , '3'),
    pattern3('MatOp', 'CopyToMasked', '8U' , '4'),
    pattern3('MatOp', 'CopyToMasked', '16U', '1'),
    pattern3('MatOp', 'CopyToMasked', '16U', '3'),
    pattern3('MatOp', 'CopyToMasked', '16U', '4'),
    pattern3('MatOp', 'CopyToMasked', '32F', '1'),
    pattern3('MatOp', 'CopyToMasked', '32F', '3'),
    pattern3('MatOp', 'CopyToMasked', '32F', '4'),
]
cublasPattern = pattern1('Core', 'GEMM')
cufftPattern = pattern1('ImgProc', 'Dft')
if __name__ == "__main__":
    inputFile = open(sys.argv[1], 'r')
    lines = inputFile.readlines()
    inputFile.close()
    for i in range(len(lines)):
        if cublasPattern.match(lines[i]):
            lines[i] = lines[i][:-1] + ' [CUBLAS]\n'
        else:
            if cufftPattern.match(lines[i]):
                lines[i] = lines[i][:-1] + ' [CUFFT]\n'
            else:
                for p in npp_patterns:
                    if p.match(lines[i]):
                        lines[i] = lines[i][:-1] + ' [NPP]\n'
    outputFile = open(sys.argv[2], 'w')
    outputFile.writelines(lines)
    outputFile.close()