// Berkeley Open Infrastructure for Network Computing // http://boinc.berkeley.edu // Copyright (C) 2005 University of California // // This is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; // either version 2.1 of the License, or (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Lesser General Public License for more details. // // To view the GNU Lesser General Public License visit // http://www.gnu.org/copyleft/lesser.html // or write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #if defined(_WIN32) && !defined(__STDWX_H__) && !defined(_BOINC_WIN_) && !defined(_AFX_STDAFX_H_) #include "boinc_win.h" #else #include "config.h" #endif #ifndef _WIN32 #include #include #include #include #include #include #include #include #include #endif #include "reduce.h" // Prepare to receive a source array. // (sx, sy) are dimensions of source array // void REDUCED_ARRAY_GEN::init_data(int sx, int sy) { sdimx = sx; sdimy = sy; rdimx = sx; rdimy = sy; if (rdimx > 256) rdimx = 256; if (rdimy > 128) rdimy = 128; while (rdimx*rdimy > MAX_DATA) { if (rdimx>1) rdimx /= 2; if (rdimy>1) rdimy /= 2; } nvalid_rows = 0; scury = 0; last_ry = 0; last_ry_count = 0; rdata_max = 0; rdata_min = (float)1e20; } bool REDUCED_ARRAY_GEN::full() { return nvalid_rows==rdimy; } #if 0 void REDUCED_ARRAY_GEN::reset() { nvalid_rows = 0; ndrawn_rows = 0; scury = 0; last_ry = 0; last_ry_count = 0; } #endif // reduce a single row. This is called only if sdimx > rdimx; // void REDUCED_ARRAY_GEN::reduce_source_row(float* in, float* out) { int i, ri; memset(out, 0, rdimx*sizeof(float)); memset(itemp, 0, rdimx*sizeof(int)); for (i=0; i 1) out[i] /= itemp[i]; } } } void REDUCED_ARRAY_GEN::update_max(int row) { int i; float* p = rrow(row); for (i=0; i rdata_max) rdata_max = p[i]; if (p[i] < rdata_min) rdata_min = p[i]; } } // Add a row of data from the source array // void REDUCED_ARRAY_GEN::add_source_row(float* in) { float* p; int i, ry; if (scury >= sdimy) { printf("too many calls to add_source_row()!\n"); *(int*)0 = 0; } if (rdimy == sdimy) { ry = scury; if (rdimx == sdimx) { memcpy(rrow(ry), in, rdimx*sizeof(float)); } else { reduce_source_row(in, rrow(ry)); } update_max(ry); nvalid_rows++; } else { ry = (scury*rdimy)/sdimy; if (scury == 0) memset(rrow(0), 0, rdimx*sizeof(float)); // if we've moved into a new row, finish up the previous one // if (ry > last_ry) { p = rrow(last_ry); if (last_ry_count > 1) { for (i=0; i 1) { for (i=0; i