static void score (BstQSampler *qsampler) { GslDataCache *dcache = qsampler->src_data; GslDataHandle *shandle = global_handle; GslDataHandle *dhandle = dcache->dhandle; GslLong l, length = MIN (gsl_data_handle_length (shandle), gsl_data_handle_length (dhandle)); gdouble score = 0; for (l = 0; l < length; ) { GslLong b = 8192; gfloat v1[b], v2[b]; b = MIN (b, length - l); b = gsl_data_handle_read (shandle, l, b, v1); b = gsl_data_handle_read (dhandle, l, b, v2); g_assert (b >= 0); g_assert (b >= 1); l += b; while (b--) score += (v1[b] - v2[b]) * (v1[b] - v2[b]); // g_print ("0x%08lx) %10.3f\n", l, score); } g_print ("total score: %10.3f\n", score); }
static GslLong cut_handle_read (GslDataHandle *dhandle, GslLong voffset, GslLong n_values, gfloat *values) { CutHandle *chandle = (CutHandle*) dhandle; GslLong orig_n_values = n_values; if (voffset < chandle->cut_offset) { GslLong l = MIN (chandle->cut_offset - voffset, n_values); l = gsl_data_handle_read (chandle->src_handle, voffset, l, values); if (l < 0) return l; /* pass on errors */ n_values -= l; values += l; voffset += l; } if (voffset >= chandle->cut_offset && n_values) { GslLong l = gsl_data_handle_read (chandle->src_handle, voffset + chandle->n_cut_values, n_values, values); if (l < 0 && orig_n_values == n_values) return l; /* pass on errors */ else if (l < 0) l = 0; n_values -= l; } return orig_n_values - n_values; }
static GslLong insert_handle_read (GslDataHandle *data_handle, GslLong voffset, GslLong n_values, gfloat *values) { InsertHandle *ihandle = (InsertHandle*) data_handle; GslLong l, orig_n_values = n_values; if (voffset < ihandle->src_handle->setup.n_values && voffset < ihandle->paste_offset) { l = MIN (n_values, MIN (ihandle->paste_offset, ihandle->src_handle->setup.n_values) - voffset); l = gsl_data_handle_read (ihandle->src_handle, voffset, l, values); if (l < 0) return l; /* pass on errors */ voffset += l; n_values -= l; values += l; } if (n_values && voffset >= ihandle->src_handle->setup.n_values && voffset < ihandle->paste_offset) { l = MIN (n_values, ihandle->paste_offset - voffset); memset (values, 0, l * sizeof (values[0])); voffset += l; n_values -= l; values += l; } if (n_values && voffset >= ihandle->paste_offset && voffset < ihandle->paste_offset + ihandle->n_paste_values) { l = MIN (n_values, ihandle->paste_offset + ihandle->n_paste_values - voffset); memcpy (values, ihandle->paste_values + voffset - ihandle->paste_offset, l * sizeof (values[0])); voffset += l; n_values -= l; values += l; } if (n_values && voffset >= ihandle->paste_offset + ihandle->n_paste_values) { l = gsl_data_handle_read (ihandle->src_handle, voffset - ihandle->n_paste_values, n_values, values); if (l < 0 && orig_n_values == n_values) return l; /* pass on errors */ else if (l < 0) l = 0; n_values -= l; } return orig_n_values - n_values; }
static gdouble score_loop (GslDataHandle *shandle, GslDataHandle *dhandle) { GslLong l, length = MIN (gsl_data_handle_length (shandle), gsl_data_handle_length (dhandle)); gdouble score = 0; for (l = 0; l < length; ) { GslLong b = 8192; gfloat v1[b], v2[b]; b = MIN (b, length - l); b = gsl_data_handle_read (shandle, l, b, v1); b = gsl_data_handle_read (dhandle, l, b, v2); g_assert (b >= 0); g_assert (b >= 1); l += b; while (b--) score += (v1[b] - v2[b]) * (v1[b] - v2[b]); } return score; }
static GslLong loop_handle_read (GslDataHandle *data_handle, GslLong voffset, GslLong n_values, gfloat *values) { LoopHandle *lhandle = (LoopHandle*) data_handle; if (voffset < lhandle->loop_start) return gsl_data_handle_read (lhandle->src_handle, voffset, MIN (lhandle->loop_start - voffset, n_values), values); else { GslLong noffset = voffset - lhandle->loop_start; noffset %= lhandle->loop_width; return gsl_data_handle_read (lhandle->src_handle, lhandle->loop_start + noffset, MIN (lhandle->loop_width - noffset, n_values), values); } }
static GslLong reverse_handle_read (GslDataHandle *dhandle, GslLong voffset, GslLong n_values, gfloat *values) { ReversedHandle *rhandle = (ReversedHandle*) dhandle; GslLong left, new_offset = dhandle->setup.n_values - (voffset + n_values); gfloat *t, *p = values; g_assert (new_offset >= 0); left = n_values; do { GslLong l = gsl_data_handle_read (rhandle->src_handle, new_offset, left, p); if (l < 0) return l; /* pass on errors */ new_offset += l; left -= l; p += l; } while (left > 0); p = values; t = values + n_values - 1; while (p < t) { gfloat v = *t; *t-- = *p; *p++ = v; } return n_values; }