/** * Wrapper for calling forward operation using italgos. */ extern void linop_forward_iter(void* _o, float* _dst, const float* _src ) { struct linop_s* o = _o; complex float* dst = (complex float*) _dst; const complex float* src = (complex float*) _src; linop_forward_unchecked(o, dst, src); }
void fd_proj_noninc(const struct linop_s* o, complex float* optr, const complex float* iptr) { struct fdiff_s* data = (struct fdiff_s*)linop_get_data(o); // FIXME: CAST? dump_cfl("impre", data->D, data->dims, iptr); complex float* tmp2 = md_alloc_sameplace(data->D, data->dims, CFL_SIZE, optr); linop_forward_unchecked(o, tmp2, iptr); long tmpdim = data->dims[0]; long dims2[data->D]; md_select_dims(data->D, ~0u, dims2, data->dims); dims2[0] *= 2; dump_cfl("dxpre", data->D, data->dims, tmp2); md_smin(data->D, dims2, (float*)optr, (float*)tmp2, 0.); // add back initial value dims2[0] = tmpdim; for (unsigned int i = 0; i < data->D; i++) { if (MD_IS_SET(data->flags, i)) { dims2[i] = 1; md_copy2(data->D, dims2, data->str, optr, data->str, tmp2, CFL_SIZE); break; } } dump_cfl("dxpost", data->D, data->dims, optr); linop_norm_inv_unchecked(o, 0., optr, optr); dump_cfl("impost", data->D, data->dims, optr); md_free(tmp2); }
static void nlop_der_iter(iter_op_data* _o, float* _dst, const float* _src) { const struct iter4_nlop_s* nlop = CAST_DOWN(iter4_nlop_s, _o); linop_forward_unchecked(nlop->nlop.derivative[0], (complex float*)_dst, (const complex float*)_src); }