From: <ole...@us...> - 2013-03-03 17:08:51
|
Revision: 1928 http://opende.svn.sourceforge.net/opende/?rev=1928&view=rev Author: oleh_derevenko Date: 2013-03-03 17:08:44 +0000 (Sun, 03 Mar 2013) Log Message: ----------- Fixed: Fixed issue with "findex==-1" constraints being intermixed with "findex!=-1" ones during constraints random reordering in QuickStep Modified Paths: -------------- trunk/CHANGELOG.txt trunk/ode/src/quickstep.cpp Modified: trunk/CHANGELOG.txt =================================================================== --- trunk/CHANGELOG.txt 2013-02-09 08:50:21 UTC (rev 1927) +++ trunk/CHANGELOG.txt 2013-03-03 17:08:44 UTC (rev 1928) @@ -8,14 +8,18 @@ * keep the format consistent (79 char width, M/D/Y date format). ------------------------------------------------------------------------------ -02/03/13 Oleh_derevenko - * [u]int[8/16/32] renamed to contain "d" prefix so that global namespace - was not polluted with these names unconditionally. - If your project depended on these types other than just for passing - parameters to ODE calls, add similar typedefs for yourself in some - of your project's global headers. +03/03/13 Oleh_Derevenko + * Fixed issue with "findex==-1" constraints being intermixed with + "findex!=-1" ones during constraints random reordering in QuickStep. -01/02/13 Oleh_derevenko +02/03/13 Oleh_Derevenko + * [u]int[8/16/32] renamed to contain "d" prefix so that global namespace + was not polluted with these names unconditionally. + If your project depended on these types other than just for passing + parameters to ODE calls, add similar typedefs for yourself in some + of your project's global headers. + +01/02/13 Oleh_Derevenko * Applied patch #183 by Joseph Cooper (complementary matrix calculation fix). Modified: trunk/ode/src/quickstep.cpp =================================================================== --- trunk/ode/src/quickstep.cpp 2013-02-09 08:50:21 UTC (rev 1927) +++ trunk/ode/src/quickstep.cpp 2013-03-03 17:08:44 UTC (rev 1928) @@ -589,6 +589,7 @@ // order to solve constraint rows in IndexError *order = memarena->AllocateArray<IndexError>(m); + unsigned int head_size; #ifndef REORDER_CONSTRAINTS { @@ -605,6 +606,7 @@ --ordertail; } } + head_size = (unsigned int)(orderhead - order); dIASSERT (orderhead-ordertail==1); } #endif @@ -623,11 +625,14 @@ if (iteration < 2) { // for the first two iterations, solve the constraints in // the given order + head_size = 0; IndexError *ordercurr = order; for (unsigned int i = 0; i != m; ordercurr++, i++) { + int findex_i = findex[i]; ordercurr->error = i; - ordercurr->findex = findex[i]; + ordercurr->findex = findex_i; ordercurr->index = i; + if (findex_i == -1) { ++head_size; } } } else { @@ -644,8 +649,10 @@ else { order[i].error = dInfinity; } - order[i].findex = findex[i]; + int findex_i = findex[i]; + order[i].findex = findex_i; order[i].index = i; + if (findex_i == -1) { ++head_size; } } } qsort (order,m,sizeof(IndexError),&compare_index_error); @@ -657,12 +664,19 @@ #endif #ifdef RANDOMLY_REORDER_CONSTRAINTS if ((iteration & 7) == 0) { - for (unsigned int i=1; i<m; i++) { + for (unsigned int i=1; i<head_size; i++) { int swapi = dRandInt(i+1); IndexError tmp = order[i]; order[i] = order[swapi]; order[swapi] = tmp; } + unsigned int tail_size = m - head_size; + for (unsigned int j=1; j<tail_size; j++) { + int swapj = dRandInt(j+1); + IndexError tmp = order[head_size + j]; + order[head_size + j] = order[head_size + swapj]; + order[head_size + swapj] = tmp; + } } #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |