Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
4677230
Remove numpy pin
pgleeson Jun 18, 2025
e33e630
Use () not None as default for shape
pgleeson Jun 20, 2025
93e7083
More fixes for shape with () for default
pgleeson Jun 20, 2025
ebdfe2f
Merge pull request #552 from ModECI/experimental
pgleeson Jun 23, 2025
466d36f
Regenerated images
pgleeson Jun 23, 2025
44fe9b9
Merge pull request #553 from ModECI/experimental
pgleeson Jun 23, 2025
ec77723
Fix onnx IR version issue.
davidt0x Jul 30, 2025
cfbf14a
Debug mac os hanging tests.
davidt0x Jul 31, 2025
a690030
Debug mac os hanging tests.
davidt0x Jul 31, 2025
b0c727a
Debug mac os hanging tests.
davidt0x Jul 31, 2025
e1e6aa3
Debug mac os hanging tests.
davidt0x Jul 31, 2025
ff3cb34
Debug mac os hanging tests.
davidt0x Jul 31, 2025
af1378e
Debug mac os hanging tests.
davidt0x Jul 31, 2025
7b4ed91
Move to pyproject.toml
davidt0x Aug 1, 2025
42ea855
Move to uv
davidt0x Aug 1, 2025
8d54313
Move to uv
davidt0x Aug 1, 2025
fe51b29
Drop python 3.9, EOL in Oct 2025
davidt0x Aug 1, 2025
f23f16b
Fix missing tensorflow pytest marker config.
davidt0x Aug 1, 2025
3d9b253
Fix missing tensorflow pytest marker config.
davidt0x Aug 1, 2025
ff0a78d
Skip vit_b_16 model
davidt0x Aug 1, 2025
827b4ee
Vit not failing.
davidt0x Aug 1, 2025
ba81f22
Bump tensorflow.
davidt0x Aug 1, 2025
5fb5fc1
Exclude tensorflow tests on windows, no wheel support now.
davidt0x Aug 1, 2025
96408d2
Fix docs build.
davidt0x Aug 1, 2025
a5e16ce
Fix weird import for keras_model.py.
davidt0x Aug 1, 2025
45828cf
Black reformat examples.
davidt0x Aug 1, 2025
8d5b014
Add concurrency block to ci.yml.
davidt0x Aug 1, 2025
0c07ef2
Add paralell running of each test-suite.
davidt0x Aug 5, 2025
a2df2cb
Fix python version.
davidt0x Aug 5, 2025
9c3ea23
Fix deps install.
davidt0x Aug 5, 2025
73fd52c
Force bash on windows.
davidt0x Aug 5, 2025
8e31063
Fix imports in tensorflow examples.
davidt0x Aug 5, 2025
be5568e
Force bash shell on windows for "Run tests"
davidt0x Aug 5, 2025
1409e55
Update ci_test_all.yml
pgleeson Aug 6, 2025
decfe8a
Regenerating many files
pgleeson Aug 13, 2025
d2449d2
More tests
pgleeson Aug 13, 2025
b3be388
Adding link to Neuron paper on Readme
pgleeson Aug 20, 2025
7e29759
Merge branch 'development' of https://github.com/ModECI/MDF into fix/…
davidt0x Sep 3, 2025
9216c3f
Shorten job name.
davidt0x Sep 10, 2025
0579c77
Make the keras_model.py name unique for IRIS and TensorFlow examples.
davidt0x Sep 10, 2025
d393450
Add missing model return.
davidt0x Sep 10, 2025
ff871a8
Pre-commit
davidt0x Sep 10, 2025
c80f21f
Try Python 3.13
davidt0x Sep 10, 2025
92a1b0f
Unpin torchvision
davidt0x Sep 10, 2025
724c805
Fix build docs, install uv
davidt0x Sep 11, 2025
60535f4
Drop 3.9
davidt0x Sep 11, 2025
55621ad
Add install of dev dependency group
davidt0x Sep 11, 2025
c831168
Remove dev from all extra.
davidt0x Sep 11, 2025
7a7659d
Fix runs of keras_model.py.
davidt0x Sep 11, 2025
66b6ce0
Add all-passed job
davidt0x Sep 11, 2025
8844e37
Make test_all run on Python 3.13
davidt0x Sep 11, 2025
c5bfc4a
Pre-commit
davidt0x Sep 11, 2025
cdfe910
Merge pull request #557 from ModECI/fix/onnx_ir_pin
pgleeson Sep 17, 2025
ee8a300
Tweak
pgleeson Sep 18, 2025
fc2370d
Regenerated multiple png & doc files
pgleeson Sep 18, 2025
1cf162f
Merge branch 'version_update' into test_onnx_ir_pg
pgleeson Sep 18, 2025
fdb6679
Merge pull request #558 from ModECI/test_onnx_ir_pg
pgleeson Sep 19, 2025
4edc149
Merge pull request #556 from ModECI/fix/onnx_ir_pin
pgleeson Sep 19, 2025
bfa9c5a
Merge pull request #559 from ModECI/version_update
pgleeson Sep 19, 2025
b3aa648
To v0.4.13
pgleeson Sep 19, 2025
c458ea0
Merge pull request #560 from ModECI/experimental
pgleeson Sep 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
231 changes: 113 additions & 118 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,138 +5,133 @@ on:
pull_request:
push:
release:
types:
- published
types: [published]

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
pre-commit:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.10"
- uses: pre-commit/action@v3.0.1
with:
extra_args: --hook-stage manual --all-files

