MRArbGrad 4.1.0__tar.gz → 4.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1/MRArbGrad.egg-info}/PKG-INFO +1 -1
  2. {mrarbgrad-4.1.0/MRArbGrad.egg-info → mrarbgrad-4.1.1}/PKG-INFO +1 -1
  3. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/Function.py +32 -4
  4. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/__init__.py +1 -1
  5. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/main.cpp +114 -59
  6. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/utility/v3.cpp +11 -10
  7. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/pyproject.toml +1 -1
  8. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/setup.py +0 -2
  9. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/LICENSE +0 -0
  10. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/MANIFEST.in +0 -0
  11. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/MRArbGrad.egg-info/SOURCES.txt +0 -0
  12. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/MRArbGrad.egg-info/dependency_links.txt +0 -0
  13. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/MRArbGrad.egg-info/requires.txt +0 -0
  14. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/MRArbGrad.egg-info/top_level.txt +0 -0
  15. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/README.md +0 -0
  16. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/example/example_BuiltInTraj.py +0 -0
  17. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/example/example_ExternalFunction2D.py +0 -0
  18. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/example/example_ExternalSamples2D.py +0 -0
  19. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/example/example_ExternalSamples3D.py +0 -0
  20. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/Utility.py +0 -0
  21. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/mag/Mag.cpp +0 -0
  22. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/mag/Mag.h +0 -0
  23. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/traj/Cones.h +0 -0
  24. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/traj/MrTraj.h +0 -0
  25. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/traj/MrTraj_2D.h +0 -0
  26. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/traj/Rosette.h +0 -0
  27. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/traj/Seiffert.h +0 -0
  28. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/traj/Shell3d.h +0 -0
  29. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/traj/Spiral.h +0 -0
  30. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/traj/TrajFunc.h +0 -0
  31. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/traj/VDSpiral.h +0 -0
  32. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/traj/Yarnball.h +0 -0
  33. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/utility/Intp.h +0 -0
  34. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/utility/LinIntp.h +0 -0
  35. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/utility/SplineIntp.h +0 -0
  36. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/utility/global.cpp +0 -0
  37. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/utility/global.h +0 -0
  38. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/ext/utility/v3.h +0 -0
  39. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/trajfunc/__init__.py +0 -0
  40. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/mrarbgrad_src/trajfunc/main.py +0 -0
  41. {mrarbgrad-4.1.0 → mrarbgrad-4.1.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MRArbGrad
3
- Version: 4.1.0
3
+ Version: 4.1.1
4
4
  Summary: Gradient waveform design tool for arbitrary k-space trajectories.
5
5
  Author-email: Ryan <ryan_shanghaitech@proton.me>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MRArbGrad
3
- Version: 4.1.0
3
+ Version: 4.1.1
4
4
  Summary: Gradient waveform design tool for arbitrary k-space trajectories.
5
5
  Author-email: Ryan <ryan_shanghaitech@proton.me>
6
6
  License-Expression: MIT
@@ -377,9 +377,23 @@ def setMagGradRep(x): ext.setMagGradRep(x)
377
377
  def setMagTrajRep(x): ext.setMagTrajRep(x)
378
378
  def setDbgPrint(x): ext.setDbgPrint(x)
379
379
 
380
- def loadF64(hdr:str, bin:str) -> list[NDArray]:
380
+ def saveF64(hdr:str, bin:str, arr:NDArray) -> bool:
381
381
  """
382
- load saved vector file (float64)
382
+ save vector file (float64)
383
+
384
+ Args:
385
+ hdr (str): header (hdr) file path
386
+ bin (str): bin file path
387
+ arr (NDarray): array to be saved
388
+
389
+ Returns:
390
+ bool: True for success
391
+ """
392
+ return ext.saveF64(str(hdr), str(bin), arr)
393
+
394
+ def loadF64(hdr:str, bin:str) -> list[NDArray]|None:
395
+ """
396
+ load vector file (float64)
383
397
 
384
398
  Args:
385
399
  hdr (str): header (hdr) file path
@@ -390,9 +404,23 @@ def loadF64(hdr:str, bin:str) -> list[NDArray]:
390
404
  """
391
405
  return ext.loadF64(str(hdr), str(bin))
392
406
 
393
- def loadF32(hdr:str, bin:str) -> list[NDArray]:
407
+ def saveF32(hdr:str, bin:str, arr:NDArray) -> bool:
408
+ """
409
+ save vector file (float32)
410
+
411
+ Args:
412
+ hdr (str): header (hdr) file path
413
+ bin (str): bin file path
414
+ arr (NDarray): array to be saved
415
+
416
+ Returns:
417
+ bool: True for success
418
+ """
419
+ return ext.saveF32(str(hdr), str(bin), arr)
420
+
421
+ def loadF32(hdr:str, bin:str) -> list[NDArray]|None:
394
422
  """
395
- load saved vector file (float32)
423
+ load vector file (float32)
396
424
 
397
425
  Args:
398
426
  hdr (str): header (hdr) file path
@@ -1,6 +1,6 @@
1
1
  from .Function import calGrad4ExFunc, calGrad4ExSamp
2
2
  from .Function import getG_Cones, getG_Rosette, getG_Rosette_Trad, getG_Seiffert, getG_Shell3d, getG_Spiral, getG_VDSpiral, getG_VDSpiral_RT, getG_Yarnball, getG_Yarnball_RT
3
- from .Function import setSolverMtg, setTrajRev, setGoldAng, setShuf, setMaxG0, setMaxG1, setMagOverSamp, setMagSFS, setMagGradRep, setMagTrajRep, setDbgPrint, loadF64, loadF32
3
+ from .Function import setSolverMtg, setTrajRev, setGoldAng, setShuf, setMaxG0, setMaxG1, setMagOverSamp, setMagSFS, setMagGradRep, setMagTrajRep, setDbgPrint, saveF64, loadF64, saveF32, loadF32
4
4
  from .Utility import _calDiaphony, rotate, _calJacElip, _calCompElipInt, _calSphFibPt, cvtGrad2Traj, getGoldang, getGoldrat, rand3d, gradClip
5
5
 
6
6
  from . import trajfunc
@@ -17,6 +17,8 @@
17
17
  #include "traj/Cones.h"
18
18
  #include "utility/SplineIntp.h"
19
19
 
20
+ typedef std::list<vv3> lvv3;
21
+
20
22
  bool gMain_enTrajRev (0);
21
23
  bool gMain_enGoldAng (0);
22
24
  bool gMain_enShuffle (0);
@@ -133,14 +135,9 @@ bool cvtNpa2Vf64(PyObject* pNumpyArray, vf64* pvf64Out)
133
135
  return true;
134
136
  }
135
137
 
136
- bool inline checkNarg(i64 nArg, i64 nArgExp)
138
+ bool inline chkNarg(i64 nArg, i64 nArgExp)
137
139
  {
138
- if (nArg != nArgExp)
139
- {
140
- printf("wrong num. of arg, narg=%ld, %ld expected\n", (long)nArg, (long)nArgExp);
141
- abort();
142
- return false;
143
- }
140
+ ASSERT (nArg == nArgExp);
144
141
  return true;
145
142
  }
146
143
 
@@ -187,18 +184,13 @@ public:
187
184
  PyObject* _pPyObj_v3 = pPyObj_v3;
188
185
  pPyObj_v3 = PyArray_FROM_OTF(pPyObj_v3, NPY_FLOAT64, NPY_ARRAY_CARRAY);
189
186
  Py_DECREF(_pPyObj_v3);
190
- if (PyArray_SIZE((PyArrayObject*)pPyObj_v3) != 3)
191
- {
192
- PyErr_SetString(PyExc_RuntimeError, "the return value of getK / getDkDp / getD2kDp2 must be size-3.\n");
193
- PyErr_PrintEx(-1);
194
- std::abort();
195
- return false;
196
- }
187
+ ASSERT (PyArray_SIZE((PyArrayObject*)pPyObj_v3) == 3);
197
188
 
198
189
  k->x = *(f64*)PyArray_GETPTR1((PyArrayObject*)pPyObj_v3, 0);
199
190
  k->y = *(f64*)PyArray_GETPTR1((PyArrayObject*)pPyObj_v3, 1);
200
191
  k->z = *(f64*)PyArray_GETPTR1((PyArrayObject*)pPyObj_v3, 2);
201
-
192
+
193
+ Py_DECREF(pPyObj_v3);
202
194
  return true;
203
195
  }
204
196
 
@@ -215,18 +207,13 @@ public:
215
207
  PyObject* _pPyObj_v3 = pPyObj_v3;
216
208
  pPyObj_v3 = PyArray_FROM_OTF(pPyObj_v3, NPY_FLOAT64, NPY_ARRAY_CARRAY);
217
209
  Py_DECREF(_pPyObj_v3);
218
- if (PyArray_SIZE((PyArrayObject*)pPyObj_v3) != 3)
219
- {
220
- PyErr_SetString(PyExc_RuntimeError, "the return value of getK / getDkDp / getD2kDp2 must be size-3.\n");
221
- PyErr_PrintEx(-1);
222
- std::abort();
223
- return false;
224
- }
210
+ ASSERT (PyArray_SIZE((PyArrayObject*)pPyObj_v3) == 3);
225
211
 
226
212
  k->x = *(f64*)PyArray_GETPTR1((PyArrayObject*)pPyObj_v3, 0);
227
213
  k->y = *(f64*)PyArray_GETPTR1((PyArrayObject*)pPyObj_v3, 1);
228
214
  k->z = *(f64*)PyArray_GETPTR1((PyArrayObject*)pPyObj_v3, 2);
229
215
 
216
+ Py_DECREF(pPyObj_v3);
230
217
  return true;
231
218
  }
232
219
 
@@ -243,18 +230,13 @@ public:
243
230
  PyObject* _pPyObj_v3 = pPyObj_v3;
244
231
  pPyObj_v3 = PyArray_FROM_OTF(pPyObj_v3, NPY_FLOAT64, NPY_ARRAY_CARRAY);
245
232
  Py_DECREF(_pPyObj_v3);
246
- if (PyArray_SIZE((PyArrayObject*)pPyObj_v3) != 3)
247
- {
248
- PyErr_SetString(PyExc_RuntimeError, "the return value of getK / getDkDp / getD2kDp2 must be size-3.\n");
249
- PyErr_PrintEx(-1);
250
- std::abort();
251
- return false;
252
- }
233
+ ASSERT (PyArray_SIZE((PyArrayObject*)pPyObj_v3) != 3);
253
234
 
254
235
  k->x = *(f64*)PyArray_GETPTR1((PyArrayObject*)pPyObj_v3, 0);
255
236
  k->y = *(f64*)PyArray_GETPTR1((PyArrayObject*)pPyObj_v3, 1);
256
237
  k->z = *(f64*)PyArray_GETPTR1((PyArrayObject*)pPyObj_v3, 2);
257
238
 
239
+ Py_DECREF(pPyObj_v3);
258
240
  return true;
259
241
  }
260
242
  protected:
@@ -325,7 +307,7 @@ private:
325
307
 
326
308
  PyObject* calGrad4ExFunc(PyObject* self, PyObject* const* args, Py_ssize_t narg)
327
309
  {
328
- checkNarg(narg, 10);
310
+ chkNarg(narg, 10);
329
311
 
330
312
  MrTraj::GeoPara objGeoPara;
331
313
  MrTraj::GradPara objGradPara;
@@ -353,7 +335,7 @@ PyObject* calGrad4ExSamp(PyObject* self, PyObject* const* args, Py_ssize_t narg)
353
335
  {
354
336
  try
355
337
  {
356
- checkNarg(narg, 6);
338
+ chkNarg(narg, 6);
357
339
 
358
340
  MrTraj::GeoPara objGeoPara;
359
341
  MrTraj::GradPara objGradPara;
@@ -410,7 +392,7 @@ bool getG(MrTraj* pmt, vv3* pvv3M0PE, vvv3* pvvv3GRO)
410
392
 
411
393
  PyObject* getG_Spiral(PyObject* self, PyObject* const* args, Py_ssize_t narg)
412
394
  {
413
- checkNarg(narg, 7);
395
+ chkNarg(narg, 7);
414
396
 
415
397
  MrTraj::GeoPara objGeoPara;
416
398
  MrTraj::GradPara objGradPara;
@@ -430,7 +412,7 @@ PyObject* getG_Spiral(PyObject* self, PyObject* const* args, Py_ssize_t narg)
430
412
 
431
413
  PyObject* getG_VDSpiral(PyObject* self, PyObject* const* args, Py_ssize_t narg)
432
414
  {
433
- checkNarg(narg, 8);
415
+ chkNarg(narg, 8);
434
416
 
435
417
  MrTraj::GeoPara objGeoPara;
436
418
  MrTraj::GradPara objGradPara;
@@ -451,7 +433,7 @@ PyObject* getG_VDSpiral(PyObject* self, PyObject* const* args, Py_ssize_t narg)
451
433
 
452
434
  PyObject* getG_VDSpiral_RT(PyObject* self, PyObject* const* args, Py_ssize_t narg)
453
435
  {
454
- checkNarg(narg, 7);
436
+ chkNarg(narg, 7);
455
437
 
456
438
  MrTraj::GeoPara objGeoPara;
457
439
  MrTraj::GradPara objGradPara;
@@ -470,7 +452,7 @@ PyObject* getG_VDSpiral_RT(PyObject* self, PyObject* const* args, Py_ssize_t nar
470
452
 
471
453
  PyObject* getG_Rosette(PyObject* self, PyObject* const* args, Py_ssize_t narg)
472
454
  {
473
- checkNarg(narg, 9);
455
+ chkNarg(narg, 9);
474
456
 
475
457
  MrTraj::GeoPara objGeoPara;
476
458
  MrTraj::GradPara objGradPara;
@@ -494,7 +476,7 @@ PyObject* getG_Rosette(PyObject* self, PyObject* const* args, Py_ssize_t narg)
494
476
 
495
477
  PyObject* getG_Rosette_Trad(PyObject* self, PyObject* const* args, Py_ssize_t narg)
496
478
  {
497
- checkNarg(narg, 10);
479
+ chkNarg(narg, 10);
498
480
 
499
481
  MrTraj::GeoPara objGeoPara;
500
482
  MrTraj::GradPara objGradPara;
@@ -518,7 +500,7 @@ PyObject* getG_Rosette_Trad(PyObject* self, PyObject* const* args, Py_ssize_t na
518
500
 
519
501
  PyObject* getG_Shell3d(PyObject* self, PyObject* const* args, Py_ssize_t narg)
520
502
  {
521
- checkNarg(narg, 6);
503
+ chkNarg(narg, 6);
522
504
 
523
505
  MrTraj::GeoPara objGeoPara;
524
506
  MrTraj::GradPara objGradPara;
@@ -536,7 +518,7 @@ PyObject* getG_Shell3d(PyObject* self, PyObject* const* args, Py_ssize_t narg)
536
518
 
537
519
  PyObject* getG_Yarnball(PyObject* self, PyObject* const* args, Py_ssize_t narg)
538
520
  {
539
- checkNarg(narg, 6);
521
+ chkNarg(narg, 6);
540
522
 
541
523
  MrTraj::GeoPara objGeoPara;
542
524
  MrTraj::GradPara objGradPara;
@@ -554,7 +536,7 @@ PyObject* getG_Yarnball(PyObject* self, PyObject* const* args, Py_ssize_t narg)
554
536
 
555
537
  PyObject* getG_Yarnball_RT(PyObject* self, PyObject* const* args, Py_ssize_t narg)
556
538
  {
557
- checkNarg(narg, 6);
539
+ chkNarg(narg, 6);
558
540
 
559
541
  MrTraj::GeoPara objGeoPara;
560
542
  MrTraj::GradPara objGradPara;
@@ -572,7 +554,7 @@ PyObject* getG_Yarnball_RT(PyObject* self, PyObject* const* args, Py_ssize_t nar
572
554
 
573
555
  PyObject* getG_Seiffert(PyObject* self, PyObject* const* args, Py_ssize_t narg)
574
556
  {
575
- checkNarg(narg, 7);
557
+ chkNarg(narg, 7);
576
558
 
577
559
  MrTraj::GeoPara objGeoPara;
578
560
  MrTraj::GradPara objGradPara;
@@ -591,7 +573,7 @@ PyObject* getG_Seiffert(PyObject* self, PyObject* const* args, Py_ssize_t narg)
591
573
 
592
574
  PyObject* getG_Cones(PyObject* self, PyObject* const* args, Py_ssize_t narg)
593
575
  {
594
- checkNarg(narg, 6);
576
+ chkNarg(narg, 6);
595
577
 
596
578
  MrTraj::GeoPara objGeoPara;
597
579
  MrTraj::GradPara objGradPara;
@@ -610,7 +592,7 @@ PyObject* getG_Cones(PyObject* self, PyObject* const* args, Py_ssize_t narg)
610
592
  PyObject* setSolverMtg(PyObject* self, PyObject* const* args, Py_ssize_t narg)
611
593
  {
612
594
  extern bool gMrTraj_enMtg;
613
- checkNarg(narg, 1);
595
+ chkNarg(narg, 1);
614
596
  gMrTraj_enMtg = PyLong_AsLong(args[0]);
615
597
  Py_INCREF(Py_None);
616
598
  return Py_None;
@@ -618,7 +600,7 @@ PyObject* setSolverMtg(PyObject* self, PyObject* const* args, Py_ssize_t narg)
618
600
 
619
601
  PyObject* setTrajRev(PyObject* self, PyObject* const* args, Py_ssize_t narg)
620
602
  {
621
- checkNarg(narg, 1);
603
+ chkNarg(narg, 1);
622
604
  gMain_enTrajRev = PyLong_AsLong(args[0]);
623
605
  Py_INCREF(Py_None);
624
606
  return Py_None;
@@ -626,7 +608,7 @@ PyObject* setTrajRev(PyObject* self, PyObject* const* args, Py_ssize_t narg)
626
608
 
627
609
  PyObject* setGoldAng(PyObject* self, PyObject* const* args, Py_ssize_t narg)
628
610
  {
629
- checkNarg(narg, 1);
611
+ chkNarg(narg, 1);
630
612
  gMain_enGoldAng = PyLong_AsLong(args[0]);
631
613
  Py_INCREF(Py_None);
632
614
  return Py_None;
@@ -634,7 +616,7 @@ PyObject* setGoldAng(PyObject* self, PyObject* const* args, Py_ssize_t narg)
634
616
 
635
617
  PyObject* setShuf(PyObject* self, PyObject* const* args, Py_ssize_t narg)
636
618
  {
637
- checkNarg(narg, 1);
619
+ chkNarg(narg, 1);
638
620
  gMain_enShuffle = PyLong_AsLong(args[0]);
639
621
  Py_INCREF(Py_None);
640
622
  return Py_None;
@@ -643,7 +625,7 @@ PyObject* setShuf(PyObject* self, PyObject* const* args, Py_ssize_t narg)
643
625
  PyObject* setMaxG0(PyObject* self, PyObject* const* args, Py_ssize_t narg)
644
626
  {
645
627
  extern f64 gMrTraj_g0Norm;
646
- checkNarg(narg, 1);
628
+ chkNarg(narg, 1);
647
629
  bool enMaxG0 = PyLong_AsLong(args[0]);
648
630
  if (enMaxG0) gMrTraj_g0Norm = 1e6;
649
631
  else gMrTraj_g0Norm = 0e0;
@@ -654,7 +636,7 @@ PyObject* setMaxG0(PyObject* self, PyObject* const* args, Py_ssize_t narg)
654
636
  PyObject* setMaxG1(PyObject* self, PyObject* const* args, Py_ssize_t narg)
655
637
  {
656
638
  extern f64 gMrTraj_g1Norm;
657
- checkNarg(narg, 1);
639
+ chkNarg(narg, 1);
658
640
  bool enMaxG1 = PyLong_AsLong(args[0]);
659
641
  if (enMaxG1) gMrTraj_g1Norm = 1e6;
660
642
  else gMrTraj_g1Norm = 0e0;
@@ -665,7 +647,7 @@ PyObject* setMaxG1(PyObject* self, PyObject* const* args, Py_ssize_t narg)
665
647
  PyObject* setMagOverSamp(PyObject* self, PyObject* const* args, Py_ssize_t narg)
666
648
  {
667
649
  extern i64 gMag_oversamp;
668
- checkNarg(narg, 1);
650
+ chkNarg(narg, 1);
669
651
  gMag_oversamp = PyLong_AsLong(args[0]);
670
652
  Py_INCREF(Py_None);
671
653
  return Py_None;
@@ -674,7 +656,7 @@ PyObject* setMagOverSamp(PyObject* self, PyObject* const* args, Py_ssize_t narg)
674
656
  PyObject* setMagSFS(PyObject* self, PyObject* const* args, Py_ssize_t narg)
675
657
  {
676
658
  extern bool gMag_enSFS;
677
- checkNarg(narg, 1);
659
+ chkNarg(narg, 1);
678
660
  gMag_enSFS = PyLong_AsLong(args[0]);
679
661
  Py_INCREF(Py_None);
680
662
  return Py_None;
@@ -683,7 +665,7 @@ PyObject* setMagSFS(PyObject* self, PyObject* const* args, Py_ssize_t narg)
683
665
  PyObject* setMagGradRep(PyObject* self, PyObject* const* args, Py_ssize_t narg)
684
666
  {
685
667
  extern bool gMag_enGradRep;
686
- checkNarg(narg, 1);
668
+ chkNarg(narg, 1);
687
669
  gMag_enGradRep = PyLong_AsLong(args[0]);
688
670
  Py_INCREF(Py_None);
689
671
  return Py_None;
@@ -692,7 +674,7 @@ PyObject* setMagGradRep(PyObject* self, PyObject* const* args, Py_ssize_t narg)
692
674
  PyObject* setMagTrajRep(PyObject* self, PyObject* const* args, Py_ssize_t narg)
693
675
  {
694
676
  extern bool gMag_enTrajRep;
695
- checkNarg(narg, 1);
677
+ chkNarg(narg, 1);
696
678
  gMag_enTrajRep = PyLong_AsLong(args[0]);
697
679
  Py_INCREF(Py_None);
698
680
  return Py_None;
@@ -701,20 +683,53 @@ PyObject* setMagTrajRep(PyObject* self, PyObject* const* args, Py_ssize_t narg)
701
683
  PyObject* setDbgPrint(PyObject* self, PyObject* const* args, Py_ssize_t narg)
702
684
  {
703
685
  extern bool glob_enDbgPrint;
704
- checkNarg(narg, 1);
686
+ chkNarg(narg, 1);
705
687
  glob_enDbgPrint = PyLong_AsLong(args[0]);
706
688
  Py_INCREF(Py_None);
707
689
  return Py_None;
708
690
  }
709
691
 
692
+ PyObject* saveF64(PyObject* self, PyObject* const* args, Py_ssize_t narg)
693
+ {
694
+ chkNarg(narg, 3);
695
+ const char* strHdr = PyUnicode_AsUTF8(args[0]);
696
+ const char* strBin = PyUnicode_AsUTF8(args[1]);
697
+ FILE* fHdr = fopen(strHdr, "w");
698
+ FILE* fBin = fopen(strBin, "wb");
699
+ if (fHdr==NULL || fBin==NULL)
700
+ {
701
+ if (fHdr) fclose(fHdr);
702
+ if (fBin) fclose(fBin);
703
+ Py_INCREF(Py_False);
704
+ return Py_False;
705
+ }
706
+
707
+ vv3 vv3Data;
708
+ i64 n = PyList_GET_SIZE(args[2]);
709
+ for (i64 i=0; i<n; ++i)
710
+ {
711
+ cvtNpa2Vv3(PyList_GET_ITEM(args[2], i), &vv3Data);
712
+ v3::saveF64(fHdr, fBin, vv3Data);
713
+ }
714
+
715
+ Py_INCREF(Py_True);
716
+ return Py_True;
717
+ }
718
+
710
719
  PyObject* loadF64(PyObject* self, PyObject* const* args, Py_ssize_t narg)
711
720
  {
712
- checkNarg(narg, 2);
721
+ chkNarg(narg, 2);
713
722
  const char* strHdr = PyUnicode_AsUTF8(args[0]);
714
723
  const char* strBin = PyUnicode_AsUTF8(args[1]);
715
- typedef std::list<vv3> lvv3;
716
724
  FILE* fHdr = fopen(strHdr, "r");
717
- FILE* fBin = fopen(strHdr, "rb");
725
+ FILE* fBin = fopen(strBin, "rb");
726
+ if (fHdr==NULL || fBin==NULL)
727
+ {
728
+ if (fHdr) fclose(fHdr);
729
+ if (fBin) fclose(fBin);
730
+ Py_INCREF(Py_None);
731
+ return Py_None;
732
+ }
718
733
 
719
734
  lvv3 lvv3Data;
720
735
  bool ret; vv3 vv3Data;
@@ -724,18 +739,54 @@ PyObject* loadF64(PyObject* self, PyObject* const* args, Py_ssize_t narg)
724
739
  if (vv3Data.empty() || !ret) break;
725
740
  lvv3Data.push_back(vv3Data);
726
741
  }
742
+ if (fHdr) fclose(fHdr);
743
+ if (fBin) fclose(fBin);
727
744
  vvv3 vvv3Data(lvv3Data.begin(), lvv3Data.end());
728
- Py_BuildValue("%O", cvtVvv3toList(vvv3Data));
745
+ return cvtVvv3toList(vvv3Data);
746
+ }
747
+
748
+ PyObject* saveF32(PyObject* self, PyObject* const* args, Py_ssize_t narg)
749
+ {
750
+ chkNarg(narg, 3);
751
+ const char* strHdr = PyUnicode_AsUTF8(args[0]);
752
+ const char* strBin = PyUnicode_AsUTF8(args[1]);
753
+ FILE* fHdr = fopen(strHdr, "w");
754
+ FILE* fBin = fopen(strBin, "wb");
755
+ if (fHdr==NULL || fBin==NULL)
756
+ {
757
+ if (fHdr) fclose(fHdr);
758
+ if (fBin) fclose(fBin);
759
+ Py_INCREF(Py_False);
760
+ return Py_False;
761
+ }
762
+
763
+ vv3 vv3Data;
764
+ i64 n = PyList_GET_SIZE(args[2]);
765
+ for (i64 i=0; i<n; ++i)
766
+ {
767
+ cvtNpa2Vv3(PyList_GET_ITEM(args[2], i), &vv3Data);
768
+ v3::saveF32(fHdr, fBin, vv3Data);
769
+ }
770
+
771
+ Py_INCREF(Py_True);
772
+ return Py_True;
729
773
  }
730
774
 
731
775
  PyObject* loadF32(PyObject* self, PyObject* const* args, Py_ssize_t narg)
732
776
  {
733
- checkNarg(narg, 2);
777
+ chkNarg(narg, 2);
734
778
  const char* strHdr = PyUnicode_AsUTF8(args[0]);
735
779
  const char* strBin = PyUnicode_AsUTF8(args[1]);
736
780
  typedef std::list<vv3> lvv3;
737
781
  FILE* fHdr = fopen(strHdr, "r");
738
- FILE* fBin = fopen(strHdr, "rb");
782
+ FILE* fBin = fopen(strBin, "rb");
783
+ if (fHdr==NULL || fBin==NULL)
784
+ {
785
+ if (fHdr) fclose(fHdr);
786
+ if (fBin) fclose(fBin);
787
+ Py_INCREF(Py_None);
788
+ return Py_None;
789
+ }
739
790
 
740
791
  lvv3 lvv3Data;
741
792
  bool ret; vv3 vv3Data;
@@ -745,8 +796,10 @@ PyObject* loadF32(PyObject* self, PyObject* const* args, Py_ssize_t narg)
745
796
  if (vv3Data.empty() || !ret) break;
746
797
  lvv3Data.push_back(vv3Data);
747
798
  }
799
+ if (fHdr) fclose(fHdr);
800
+ if (fBin) fclose(fBin);
748
801
  vvv3 vvv3Data(lvv3Data.begin(), lvv3Data.end());
749
- Py_BuildValue("%O", cvtVvv3toList(vvv3Data));
802
+ return cvtVvv3toList(vvv3Data);
750
803
  }
751
804
 
752
805
  static PyMethodDef aMeth[] =
@@ -774,7 +827,9 @@ static PyMethodDef aMeth[] =
774
827
  {"setMagGradRep", (PyCFunction)setMagGradRep, METH_FASTCALL, ""},
775
828
  {"setMagTrajRep", (PyCFunction)setMagTrajRep, METH_FASTCALL, ""},
776
829
  {"setDbgPrint", (PyCFunction)setDbgPrint, METH_FASTCALL, ""},
830
+ {"saveF64", (PyCFunction)saveF64, METH_FASTCALL, ""},
777
831
  {"loadF64", (PyCFunction)loadF64, METH_FASTCALL, ""},
832
+ {"saveF32", (PyCFunction)saveF32, METH_FASTCALL, ""},
778
833
  {"loadF32", (PyCFunction)loadF32, METH_FASTCALL, ""},
779
834
  {NULL, NULL, 0, NULL} /* Sentinel */
780
835
  };
@@ -1,6 +1,7 @@
1
1
  #include "v3.h"
2
2
  #include <array>
3
3
  #include <cinttypes>
4
+ #include <cstring> // test
4
5
 
5
6
  v3::v3() :x(0e0), y(0e0), z(0e0) {}
6
7
  v3::v3(f64 _) :x(_), y(_), z(_) {}
@@ -371,14 +372,14 @@ bool v3::saveF64(FILE* pfHdr, FILE* pfBin, const vv3& vv3Data)
371
372
  i64 lenData = vv3Data.size();
372
373
  fprintf(pfHdr, "float64[%ld][3];\n", (long)lenData);
373
374
 
374
- f64* bufFile = new f64[lenData*3];
375
+ f64* bufFile = (f64*)malloc(lenData*3*sizeof(f64));
375
376
  for(i64 i=0; i<(i64)lenData; ++i)
376
377
  {
377
378
  for(i64 j=0; j<3; ++j)
378
379
  { bufFile[3*i+j] = (f64)vv3Data[i][j]; }
379
380
  }
380
381
  ret &= (i64)fwrite(bufFile, sizeof(f64), lenData*3, pfBin)==lenData*3;
381
- delete[] bufFile;
382
+ free(bufFile);
382
383
  return ret;
383
384
  }
384
385
 
@@ -392,14 +393,14 @@ bool v3::loadF64(FILE* pfHdr, FILE* pfBin, vv3* pvv3Data)
392
393
  else if (nRead!=1) return false;
393
394
  pvv3Data->resize(lenData);
394
395
 
395
- f64* bufFile = new f64[lenData*3];
396
+ f64* bufFile = (f64*)malloc(lenData*3*sizeof(f64));
396
397
  ret &= (i64)fread(bufFile, sizeof(f64), lenData*3, pfBin)==lenData*3;
397
- for(i64 i=0; i<(i64)pvv3Data->size(); ++i)
398
+ for(i64 i=0; i<lenData; ++i)
398
399
  {
399
400
  for(i64 j=0; j<3; ++j)
400
401
  { (*pvv3Data)[i][j] = (f64)bufFile[3*i+j]; }
401
402
  }
402
- delete[] bufFile;
403
+ free(bufFile);
403
404
  return ret;
404
405
  }
405
406
 
@@ -409,14 +410,14 @@ bool v3::saveF32(FILE* pfHdr, FILE* pfBin, const vv3& vv3Data)
409
410
  i64 lenData = vv3Data.size();
410
411
  fprintf(pfHdr, "float32[%ld][3];\n", (long)lenData);
411
412
 
412
- f32* bufFile = new f32[lenData*3];
413
+ f32* bufFile = (f32*)malloc(lenData*3*sizeof(f32));
413
414
  for(i64 i=0; i<(i64)lenData; ++i)
414
415
  {
415
416
  for(i64 j=0; j<3; ++j)
416
417
  { bufFile[3*i+j] = (f32)vv3Data[i][j]; }
417
418
  }
418
419
  ret &= (i64)fwrite(bufFile, sizeof(f32), lenData*3, pfBin)==lenData*3;
419
- delete[] bufFile;
420
+ free(bufFile);
420
421
  return ret;
421
422
  }
422
423
 
@@ -430,13 +431,13 @@ bool v3::loadF32(FILE* pfHdr, FILE* pfBin, vv3* pvv3Data)
430
431
  else if (nRead!=1) return false;
431
432
  pvv3Data->resize(lenData);
432
433
 
433
- f32* bufFile = new f32[lenData*3];
434
+ f32* bufFile = (f32*)malloc(lenData*3*sizeof(f32));
434
435
  ret &= (i64)fread(bufFile, sizeof(f32), lenData*3, pfBin)==lenData*3;
435
- for(i64 i=0; i<(i64)pvv3Data->size(); ++i)
436
+ for(i64 i=0; i<lenData; ++i)
436
437
  {
437
438
  for(i64 j=0; j<3; ++j)
438
439
  { (*pvv3Data)[i][j] = (f64)bufFile[3*i+j]; }
439
440
  }
440
- delete[] bufFile;
441
+ free(bufFile);
441
442
  return ret;
442
443
  }
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "MRArbGrad"
7
- version = "4.1.0"
7
+ version = "4.1.1"
8
8
  dependencies = ["numpy"]
9
9
 
10
10
  description = "Gradient waveform design tool for arbitrary k-space trajectories."
@@ -4,7 +4,6 @@ from os.path import exists
4
4
  from ctypes.util import find_library
5
5
 
6
6
  useMtg = exists("./mrarbgrad_src/ext/mtg/")
7
- useJemalloc = find_library("jemalloc") is not None
8
7
 
9
8
  _sources = \
10
9
  [
@@ -23,7 +22,6 @@ modExt = Extension\
23
22
  (
24
23
  "mrarbgrad.ext",
25
24
  sources = _sources,
26
- libraries = ['jemalloc'] if useJemalloc else [],
27
25
  include_dirs = ["./mrarbgrad_src/ext/", numpy.get_include()],
28
26
  define_macros = [("USE_MTG", None)] if useMtg else None,
29
27
  language = 'c++'
File without changes
File without changes
File without changes
File without changes