From 34c67cbf3b3d36735255c0abfc14fa080be3102b Mon Sep 17 00:00:00 2001 From: Benjamin Aron Date: Mon, 26 Aug 2024 22:28:57 -0400 Subject: [PATCH] fix echo time bug, fix smi fw compartment --- designer2/designer.py | 2 - designer2/tmi.py | 14 +- lib/designer_input_utils.py | 161 +++++++++--------- lib/smi.py | 3 +- rpg_cpp/fftw-3.3.10/api/.libs/libapi.a | Bin 100408 -> 100408 bytes rpg_cpp/fftw-3.3.10/dft/.libs/libdft.a | Bin 92528 -> 92528 bytes .../dft/scalar/.libs/libdft_scalar.a | Bin 2216 -> 2216 bytes .../codelets/.libs/libdft_scalar_codelets.a | Bin 369288 -> 369288 bytes rpg_cpp/fftw-3.3.10/kernel/.libs/libkernel.a | Bin 97088 -> 97088 bytes rpg_cpp/fftw-3.3.10/libbench2/libbench2.a | Bin 126552 -> 126552 bytes rpg_cpp/fftw-3.3.10/rdft/.libs/librdft.a | Bin 182872 -> 182872 bytes .../rdft/scalar/.libs/librdft_scalar.a | Bin 3152 -> 3152 bytes .../scalar/r2cb/.libs/librdft_scalar_r2cb.a | Bin 518808 -> 518808 bytes .../scalar/r2cf/.libs/librdft_scalar_r2cf.a | Bin 526208 -> 526208 bytes .../scalar/r2r/.libs/librdft_scalar_r2r.a | Bin 6648 -> 6648 bytes rpg_cpp/fftw-3.3.10/reodft/.libs/libreodft.a | Bin 44432 -> 44432 bytes .../simd-support/.libs/libsimd_support.a | Bin 4192 -> 4192 bytes setup.py | 2 +- 18 files changed, 94 insertions(+), 88 deletions(-) diff --git a/designer2/designer.py b/designer2/designer.py index ee828f6c..7cc5cb3e 100644 --- a/designer2/designer.py +++ b/designer2/designer.py @@ -126,8 +126,6 @@ def execute(): #pylint: disable=unused-variable index = shell_rows) print('input DWI data has properties:') print(shell_df) - - import pdb; pdb.set_trace() app.goto_scratch_dir() diff --git a/designer2/tmi.py b/designer2/tmi.py index 4ad2011a..a1d2658b 100644 --- a/designer2/tmi.py +++ b/designer2/tmi.py @@ -109,7 +109,7 @@ def usage(cmdline): #pylint: disable=unused-variable options.add_argument('-n_cores',metavar=(''),help='specify the number of cores to use in parallel tasts, by default designer will use available cores - 2', default=-3) options.add_argument('-echo_time',metavar=(''),help='specify the echo time used in the acquisition (comma separated list the same length as number of inputs)') options.add_argument('-bshape',metavar=(''),help='specify the b-shape used in the acquisition (comma separated list the same length as number of inputs)') - + dki_options = cmdline.add_argument_group('tensor options for the TMI script') dki_options.add_argument('-DKI', action='store_true', help='Include DKI parameters in output folder (mk,ak,rk)') dki_options.add_argument('-DTI', action='store_true', help='Include DTI parameters in output folder (md,ad,rd,fa,eigenvalues, eigenvectors') @@ -581,13 +581,19 @@ def execute(): #pylint: disable=unused-variable logger.info("No lmax specified for SMI. Using default.") logger.info("Initializing SMI fitting...") + echo_times = dwi_metadata['echo_time_per_volume'] + if np.max(echo_times) > 1.0: + logger.info("Echo times in ms, converting to seconds.") + echo_times /= 1000 + if multi_te_beta: smi = SMI(bval=bval_orig, bvec=bvec_orig, rotinv_lmax=lmax) smi.set_compartments(compartments) - smi.set_echotime(dwi_metadata['echo_time_per_volume']) + + smi.set_echotime(echo_times) smi.set_bshape(dwi_metadata['bshape_per_volume']) logger.info("SMI model initialized for multi-TE/beta data.") - + params_smi = smi.fit(dwi_orig, mask=mask, sigma=sigma) logger.info("SMI fitting completed for multi-TE/beta data.", extra={"params_smi_shape": {key: value.shape for key, value in params_smi.items()}}) @@ -596,7 +602,7 @@ def execute(): #pylint: disable=unused-variable else: smi = SMI(bval=bval, bvec=bvec, rotinv_lmax=lmax) smi.set_compartments(compartments) - smi.set_echotime(dwi_metadata['echo_time_per_volume']) + smi.set_echotime(echo_times) smi.set_bshape(dwi_metadata['bshape_per_volume']) logger.info("SMI model initialized for single-TE/beta data.") diff --git a/lib/designer_input_utils.py b/lib/designer_input_utils.py index fa7d1014..135a94ef 100644 --- a/lib/designer_input_utils.py +++ b/lib/designer_input_utils.py @@ -172,6 +172,7 @@ def assert_inputs(dwi_metadata, args_pe_dir, args_pf): import json from mrtrix3 import app, MRtrixError import numpy as np + bidslist = dwi_metadata['bidslist'] # if bids files are provided, check that the user inputs match the bids files @@ -283,6 +284,9 @@ def convert_input_data(dwi_metadata): import numpy as np import os import warnings + import inspect + + caller = os.path.basename(inspect.stack()[-1].filename) miflist = [] phaselist = [] @@ -337,51 +341,53 @@ def convert_input_data(dwi_metadata): dwi_header = image.Header('%s/dwi.mif' % (app.SCRATCH_DIR)) dwi_ind_size.append([ int(s) for s in dwi_header.size() ]) - if app.ARGS.pf: - pf_per_series_app = convert_to_float(app.ARGS.pf) - try: - pf_per_series_bids = dwi_header.keyval()['PartialFourier'] - if pf_per_series_app != pf_per_series_bids: - warnings.warn('User defined partial fourier factor does not match that found in bids json. Using user defined value') - except: - pass - pf_per_series.append(pf_per_series_app) - else: - try: - pf_per_series.append(dwi_header.keyval()['PartialFourier']) - except: - warnings.warn('No partial fourier factor found in header, assuming full sampling') - pf_per_series.append(1) + if caller == 'designer': + if app.ARGS.pf: + pf_per_series_app = convert_to_float(app.ARGS.pf) + try: + pf_per_series_bids = dwi_header.keyval()['PartialFourier'] + if pf_per_series_app != pf_per_series_bids: + warnings.warn('User defined partial fourier factor does not match that found in bids json. Using user defined value') + except: + pass + pf_per_series.append(pf_per_series_app) + else: + try: + pf_per_series.append(dwi_header.keyval()['PartialFourier']) + except: + warnings.warn('No partial fourier factor found in header, assuming full sampling') + pf_per_series.append(1) - if app.ARGS.pe_dir: - pe_dir_app = app.ARGS.pe_dir - pe_dir = convert_pe_dir_to_ijk(pe_dir_app) - try: - ped_per_series_bids = dwi_header.keyval()['PhaseEncodingDirection'] - if ped_per_series_bids != pe_dir_app: - warnings.warn('User defined phase encoding direction does not match that found in bids json. Using user defined value') - except: - pass - ped_per_series.append(pe_dir) - else: - try: - ped_per_series.append(dwi_header.keyval()['PhaseEncodingDirection']) - except: - raise MRtrixError('No phase encoding direction found in header, please specify manually') + if app.ARGS.pe_dir: + pe_dir_app = app.ARGS.pe_dir + pe_dir = convert_pe_dir_to_ijk(pe_dir_app) + try: + ped_per_series_bids = dwi_header.keyval()['PhaseEncodingDirection'] + if ped_per_series_bids != pe_dir_app: + warnings.warn('User defined phase encoding direction does not match that found in bids json. Using user defined value') + except: + pass + ped_per_series.append(pe_dir) + else: + try: + ped_per_series.append(dwi_header.keyval()['PhaseEncodingDirection']) + except: + raise MRtrixError('No phase encoding direction found in header, please specify manually') if app.ARGS.echo_time: - te_per_series.append(app.ARGS.echo_time) + te_app = np.round(float(app.ARGS.echo_time), 3) + te_per_series.append(te_app) try: - te_per_series_bids = dwi_header.keyval()['EchoTime'] - if te_per_series_bids != app.ARGS.echo_time: + te_per_series_bids = np.round(float(dwi_header.keyval()['EchoTime']), 3) + if te_per_series_bids != te_app: warnings.warn('User defined echo time does not match that found in bids json. Using user defined value') except: pass else: try: - te_per_series.append(dwi_header.keyval()['EchoTime']) + te_per_series.append(np.round(float(dwi_header.keyval()['EchoTime']), 3)) except: - warnings.warn('No echo time found in header, assuming 0') + warnings.warn('No echo time found in header, assuming 0 unless specifified by a .echotime file') te_per_series.append(0) else: @@ -417,51 +423,53 @@ def convert_input_data(dwi_metadata): dwi_ind_size.append([ int(s) for s in dwi_header.size() ]) miflist.append('%s/dwi%s.mif' % (app.SCRATCH_DIR, str(idx))) - if app.ARGS.pf: - pf_per_series_app = convert_to_float(app.ARGS.pf) - try: - pf_per_series_bids = dwi_header.keyval()['PartialFourier'] - if pf_per_series_app != pf_per_series_bids: - warnings.warn('User defined partial fourier factor does not match that found in bids json. Using user defined value') - except: - pass - pf_per_series.append(pf_per_series_app) - else: - try: - pf_per_series.append(dwi_header.keyval()['PartialFourier']) - except: - warnings.warn('No partial fourier factor found in header, assuming full sampling') - pf_per_series.append(1) - - if app.ARGS.pe_dir: - pe_dir_app = app.ARGS.pe_dir - pe_dir = convert_pe_dir_to_ijk(pe_dir_app) - try: - ped_per_series_bids = dwi_header.keyval()['PhaseEncodingDirection'] - if ped_per_series_bids != pe_dir_app: - warnings.warn('User defined phase encoding direction does not match that found in bids json. Using user defined value') - except: - pass - ped_per_series.append(pe_dir) - else: - try: - ped_per_series.append(dwi_header.keyval()['PhaseEncodingDirection']) - except: - raise MRtrixError('No phase encoding direction found in header, please specify manually') + if caller == 'designer': + if app.ARGS.pf: + pf_per_series_app = convert_to_float(app.ARGS.pf) + try: + pf_per_series_bids = dwi_header.keyval()['PartialFourier'] + if pf_per_series_app != pf_per_series_bids: + warnings.warn('User defined partial fourier factor does not match that found in bids json. Using user defined value') + except: + pass + pf_per_series.append(pf_per_series_app) + else: + try: + pf_per_series.append(dwi_header.keyval()['PartialFourier']) + except: + warnings.warn('No partial fourier factor found in header, assuming full sampling') + pf_per_series.append(1) + + if app.ARGS.pe_dir: + pe_dir_app = app.ARGS.pe_dir + pe_dir = convert_pe_dir_to_ijk(pe_dir_app) + try: + ped_per_series_bids = dwi_header.keyval()['PhaseEncodingDirection'] + if ped_per_series_bids != pe_dir_app: + warnings.warn('User defined phase encoding direction does not match that found in bids json. Using user defined value') + except: + pass + ped_per_series.append(pe_dir) + else: + try: + ped_per_series.append(dwi_header.keyval()['PhaseEncodingDirection']) + except: + raise MRtrixError('No phase encoding direction found in header, please specify manually') if app.ARGS.echo_time: - te_per_series.append(app.ARGS.echo_time) + te_app = [np.round(float(i), 3) for i in app.ARGS.echo_time.rsplit(',')] + te_per_series.append(te_app[idx]) try: - te_per_series_bids = dwi_header.keyval()['EchoTime'] - if te_per_series_bids != app.ARGS.echo_time: + te_per_series_bids = np.round(float(dwi_header.keyval()['EchoTime']), 3) + if te_per_series_bids != te_app[idx]: warnings.warn('User defined echo time does not match that found in bids json. Using user defined value') except: pass else: try: - te_per_series.append(dwi_header.keyval()['EchoTime']) + te_per_series.append(np.round(float(dwi_header.keyval()['EchoTime']), 3)) except: - warnings.warn('No echo time found in header, assuming 0') + warnings.warn('No echo time found in header, assuming 0 unless specified by a .echotime file') te_per_series.append(0) DWImif = ' '.join(miflist) @@ -476,7 +484,7 @@ def convert_input_data(dwi_metadata): else: for idx,i in enumerate(phase_n_list): run.command('mrconvert %s%s %s/phase%s.nii' % - (i, dwi_ext[idx], app.SCRATCH_DIR, str(idx))) + (i, phase_ext[idx], app.SCRATCH_DIR, str(idx))) phaselist.append('%s/phase%s.nii' % (app.SCRATCH_DIR, str(idx))) run.command('mrcat -axis 3 %s %s/phase.nii' % (' '.join(phaselist), app.SCRATCH_DIR)) except: @@ -494,11 +502,8 @@ def convert_input_data(dwi_metadata): dwi_metadata['bshape'] = bshape bshape_per_series = dwi_metadata['bshape'] - try: - if (len(set(te_per_series)) > 1) and (not app.ARGS.rpe_te): - raise MRtrixError('If data has variable echo time and no RPE TE is specified, please use the -rpe_te flag to specify the RPE TE') - except: - pass + if (len(set(te_per_series)) > 1) and (not app.ARGS.rpe_te): + raise MRtrixError('If data has variable echo time and no RPE TE is specified, please use the -rpe_te flag to specify the RPE TE') if not all(x == ped_per_series[0] for x in ped_per_series): raise MRtrixError('input series have different phase encoding directions, series should be processed separately') @@ -524,8 +529,6 @@ def convert_input_data(dwi_metadata): dwi_ind_size = [i + [1] if len(i)==3 else i for i in dwi_ind_size] - import pdb; pdb.set_trace() - nvols = [i[3] for i in dwi_ind_size] for idx,i in enumerate(dwi_n_list): if len(dwi_n_list) == 1: diff --git a/lib/smi.py b/lib/smi.py index 4b1b9409..33888803 100644 --- a/lib/smi.py +++ b/lib/smi.py @@ -860,7 +860,7 @@ def generate_sm_wfw_b_beta_te_ws0_training_data(self): if not self.flag_compartments[2]: f_fw = np.zeros((n_training, 1)) else: - f_fw = self.prior[:,[5]] + f_fw = self.prior[:,[4]] if not self.flag_compartments[1]: f = 1 - f_fw @@ -890,7 +890,6 @@ def generate_sm_wfw_b_beta_te_ws0_training_data(self): kernel_params[:,[8]] * abs(k2_all), kernel_params[:,[9]] * abs(k4_all), kernel_params[:,[10]] * abs(k6_all))) - return rot_invs def standard_model_mlfit_rot_invs(self, rot_invs, sigma_norm_limits): diff --git a/rpg_cpp/fftw-3.3.10/api/.libs/libapi.a b/rpg_cpp/fftw-3.3.10/api/.libs/libapi.a index 063967f1059857fcd8c005095b6b87698ae62bcb..fc2ccb4c425ef902c88681dd86e6d206c61b0fe0 100644 GIT binary patch delta 1026 zcmY+COK1~O6o&aH$t=bMA{r)YkgCN;5-^iQTWc1k(qcs+jSEXCqEIlj3MzEbpbN8W za1lC{!3UUyi!3Z!uX;;Bd=(V!#v&-8LZS;XSOg2zN(D3N+?$)-`Tp~tbME8J+UHhne51m8adR(n_Z1#6Dh|Ohjke9E)TmG*jY^^ ze|qLxxYBp+RMYMyfhX773#gDO1{cXzgHhGt|LE6r(1fYpS8|R zyt3P6^SQM!NxfEhJp4{^GClKgp6khl43Fn4ewlfsZwiZzTrYN!1BZqzvBHXvo)Cqio~x-5uNzYpCUF16t(hnMZ}bNICz5{JJ*BsnBCOgPqV z9i_GX80L_QVLOLx9FnypdcQ}dg%)lk)u#C5I3@+84-#Noz1HId zd}7Z}19&9*i-TCTwxZ#Geg=cWOxihwV`9FLMv(D~n3sM(hl2tebyn%XMYIbdy)lX{ bjH^9f`hE;c>=0&?>J=Pjd6VN={C4~YV4ffs delta 1041 zcmY+CO=uHQ5XYIMS!7KiYC|@$NHs-?so0fZc54o;AH^U-KMs~Eq99ncf<5%m7%w?V z@etX_qCJ?3U=gJzPy5P(NU$KpUW|gZREWKZ!JsHq8xYKX%=YCrzyHj<`OkZAKF!Ui zxpb@RpnO1-)pw)d%SkO>10}UT4n8vCU1(Bsheb?X;vfMUF=~3`4rpiV$9?Zub@}M+uvi04P1`j zI?L&+OHrk$?IM|(b4?bL+LOEkq(57 zXCA=!HaNQtjy9Q3qVt>p?F`cHR_I{)W*bCUUTTLHmN$jqJ7a-*_Cd_d%Ss_8&`Tm* zH-CW15QV`F4n9i8U<3X1UJq2TeOeThP}M_oy)b2NBr9Ujr`EULLMP&I#hh!1b0;B# zSns2`K6sBkg_xf{7=!@Msh>fYhTu8Y>-ooLpk~dzy;Got^Kcs5$7Td7Uw{*6OXukk x2($cc6b>=0*4amg#_(!oMQ^%04%@LPH|wXR3HXH`^!%3_a0K%@_oU#D>pz|IlmIfP@xL8<0OpD12pNenxU}+IU;=Yi20_9FW$jKc|-pm6#X4bM5Gb&5}SAK z?-oSx#WyEhv_Vn7<7tirvb@8;B}`y{S(t2n#drwDo~-pxbNg*(#)&Y2?L};iUd&LH z+YfOv9^!y;x`Y@v!Ie3QGBWYPWW1CZjUb_BVY0o+j`5NpOeQLTaS>b(Q!t~H5Jbjw KyHYBn9}57yp=Tff delta 360 zcmexxiS@%J)(J9fW|l^VW)>TjxL6=e!_7u4v&3NROH#iOY{Mo_n0S=+EfE;oDqxWu zjQuFDiWkOCsxcCVv1j#Pf~zlDq9qLzU$lRbAdKyGF-U|J?3~GlEaIDYJk60n;yV0W z!i3;%V`N-|#GUN$Pk8%nX2yv~V%s~|7)_X=S}qz&Y`@9LxS9iD#P$V3jB}9HM~E`M w;X#s5P-2vkLE_J_W85Q%#4iY7?1AY|tdZC*8O+Em1eJf7C%)YxmC=F)0RFUN^#A|> diff --git a/rpg_cpp/fftw-3.3.10/dft/scalar/.libs/libdft_scalar.a b/rpg_cpp/fftw-3.3.10/dft/scalar/.libs/libdft_scalar.a index da8ead8407ddbe1be8fa02ecaf25384996343cd2..79304f827a79f3c51b31eba7b169a71b41af986e 100644 GIT binary patch delta 39 lcmZ1>xI%D(44b);sey(0M5QhW%V^^!B^D@i^DUNh%mCH83kCoH delta 39 lcmZ1>xI%D(44avyk)fICM5QhW%V6UsB^D@i^DUNh%mCHo3kCoH diff --git a/rpg_cpp/fftw-3.3.10/dft/scalar/codelets/.libs/libdft_scalar_codelets.a b/rpg_cpp/fftw-3.3.10/dft/scalar/codelets/.libs/libdft_scalar_codelets.a index 75f8a1cf679c1863e4807a1d6641cc664087013b..ff5bf56876b165ccfd6dc35951b8206f0fed9850 100644 GIT binary patch delta 831 zcmeA;D%NpSY=R7{xsj=X#q@_;7$r7Z9%cn|%_nbsDY03SZ8tLaBeyp@l5C{#Z#D>b zdZ93*#O6XNV=gHF;u#?Spb9sP-*^Maf2rrp3zY}+J#CD6pnRa+;+to9v8}-HgQ?$c8!| zVeCc`czK3#GB;F3;0pe6HXBZPqXc7+_~H4xugOm{S3mDv8W zgjpHl7pNH;EzD0Ku?7~9*si&NS=j<=23Skx4QB5OWPytTEVFsoz=_sydr>UQEnyfZ zsF3BC5}Y%I<&i0jV|9w<5j%{dbcrPjuBYiK%PudNjFSPY5Fd;aWyktR0mgBPXT7Bb N;TUaK>S9fk006*a{XYNz delta 811 zcmeA;D%NpSY=R7%nWd4TndwHQTdZKFsp)1Wwo7pKE$$?Cn7EU$5S$$)<;4XPU!|f1 zXJ68b;$;OHX*!vaO?W`l9Xw{O_ZSi*teIvio_LE^qR!#IT-B0Kq_p2YTF0nq3nv0d>g<8PRk zLGqSg8N2zQ>Ot}knVFh}k@$_`Os|EY{DoH}ws&eVNy9w0@QV2M19nVbpiZ9*;$Mhl z(t+_ezLeN5S;C}j0?|LcP?%9-d*lkH+xc(<#kU7YFfUPn@Il7LzCPif^OWtO-W~%;)#k9n>(eM*&wo;Co0Zng)$A*XR||@7xhl_LA3|QN^IU~`xvG@ z@d=RYP|XOHRs1HgInZe_OculybnS+517pQE?{LpSaFsXvczu9z6VoI%NBaJTIUA(7 zAm|Pk)CqyH!Z05+-jm$ilyD2`&gq3bj1rqG)2yLhfbcKotcDr{;m<6b>@k9g~_z>xpAB$n`21#3d+XD5~ z^g;(l@y#4RWl;DIzn^eIZ3oG3cVK0df%*=tVS5D!;};|W$?aV{jJMz(0%>UwWUPUP z4MdBC45JALvY{C&j4p6LfwY`3Wwb#uRD8RFB_j)xfW&r38%AvwHc%2XH{D+3z{tc3 Y<5amaY6-(Qt0EY)1YjJgOhz>!04`^~=>Px# delta 660 zcmX@`jrG7c)(J9fW|l^Vrj{F(vUpj+%!!KPn^*AqFd=vX0#8_wc%pxp5j+h^7bKM( z(kyHcxy=(5XR|_?hU&A~q0EbVr}-ev$rE|SH}9~00@XeFqMpR&oetHENU{M=OJK4f z#R9H92rf{udp3eAzS+U+4~$zVEwMS$_czqdV2cWZ?r=e!5Ev^Ab^l~XUy03)3Adr{ z1am9Xtf4*tb1&wsh8Y7=JhO1JBh-NlZN)cxY~CY?#8o&t2gU^{zIkmi)Z1XAX5Kpt zvuL4%#OBH;!q5N*%dY%b46_Jivc~!<{565*q*7v=nV4+NdAN=qYc75 z@$Cwhj4TMg#CAs;Ms2A1(+hbRCAW7uFusBb1gbDfY@g`LC@c)IVLDjgU<6~Z0J4B# ICL_NP0DRrO3jhEB diff --git a/rpg_cpp/fftw-3.3.10/libbench2/libbench2.a b/rpg_cpp/fftw-3.3.10/libbench2/libbench2.a index c453cd34d5fabce518c5348bfe3c91df32f71cc0..544ca48a4fd33cbf378490acb5468ce98ddcf3c4 100644 GIT binary patch delta 448 zcmca{hyBJK_6ag<=0>K5M#dYJ9}d7WYW z%~|{iwOkw;o4JI%;BrwSS#b6#F)ePG`M(rrLB-8C&r*TuH{UFzUIiDQq{DV|+z>O3Hvdwb1s9*C0@uG;NWBU!K1uVCFid@v z?ImUy+sJVjT+JtEEjF0AlGh_v7@I4g3$A8XP#0W{R^%x+n3`YnyI5fCt|gP;>Xnvf z$-=}Z9l0a`V`p8R#06tBJ(wf~W6%24#R+9^*J5D|f;n`16FZ|6G(?TIFXCg&5`-xe tQed<)g>iyH8I2-foUXNumteMUPdd%`3l?PCldd!Vg86TI(p|=H0swSFdfEU0 diff --git a/rpg_cpp/fftw-3.3.10/rdft/.libs/librdft.a b/rpg_cpp/fftw-3.3.10/rdft/.libs/librdft.a index d1680e7dcbed8066e1944a66227fa68c60792807..8bbea7ce2b4618eacacc055d3c201b2341280278 100644 GIT binary patch delta 543 zcmX|-KS)Ah6vesMQqc%{MVkF11DA$W(C_tUY7lCSmL3u0=oGfOL_rbeAP+%ld~I&M zM_iDW9N*9o4HC3Cy5%TAY2N#`-}%nveD~Z=E!?Svt4otAok^wY(17UE)=uDGChKQ8 zj5yW6i{>BM$&7OtE6xbJ8|5isLr<>>o5#%s;k}F4v~d3FAS`TG+RMVFrZq1de;q7( z{1xJvZ2fZ;;?B{aieoeD^nPp~^Roqgd8Y>-6ld8WEduSJh+%~7jhS)iN5m;_gS#%m zI0c(4W=T7T7I#XtS+TK8F@NI)(NTxvoyy3A!ue6rH*yEKZ0pF46Xj&~DN7 V0=jqD@`QDdUA~G=BF0ZJ@$Ivi8H~ z5@ZF3!bC;!?HUD)ON0>I7fp;cObBj6D`O2@R${y43`S=gglxqX#y2tuZo@}L89oGe z$A88v90=|T4yF(!dnKfpu86>8r+<)V6xc4I&(wot`2jVV_F3Doym4C zPbMa4Aed|yieWk>2UGT_im8YN#)+zD+QbIq2(>Ytf*bItgJ~C>v#6Wt5j3n!ws$RN HI;REzsJ5Jl diff --git a/rpg_cpp/fftw-3.3.10/rdft/scalar/.libs/librdft_scalar.a b/rpg_cpp/fftw-3.3.10/rdft/scalar/.libs/librdft_scalar.a index 787ffaed11e925936ee6004b600822afebaa0b4b..fa9f1b99b2106c1affc065cbdcee5983abc88e1e 100644 GIT binary patch delta 65 wcmca0aY15&44b);siA@8Mx`W12-9S97h@6=jQxrE7My*FO$*Lu;`Cz%07&K#!2kdN delta 65 wcmca0aY15&44avyk)egzMx`W12-9G57h@6=jQxrE7My*FO$*Lu;`Cz%08N|_0IsJO+{0K6syf9Iux`Qv7`qfY1tptWq+tJ^QAT)S_suv z;xxF^gdDvLCz4+981{W`JLar;n~da zY-VRVS6o=+uuBt7yg2NdG^l8IN&ZTmO-?h`aB&vp2Pqz2%L&3y8h6APK^8O4?jrHw zR#ucl`Gk{bRzPK3u| zjE4+F@+&}uQ;^9?(K-^|GCq1S?1+41d~_06aD8VMQb|grnzO>fe~e)d5r)@L(bFc~ z5865stgx{_XQM((6ghe-b!kqLqV5QM@70yI5aH+$Dw@Bd>&+s9!;4y164|9fZHiLP zKHI+S9CAdeSTh}AXc^V`aEhHz)7F@3Wz8i-P}G!-7~4(f!8G#%jE=E0*~HN>jT-A& zU?+>T!fg}q(EY@Y4GZwmcfmp^1H7aHE_yi^T%(<0$7%ssAUiB!$2TW9Nk0-SxXVFX z0y!25B3!KkPZD|jRoP)zEeIGWWY>d2BZa!Fpf`oWA0Jpurmz?UfpiKtqrl*za908O zCJG~Kpw31iHHmx8Qds~7so|7ai0H+-%8ET5aFjLJ_pYoaZS4w+M4+R{9R+e0Kc^H z0DmuAJo<<)qjyrvyCeMIUd?e?kS`0m?&oo|Ng nhx9453DuQVqTfDL<%%l(j;i4c`W;oD_ia~IPaPfChx7jfPdlfV delta 1480 zcmY*YT}V_x6lV6$y}Pw*?Yh>TyRPV_frgcTF@d%csQQmwF4RCJI1w3xt1?{zjx3{N#nvTl<%d7faTD;ae*bADj| ziZy|e9z58^`%`|N8sU7EMA{PRn7rlzu9(C&4! zJmD*POZS}=h8t#xXy^UAyq@Cd=txq&?eVOf;3K`^ZR6ntmi5Ko-Iq-m-@E`ecbfwP zS3!v<5kPq9Ht6H;W{ku={h*02P6IX#1Xv&hG7t_w1by~cix9BOxF!Oc*rQN9jX{pn zl($WT09%UYM?ZrAdjyKrpI{-?#4q><9BC%(cUe}MWXiA4w|EoSgNLgvN(ti=pWsiO zmh$#EmT~T?WhBdl7ahV%Q5<{la-|UF`}zE2zZ${K-i-K8#vjiL3+ZvbjHf$I1`c!IQo?vG>`1C8tB2|QsK$)8E3lg# zQJchMhARNyb0-x>0Fm7Xuf@J+sdlT{f^hE`++gn#D;ZjXZdXi&cFaW>@7CdQZa!L) zmm)^^sj74e(QlbJVWq;0N>Fc1#ft;N~=CY4apzBNm!c=M3enWQC4 nwI+?mRW;V+&O=RB)>+kpwNS=SMyw^V&Z^cv1`!6YtlEM9&O^A- diff --git a/rpg_cpp/fftw-3.3.10/rdft/scalar/r2cf/.libs/librdft_scalar_r2cf.a b/rpg_cpp/fftw-3.3.10/rdft/scalar/r2cf/.libs/librdft_scalar_r2cf.a index ddf8a3c9824741bbf67f320878466057582f1b3a..c76dc5e5e0964d2382a8e23bc7f44463decd949d 100644 GIT binary patch delta 1442 zcmY*ZT}TvB6lQkrozb<@Tx(`+H&$ICL_l~hdJ zYT}BWRMBP!R`j)(>t-g6r|CrhJ+6*TiHZ0}oYz3e=;<)m6GLls1bHi}(zv>9#kkQT=?kcrI<;sDCMm})Ys0V~7T;am;H05zve@78CnG-01Q_fpW-xG~QYmUjb zg&1+0Y&ldh-T-8@*lBvxVoV9Gms>nPHipkkgqVFhZj>c^%A(sOi z*$X8qPJ-GkDWL{1NR~|%`hhkRKM1jLu?fi51!@>OZWkrg*AME6ON#39iuwsW2R#RA zZ>*RIg95T(Mb!yiu?~KwPz6p&vcqR=uwxY-C(xARR6cr*RFvtpb0sffh^k zl*h;6UvgJeG2wyE1OfjO!$+$2`&g}bTxsj3>ht75~}GU0?TFzoxU#2lW$zXxZ<*a*GGq#)%l99TcLmxJ<@K4N%FUBk=4Gkp?3(ACM7K9da zExHCqWe*xc=&o>tB7=e!y{P$?8M8qIKBO5<@S%IpJ!d;Ue&6pqzwi8h=esu$v<8CK zVGCF0Dk*k`8@$rAOUXc}Ope8QNlDLa;@HC%guWBUzVV?3Uqk zR}zabx?vc#QaE5@<0VNf!Tyu%3o>7>`%L_q9f){&PQ#mI3 z{fxTd2>TFkKt@FM9J_RgKH^$s-yf$5vjmdqRhydOU>-P6;){q3I~XHGXk4}ZR0#Ye zkmw$sQt*W&SW|>uZQ0OW0g{Oet*Dn9J^?z@u{9#3dSD?zMTGARXeJ>=M6?Zz;un?? zp{BBvBvK=^nC3#u0B9m?gV~@a=K*LTn+kaiW|;E|43^Q}vvE*~-&XHz+ya~VMB!C? z*z&kZJa)*YhBKcFlcD<~tOOq);l3t!tq~y?_Xm#?vWf6nHMfn^q`_G~XUB#bOmuM$ zoE_P=%9>&AAh%J9{fp<+cBkKRlQ=D!zwJBsdWZkkPcDpy)*4Ry$KN}(>xPFyy)L+OcGxfj>&)?)1^$#8&@!jXE^iK*CQ&0F# zeJo6rNBHf%w5>17-@`vo{bGqYKclDCDL;>^H;v{AxAoOK<%N7s&9z79A@@LvM6Iw) gY!UI>FPu7vT@caKE6h~V#9=6WD4>b7Z^E_0|Jk*{X#fBK diff --git a/rpg_cpp/fftw-3.3.10/rdft/scalar/r2r/.libs/librdft_scalar_r2r.a b/rpg_cpp/fftw-3.3.10/rdft/scalar/r2r/.libs/librdft_scalar_r2r.a index 6523f72891b0715829940dde5d155498fb9c7478..8cf04e02990e750e0dc4cccce93b763ba4f501ab 100644 GIT binary patch delta 51 qcmexi{KI&H44b);siA@8M5R>_mdVCTm$;zJ&8xU?!P#A6dCUN=r4P6O delta 51 qcmexi{KI&H44avyk)eg@M5R>_mchnLm$;zJ&8xU?!P#A6dCUN@fe+LG diff --git a/rpg_cpp/fftw-3.3.10/reodft/.libs/libreodft.a b/rpg_cpp/fftw-3.3.10/reodft/.libs/libreodft.a index 63b040b9dae410a41b029235b2fa5bc722b3f423..0e920add3c98b7d52e1edd8a3dad22a33cdba454 100644 GIT binary patch delta 103 zcmbPmn`r_N$*`FlnHn0JY*Z>@1TzgRH_u}H#0Fze;!skAv3F^DDZtoVUZ<2{>|426 Q0x-5$T@swVsqdZ~0Q1ou(*OVf delta 105 zcmbPmn`r_N$*`GO8W~y|Y*Z>@WCbxTCMt?=-oSW=4J=_{x_J_Zk|K<~OVdjM#^&-m Wr3_==%FPmhvAyb&;OtF(_v8ROb{?Jp diff --git a/rpg_cpp/fftw-3.3.10/simd-support/.libs/libsimd_support.a b/rpg_cpp/fftw-3.3.10/simd-support/.libs/libsimd_support.a index fe1e1e02d7e6e66f9676a48b2ae5def614b26e4b..9a3663e785846430555b45595ea5b2ed95505314 100644 GIT binary patch delta 156 zcmaE$@IYaL44b);sey&zM5Q2B5X*eBAeZvSIR%Ue-ewaf6z&;jB(B8fNY-X##VqUv mj9@d(%{EtYOoFi|Rw->Z;X+8Q;+_SQ+U&)PqKt(