checks:
name: Check Python ${{ matrix.python-version }} on ${{ matrix.runs-on }}
runs-on: ${{ matrix.runs-on }}
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.10'
- uses: pre-commit/action@v3.0.1
with:
extra_args: --hook-stage manual --all-files

tests:
name: ${{ matrix.test-suite }}, py ${{ matrix.python-version }}, ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
python-version: [ "3.9", "3.11", "3.12"]
runs-on: [ubuntu-latest, macos-latest, windows-latest]
python-version: ['3.10', '3.13']
os: [ubuntu-latest, macos-latest, windows-latest]
test-suite: [core, actr, pytorch, neuroml, tensorflow, psyneulink]
exclude:
- runs-on: macos-latest
python-version: "3.9"
- os: windows-latest
test-suite: tensorflow

steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

# Rely on version of modelspec from PyPI as set by setup.cfg...
#- name: Install modelspec
# run: python -m pip install git+https://github.com/ModECI/modelspec.git@main

# Rely on version of NeuroMLlite from PyPI as set by setup.py...
# - name: Install NeuroMLlite
# run: python -m pip install NeuroMLlite>=0.5.0

# Rely on version of PsyNeuLink from PyPI as set by setup.py...
#- name: Install specific PsyNeuLink branch
# run: python -m pip install git+https://github.com/ModECI/PsyNeuLink@devel

- name: Install HDF5 for pytables on macos-14/latest
if: ${{ matrix.runs-on == 'macos-latest' }}
run: |
brew install hdf5

- name: Install core package
run: |
pip install 'numpy<2.0.0' # due to lingering issues with other modules & numpy v2...
python -m pip install .[dev]

- name: Version info for installed packages
run: |
pip list

- name: Test core package
run: |
python -m pytest -m coremdf tests/

- name: Install most optional dependencies
run: |
python -m pip install .[optional]

- name: Version info for optional installed packages
run: |
pip list

- name: Install graphviz
uses: ts-graphviz/setup-graphviz@v2
with:
# Skip to run brew update command on macOS.
macos-skip-brew-update: 'true' # default false

- name: Test interface ACT-R
run: |
python -m pytest -v -m "actr" tests/

- name: Test interface PyTorch
run: |
python -m pytest -v -m "pytorch" tests/

- name: Test interface NeuroML
run: |
python -m pip install .[neuroml]
python -m pytest -v -m "neuroml" tests/

- name: Test interface TensorFlow
run: |
python -m pip install .[tensorflow]
dot -V
python -m pytest -v -m "tensorflow" tests/

- name: Test interface PsyNeuLink
run: |
python -m pip install .[psyneulink]
python -m pytest -v -m "psyneulink" tests/

- name: Build Documentation
run: |
cd docs
python generate.py
cd sphinx
make clean
make html

- name: Final version info for optional installed packages
run: |
pip list
- uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Install uv and set the python version
uses: astral-sh/setup-uv@v6
with:
python-version: ${{ matrix.python-version }}

- name: Install HDF5 for pytables on macos-14/latest
if: ${{ matrix.runs-on == 'macos-latest' }}
run: |
brew install hdf5

- name: Install graphviz
uses: ts-graphviz/setup-graphviz@v2
with:
# Skip to run brew update command on macOS.
macos-skip-brew-update: 'true' # default false

- name: Install extras for ${{ matrix.test-suite }}
shell: bash
run: |
uv sync --dev
case "${{ matrix.test-suite }}" in
pytorch) uv sync --extra "optional" --dev ;;
neuroml) uv sync --extra "neuroml" --dev ;;
tensorflow) uv sync --extra "tensorflow" --dev ;;
psyneulink) uv sync --extra "psyneulink" --dev ;;
esac

