Skip to content

Conversation

@schuenke
Copy link
Collaborator

License Change: AGPL-3.0 → MIT License

Overview

This PR implements the license change from AGPL-3.0 to MIT License as proposed and discussed in issue #324. This change aligns PyPulseq with the upstream MATLAB Pulseq implementation.

PR Status

⚠️ This is currently a DRAFT PR as we are still awaiting final agreement from all contributors listed in #324. However, we're opening this draft to:

  • Allow the community to review the proposed changes
  • Discuss the implementation approach
  • Ensure we haven't missed any important aspects of the license transition

Once all contributors have confirmed their agreement in #324, this PR will be ready for final review and merge. I suggest that all maintainers approve this PR.

Changes Included

This PR includes all necessary steps for a complete license change:

Core License Updates

  • LICENSE file: Completely replaced AGPL-3.0 text with standard MIT License
  • pyproject.toml: Added "License :: OSI Approved :: MIT License" classifier for proper PyPI display
  • README.md: Updated license badge from AGPL v3 to MIT

Verification & Compatibility

  • Codebase scan: Confirmed no remaining AGPL references in the codebase (please double check)
  • Documentation review: No license references found in documentation files that need updating (please double check)

Third-Party License Analysis

All existing third-party code in the repository remains compatible with the MIT License:

File License Status
src/pypulseq/make_adiabatic_pulse.py BSD-3-Clause (SigPy) ✅ Compatible
src/pypulseq/utils/safe_pns_prediction.py BSD-3-Clause (Szczepankiewicz & Witzel) ✅ Compatible
src/pypulseq/SAR/SAR_calc.py Columbia University Copyright ✅ Compatible

All third-party licenses are permissive and shold be fully compatible with MIT. The existing copyright notices and license texts have been preserved to maintain proper attribution.

Post-Merge Actions

After this PR is merged, we should create a new PyPI release to update the license information displayed on the PyPI page.

Legal Compliance

This license change has been properly coordinated with all contributors as documented in #324, ensuring we have the necessary rights to relicense all contributed code under the MIT License. However, I would like to add that I am not a lawyer nor an expert with regard to licenses.

@github-actions
Copy link

Coverage

Coverage Report
FileStmtsMissCoverMissing
/home/runner/.local/lib/python3.12/site-packages/pypulseq
   add_gradients.py1235159%44, 52, 58, 61, 75–86, 92, 120–123, 130–131, 150, 157, 162–241
   add_ramps.py36360%1–89
   align.py35489%41, 45, 69, 73
   calc_duration.py25196%37
   calc_ramp.py2182142%45–353
   calc_rf_bandwidth.py272026%37–59, 63–67
   check_timing.py962970%78, 82, 107, 180, 199, 232, 239, 249–293
   compress_shape.py30197%28
   convert.py40880%42, 48, 66, 72–73, 82, 88–89
   event_lib.py961485%6–9, 48–51, 70–71, 205–210
   make_adc.py921386%63, 72–76, 79, 128, 131, 135, 141, 145, 184, 186, 188, 196
   make_adiabatic_pulse.py1293970%196–200, 217–221, 229–230, 253, 259, 328–347, 451–460, 498–506
   make_arbitrary_grad.py37781%68, 71, 74, 77, 81, 83, 103
   make_arbitrary_rf.py665517%83–160
   make_block_pulse.py46393%112–116, 119
   make_delay.py9189%27
   make_digital_output_pulse.py16288%39, 47
   make_extended_trapezoid.py561279%67, 70, 76, 82, 85, 88, 91, 94, 116, 134, 136, 139
   make_extended_trapezoid_area.py93397%52, 227, 230
   make_gauss_pulse.py692071%127–131, 134–158, 165, 168
   make_label.py22482%64, 66, 68, 75
   make_sigpy_pulse.py1163173%12–13, 112, 115, 119, 154, 157–161, 165, 168–169, 172–173, 188, 195, 200, 212, 215, 240–250, 264, 267, 297–307
   make_sinc_pulse.py681085%94, 100, 127–131, 135, 138–139, 142–143, 165
   make_soft_delay.py25292%102, 120
   make_trapezoid.py111794%177, 190, 196, 214, 232, 237, 255
   make_trigger.py16288%44, 52
   opts.py66986%78, 83, 102, 142, 166–170
   points_to_waveform.py9189%27
   rotate.py691480%15, 55, 66–69, 85–90, 112, 119–120
   scale_grad.py14471%28–30, 33
   sigpy_pulse_opts.py26773%34–41
   split_gradient.py393121%46–103
   split_gradient_at.py702761%63–90, 110, 114, 118–120, 154–156
   traj_to_grad.py13931%26–40
/home/runner/.local/lib/python3.12/site-packages/pypulseq/SAR
   SAR_calc.py1139813%33–40, 55–62, 89–108, 129–132, 168–212, 242–246, 264–306
/home/runner/.local/lib/python3.12/site-packages/pypulseq/Sequence
   block.py4053791%63, 66, 74, 80, 95, 103, 109, 120, 123, 126, 134, 139, 148, 159, 167, 207, 209, 213, 225, 274, 278, 294, 334–337, 366–367, 433, 439, 472, 541, 577, 583, 610, 648, 727
   calc_grad_spectrum.py81766%68–190
   calc_pns.py403122%45–96
   ext_test_report.py1441292%23, 61, 138, 149–150, 237–243
   install.py754244%31, 52, 69, 71, 112–131, 148, 181–184, 200–212, 254–278
   parula.py4250%19–86
   read_seq.py3196879%42–43, 90, 93, 105, 110, 116, 123, 132, 141, 146, 149, 157–159, 202, 207, 215–264, 294–297, 312–313, 342–359, 422, 425, 460, 468, 542, 584–588
   sequence.py81522473%11–14, 104–114, 135–148, 195, 260–263, 310, 337, 354, 402, 430, 457–462, 499, 515, 606, 628, 669–672, 726, 764, 775–776, 782, 793, 799, 801, 809, 842–850, 1000, 1002, 1005, 1048–1049, 1052–1055, 1091–1101, 1110–1112, 1156–1168, 1183–1184, 1200–1218, 1252–1253, 1282, 1288, 1291, 1294, 1331, 1452–1465, 1488, 1516, 1538–1540, 1561, 1624, 1632, 1699, 1710–1723, 1735–1746, 1792–1793, 1802–1820, 1844, 1874–1882, 1914–2024, 2060, 2074–2084, 2088, 2099
   write_seq.py35417650%42, 66, 69–76, 303–526
/home/runner/.local/lib/python3.12/site-packages/pypulseq/utils
   cumsum.py14193%17
   safe_pns_prediction.py12611310%50–87, 102–189, 197–214, 222, 244–250, 279–286, 310–336, 344–383, 396–411, 415
   tracing.py16662%33–34, 42, 54–55, 75
/home/runner/.local/lib/python3.12/site-packages/pypulseq/utils/siemens
   asc_to_hw.py58539%21–28, 48–106
   readasc.py48456%25–100
TOTAL4719167565% 

Tests Skipped Failures Errors Time
1358 21 💤 0 ❌ 0 🔥 3m 46s ⏱️

@fzimmermann89
Copy link
Collaborator

(Despite being mostly AI slop) the PR text raises an interesting question: the SAR code does not have a separate license and copyright is held by Columbia. It was originally contributed under AGPL.

How can we relicense it?

Is the author still at Columbia and can agree in Columbia's Name to the change?
The license change issue assumed the GitHub authors hold copyright and can grant us use under the new license.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants