$title 'Check Ctrl-C/Interrupt handling of Embedded Code, MIP solver, and GAMS' (INTERRUPT,SEQ=937) $ontext This test checks that embedded code, the MIP solver, and GAMS itself (during execution) can be interrupted. The test can be run interactively requiring the user to hit 25 times Ctrl-C or in a batch mode, where some embedded Python issues these 25 interrupt signals Contributor: Michael Bussieck, March 2023 $offtext $onechoV > stopme.gms $onEmbeddedCode Connect: - PythonCode: code: | x = 0 for i in range(1000): for j in range(1000): for k in range(1000): for l in range(1000): x = x + 1 $offEmbeddedCode $clearErrors $onEmbeddedCode Python: x = 0 for i in range(1000): for j in range(1000): for k in range(1000): for l in range(1000): x = x + 1 $offEmbeddedCode $clearErrors $onEmbeddedCode GAMS: set i / 1*1000 /; alias (i,j,k,l); scalar x /0/; loop((i,j,k,l), x = x+1); $offEmbeddedCode $clearErrors embeddedCode Connect: - PythonCode: code: | x = 0 for i in range(1000): for j in range(1000): for k in range(1000): for l in range(1000): x = x + 1 endEmbeddedCode execError = 0; embeddedCode Python: x = 0 for i in range(1000): for j in range(1000): for k in range(1000): for l in range(1000): x = x + 1 pauseEmbeddedCode execError = 0; continueEmbeddedCode: x = 0 for i in range(1000): for j in range(1000): for k in range(1000): for l in range(1000): x = x + 1 endEmbeddedCode execError = 0; embeddedCode GAMS: set i / 1*1000 /; alias (i,j,k,l); scalar x /0/; loop((i,j,k,l), x = x+1); endEmbeddedCode execError = 0; * MIPLIB pk1 problem with last five binaries relaxed (to fit the demo limit and make test faster) Variables x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19 ,x20,x21,x22,x23,x24,x25,x26,x27,x28,x29,x30,x31,x32,b33,b34,b35,b36 ,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49,b50,b51,b52,b53 ,b54,b55,b56,b57,b58,b59,b60,b61,b62,b63,b64,b65,b66,b67,b68,b69,b70 ,b71,b72,b73,b74,b75,b76,b77,b78,b79,b80,b81,b82,b83,b84,b85,b86,b87; Positive Variables x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17 ,x18,x19,x20,x21,x22,x23,x24,x25,x26,x27,x28,x29,x30,x31,x32; Binary Variables b33,b34,b35,b36,b37,b38,b39,b40,b41,b42,b43,b44,b45,b46,b47 ,b48,b49,b50,b51,b52,b53,b54,b55,b56,b57,b58,b59,b60,b61,b62,b63,b64 ,b65,b66,b67,b68,b69,b70,b71,b72,b73,b74,b75,b76,b77,b78,b79,b80,b81 ,b82,b83,b84,b85,b86,b87; Equations e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19 ,e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e30,e31,e32,e33,e34,e35,e36 ,e37,e38,e39,e40,e41,e42,e43,e44,e45,e46; e1.. x1 - x2 =E= 0; e2.. x2 - x3 =G= 0; e3.. x2 - x4 =G= 0; e4.. x2 - x5 =G= 0; e5.. x2 - x6 =G= 0; e6.. x2 - x7 =G= 0; e7.. x2 - x8 =G= 0; e8.. x2 - x9 =G= 0; e9.. x2 - x10 =G= 0; e10.. x2 - x11 =G= 0; e11.. x2 - x12 =G= 0; e12.. x2 - x13 =G= 0; e13.. x2 - x14 =G= 0; e14.. x2 - x15 =G= 0; e15.. x2 - x16 =G= 0; e16.. x2 - x17 =G= 0; e17.. x2 - x18 =G= 0; e18.. x2 - x19 =G= 0; e19.. x2 - x20 =G= 0; e20.. x2 - x21 =G= 0; e21.. x2 - x22 =G= 0; e22.. x2 - x23 =G= 0; e23.. x2 - x24 =G= 0; e24.. x2 - x25 =G= 0; e25.. x2 - x26 =G= 0; e26.. x2 - x27 =G= 0; e27.. x2 - x28 =G= 0; e28.. x2 - x29 =G= 0; e29.. x2 - x30 =G= 0; e30.. x2 - x31 =G= 0; e31.. x2 - x32 =G= 0; e32.. x3 - x4 + 14*b33 + 36*b34 + 11*b35 + 27*b36 + 49*b37 + 26*b38 + 37*b39 + 45*b40 + 21*b41 + 6*b42 + 48*b43 + 38*b44 + 37*b45 + 10*b46 + 16*b47 + 35*b48 + 17*b49 + 7*b50 + 46*b51 + 26*b52 + 8*b53 + 40*b54 + 19*b55 + 33*b56 + 5*b57 + 42*b58 + 22*b59 + 14*b60 + 51*b61 + 49*b62 + 7*b63 + 10*b64 + 30*b65 + 14*b66 + 32*b67 + 24*b68 + 36*b69 + 14*b70 + 13*b71 + 52*b72 + 16*b73 + 5*b74 + 35*b75 + 48*b76 + 11*b77 + 47*b78 + 27*b79 + 24*b80 + 49*b81 + 17*b82 + 46*b83 + 53*b84 + 53*b85 + 10*b86 + 30*b87 =E= 731; e33.. x5 - x6 + 53*b33 + 48*b34 + 48*b35 + 12*b36 + 43*b37 + 42*b38 + 14*b39 + 48*b40 + 16*b41 + 23*b42 + 25*b43 + 36*b44 + 54*b45 + 34*b46 + 45*b47 + 51*b48 + 45*b49 + 46*b50 + 30*b51 + 38*b52 + 52*b53 + 21*b54 + 9*b55 + 21*b56 + 15*b57 + 22*b58 + 12*b59 + 12*b60 + 19*b61 + 17*b62 + 38*b63 + 17*b64 + 9*b65 + 30*b66 + 24*b67 + 48*b68 + 16*b69 + 34*b70 + 41*b71 + 28*b72 + 52*b73 + 10*b74 + 8*b75 + 51*b76 + 40*b77 + 48*b78 + 46*b79 + 30*b80 + 38*b81 + 21*b82 + 12*b83 + 35*b84 + 38*b85 + 17*b86 + 52*b87 =E= 731; e34.. x7 - x8 + 48*b33 + 34*b34 + 8*b35 + 5*b36 + 49*b37 + 21*b38 + 38*b39 + 11*b40 + 26*b41 + 12*b42 + 30*b43 + 18*b44 + 23*b45 + 8*b46 + 55*b47 + 46*b48 + 5*b49 + 10*b50 + 50*b51 + 52*b52 + 45*b53 + 42*b54 + 43*b55 + 19*b56 + 25*b57 + 8*b58 + 27*b59 + 5*b60 + 41*b61 + 39*b62 + 52*b63 + 33*b64 + 17*b65 + 5*b66 + 34*b67 + 11*b68 + 21*b69 + 16*b70 + 17*b71 + 42*b72 + 23*b73 + 43*b74 + 5*b75 + 42*b76 + 47*b77 + 55*b78 + 32*b79 + 47*b80 + 9*b81 + 26*b82 + 43*b83 + 50*b84 + 13*b85 + 30*b86 + 14*b87 =E= 731; e35.. x9 - x10 + 33*b33 + 34*b34 + 36*b35 + 34*b36 + 19*b37 + 19*b38 + 30*b39 + 48*b40 + 32*b41 + 30*b42 + 26*b43 + 39*b44 + 47*b45 + 37*b46 + 52*b47 + 33*b48 + 5*b49 + 39*b50 + 34*b51 + 42*b52 + 30*b53 + 33*b54 + 19*b55 + 21*b56 + 38*b57 + 40*b58 + 9*b59 + 33*b60 + 48*b61 + 35*b62 + 42*b63 + 26*b64 + 13*b65 + 23*b66 + 55*b67 + 27*b68 + 37*b69 + 30*b70 + 20*b71 + 14*b72 + 5*b73 + 42*b74 + 49*b75 + 47*b76 + 24*b77 + 45*b78 + 25*b79 + 24*b80 + 28*b81 + 54*b82 + 11*b83 + 53*b84 + 32*b85 + 25*b86 + 19*b87 =E= 731; e36.. x11 - x12 + 15*b33 + 9*b34 + 24*b35 + 43*b36 + 53*b37 + 54*b38 + 29*b39 + 24*b40 + 11*b41 + 47*b42 + 24*b43 + 34*b44 + 29*b45 + 49*b46 + 50*b47 + 39*b48 + 50*b49 + 36*b50 + 32*b51 + 42*b52 + 55*b53 + 21*b54 + 11*b55 + 24*b56 + 45*b57 + 10*b58 + 30*b59 + 42*b60 + 38*b61 + 51*b62 + 6*b63 + 48*b64 + 5*b65 + 25*b66 + 36*b67 + 53*b68 + 24*b69 + 10*b70 + 22*b71 + 31*b72 + 53*b73 + 41*b74 + 10*b75 + 26*b76 + 35*b77 + 55*b78 + 10*b79 + 29*b80 + 36*b81 + 37*b82 + 15*b83 + 36*b84 + 54*b85 + 22*b86 + 55*b87 =E= 731; e37.. x13 - x14 + 43*b33 + 28*b34 + 30*b35 + 30*b36 + 10*b37 + 26*b38 + 32*b39 + 54*b40 + 26*b41 + 52*b42 + 34*b43 + 24*b44 + 21*b45 + 39*b46 + 41*b47 + 47*b48 + 36*b49 + 27*b50 + 52*b51 + 7*b52 + 6*b53 + 52*b54 + 13*b55 + 30*b56 + 32*b57 + 46*b58 + 41*b59 + 12*b60 + 44*b61 + 7*b62 + 12*b63 + 32*b64 + 30*b65 + 38*b66 + 6*b67 + 36*b68 + 8*b69 + 34*b70 + 34*b71 + 30*b72 + 31*b73 + 13*b74 + 49*b75 + 47*b76 + 48*b77 + 35*b78 + 39*b79 + 29*b80 + 6*b81 + 35*b82 + 32*b83 + 7*b84 + 32*b85 + 40*b86 + 33*b87 =E= 731; e38.. x15 - x16 + 8*b33 + 30*b34 + 18*b35 + 16*b36 + 18*b37 + 21*b38 + 24*b39 + 46*b40 + 47*b41 + 6*b42 + 48*b43 + 27*b44 + 10*b45 + 26*b46 + 6*b47 + 36*b48 + 52*b49 + 14*b50 + 29*b51 + 43*b52 + 7*b53 + 8*b54 + 26*b55 + 31*b56 + 10*b57 + 6*b58 + 7*b59 + 12*b60 + 33*b61 + 42*b62 + 41*b63 + 37*b64 + 17*b65 + 55*b66 + 48*b67 + 31*b68 + 20*b69 + 17*b70 + 21*b71 + 11*b72 + 19*b73 + 13*b74 + 34*b75 + 24*b76 + 35*b77 + 35*b78 + 55*b79 + 31*b80 + 44*b81 + 29*b82 + 19*b83 + 46*b84 + 33*b85 + 41*b86 + 22*b87 =E= 731; e39.. x17 - x18 + 38*b33 + 42*b34 + 24*b35 + 46*b36 + 20*b37 + 11*b38 + 32*b39 + 52*b40 + 24*b41 + 31*b42 + 45*b43 + 50*b44 + 47*b45 + 6*b46 + 15*b47 + 53*b48 + 20*b49 + 24*b50 + 31*b51 + 40*b52 + 54*b53 + 10*b54 + 40*b55 + 30*b56 + 50*b57 + 14*b58 + 44*b59 + 41*b60 + 42*b61 + 29*b62 + 8*b63 + 24*b64 + 16*b65 + 27*b66 + 15*b67 + 31*b68 + 34*b69 + 42*b70 + 28*b71 + 53*b72 + 17*b73 + 18*b74 + 48*b75 + 8*b76 + 19*b77 + 7*b78 + 6*b79 + 35*b80 + 27*b81 + 33*b82 + 20*b83 + 25*b84 + 39*b85 + 55*b86 + 51*b87 =E= 731; e40.. x19 - x20 + 34*b33 + 13*b34 + 39*b35 + 19*b36 + 51*b37 + 13*b38 + 22*b39 + 20*b40 + 24*b41 + 45*b42 + 30*b43 + 51*b44 + 24*b45 + 17*b46 + 23*b47 + 22*b48 + 29*b49 + 36*b50 + 14*b51 + 33*b52 + 51*b53 + 17*b54 + 35*b55 + 31*b56 + 39*b57 + 12*b58 + 47*b59 + 9*b60 + 46*b61 + 46*b62 + 55*b63 + 25*b64 + 55*b65 + 38*b66 + 39*b67 + 51*b68 + 46*b69 + 6*b70 + 15*b71 + 15*b72 + 47*b73 + 40*b74 + 10*b75 + 15*b76 + 52*b77 + 29*b78 + 32*b79 + 26*b80 + 10*b81 + 42*b82 + 55*b83 + 6*b84 + 54*b85 + 34*b86 + 32*b87 =E= 731; e41.. x21 - x22 + 37*b33 + 42*b34 + 23*b35 + 41*b36 + 33*b37 + 14*b38 + 40*b39 + 53*b40 + 14*b41 + 23*b42 + 37*b43 + 9*b44 + 14*b45 + 38*b46 + 19*b47 + 24*b48 + 29*b49 + 55*b50 + 29*b51 + 40*b52 + 52*b53 + 54*b54 + 16*b55 + 23*b56 + 8*b57 + 53*b58 + 23*b59 + 9*b60 + 52*b61 + 52*b62 + 37*b63 + 33*b64 + 39*b65 + 55*b66 + 18*b67 + 17*b68 + 14*b69 + 54*b70 + 14*b71 + 24*b72 + 21*b73 + 46*b74 + 28*b75 + 30*b76 + 29*b77 + 43*b78 + 50*b79 + 53*b80 + 43*b81 + 24*b82 + 38*b83 + 39*b84 + 22*b85 + 49*b86 + 7*b87 =E= 731; e42.. x23 - x24 + 25*b33 + 47*b34 + 25*b35 + 29*b36 + 44*b37 + 22*b38 + 10*b39 + 21*b40 + 5*b41 + 10*b42 + 35*b43 + 17*b44 + 20*b45 + 33*b46 + 27*b47 + 39*b48 + 50*b49 + 17*b50 + 11*b51 + 25*b52 + 42*b53 + 50*b54 + 19*b55 + 40*b56 + 37*b57 + 38*b58 + 22*b59 + 20*b60 + 5*b61 + 16*b62 + 22*b63 + 25*b64 + 8*b65 + 43*b66 + 50*b67 + 47*b68 + 9*b69 + 5*b70 + 12*b71 + 10*b72 + 10*b73 + 42*b74 + 22*b75 + 25*b76 + 20*b77 + 45*b78 + 9*b79 + 15*b80 + 7*b81 + 15*b82 + 35*b83 + 44*b84 + 9*b85 + 50*b86 + 28*b87 =E= 731; e43.. x25 - x26 + 42*b33 + 33*b34 + 45*b35 + 6*b36 + 33*b37 + 6*b38 + 24*b39 + 54*b40 + 9*b41 + 12*b42 + 48*b43 + 51*b44 + 16*b45 + 48*b46 + 8*b47 + 21*b48 + 54*b49 + 46*b50 + 39*b51 + 23*b52 + 11*b53 + 28*b54 + 27*b55 + 21*b56 + 30*b57 + 38*b58 + 52*b59 + 18*b60 + 43*b61 + 46*b62 + 42*b63 + 29*b64 + 23*b65 + 32*b66 + 31*b67 + 52*b68 + 33*b69 + 51*b70 + 50*b71 + 38*b72 + 7*b73 + 42*b74 + 34*b75 + 18*b76 + 35*b77 + 37*b78 + 35*b79 + 33*b80 + 28*b81 + 18*b82 + 52*b83 + 34*b84 + 42*b85 + 24*b86 + 51*b87 =E= 731; e44.. x27 - x28 + 16*b33 + 6*b34 + 47*b35 + 30*b36 + 45*b37 + 37*b38 + 16*b39 + 19*b40 + 5*b41 + 44*b42 + 45*b43 + 53*b44 + 22*b45 + 40*b46 + 47*b47 + 55*b48 + 43*b49 + 34*b50 + 33*b51 + 6*b52 + 13*b53 + 15*b54 + 36*b55 + 41*b56 + 39*b57 + 50*b58 + 38*b59 + 18*b60 + 36*b61 + 6*b62 + 13*b63 + 47*b64 + 8*b65 + 5*b66 + 22*b67 + 48*b68 + 37*b69 + 34*b70 + 11*b71 + 38*b72 + 22*b73 + 52*b74 + 35*b75 + 39*b76 + 37*b77 + 27*b78 + 38*b79 + 24*b80 + 5*b81 + 16*b82 + 25*b83 + 14*b84 + 27*b85 + 6*b86 + 51*b87 =E= 731; e45.. x29 - x30 + 10*b33 + 51*b34 + 33*b35 + 23*b36 + 31*b37 + 34*b38 + 32*b39 + 23*b40 + 38*b41 + 32*b42 + 40*b43 + 30*b44 + 14*b45 + 19*b46 + 37*b47 + 48*b48 + 36*b49 + 33*b50 + 27*b51 + 20*b52 + 14*b53 + 50*b54 + 54*b55 + 34*b56 + 50*b57 + 14*b58 + 54*b59 + 9*b60 + 37*b61 + 55*b62 + 55*b63 + 42*b64 + 51*b65 + 32*b66 + 10*b67 + 26*b68 + 11*b69 + 38*b70 + 45*b71 + 44*b72 + 14*b73 + 30*b74 + 19*b75 + 24*b76 + 44*b77 + 52*b78 + 16*b79 + 24*b80 + 29*b81 + 39*b82 + 39*b83 + 39*b84 + 33*b85 + 37*b86 + 17*b87 =E= 731; e46.. x31 - x32 + 28*b33 + 47*b34 + 16*b35 + 32*b36 + 28*b37 + 16*b38 + 32*b39 + 15*b40 + 11*b41 + 8*b42 + 21*b43 + 33*b44 + 15*b45 + 54*b46 + 22*b47 + 55*b48 + 13*b49 + 47*b50 + 19*b51 + 33*b52 + 35*b53 + 15*b54 + 44*b55 + 55*b56 + 39*b57 + 28*b58 + 39*b59 + 23*b60 + 6*b61 + 20*b62 + 36*b63 + 29*b64 + 12*b65 + 48*b66 + 6*b67 + 35*b68 + 8*b69 + 33*b70 + 46*b71 + 15*b72 + 37*b73 + 11*b74 + 44*b75 + 48*b76 + 9*b77 + 11*b78 + 47*b79 + 18*b80 + 54*b81 + 10*b82 + 46*b83 + 34*b84 + 20*b85 + 35*b86 + 33*b87 =E= 731; Model m / all /; m.limrow=0; m.limcol=0; Solve m using MIP minimizing x1; embeddedCode Connect: - PythonCode: code: | x = 0 for i in range(1000): for j in range(1000): for k in range(1000): for l in range(1000): x = x + 1 endEmbeddedCode execError = 0; embeddedCode Python: x = 0 for i in range(1000): for j in range(1000): for k in range(1000): for l in range(1000): x = x + 1 pauseEmbeddedCode execError = 0; continueEmbeddedCode: x = 0 for i in range(1000): for j in range(1000): for k in range(1000): for l in range(1000): x = x + 1 endEmbeddedCode execError = 0; embeddedCode GAMS: set i / 1*1000 /; alias (i,j,k,l); scalar x /0/; loop((i,j,k,l), x = x+1); endEmbeddedCode execError = 0; $if set SKIPEXECERROR $exit set i / 1*1000 /; alias (i,j,k,l); scalar x /0/; loop((i,j,k,l), x = x+1); $offEcho $ifThen set interactive * This requires to hit interrupt or Ctrl-C 25 times $ call.checkErrorLevel gams stopme lo=%gams.lo% --SKIPEXECERROR=1 $ call gams stopme lo=%gams.lo% $ if not errorLevel 1 $abort expect error from previous run $else $onEmbeddedCode Python: import sys import threading def interrupt_gams(job,num,secs): import time time.sleep(2) for i in range(num): time.sleep(secs) job.interrupt() gams.wsWorkingDir = '.' job = gams.ws.add_job_from_file("stopme.gms") # start thread asynchronously that interrupts the GamsJob after 1 seconds threading.Thread(target=interrupt_gams, args=(job,12,1)).start() # start GamsJob opt = gams.ws.add_options() opt.defines["SKIPEXECERROR"] = "1" job.run(opt,output=sys.stdout) # start thread asynchronously that interrupts the GamsJob after 1 seconds threading.Thread(target=interrupt_gams, args=(job,13,1)).start() try: job.run(output=sys.stdout) except Exception as e: assert type(e)==GamsExceptionExecution assert e.get_rc()==3 $offEmbeddedCode $endIf