- name: Run ${{ matrix.test-suite }} tests
shell: bash
run: |
MARKER="${{ matrix.test-suite }}"
if [ "${{ matrix.test-suite }}" = "core" ]; then
MARKER="coremdf"
fi
uv run pytest -v -m "${MARKER}" tests/

docs:
name: Build Documentation
needs: tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install uv and set the python version
uses: astral-sh/setup-uv@v6
with:
python-version: '3.10'
- name: Generate and Build Docs
run: |
uv sync --group docs
cd docs
uv run generate.py
cd sphinx
uv run make clean
uv run make html

dist:
name: Distribution build
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Build sdist and wheel
run: pipx run --spec build pyproject-build

- uses: actions/upload-artifact@v4
with:
path: dist

- uses: pypa/gh-action-pypi-publish@v1.4.1
if: github.event_name == 'release' && github.event.action == 'published'
with:
user: __token__
# Remember to generate this and set it in "GitHub Secrets"
password: ${{ secrets.pypi_password }}
- uses: actions/checkout@v4
- name: Build sdist & wheel
run: pipx run --spec build pyproject-build
- uses: actions/upload-artifact@v4
with:
path: dist
- uses: pypa/gh-action-pypi-publish@v1.4.1
if: github.event_name == 'release' && github.event.action == 'published'
with:
user: __token__
password: ${{ secrets.pypi_password }}

all-passed:
runs-on: ubuntu-latest
needs:
- pre-commit
- tests
- docs
- dist
if: always()
steps:
- name: Fail if any dependency did not succeed
run: |
echo "Upstream results: ${{ join(needs.*.result, ', ') }}"
# If any result is failure/cancelled/skipped, fail this job
if [[ "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') }}" == "true" ]]; then
exit 1
fi
13 changes: 3 additions & 10 deletions .github/workflows/ci_test_all.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: CI Test script

on:
push:
branches: [ main, development, experimental, test*, nml* ]
branches: [ main, development, experimental, test*, nml*, version* ]
pull_request:
branches: [ main, development, experimental, test*, nml* ]
branches: [ main, development, experimental, test*, nml*, version* ]

jobs:

Expand All @@ -14,7 +14,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: [ "3.10"]
python-version: [ "3.13"]
runs-on: [ubuntu-latest]

steps:
Expand Down Expand Up @@ -43,10 +43,3 @@ jobs:
- name: Version info for installed packages
run: |
pip list




