Skip to content

Commit

Permalink
allowing for sep = 0 in rppi/smu
Browse files Browse the repository at this point in the history
  • Loading branch information
adematti committed Feb 3, 2022
1 parent b6da81c commit 67581af
Show file tree
Hide file tree
Showing 11 changed files with 130 additions and 127 deletions.
18 changes: 8 additions & 10 deletions mocks/DDrppi_mocks/countpairs_rp_pi_mocks_impl.c.src
Original file line number Diff line number Diff line change
Expand Up @@ -296,8 +296,8 @@ int countpairs_mocks_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1, DOUBLE
double *rupp = bins->edges;
int nrpbin = bins->nedges;
double rpmin=bins->edges[0], rpmax=bins->edges[bins->nedges-1];
if( ! (rpmin > 0.0 && rpmax > 0.0 && rpmin < rpmax && nrpbin > 0)) {
fprintf(stderr,"Error: Could not setup with R bins correctly. (rmin = %lf, rmax = %lf, with nbins = %d). Expected non-zero rmin/rmax with rmax > rmin and nbins >=1 \n",
if( ! (rpmin >= 0.0 && rpmax > 0.0 && rpmin < rpmax && nrpbin > 0)) {
fprintf(stderr,"Error: Could not setup with r bins correctly. (rmin = %lf, rmax = %lf, with nbins = %d). Expected positive rmin/rmax with rmax > rmin and nbins >=1 \n",
rpmin, rpmax, nrpbin);
return EXIT_FAILURE;
}
Expand Down Expand Up @@ -333,7 +333,7 @@ int countpairs_mocks_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1, DOUBLE
const double zmax = czmax * inv_speed_of_light + 0.01;

const int workspace_size = 10000;
double *interp_redshift = my_calloc(sizeof(*interp_redshift), workspace_size);//the interpolation is done in 'z' and not in 'cz'
double *interp_redshift = my_calloc(sizeof(*interp_redshift), workspace_size);//the interpolation is done in 'z' and not in 'cz'
double *interp_comoving_dist = my_calloc(sizeof(*interp_comoving_dist),workspace_size);
int Nzdc = set_cosmo_dist(zmax, workspace_size, interp_redshift, interp_comoving_dist, cosmology);
if(Nzdc < 0) {
Expand All @@ -344,7 +344,7 @@ int countpairs_mocks_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1, DOUBLE
gsl_interp *interpolation;
gsl_interp_accel *accelerator;
accelerator = gsl_interp_accel_alloc();
interpolation = gsl_interp_alloc (gsl_interp_linear,Nzdc);
interpolation = gsl_interp_alloc(gsl_interp_linear,Nzdc);
gsl_interp_init(interpolation, interp_redshift, interp_comoving_dist, Nzdc);
for(int64_t i=0;i<ND1;i++) {
D1[i] = gsl_interp_eval(interpolation, interp_redshift, interp_comoving_dist, czD1[i]*inv_speed_of_light, accelerator);
Expand Down Expand Up @@ -758,24 +758,22 @@ int countpairs_mocks_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1, DOUBLE
/* Then, add all the self-pairs. This ensures that
a cross-correlation with two identical datasets
produces the same result as the auto-correlation */
npairs[1] += ND1; //npairs[1] contains the first valid bin.
npairs[npibin+1] += ND1; //npairs[1] contains the first valid bin.

// Increasing npairs affects rpavg and weightavg.
// We don't need to add anything to rpavg; all the self-pairs have 0 separation!
// The self-pairs have non-zero weight, though. So, fix that here.
if(need_weightavg){
// Keep in mind this is an autocorrelation (i.e. only one particle set to consider)
pair_struct_DOUBLE pair;
set_pair_struct_DOUBLE(&pair, (weight_struct_DOUBLE *) &(extra->weights0), (weight_struct_DOUBLE *) &(extra->weights0), &(extra->pair_weight));
weight_func_t_DOUBLE weight_func = get_weight_func_by_method_DOUBLE(extra->weight_method);
pair_struct_DOUBLE pair = {.num_weights = extra->weights0.num_weights,
.num_integer_weights = extra->weights0.num_integer_weights,
.dx.d=0., .dy.d=0., .dz.d=0., // always 0 separation
.parx.d=0., .pary.d=0., .parz.d=0.};
for(int64_t j = 0; j < ND1; j++){
for(int w = 0; w < pair.num_weights; w++){
pair.weights0[w].d = ((DOUBLE *) extra->weights0.weights[w])[j];
pair.weights1[w].d = ((DOUBLE *) extra->weights0.weights[w])[j];
}
weightavg[1] += weight_func(&pair);
weightavg[npibin+1] += weight_func(&pair);
}
}
}
Expand Down
20 changes: 9 additions & 11 deletions mocks/DDsmu_mocks/countpairs_s_mu_mocks_impl.c.src
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,8 @@ int countpairs_mocks_s_mu_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1, D
double *supp = bins->edges;
int nsbin = bins->nedges;
double smin=bins->edges[0], smax=bins->edges[bins->nedges-1];
if( ! (smin > 0.0 && smax > 0.0 && smin < smax && nsbin > 0)) {
fprintf(stderr,"Error: Could not setup with S bins correctly. (smin = %lf, smax = %lf, with nbins = %d). Expected non-zero smin/smax with smax > smin and nbins >=1 \n",
if( ! (smin >= 0.0 && smax > 0.0 && smin < smax && nsbin > 0)) {
fprintf(stderr,"Error: Could not setup with s bins correctly. (smin = %lf, smax = %lf, with nbins = %d). Expected non-zero smin/smax with smax > smin and nbins >=1 \n",
smin, smax, nsbin);
return EXIT_FAILURE;
}
Expand Down Expand Up @@ -761,24 +761,22 @@ int countpairs_mocks_s_mu_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1, D
/* Then, add all the self-pairs. This ensures that
a cross-correlation with two identical datasets
produces the same result as the auto-correlation */
npairs[1] += ND1; //npairs[1] contains the first valid bin.
npairs[nmu_bins+1] += ND1; //npairs[1] contains the first valid bin.

// Increasing npairs affects rpavg and weightavg.
// We don't need to add anything to rpavg; all the self-pairs have 0 separation!
// The self-pairs have non-zero weight, though. So, fix that here.
if(need_weightavg){
// Keep in mind this is an autocorrelation (i.e. only one particle set to consider)
pair_struct_DOUBLE pair;
set_pair_struct_DOUBLE(&pair, (weight_struct_DOUBLE *) &(extra->weights0), (weight_struct_DOUBLE *) &(extra->weights0), &(extra->pair_weight));
weight_func_t_DOUBLE weight_func = get_weight_func_by_method_DOUBLE(extra->weight_method);
pair_struct_DOUBLE pair = {.num_weights = extra->weights0.num_weights,
.num_integer_weights = extra->weights0.num_integer_weights,
.dx.d=0., .dy.d=0., .dz.d=0., // always 0 separation
.parx.d=0., .pary.d=0., .parz.d=0.};
for(int64_t j = 0; j < ND1; j++){
for(int w = 0; w < pair.num_weights; w++){
pair.weights0[w].d = ((DOUBLE *) extra->weights0.weights[w])[j];
pair.weights1[w].d = ((DOUBLE *) extra->weights0.weights[w])[j];
}
weightavg[1] += weight_func(&pair);
weightavg[nmu_bins+1] += weight_func(&pair);
}
}
}
Expand All @@ -800,9 +798,9 @@ int countpairs_mocks_s_mu_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1, D
results->mu_max = max_mu;//NOTE max_mu which is double and not mu_max (which might be float)
results->mu_min = ZERO;
results->npairs = my_malloc(sizeof(*(results->npairs)), totnbins);
results->supp = my_malloc(sizeof(*(results->supp)) , nsbin);
results->savg = my_malloc(sizeof(*(results->savg)) , totnbins);
results->weightavg = my_calloc(sizeof(double) , totnbins);
results->supp = my_malloc(sizeof(*(results->supp)), nsbin);
results->savg = my_malloc(sizeof(*(results->savg)), totnbins);
results->weightavg = my_calloc(sizeof(double), totnbins);
if(results->npairs == NULL || results->supp == NULL || results->savg == NULL || results->weightavg == NULL) {
free_results_mocks_s_mu(results);
return EXIT_FAILURE;
Expand Down
46 changes: 28 additions & 18 deletions mocks/DDsmu_mocks/countpairs_s_mu_mocks_kernels.c.src
Original file line number Diff line number Diff line change
Expand Up @@ -268,14 +268,18 @@ static inline int countpairs_s_mu_mocks_avx512_intrinsics_DOUBLE(const int64_t N
AVX512_SQUARE_FLOAT(m_parz)));

// \mu^2 := cos^2(\theta_between_s_and_l) = |s.l|^2 / (|s|^2 * |l|^2)
const AVX512_FLOATS m_zero = AVX512_SETZERO_FLOAT();
const AVX512_FLOATS m_one = AVX512_SET_FLOAT((DOUBLE) 1);
const AVX512_FLOATS m_sqr_norm_l_norm_s = AVX512_MULTIPLY_FLOATS(m_sqr_norm_l, m_sqr_s);
const AVX512_FLOATS m_mask_szero = AVX512_COMPARE_FLOATS(m_zero, m_sqr_s, _CMP_LT_OQ);
m_sqr_norm_l_norm_s = AVX512_BLEND_FLOATS_WITH_MASK(m_one, m_sqr_norm_l_norm_s, m_mask_szero); // to avoid division by 0
AVX512_FLOATS m_sqr_mu = AVX512_SETZERO_FLOAT();
CHECK_AND_FAST_DIVIDE_AVX512(m_sqr_mu, m_sqr_s_dot_l, m_sqr_norm_l_norm_s, m_mask_left, fast_divide_and_NR_steps);

const AVX512_FLOATS m_mu = AVX512_SQRT_FLOAT(m_sqr_mu);
//Do the mask filters in a separate scope
{
const AVX512_MASK m_mask_mumax = AVX512_MASK_COMPARE_FLOATS(m_mask_left, m_sqr_mu,m_sqr_mumax,_CMP_LT_OQ);
const AVX512_MASK m_mask_mumax = AVX512_MASK_COMPARE_FLOATS(m_mask_left, m_sqr_mu,m_sqr_mumax, _CMP_LT_OQ);
const AVX512_MASK m_smax_mask = AVX512_MASK_COMPARE_FLOATS(m_mask_left, m_sqr_s, m_sqr_smax, _CMP_LT_OQ);
const AVX512_MASK m_smin_mask = AVX512_MASK_COMPARE_FLOATS(m_mask_left, m_sqr_s, m_sqr_smin, _CMP_GE_OQ);
const AVX512_MASK m_s_mask = AVX512_MASK_BITWISE_AND(m_smax_mask, m_smin_mask);
Expand Down Expand Up @@ -611,16 +615,18 @@ static inline int countpairs_s_mu_mocks_avx_intrinsics_DOUBLE(const int64_t N0,
AVX_SQUARE_FLOAT(m_parz)));

// \mu^2 := cos^2(\theta_between_s_and_l) = |s.l|^2 / (|s|^2 * |l|^2)
AVX_FLOATS m_sqr_norm_l_norm_s = AVX_MULTIPLY_FLOATS(m_sqr_norm_l, m_sqr_s);
const AVX_FLOATS m_mask_szero = AVX_COMPARE_FLOATS(m_zero, m_sqr_s, _CMP_LT_OQ);
m_sqr_norm_l_norm_s = AVX_BLEND_FLOATS_WITH_MASK(m_one, m_sqr_norm_l_norm_s, m_mask_szero); // to avoid division by 0
AVX_FLOATS m_sqr_mu = AVX_SETZERO_FLOAT();
const AVX_FLOATS m_sqr_norm_l_norm_s = AVX_MULTIPLY_FLOATS(m_sqr_norm_l, m_sqr_s);
CHECK_AND_FAST_DIVIDE_AVX(m_sqr_mu, m_sqr_s_dot_l, m_sqr_norm_l_norm_s, fast_divide_and_NR_steps);

const AVX_FLOATS m_mu = AVX_SQRT_FLOAT(m_sqr_mu);

AVX_FLOATS m_mask_left;
//Do the mask filters in a separate scope
{
const AVX_FLOATS m_mask_mumax = AVX_COMPARE_FLOATS(m_sqr_mu,m_sqr_mumax,_CMP_LT_OQ);
const AVX_FLOATS m_mask_mumax = AVX_COMPARE_FLOATS(m_sqr_mu,m_sqr_mumax, _CMP_LT_OQ);
const AVX_FLOATS m_smax_mask = AVX_COMPARE_FLOATS(m_sqr_s, m_sqr_smax, _CMP_LT_OQ);
const AVX_FLOATS m_smin_mask = AVX_COMPARE_FLOATS(m_sqr_s, m_sqr_smin, _CMP_GE_OQ);
const AVX_FLOATS m_s_mask = AVX_BITWISE_AND(m_smax_mask, m_smin_mask);
Expand All @@ -630,7 +636,7 @@ static inline int countpairs_s_mu_mocks_avx_intrinsics_DOUBLE(const int64_t N0,
continue;
}
m_sqr_s = AVX_BLEND_FLOATS_WITH_MASK(m_zero,m_sqr_s,m_mask_left);
m_sqr_mu = AVX_BLEND_FLOATS_WITH_MASK(m_sqr_mumax,m_sqr_mu,m_mask_left);
m_sqr_mu = AVX_BLEND_FLOATS_WITH_MASK(m_sqr_mumax,m_sqr_mu,m_mask_left);
}

if(need_savg || bin_type == BIN_LIN) {
Expand Down Expand Up @@ -731,7 +737,8 @@ static inline int countpairs_s_mu_mocks_avx_intrinsics_DOUBLE(const int64_t N0,
const DOUBLE s_dot_l = parx*perpx + pary*perpy + parz*perpz;
const DOUBLE sqr_l = parx*parx + pary*pary + parz*parz;// := |l|^2
const DOUBLE sqr_s_dot_l = s_dot_l * s_dot_l;
const DOUBLE sqr_mu = sqr_s_dot_l/(sqr_l * sqr_s);
//const DOUBLE sqr_mu = sqr_s_dot_l/(sqr_l * sqr_s);
const DOUBLE sqr_mu = sqr_s > 0. ? sqr_s_dot_l/(sqr_l * sqr_s) : 0.;
const int mubin = (sqr_mu >= sqr_mumax) ? nmu_bins:(int) (SQRT(sqr_mu)*inv_dmu);
DOUBLE s = ZERO, pairweight = ZERO;
if(need_savg || bin_type == BIN_LIN) {
Expand Down Expand Up @@ -1005,7 +1012,6 @@ static inline int countpairs_s_mu_mocks_sse_intrinsics_DOUBLE(const int64_t N0,
j = N1;/* but do not break out of the loop because this chunk might contain valid pairs */
}


SSE_FLOATS m_sqr_s, m_sqr_mu;
{
const SSE_FLOATS m_term1 = SSE_MULTIPLY_FLOATS(m_parx, m_perpx);
Expand All @@ -1027,8 +1033,10 @@ static inline int countpairs_s_mu_mocks_sse_intrinsics_DOUBLE(const int64_t N0,
}

// \mu^2 = \pi^2 / s^2
const SSE_FLOATS m_sqr_norm_l_norm_s = SSE_MULTIPLY_FLOATS(m_sqr_norm_l, m_sqr_s);
m_sqr_mu = SSE_DIVIDE_FLOATS(m_sqr_s_dot_l,m_sqr_norm_l_norm_s);
SSE_FLOATS m_sqr_norm_l_norm_s = SSE_MULTIPLY_FLOATS(m_sqr_norm_l, m_sqr_s);
const SSE_FLOATS m_mask_szero = SSE_COMPARE_FLOATS_LT(m_zero, m_sqr_s);
m_sqr_norm_l_norm_s = SSE_BLEND_FLOATS_WITH_MASK(m_one, m_sqr_norm_l_norm_s, m_mask_szero); // to avoid division by 0
m_sqr_mu = SSE_DIVIDE_FLOATS(m_sqr_s_dot_l, m_sqr_norm_l_norm_s);
}


Expand All @@ -1037,18 +1045,18 @@ static inline int countpairs_s_mu_mocks_sse_intrinsics_DOUBLE(const int64_t N0,
SSE_FLOATS m_mask_left;
//Do the mask filters in a separate scope
{
const SSE_FLOATS m_mask_mumax = SSE_COMPARE_FLOATS_LT(m_sqr_mu,m_sqr_mumax);
const SSE_FLOATS m_mask_mumax = SSE_COMPARE_FLOATS_LT(m_sqr_mu, m_sqr_mumax);
const SSE_FLOATS m_smax_mask = SSE_COMPARE_FLOATS_LT(m_sqr_s, m_sqr_smax);
const SSE_FLOATS m_smin_mask = SSE_COMPARE_FLOATS_GE(m_sqr_s, m_sqr_smin);
const SSE_FLOATS m_s_mask = SSE_BITWISE_AND(m_smax_mask,m_smin_mask);
const SSE_FLOATS m_s_mask = SSE_BITWISE_AND(m_smax_mask, m_smin_mask);

m_mask_left = SSE_BITWISE_AND(m_mask_mumax, m_s_mask);
if(SSE_TEST_COMPARISON(m_mask_left)==0) {
if(SSE_TEST_COMPARISON(m_mask_left) == 0) {
continue;
}

m_sqr_s = SSE_BLEND_FLOATS_WITH_MASK(m_zero,m_sqr_s,m_mask_left);
m_sqr_mu = SSE_BLEND_FLOATS_WITH_MASK(m_sqr_mumax,m_sqr_mu,m_mask_left);
m_sqr_s = SSE_BLEND_FLOATS_WITH_MASK(m_zero, m_sqr_s, m_mask_left);
m_sqr_mu = SSE_BLEND_FLOATS_WITH_MASK(m_sqr_mumax, m_sqr_mu, m_mask_left);
}
if(need_savg || bin_type == BIN_LIN) {
union_msep.m_Dperp = SSE_SQRT_FLOAT(m_sqr_s);
Expand Down Expand Up @@ -1076,9 +1084,9 @@ static inline int countpairs_s_mu_mocks_sse_intrinsics_DOUBLE(const int64_t N0,
}
else {
for(int kbin=nsbin-1;kbin>=1;kbin--) {
const SSE_FLOATS m_mask_low = SSE_COMPARE_FLOATS_GE(m_sqr_s,m_supp_sqr[kbin-1]);
const SSE_FLOATS m_bin_mask = SSE_BITWISE_AND(m_mask_low,m_mask_left);
m_sbin = SSE_BLEND_FLOATS_WITH_MASK(m_sbin,m_kbin[kbin], m_bin_mask);
const SSE_FLOATS m_mask_low = SSE_COMPARE_FLOATS_GE(m_sqr_s, m_supp_sqr[kbin-1]);
const SSE_FLOATS m_bin_mask = SSE_BITWISE_AND(m_mask_low, m_mask_left);
m_sbin = SSE_BLEND_FLOATS_WITH_MASK(m_sbin, m_kbin[kbin], m_bin_mask);
m_mask_left = SSE_COMPARE_FLOATS_LT(m_sqr_s, m_supp_sqr[kbin-1]);
if(SSE_TEST_COMPARISON(m_mask_left) == 0) {
break;
Expand Down Expand Up @@ -1139,7 +1147,8 @@ static inline int countpairs_s_mu_mocks_sse_intrinsics_DOUBLE(const int64_t N0,
const DOUBLE s_dot_l = parx*perpx + pary*perpy + parz*perpz;
const DOUBLE sqr_l = parx*parx + pary*pary + parz*parz;
const DOUBLE sqr_s_dot_l = s_dot_l * s_dot_l;
const DOUBLE sqr_mu = sqr_s_dot_l/(sqr_l * sqr_s);
//const DOUBLE sqr_mu = sqr_s_dot_l/(sqr_l * sqr_s);
const DOUBLE sqr_mu = sqr_s > 0. ? sqr_s_dot_l/(sqr_l * sqr_s) : 0.;
const int mubin = (sqr_mu >= sqr_mumax) ? nmu_bins:(int) (SQRT(sqr_mu)*inv_dmu);
DOUBLE s = ZERO, pairweight = ZERO;
if(need_savg || bin_type == BIN_LIN) {
Expand Down Expand Up @@ -1374,7 +1383,8 @@ static inline int countpairs_s_mu_mocks_fallback_DOUBLE(const int64_t N0, DOUBLE
const DOUBLE s_dot_l = parx*perpx + pary*perpy + parz*perpz;
const DOUBLE sqr_l = parx*parx + pary*pary + parz*parz;
const DOUBLE sqr_s_dot_l = s_dot_l * s_dot_l;
const DOUBLE sqr_mu = sqr_s_dot_l/(sqr_l * sqr_s);
//const DOUBLE sqr_mu = sqr_s_dot_l/(sqr_l * sqr_s);
const DOUBLE sqr_mu = sqr_s > 0. ? sqr_s_dot_l/(sqr_l * sqr_s) : 0.;
const int mubin = (sqr_mu >= sqr_mumax) ? nmu_bins:(int) (SQRT(sqr_mu)*inv_dmu);
DOUBLE s = ZERO, pairweight = ZERO;
if(need_savg || bin_type == BIN_LIN) {
Expand Down
12 changes: 5 additions & 7 deletions mocks/DDtheta_mocks/countpairs_theta_mocks_impl.c.src
Original file line number Diff line number Diff line change
Expand Up @@ -513,7 +513,7 @@ int countpairs_theta_mocks_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1,
}
}

if(autocorr==0) {
if(autocorr == 0) {
int status = check_ra_dec_DOUBLE(ND2, ra2, dec2);
if(status != EXIT_SUCCESS) {
return status;
Expand All @@ -534,7 +534,7 @@ int countpairs_theta_mocks_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1,
int nthetabin = bins->nedges;
double thetamin=bins->edges[0], thetamax=bins->edges[bins->nedges-1];
if( ! (thetamin >= 0.0 && thetamax > 0.0 && thetamin < thetamax && thetamax <= 180.0 && nthetabin >= 1) ) {
fprintf(stderr,"Error: Could not setup with theta bins correctly. (thetamin = %lf, thetamax = %lf, with nbins = %d). Expected non-zero rmin/rmax with thetamax > "
fprintf(stderr,"Error: Could not setup with theta bins correctly. (thetamin = %lf, thetamax = %lf, with nbins = %d). Expected positive rmin/rmax with thetamax > "
"thetamin and nbins >=1 \n",thetamin, thetamax, nthetabin);
return EXIT_FAILURE;
}
Expand All @@ -545,7 +545,7 @@ int countpairs_theta_mocks_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1,
if((options->link_in_ra == 0) &&
(options->bin_refine_factors[1] < numthreads) &&
(get_bin_refine_scheme(options) == BINNING_DFL)) {
options->bin_refine_factors[1]=numthreads;
options->bin_refine_factors[1] = numthreads;
}
#endif

Expand Down Expand Up @@ -1148,11 +1148,9 @@ int countpairs_theta_mocks_DOUBLE(const int64_t ND1, DOUBLE *ra1, DOUBLE *dec1,
// The self-pairs have non-zero weight, though. So, fix that here.
if(need_weightavg){
// Keep in mind this is an autocorrelation (i.e. only one particle set to consider)
pair_struct_DOUBLE pair;
set_pair_struct_DOUBLE(&pair, (weight_struct_DOUBLE *) &(extra->weights0), (weight_struct_DOUBLE *) &(extra->weights0), &(extra->pair_weight));
weight_func_t_DOUBLE weight_func = get_weight_func_by_method_DOUBLE(extra->weight_method);
pair_struct_DOUBLE pair = {.num_weights = extra->weights0.num_weights,
.num_integer_weights = extra->weights0.num_integer_weights,
.dx.d=0., .dy.d=0., .dz.d=0., // always 0 separation
.parx.d=0., .pary.d=0., .parz.d=0.};
for(int64_t j = 0; j < ND1; j++){
for(int w = 0; w < pair.num_weights; w++){
pair.weights0[w].d = ((DOUBLE *) extra->weights0.weights[w])[j];
Expand Down
Loading

0 comments on commit 67581af

Please sign in to comment.