chromium/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/reduce_log_sum_exp.https.any.js

// META: title=test WebNN API reduction operations
// META: global=window,dedicatedworker
// META: variant=?cpu
// META: variant=?gpu
// META: variant=?npu
// META: script=../resources/utils.js
// META: timeout=long

'use strict';

// https://www.w3.org/TR/webnn/#dom-mlgraphbuilder-reducelogsumexp
// Reduce the input tensor along all dimensions, or along the axes specified in
// the axes array parameter.
//
// dictionary MLReduceOptions {
//   sequence<[EnforceRange] unsigned long> axes;
//   boolean keepDimensions = false;
// };
//
// MLOperand reduceLogSumExp(MLOperand input, optional MLReduceOptions options
// = {});

const getReductionOperatorsPrecisionTolerance = (graphResources) => {
  return {
    metricType: 'ULP',
    value: getReducedElementCount(graphResources) * 2 + 18,
  };
};

const reduceLogSumExpTests = [
  {
    'name': 'reduceLogSumExp float32 0D constant tensor default options',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [0.7974132895469666],
          'descriptor': {'dimensions': [], 'dataType': 'float32'},
          'constant': true
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [{'input': 'reduceLogSumExpInput'}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 0.7974132895469666,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 0D constant tensor empty axes',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [0.7974132895469666],
          'descriptor': {'dimensions': [], 'dataType': 'float32'},
          'constant': true
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments':
            [{'input': 'reduceLogSumExpInput'}, {'options': {'axes': []}}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 0.7974132895469666,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name':
        'reduceLogSumExp float32 1D constant tensor all positive default options',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [24], 'dataType': 'float32'},
          'constant': true
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [{'input': 'reduceLogSumExpInput'}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 10.39477825164795,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 1D tensor all positive default options',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [24], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [{'input': 'reduceLogSumExpInput'}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 10.39477825164795,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 1D tensor all negative default options',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            -4.025670051574707,  -9.444348335266113,   -3.1193981170654297,
            -5.943697929382324,  -0.3701804578304291,  -4.397126197814941,
            -6.605968475341797,  -5.534277439117432,   -7.361471176147461,
            -1.9987547397613525, -9.093968391418457,   -8.693618774414062,
            -8.416788101196289,  -1.010741114616394,   -9.814584732055664,
            -9.725259780883789,  -9.157071113586426,   -0.001698818989098072,
            -9.963415145874023,  -5.991659641265869,   -6.180599689483643,
            -1.2336505651474,    -0.44234341382980347, -6.990072250366211
          ],
          'descriptor': {'dimensions': [24], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [{'input': 'reduceLogSumExpInput'}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 1.1666961908340454,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name':
        'reduceLogSumExp float32 1D tensor all positive integers default options',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            1, 5, 7, 5, 7, 5, 4, 2, 1, 5, 8, 2,
            4, 1, 4, 5, 4, 8, 6, 2, 7, 7, 8, 5
          ],
          'descriptor': {'dimensions': [24], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [{'input': 'reduceLogSumExpInput'}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 9.607237815856934,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name':
        'reduceLogSumExp float32 1D tensor all negative integers default options',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            -6, -3, -5,  -1,  -9, -5, -1, -2, -10, -1, -5, -7,
            -7, -3, -10, -10, -8, -6, -2, -6, -1,  -9, -5, -2
          ],
          'descriptor': {'dimensions': [24], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [{'input': 'reduceLogSumExpInput'}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 0.7001367211341858,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 2D tensor default options',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [4, 6], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [{'input': 'reduceLogSumExpInput'}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 10.39477825164795,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 3D tensor default options',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 3, 4], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [{'input': 'reduceLogSumExpInput'}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 10.39477825164795,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 4D tensor default options',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 2, 2, 3], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [{'input': 'reduceLogSumExpInput'}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 10.39477825164795,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 5D tensor default options',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 1, 4, 1, 3], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [{'input': 'reduceLogSumExpInput'}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 10.39477825164795,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 3D tensor options.axes',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 3, 4], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments':
            [{'input': 'reduceLogSumExpInput'}, {'options': {'axes': [2]}}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': [
            8.55212688446045, 3.985233783721924, 5.52872896194458,
            9.081488609313965, 6.996237754821777, 9.759706497192383
          ],
          'descriptor': {'dimensions': [2, 3], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 4D tensor options.axes',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 2, 2, 3], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments':
            [{'input': 'reduceLogSumExpInput'}, {'options': {'axes': [0, 2]}}],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': [
            4.66951847076416, 9.08117961883545, 8.533217430114746,
            9.270560264587402, 6.450263977050781, 8.917200088500977
          ],
          'descriptor': {'dimensions': [2, 3], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 3D tensor options.keepDimensions=false',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 3, 4], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [
          {'input': 'reduceLogSumExpInput'},
          {'options': {'keepDimensions': false}}
        ],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 10.39477825164795,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 3D tensor options.keepDimensions=true',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 3, 4], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [
          {'input': 'reduceLogSumExpInput'},
          {'options': {'keepDimensions': true}}
        ],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': [10.39477825164795],
          'descriptor': {'dimensions': [1, 1, 1], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 4D tensor options.keepDimensions=false',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 2, 2, 3], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [
          {'input': 'reduceLogSumExpInput'},
          {'options': {'keepDimensions': false}}
        ],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': 10.39477825164795,
          'descriptor': {'dimensions': [], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name': 'reduceLogSumExp float32 4D tensor options.keepDimensions=true',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 2, 2, 3], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [
          {'input': 'reduceLogSumExpInput'},
          {'options': {'keepDimensions': true}}
        ],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': [10.39477825164795],
          'descriptor': {'dimensions': [1, 1, 1, 1], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name':
        'reduceLogSumExp float32 4D tensor options.axes with options.keepDimensions=false',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 2, 2, 3], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [
          {'input': 'reduceLogSumExpInput'},
          {'options': {'axes': [1, 3], 'keepDimensions': false}}
        ],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': [
            8.563796997070312, 5.500619411468506, 9.753945350646973,
            9.20864486694336
          ],
          'descriptor': {'dimensions': [2, 2], 'dataType': 'float32'}
        }
      }
    }
  },
  {
    'name':
        'reduceLogSumExp float32 4D tensor options.axes with options.keepDimensions=true',
    'graph': {
      'inputs': {
        'reduceLogSumExpInput': {
          'data': [
            0.7974132895469666,  5.046889781951904,   8.520371437072754,
            1.4063042402267456,  0.11882661283016205, 0.2858544886112213,
            1.9325640201568604,  3.7939958572387695,  2.6040232181549072,
            4.937509536743164,   4.571482181549072,   0.786512017250061,
            0.21018670499324799, 9.063042640686035,   4.099809646606445,
            4.596248626708984,   0.2549232244491577,  1.159480094909668,
            6.802876949310303,   5.234325408935547,   8.914905548095703,
            9.166799545288086,   5.717507362365723,   0.3255050778388977
          ],
          'descriptor': {'dimensions': [2, 2, 2, 3], 'dataType': 'float32'}
        }
      },
      'operators': [{
        'name': 'reduceLogSumExp',
        'arguments': [
          {'input': 'reduceLogSumExpInput'},
          {'options': {'axes': [1, 3], 'keepDimensions': true}}
        ],
        'outputs': 'reduceLogSumExpOutput'
      }],
      'expectedOutputs': {
        'reduceLogSumExpOutput': {
          'data': [
            8.563796997070312, 5.500619411468506, 9.753945350646973,
            9.20864486694336
          ],
          'descriptor': {'dimensions': [2, 1, 2, 1], 'dataType': 'float32'}
        }
      }
    }
  }
];

if (navigator.ml) {
  reduceLogSumExpTests.forEach((test) => {
    webnn_conformance_test(
        buildGraphAndCompute, getReductionOperatorsPrecisionTolerance, test);
  });
} else {
  test(() => assert_implements(navigator.ml, 'missing navigator.ml'));
}