- name: Final version info for optional installed packages
run: |
pip list
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@
**Note: MDF is still in development! See the [open issues related to the specification](https://github.com/ModECI/MDF/issues?q=is%3Aissue+is%3Aopen+label%3Aspecification) or go [here](http://modeci.org/#contactPage) to get in contact regarding MDF.**
*The MDF format was first proposed following a meeting organised at Princeton in July 2019 by Russ Poldrack of the Center for Reproducible Neuroscience (CRN) at Stanford and the [Brain Imaging Data Standard (BIDS)](https://bids.neuroimaging.io/) initiative. For more on the previous work in this area, see [here](https://github.com/OpenSourceBrain/PsyNeuLinkShowcase/tree/master/BIDS-MDF).*

## Paper introducing MDF

The background to the ModECI project, the motivation for developing the Model Description Format, and the initial Python implementation of the language have been described in a NeuroView article in the Neuron journal:

*<b>Integrating model development across computational neuroscience, cognitive science, and machine learning</b>*
Padraig Gleeson, Sharon Crook, David Turner, Katherine Mantel, Mayank Raunak, Ted Willke and Jonathan D. Cohen, April 25, 2023 DOI: [https://doi.org/10.1016/j.neuron.2023.03.037](https://doi.org/10.1016/j.neuron.2023.03.037)


## Overview

Expand Down
8 changes: 4 additions & 4 deletions docs/MDF_function_specifications.json
Original file line number Diff line number Diff line change
Expand Up @@ -686,15 +686,15 @@
"expression_string": "onnx_ops.lppool(X, auto_pad, kernel_shape, p, pads, strides)"
},
"onnx::MatMul": {
"description": "\nMatrix product that behaves like numpy.matmul: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.matmul.html\n",
"description": "\nMatrix product that behaves like [numpy.matmul](https://numpy.org/doc/stable/reference/generated/numpy.matmul.html).\n",
"arguments": [
"A",
"B"
],
"expression_string": "onnx_ops.matmul(A, B)"
},
"onnx::MatMulInteger": {
"description": "\nMatrix product that behaves like numpy.matmul: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.matmul.html.\nThe production MUST never overflow. The accumulation may overflow if and only if in 32 bits.\n",
"description": "\nMatrix product that behaves like [numpy.matmul](https://numpy.org/doc/stable/reference/generated/numpy.matmul.html).\nThe production MUST never overflow. The accumulation may overflow if and only if in 32 bits.\n",
"arguments": [
"A",
"B",
Expand All @@ -711,7 +711,7 @@
"expression_string": "onnx_ops.max(data_0)"
},
"onnx::MaxPool": {
"description": "\n MaxPool consumes an input tensor X and applies max pooling across\n the tensor according to kernel sizes, stride sizes, and pad lengths.\n max pooling consisting of computing the max on all values of a\n subset of the input tensor according to the kernel size and downsampling the\n data into the output tensor Y for further processing. The output spatial shape is calculated differently\n depending on whether explicit padding is used, where pads is employed, or auto padding is used, where auto_pad is utilized.\n With explicit padding (https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html?highlight=maxpool#torch.nn.MaxPool2d):\n ```\n output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1)\n ```\n or\n ```\n output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1)\n ```\n if ceil_mode is enabled. `pad_shape[i]` is the sum of pads along axis `i`. Sliding windows that would start in the right padded region are ignored.\n\n `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following when ceil_mode is enabled:\n ```\n VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i])\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i])\n ```\n or when ceil_mode is disabled (https://www.tensorflow.org/api_docs/python/tf/keras/layers/AveragePooling2D):\n ```\n VALID: output_spatial_shape[i] = floor((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i]) + 1\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = floor((input_spatial_shape[i] - 1) / strides_spatial_shape[i]) + 1\n ```\n And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`:\n ```\n pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i]\n ```\n The output of each pooling window is maximum number of elements exclude pad. \n ",
"description": "\n MaxPool consumes an input tensor X and applies max pooling across\n the tensor according to kernel sizes, stride sizes, and pad lengths.\n max pooling consisting of computing the max on all values of a\n subset of the input tensor according to the kernel size and downsampling the\n data into the output tensor Y for further processing. The output spatial shape is calculated differently\n depending on whether explicit padding is used, where pads is employed, or auto padding is used, where auto_pad is utilized.\n With explicit padding (https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html?highlight=maxpool#torch.nn.MaxPool2d):\n ```\n output_spatial_shape[i] = floor((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1)\n ```\n or\n ```\n output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1)\n ```\n if ceil_mode is enabled. `pad_shape[i]` is the sum of pads along axis `i`.\n\n `auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following when ceil_mode is enabled:\n ```\n VALID: output_spatial_shape[i] = ceil((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) + 1) / strides_spatial_shape[i])\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides_spatial_shape[i])\n ```\n or when ceil_mode is disabled (https://www.tensorflow.org/api_docs/python/tf/keras/layers/AveragePooling2D):\n ```\n VALID: output_spatial_shape[i] = floor((input_spatial_shape[i] - ((kernel_spatial_shape[i] - 1) * dilations[i] + 1)) / strides_spatial_shape[i]) + 1\n SAME_UPPER or SAME_LOWER: output_spatial_shape[i] = floor((input_spatial_shape[i] - 1) / strides_spatial_shape[i]) + 1\n ```\n And pad shape will be following if `SAME_UPPER` or `SAME_LOWER`:\n ```\n pad_shape[i] = (output_spatial_shape[i] - 1) * strides_spatial_shape[i] + ((kernel_spatial_shape[i] - 1) * dilations[i] + 1) - input_spatial_shape[i]\n ```\n The output of each pooling window is maximum number of elements exclude pad. \n ",
"arguments": [
"X"
],
Expand Down Expand Up @@ -900,7 +900,7 @@
"expression_string": "onnx_ops.qlinearconv(x, x_scale, x_zero_point, w, w_scale, w_zero_point, y_scale, y_zero_point, B, auto_pad, dilations, group, kernel_shape, pads, strides)"
},
"onnx::QLinearMatMul": {
"description": "\nMatrix product that behaves like numpy.matmul: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.matmul.html.\nIt consumes two quantized input tensors, their scales and zero points, scale and zero point of output,\nand computes the quantized output. The quantization formula is y = saturate((x / y_scale) + y_zero_point).\nFor (x / y_scale), it is rounding to nearest ties to even. Refer to https://en.wikipedia.org/wiki/Rounding for details.\nScale and zero point must have same shape. They must be either scalar (per tensor) or N-D tensor\n(per row for 'a' and per column for 'b'). Scalar refers to per tensor quantization whereas N-D refers to per row\nor per column quantization. If the input is 2D of shape [M, K] then zero point and scale tensor may be\nan M element vector [v_1, v_2, ..., v_M] for per row quantization and K element vector of shape [v_1, v_2, ..., v_K]\nfor per column quantization. If the input is N-D tensor with shape [D1, D2, M, K] then zero point and scale tensor may\nhave shape [D1, D2, M, 1] for per row quantization and shape [D1, D2, 1, K] for per column quantization.\nProduction must never overflow, and accumulation may overflow if and only if in 32 bits.\n",
"description": "\nMatrix product that behaves like [numpy.matmul](https://numpy.org/doc/stable/reference/generated/numpy.matmul.html).\nIt consumes two quantized input tensors, their scales and zero points, scale and zero point of output,\nand computes the quantized output. The quantization formula is y = saturate((x / y_scale) + y_zero_point).\nFor (x / y_scale), it is rounding to nearest ties to even. Refer to https://en.wikipedia.org/wiki/Rounding for details.\nScale and zero point must have same shape. They must be either scalar (per tensor) or N-D tensor\n(per row for 'a' and per column for 'b'). Scalar refers to per tensor quantization whereas N-D refers to per row\nor per column quantization. If the input is 2D of shape [M, K] then zero point and scale tensor may be\nan M element vector [v_1, v_2, ..., v_M] for per row quantization and K element vector of shape [v_1, v_2, ..., v_K]\nfor per column quantization. If the input is N-D tensor with shape [D1, D2, M, K] then zero point and scale tensor may\nhave shape [D1, D2, M, 1] for per row quantization and shape [D1, D2, 1, K] for per column quantization.\nProduction must never overflow, and accumulation may overflow if and only if in 32 bits.\n",
"arguments": [
"a",
"a_scale",
Expand Down
8 changes: 4 additions & 4 deletions docs/MDF_function_specifications.md
Original file line number Diff line number Diff line change
Expand Up @@ -1685,7 +1685,7 @@ Python version: `onnx_ops.lppool(X, auto_pad, kernel_shape, p, pads, strides)`

## MatMul
<p><i>
Matrix product that behaves like numpy.matmul: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.matmul.html
Matrix product that behaves like [numpy.matmul](https://numpy.org/doc/stable/reference/generated/numpy.matmul.html).
</i></p>

Python version: `onnx_ops.matmul(A, B)`
Expand All @@ -1695,7 +1695,7 @@ Python version: `onnx_ops.matmul(A, B)`

## MatMulInteger
<p><i>
Matrix product that behaves like numpy.matmul: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.matmul.html.
Matrix product that behaves like [numpy.matmul](https://numpy.org/doc/stable/reference/generated/numpy.matmul.html).
The production MUST never overflow. The accumulation may overflow if and only if in 32 bits.
</i></p>

Expand Down Expand Up @@ -1732,7 +1732,7 @@ Python version: `onnx_ops.max(data_0)`
```
output_spatial_shape[i] = ceil((input_spatial_shape[i] + pad_shape[i] - dilation[i] * (kernel_shape[i] - 1) - 1) / strides_spatial_shape[i] + 1)
```
if ceil_mode is enabled. `pad_shape[i]` is the sum of pads along axis `i`. Sliding windows that would start in the right padded region are ignored.
if ceil_mode is enabled. `pad_shape[i]` is the sum of pads along axis `i`.

`auto_pad` is a DEPRECATED attribute. If you are using them currently, the output spatial shape will be following when ceil_mode is enabled:
```
Expand Down Expand Up @@ -2237,7 +2237,7 @@ Python version: `onnx_ops.qlinearconv(x, x_scale, x_zero_point, w, w_scale, w_ze

## QLinearMatMul
<p><i>
Matrix product that behaves like numpy.matmul: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.matmul.html.
Matrix product that behaves like [numpy.matmul](https://numpy.org/doc/stable/reference/generated/numpy.matmul.html).
It consumes two quantized input tensors, their scales and zero points, scale and zero point of output,
and computes the quantized output. The quantization formula is y = saturate((x / y_scale) + y_zero_point).
For (x / y_scale), it is rounding to nearest ties to even. Refer to https://en.wikipedia.org/wiki/Rounding for details.
Expand Down
Loading
Loading