@Test
    public void testSoftmax1() throws ParseException {
        Tensor x = evaluate("tensor(d0[1],d1[3]):[-1, 0, 1]");
        assertEval("softmax", x, evaluate("tensor(d0[1],d1[3]):[0.09003058, 0.24472848, 0.66524094]"));

        x = evaluate("tensor(d0[2],d1[3]):[1, 2, 3, 4, 5, 7]");
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d1)", x));
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d0, d1)", x), createAttribute("axis", 0));
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d1)", x), createAttribute("axis", 1)); // 1 is default
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d1)", x), createAttribute("axis", -1));
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d0, d1)", x), createAttribute("axis", -2));

        x = evaluate("random(d0[2],d1[3],d2[4])");
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d1, d2)", x));
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d0, d1, d2)", x), createAttribute("axis", 0));
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d1, d2)", x), createAttribute("axis", 1));
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d2)", x), createAttribute("axis", 2));
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d2)", x), createAttribute("axis", -1));
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d1, d2)", x), createAttribute("axis", -2));
        assertEval("softmax", x, evaluate("exp(x) / sum(exp(x), d0, d1, d2)", x), createAttribute("axis", -3));
    }
Unit tests for ONNX operators. The number on the test reflects the minimum
opset number for the operations tested.

@author lesters
model-integration/src/test/java/ai/vespa/rankingexpression/importer/onnx/OnnxOperationsTestCase.java