www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Magic infinite loop inside foreach

reply "MrSmith" <mrsmith33 yandex.ru> writes:
I have some function which does some matrix calculations and 
prints them. It is actually calculationg determinant of the 
matrix and i need to call those functions several times in the 
loop, until i get the final result. Here is the code.

void solveAndPrint(T : CoeffMatrix!(ElementType, ElementType), 
ElementType)(T _matrix)
{
	auto matrix = _matrix;
	TempMatrix!ElementType temp;

	foreach(_; 0..3) //3 is just for debug
	{
		writeln(matrix);
		temp = makeTemp(matrix);

		writeln(temp);
		matrix = solveTemp(temp);

		writeln("done1");
		stdout.flush();
	}
	writeln("done2");
	stdout.flush();
}

The problem is that after 'done1' is printed it is running 
infinitely consuming all the processor just like if has infinite 
loop inside. done2 is never printed.
Jan 30 2014
parent reply "MrSmith" <mrsmith33 yandex.ru> writes:
On Thursday, 30 January 2014 at 22:56:46 UTC, MrSmith wrote:
 I have some function which does some matrix calculations and 
 prints them. It is actually calculationg determinant of the 
 matrix and i need to call those functions several times in the 
 loop, until i get the final result. Here is the code.

 void solveAndPrint(T : CoeffMatrix!(ElementType, ElementType), 
 ElementType)(T _matrix)
 {
 	auto matrix = _matrix;
 	TempMatrix!ElementType temp;

 	foreach(_; 0..3) //3 is just for debug
 	{
 		writeln(matrix);
 		temp = makeTemp(matrix);

 		writeln(temp);
 		matrix = solveTemp(temp);

 		writeln("done1");
 		stdout.flush();
 	}
 	writeln("done2");
 	stdout.flush();
 }

 The problem is that after 'done1' is printed it is running 
 infinitely consuming all the processor just like if has 
 infinite loop inside. done2 is never printed.
Somehow if i comment out //matrix = solveTemp(temp); it works, but this method works fine, and after it done1 is printed. Strange.
Jan 30 2014
next sibling parent =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 01/30/2014 03:08 PM, MrSmith wrote:

 On Thursday, 30 January 2014 at 22:56:46 UTC, MrSmith wrote:
 I have some function which does some matrix calculations and prints
 them. It is actually calculationg determinant of the matrix and i need
 to call those functions several times in the loop, until i get the
 final result. Here is the code.

 void solveAndPrint(T : CoeffMatrix!(ElementType, ElementType),
 ElementType)(T _matrix)
 {
     auto matrix = _matrix;
     TempMatrix!ElementType temp;

     foreach(_; 0..3) //3 is just for debug
     {
         writeln(matrix);
         temp = makeTemp(matrix);

         writeln(temp);
         matrix = solveTemp(temp);
Does that mutate temp in any way? If so, probably the change is affecting how solveTemp() works the next time.
         writeln("done1");
         stdout.flush();
     }
     writeln("done2");
     stdout.flush();
 }

 The problem is that after 'done1' is printed it is running infinitely
 consuming all the processor just like if has infinite loop inside.
 done2 is never printed.
Somehow if i comment out //matrix = solveTemp(temp); it works, but this method works fine, and after it done1 is printed. Strange.
Ali
Jan 30 2014
prev sibling parent reply Joseph Rushton Wakeling <joseph.wakeling webdrake.net> writes:
On 31/01/14 00:08, MrSmith wrote:
 Somehow if i comment out
 //matrix = solveTemp(temp);
 it works, but this method works fine, and after it done1 is printed. Strange.
That does rather suggest that it's that method that is causing things to get stuck. Can you share what's inside it? And when you say "this method works fine", do you mean that you've manually tested it with the temp variable that goes in before it hangs? Could it be that whatever printout you're doing of variables like matrix is missing some tiny differences -- floating-point rounding errors? -- that are responsible for the transformations inside makeTemp or solveTemp behaving wrongly and therefore (in the latter case) getting stuck?
Jan 30 2014
parent reply "MrSmith" <mrsmith33 yandex.ru> writes:
On Thursday, 30 January 2014 at 23:45:14 UTC, Joseph Rushton 
Wakeling wrote:
 On 31/01/14 00:08, MrSmith wrote:
 Somehow if i comment out
 //matrix = solveTemp(temp);
 it works, but this method works fine, and after it done1 is 
 printed. Strange.
That does rather suggest that it's that method that is causing things to get stuck. Can you share what's inside it? And when you say "this method works fine", do you mean that you've manually tested it with the temp variable that goes in before it hangs? Could it be that whatever printout you're doing of variables like matrix is missing some tiny differences -- floating-point rounding errors? -- that are responsible for the transformations inside makeTemp or solveTemp behaving wrongly and therefore (in the latter case) getting stuck?
Here is complete code (excluding rational.d by DSimcha) https://gist.github.com/MrSmith33/8732520 It prints: foreach start after makeTemp solveTemp start before solveTemp return foreach end and then stucks. As you can see it goes through solveTemp method and stops at the foreach end. So, i can not see any reason why it goes infinite there.
Jan 31 2014
parent "MrSmith" <mrsmith33 yandex.ru> writes:
On Friday, 31 January 2014 at 14:05:10 UTC, MrSmith wrote:
 On Thursday, 30 January 2014 at 23:45:14 UTC, Joseph Rushton 
 Wakeling wrote:
 On 31/01/14 00:08, MrSmith wrote:
 Somehow if i comment out
 //matrix = solveTemp(temp);
 it works, but this method works fine, and after it done1 is 
 printed. Strange.
That does rather suggest that it's that method that is causing things to get stuck. Can you share what's inside it? And when you say "this method works fine", do you mean that you've manually tested it with the temp variable that goes in before it hangs? Could it be that whatever printout you're doing of variables like matrix is missing some tiny differences -- floating-point rounding errors? -- that are responsible for the transformations inside makeTemp or solveTemp behaving wrongly and therefore (in the latter case) getting stuck?
Here is complete code (excluding rational.d by DSimcha) https://gist.github.com/MrSmith33/8732520 It prints: foreach start after makeTemp solveTemp start before solveTemp return foreach end and then stucks. As you can see it goes through solveTemp method and stops at the foreach end. So, i can not see any reason why it goes infinite there.
Found it! First i was thinkig that it was stuck at the end of foreach. Than i placed print at the start of the loop. Turned out that problem was in makeTemp in pow function which i poorly implemeneted and it looped infinitely. ElementType pow(ElementType, I)(ElementType number, I power) if (isIntegral!I) { ElementType result = number; writeln("pow start ", number, " ", power); stdout.flush(); foreach(_; 0..power-1) number *= number; writeln("pow end"); stdout.flush(); return number; } that printed: pow start 0/1 0 I've completely forgot about power of 0. Thanks guys!
Jan 31 2014