File size: 11,150 Bytes
c3d0544
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
# PhysicsNeMo Contribution Guide

## Introduction

Welcome to Project PhysicsNeMo! We're excited you're here and want to contribute.
This documentation is intended for individuals and institutions interested in
contributing to PhysicsNeMo. PhysicsNeMo is an open-source project and, as such, its
success relies on its community of contributors willing to keep improving it.
Your contribution will be a valued addition to the code base; we simply ask
that you read this page and understand our contribution process, whether you
are a seasoned open-source contributor or whether you are a first-time
contributor.

### Communicate with Us

We are happy to talk with you about your needs for PhysicsNeMo and your ideas for
contributing to the project. One way to do this is to create an issue discussing
your thoughts. It might be that a very similar feature is under development or
already exists, so an issue is a great starting point. If you are looking for an
issue to resolve that will help, refer to the
[issue](https://github.com/NVIDIA/physicsnemo/issues) section.
If you are considering collaborating with NVIDIA PhysicsNeMo team to enhance PhysicsNeMo,
fill this [proposal form](https://forms.gle/fYsbZEtgRWJUQ3oQ9) and
we will get back to you.

## Contribute to PhysicsNeMo-Core

### Pull Requests

Developer workflow for code contributions is as follows:

1. Developers must first [fork](https://help.github.com/en/articles/fork-a-repo)
the [upstream](https://github.com/NVIDIA/physicsnemo) PhysicsNeMo repository.

2. Git clone the forked repository and push changes to the personal fork.

3. Once the code changes are staged on the fork and ready for review, a
[Pull Request](https://help.github.com/en/articles/about-pull-requests) (PR)
can be [requested](https://help.github.com/en/articles/creating-a-pull-request)
to merge the changes from a branch of the fork into a selected branch of upstream.

    - Exercise caution when selecting the source and target branches for the PR.
    - Ensure that you update the [`CHANGELOG.md`](CHANGELOG.md) to reflect your contributions.
    - Creation of a PR creation kicks off CI and a code review process.
    - Atleast one PhysicsNeMo engineer will be assigned for the review.

4. The PR will be accepted and the corresponding issue closed after adequate review and
testing has been completed. Note that every PR should correspond to an open issue and
should be linked on Github.

### Licensing Information

All source code files should start with this paragraph:

```bash
# SPDX-FileCopyrightText: Copyright (c) 2023 - 2024 NVIDIA CORPORATION & AFFILIATES.
# SPDX-FileCopyrightText: All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
```

### Signing Your Work

- We require that all contributors "sign-off" on their commits. This certifies that the
contribution is your original work, or you have rights to submit it under the same
license, or a compatible license.

  - Any contribution which contains commits that are not Signed-Off will not be accepted.

- To sign off on a commit you simply use the `--signoff` (or `-s`) option when
committing your changes:

  ```bash
  git commit -s -m "Add cool feature."
  ```

  This will append the following to your commit message:

  ```text
  Signed-off-by: Your Name <your@email.com>
  ```

- Full text of the DCO:

  ```text
    Developer Certificate of Origin
    Version 1.1

    Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
    1 Letterman Drive
    Suite D4700
    San Francisco, CA, 94129

    Everyone is permitted to copy and distribute verbatim copies of this license 
    document, but changing it is not allowed.
  ```

  ```text
    Developer's Certificate of Origin 1.1

    By making a contribution to this project, I certify that:

    (a) The contribution was created in whole or in part by me and I have the right to 
    submit it under the open source license indicated in the file; or

    (b) The contribution is based upon previous work that, to the best of my knowledge,
    is covered under an appropriate open source license and I have the right under that
    license to submit that work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am permitted to submit under a
    different license), as indicated in the file; or

    (c) The contribution was provided directly to me by some other person who certified
    (a), (b) or (c) and I have not modified it.

    (d) I understand and agree that this project and the contribution are public and
    that a record of the contribution (including all personal information I submit with
    it, including my sign-off) is maintained indefinitely and may be redistributed
    consistent with this project or the open source license(s) involved.

  ```

### Pre-commit

For PhysicsNeMo development, [pre-commit](https://pre-commit.com/) is **required**.
This will not only help developers pass the CI pipeline, but also accelerate reviews.
Contributions that have not used pre-commit will *not be reviewed*.

`pre-commit` is installed as part of the `dev` optional dependencies defined in `pyproject.toml`.
To install `pre-commit` in an existing environment, follow the below steps inside the PhysicsNeMo
repository folder:

```bash
pip install pre-commit
pre-commit install
```

Once the above commands are executed, the pre-commit hooks will be activated and all
the commits will be checked for appropriate formatting.

### Continuous Integration (CI)

To ensure quality of the code, your merge request (MR) will pass through several CI checks.
It is mandatory for your MRs to pass these pipelines to ensure a successful merge.
Please keep checking this document for the latest guidelines on pushing code. Currently,
The pipeline has following stages:

1. `format`
    *Pre-commit will check this for you!* Checks for formatting of your
    Python code, using `ruff format` via [Ruff](https://docs.astral.sh/ruff/).
    If your MR fails this test, run `ruff format <script-name>.py` on
    problematic scripts and Ruff will take care of the rest.

2. `interrogate`
   *Pre-commit will check this for you!*
   Checks if the code being pushed is well documented. The goal is to make the
   documentation live inside code. Very few exceptions are made.
   Elements that are fine to have no documentation include `init-module`, `init-method`,
   `private` and `semiprivate` classes/functions and `dunder` methods. For definitions of
   these, refer [interrogate](https://interrogate.readthedocs.io/en/latest/). Meaning for
   some methods/functions is very explicit and exceptions for these are made. These
   include `forward`, `reset_parameters`, `extra_repr`, `MetaData`. If your MR fails this
   test, add the missing documentation. Take a look at the pipeline output for hints on
   which functions/classes need documentation.
   To test the documentation before making a commit, you can run the following during
   your development

    ```bash
    interrogate \
      --ignore-init-method \
      --ignore-init-module \
      --ignore-module \
      --ignore-private \
      --ignore-semiprivate \
      --ignore-magic \
      --fail-under 99 \
      --exclude '[setup.py]' \
      --ignore-regex forward \
      --ignore-regex reset_parameters \
      --ignore-regex extra_repr \
      --ignore-regex MetaData \
      -vv \
      --color \
      ./physicsnemo/
    ```

3. `lint`
    *Pre-commit will check this for you!*
    Linters will perform static analysis to check the style, complexity, errors
    and more. For markdown files `markdownlint` is used, its suggested to use
    the vscode, neovim or sublime
    [extensions](https://github.com/DavidAnson/markdownlint#related).
    PhysicsNeMo uses `ruff check` via[Ruff](https://docs.astral.sh/ruff/) for
    linting of various types. Currently we use flake8/pycodestyle (`E`),
    Pyflakes (`F`), flake8-bandit (`S`), isort (`I`), and performance 'PERF'
    rules. Many rule violations will be automatically fixed by Ruff; others may
    require manual changes.

4. `license`
    *Pre-commit will check this for you!*
    Checks for correct license headers of all files.
    To run this locally use `make license`.
    See the Licensing Information section above for details about the license header required.

5. `pytest`
    Checks if the test scripts from the `test` folder run and produce desired outputs. It
    is imperative that your changes don't break the existing tests. If your MR fails this
    test, you will have to review your changes and fix the issues.
    To run pytest locally you can simply run `pytest` inside the `test` folder.

    While writing these tests, we encourage you to make use of the [`@import_of_fail`](https://github.com/NVIDIA/physicsnemo/blob/main/test/pytest_utils.py#L25)
    decorator to appropriately skip your tests for developers and users not having your
    test specific dependencies. This mechanism helps us provide a better developer and
    user experience when working with the unit tests.

    Some of the tests require test data to be run; otherwise, they will be skipped.
    To get the data (available to NVIDIANs only), set the `TEST_DATA_DIR` environment variable
    to a desired value and run make get-data. After that, pytest will use the same
    variable to find the test data. Alternatively, you can pass it explicitly using
    `pytest --nfs-data-dir=<path to test data>`.

6. `doctest`
    Checks if the examples in the docstrings run and produce desired outputs.
    It is highly recommended that you provide simple examples of your functions/classes
    in the code's docstring itself.
    Keep these examples simple and also add the expected outputs.
    Refer [doctest](https://docs.python.org/3/library/doctest.html) for more information.
    If your MR fails this test, check your changes and the docstrings.
    To run doctest locally, you can simply run `pytest --doctest-modules` inside the
    `physicsnemo` folder.

7. `coverage`
    Checks if your code additions have sufficient coverage.
    Refer [coverage](https://coverage.readthedocs.io/en/6.5.0/index.html#) for more details.
    If your MR fails this test, this means that you have not added enough tests to the `test`
    folder for your module/functions.
    Add extensive test scripts to cover different
    branches and lines of your additions.
    Aim for more than 80% code coverage.
    To test coverage locally, run the `get_coverage.sh` script from the `test` folder and
    check the coverage of the module that you added/edited.