Title: Passivity test is ill-conditioned · Issue #761 · python-control/python-control · GitHub
Open Graph Title: Passivity test is ill-conditioned · Issue #761 · python-control/python-control
X Title: Passivity test is ill-conditioned · Issue #761 · python-control/python-control
Description: Whack-a-mole! Now this cvxopt test is flaky passivity_test.py::test_ispassive_edge_cases : https://github.com/python-control/python-control/runs/7930805491?check_suite_focus=true#step:6:3450 Details 2022-08-20T10:05:12.4606678Z =========...
Open Graph Description: Whack-a-mole! Now this cvxopt test is flaky passivity_test.py::test_ispassive_edge_cases : https://github.com/python-control/python-control/runs/7930805491?check_suite_focus=true#step:6:3450 Detail...
X Description: Whack-a-mole! Now this cvxopt test is flaky passivity_test.py::test_ispassive_edge_cases : https://github.com/python-control/python-control/runs/7930805491?check_suite_focus=true#step:6:3450 Detail...
Opengraph URL: https://github.com/python-control/python-control/issues/761
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Passivity test is ill-conditioned","articleBody":"Whack-a-mole! \r\n\r\nNow this cvxopt test is flaky `passivity_test.py::test_ispassive_edge_cases` :\r\n\r\nhttps://github.com/python-control/python-control/runs/7930805491?check_suite_focus=true#step:6:3450\r\n\r\n\u003cdetails\u003e\r\n\r\n```\r\n2022-08-20T10:05:12.4606678Z =================================== FAILURES ===================================\r\n2022-08-20T10:05:12.4607612Z _________________ test_ispassive_edge_cases[test_input2-True] __________________\r\n2022-08-20T10:05:12.4607862Z \r\n2022-08-20T10:05:12.4608255Z test_input = (array([[-3.e+12, 0.e+00],\r\n2022-08-20T10:05:12.4608627Z [ 0.e+00, -2.e+12]]), array([[0],\r\n2022-08-20T10:05:12.4609085Z [1]]), array([[-1, 2]]), array([[0.]]))\r\n2022-08-20T10:05:12.4609312Z expected = True\r\n2022-08-20T10:05:12.4609448Z \r\n2022-08-20T10:05:12.4609567Z @pytest.mark.parametrize(\r\n2022-08-20T10:05:12.4609948Z \"test_input,expected\",\r\n2022-08-20T10:05:12.4610188Z [((A, B, C, D*0.0), True),\r\n2022-08-20T10:05:12.4610415Z ((A_d, B, C, D), True),\r\n2022-08-20T10:05:12.4610640Z ((A*1e12, B, C, D*0), True),\r\n2022-08-20T10:05:12.4610854Z ((A, B*0, C*0, D), True),\r\n2022-08-20T10:05:12.4611073Z ((A*0, B, C, D), True),\r\n2022-08-20T10:05:12.4611293Z ((A*0, B*0, C*0, D*0), True)])\r\n2022-08-20T10:05:12.4611683Z def test_ispassive_edge_cases(test_input, expected):\r\n2022-08-20T10:05:12.4611958Z A = test_input[0]\r\n2022-08-20T10:05:12.4612178Z B = test_input[1]\r\n2022-08-20T10:05:12.4612610Z C = test_input[2]\r\n2022-08-20T10:05:12.4612970Z D = test_input[3]\r\n2022-08-20T10:05:12.4613469Z sys = ss(A, B, C, D)\r\n2022-08-20T10:05:12.4613753Z \u003e assert(passivity.ispassive(sys) == expected)\r\n2022-08-20T10:05:12.4613952Z \r\n2022-08-20T10:05:12.4614077Z control/tests/passivity_test.py:115: \r\n2022-08-20T10:05:12.4614373Z _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \r\n2022-08-20T10:05:12.4614742Z control/passivity.py:292: in ispassive\r\n2022-08-20T10:05:12.4615096Z return solve_passivity_LMI(sys, rho=ofp_index, nu=ifp_index) is not None\r\n2022-08-20T10:05:12.4615456Z control/passivity.py:177: in solve_passivity_LMI\r\n2022-08-20T10:05:12.4615750Z sol = cvx.solvers.sdp(c, Gs=Gs, hs=hs)\r\n2022-08-20T10:05:12.4616316Z /usr/share/miniconda3/envs/test-env/lib/python3.10/site-packages/cvxopt/coneprog.py:4126: in sdp\r\n2022-08-20T10:05:12.4616810Z sol = conelp(c, G, h, dims, A = A, b = b, primalstart = ps, dualstart = ds, kktsolver = kktsolver, options = options)\r\n2022-08-20T10:05:12.4617643Z /usr/share/miniconda3/envs/test-env/lib/python3.10/site-packages/cvxopt/coneprog.py:1395: in conelp\r\n2022-08-20T10:05:12.4618038Z misc.update_scaling(W, lmbda, ds, dz)\r\n2022-08-20T10:05:12.4618322Z _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \r\n2022-08-20T10:05:12.4618485Z \r\n2022-08-20T10:05:12.4618810Z W = {'beta': [], 'd': \u003c0x1 matrix, tc='d'\u003e, 'di': \u003c0x1 matrix, tc='d'\u003e, 'dnl': \u003c0x1 matrix, tc='d'\u003e, ...}\r\n2022-08-20T10:05:12.4619335Z lmbda = \u003c6x1 matrix, tc='d'\u003e, s = \u003c13x1 matrix, tc='d'\u003e\r\n2022-08-20T10:05:12.4619636Z z = \u003c13x1 matrix, tc='d'\u003e\r\n2022-08-20T10:05:12.4619773Z \r\n2022-08-20T10:05:12.4619885Z def update_scaling(W, lmbda, s, z):\r\n2022-08-20T10:05:12.4620221Z \"\"\"\r\n2022-08-20T10:05:12.4620607Z Updates the Nesterov-Todd scaling matrix W and the scaled variable\r\n2022-08-20T10:05:12.4621042Z lmbda so that on exit\r\n2022-08-20T10:05:12.4621247Z \r\n2022-08-20T10:05:12.4621547Z W * zt = W^{-T} * st = lmbda.\r\n2022-08-20T10:05:12.4621773Z \r\n2022-08-20T10:05:12.4622145Z On entry, the nonlinear, 'l' and 'q' components of the arguments s\r\n2022-08-20T10:05:12.4622629Z and z contain W^{-T}*st and W*zt, i.e, the new iterates in the current\r\n2022-08-20T10:05:12.4622920Z scaling.\r\n2022-08-20T10:05:12.4623119Z \r\n2022-08-20T10:05:12.4623489Z The 's' components contain the factors Ls, Lz in a factorization of\r\n2022-08-20T10:05:12.4624030Z the new iterates in the current scaling, W^{-T}*st = Ls*Ls',\r\n2022-08-20T10:05:12.4624341Z W*zt = Lz*Lz'.\r\n2022-08-20T10:05:12.4624645Z \"\"\"\r\n2022-08-20T10:05:12.4624832Z \r\n2022-08-20T10:05:12.4625008Z \r\n2022-08-20T10:05:12.4625390Z # Nonlinear and 'l' blocks\r\n2022-08-20T10:05:12.4625606Z #\r\n2022-08-20T10:05:12.4626008Z # d := d .* sqrt( s ./ z )\r\n2022-08-20T10:05:12.4626266Z # lmbda := lmbda .* sqrt(s) .* sqrt(z)\r\n2022-08-20T10:05:12.4626501Z \r\n2022-08-20T10:05:12.4626752Z if 'dnl' in W:\r\n2022-08-20T10:05:12.4627026Z mnl = len(W['dnl'])\r\n2022-08-20T10:05:12.4627256Z else:\r\n2022-08-20T10:05:12.4627460Z mnl = 0\r\n2022-08-20T10:05:12.4627713Z ml = len(W['d'])\r\n2022-08-20T10:05:12.4627934Z m = mnl + ml\r\n2022-08-20T10:05:12.4628165Z s[:m] = base.sqrt( s[:m] )\r\n2022-08-20T10:05:12.4628397Z z[:m] = base.sqrt( z[:m] )\r\n2022-08-20T10:05:12.4629372Z \r\n2022-08-20T10:05:12.4629630Z # d := d .* s .* z\r\n2022-08-20T10:05:12.4629940Z if 'dnl' in W:\r\n2022-08-20T10:05:12.4630299Z blas.tbmv(s, W['dnl'], n = mnl, k = 0, ldA = 1)\r\n2022-08-20T10:05:12.4630693Z blas.tbsv(z, W['dnl'], n = mnl, k = 0, ldA = 1)\r\n2022-08-20T10:05:12.4631031Z W['dnli'][:] = W['dnl'][:] ** -1\r\n2022-08-20T10:05:12.4631420Z blas.tbmv(s, W['d'], n = ml, k = 0, ldA = 1, offsetA = mnl)\r\n2022-08-20T10:05:12.4631840Z blas.tbsv(z, W['d'], n = ml, k = 0, ldA = 1, offsetA = mnl)\r\n2022-08-20T10:05:12.4632171Z W['di'][:] = W['d'][:] ** -1\r\n2022-08-20T10:05:12.4632391Z \r\n2022-08-20T10:05:12.4632808Z # lmbda := s .* z\r\n2022-08-20T10:05:12.4633059Z blas.copy(s, lmbda, n = m)\r\n2022-08-20T10:05:12.4633323Z blas.tbmv(z, lmbda, n = m, k = 0, ldA = 1)\r\n2022-08-20T10:05:12.4633622Z \r\n2022-08-20T10:05:12.4633806Z \r\n2022-08-20T10:05:12.4634057Z # 'q' blocks.\r\n2022-08-20T10:05:12.4634267Z #\r\n2022-08-20T10:05:12.4634539Z # Let st and zt be the new variables in the old scaling:\r\n2022-08-20T10:05:12.4634792Z #\r\n2022-08-20T10:05:12.4635010Z # st = s_k, zt = z_k\r\n2022-08-20T10:05:12.4635228Z #\r\n2022-08-20T10:05:12.4635560Z # and a = sqrt(st' * J * st), b = sqrt(zt' * J * zt).\r\n2022-08-20T10:05:12.4635811Z #\r\n2022-08-20T10:05:12.4636209Z # 1. Compute the hyperbolic Householder transformation 2*q*q' - J\r\n2022-08-20T10:05:12.4636519Z # that maps st/a to zt/b.\r\n2022-08-20T10:05:12.4636747Z #\r\n2022-08-20T10:05:12.4637058Z # c = sqrt( (1 + st'*zt/(a*b)) / 2 )\r\n2022-08-20T10:05:12.4637420Z # q = (st/a + J*zt/b) / (2*c).\r\n2022-08-20T10:05:12.4637667Z #\r\n2022-08-20T10:05:12.4637894Z # The new scaling point is\r\n2022-08-20T10:05:12.4638110Z #\r\n2022-08-20T10:05:12.4638578Z # wk := betak * sqrt(a/b) * (2*v[k]*v[k]' - J) * q\r\n2022-08-20T10:05:12.4638818Z #\r\n2022-08-20T10:05:12.4639082Z # with betak = W['beta'][k].\r\n2022-08-20T10:05:12.4639302Z #\r\n2022-08-20T10:05:12.4639636Z # 3. The scaled variable:\r\n2022-08-20T10:05:12.4639831Z #\r\n2022-08-20T10:05:12.4640044Z # lambda_k0 = sqrt(a*b) * c\r\n2022-08-20T10:05:12.4640423Z # lambda_k1 = sqrt(a*b) * ( (2vk*vk' - J) * (-d*q + u/2) )_1\r\n2022-08-20T10:05:12.4640655Z #\r\n2022-08-20T10:05:12.4640839Z # where\r\n2022-08-20T10:05:12.4641026Z #\r\n2022-08-20T10:05:12.4641267Z # u = st/a - J*zt/b\r\n2022-08-20T10:05:12.4641620Z # d = ( vk0 * (vk'*u) + u0/2 ) / (2*vk0 *(vk'*q) - q0 + 1).\r\n2022-08-20T10:05:12.4641864Z #\r\n2022-08-20T10:05:12.4642182Z # 4. Update scaling\r\n2022-08-20T10:05:12.4642379Z #\r\n2022-08-20T10:05:12.4642577Z # v[k] := wk^1/2\r\n2022-08-20T10:05:12.4642824Z # = 1 / sqrt(2*(wk0 + 1)) * (wk + e).\r\n2022-08-20T10:05:12.4643060Z # beta[k] *= sqrt(a/b)\r\n2022-08-20T10:05:12.4643271Z \r\n2022-08-20T10:05:12.4643455Z ind = m\r\n2022-08-20T10:05:12.4643731Z for k in range(len(W['v'])):\r\n2022-08-20T10:05:12.4643952Z \r\n2022-08-20T10:05:12.4644314Z v = W['v'][k]\r\n2022-08-20T10:05:12.4644524Z m = len(v)\r\n2022-08-20T10:05:12.4644728Z \r\n2022-08-20T10:05:12.4645040Z # ln = sqrt( lambda_k' * J * lambda_k )\r\n2022-08-20T10:05:12.4645428Z ln = jnrm2(lmbda, n = m, offset = ind)\r\n2022-08-20T10:05:12.4645658Z \r\n2022-08-20T10:05:12.4645978Z # a = sqrt( sk' * J * sk ) = sqrt( st' * J * st )\r\n2022-08-20T10:05:12.4646340Z # s := s / a = st / a\r\n2022-08-20T10:05:12.4646607Z aa = jnrm2(s, offset = ind, n = m)\r\n2022-08-20T10:05:12.4646898Z blas.scal(1.0/aa, s, offset = ind, n = m)\r\n2022-08-20T10:05:12.4647123Z \r\n2022-08-20T10:05:12.4647455Z # b = sqrt( zk' * J * zk ) = sqrt( zt' * J * zt )\r\n2022-08-20T10:05:12.4647818Z # z := z / a = zt / b\r\n2022-08-20T10:05:12.4648054Z bb = jnrm2(z, offset = ind, n = m)\r\n2022-08-20T10:05:12.4648334Z blas.scal(1.0/bb, z, offset = ind, n = m)\r\n2022-08-20T10:05:12.4648565Z \r\n2022-08-20T10:05:12.4648857Z # c = sqrt( ( 1 + (st'*zt) / (a*b) ) / 2 )\r\n2022-08-20T10:05:12.4649290Z cc = math.sqrt( ( 1.0 + blas.dot(s, z, offsetx = ind, offsety =\r\n2022-08-20T10:05:12.4649582Z ind, n = m) ) / 2.0 )\r\n2022-08-20T10:05:12.4649796Z \r\n2022-08-20T10:05:12.4650041Z # vs = v' * st / a\r\n2022-08-20T10:05:12.4650311Z vs = blas.dot(v, s, offsety = ind, n = m)\r\n2022-08-20T10:05:12.4650549Z \r\n2022-08-20T10:05:12.4651253Z # vz = v' * J *zt / b\r\n2022-08-20T10:05:12.4651724Z vz = jdot(v, z, offsety = ind, n = m)\r\n2022-08-20T10:05:12.4651960Z \r\n2022-08-20T10:05:12.4652334Z # vq = v' * q where q = (st/a + J * zt/b) / (2 * c)\r\n2022-08-20T10:05:12.4652810Z vq = (vs + vz ) / 2.0 / cc\r\n2022-08-20T10:05:12.4653032Z \r\n2022-08-20T10:05:12.4653355Z # vu = v' * u where u = st/a - J * zt/b\r\n2022-08-20T10:05:12.4653655Z vu = vs - vz\r\n2022-08-20T10:05:12.4653865Z \r\n2022-08-20T10:05:12.4654053Z # lambda_k0 = c\r\n2022-08-20T10:05:12.4654285Z lmbda[ind] = cc\r\n2022-08-20T10:05:12.4654602Z \r\n2022-08-20T10:05:12.4654873Z # wk0 = 2 * vk0 * (vk' * q) - q0\r\n2022-08-20T10:05:12.4655466Z wk0 = 2 * v[0] * vq - ( s[ind] + z[ind] ) / 2.0 / cc\r\n2022-08-20T10:05:12.4655699Z \r\n2022-08-20T10:05:12.4655989Z # d = (v[0] * (vk' * u) - u0/2) / (wk0 + 1)\r\n2022-08-20T10:05:12.4656492Z dd = (v[0] * vu - s[ind]/2.0 + z[ind]/2.0) / (wk0 + 1.0)\r\n2022-08-20T10:05:12.4656755Z \r\n2022-08-20T10:05:12.4657096Z # lambda_k1 = 2 * v_k1 * vk' * (-d*q + u/2) - d*q1 + u1/2\r\n2022-08-20T10:05:12.4657651Z blas.copy(v, lmbda, offsetx = 1, offsety = ind+1, n = m-1)\r\n2022-08-20T10:05:12.4658095Z blas.scal(2.0 * (-dd * vq + 0.5 * vu), lmbda, offset = ind+1,\r\n2022-08-20T10:05:12.4658422Z n = m-1)\r\n2022-08-20T10:05:12.4658904Z blas.axpy(s, lmbda, 0.5 * (1.0 - dd/cc), offsetx = ind+1, offsety\r\n2022-08-20T10:05:12.4659242Z = ind+1, n = m-1)\r\n2022-08-20T10:05:12.4659529Z blas.axpy(z, lmbda, 0.5 * (1.0 + dd/cc), offsetx = ind+1, offsety\r\n2022-08-20T10:05:12.4659850Z = ind+1, n = m-1)\r\n2022-08-20T10:05:12.4660056Z \r\n2022-08-20T10:05:12.4660408Z # Scale so that sqrt(lambda_k' * J * lambda_k) = sqrt(aa*bb).\r\n2022-08-20T10:05:12.4660855Z blas.scal(math.sqrt(aa*bb), lmbda, offset = ind, n = m)\r\n2022-08-20T10:05:12.4661118Z \r\n2022-08-20T10:05:12.4661396Z # v := (2*v*v' - J) * q\r\n2022-08-20T10:05:12.4661843Z # = 2 * (v'*q) * v' - (J* st/a + zt/b) / (2*c)\r\n2022-08-20T10:05:12.4662220Z blas.scal(2.0 * vq, v)\r\n2022-08-20T10:05:12.4662532Z v[0] -= s[ind] / 2.0 / cc\r\n2022-08-20T10:05:12.4662939Z blas.axpy(s, v, 0.5/cc, offsetx = ind+1, offsety = 1, n = m-1)\r\n2022-08-20T10:05:12.4663341Z blas.axpy(z, v, -0.5/cc, offsetx = ind, n = m)\r\n2022-08-20T10:05:12.4663589Z \r\n2022-08-20T10:05:12.4663824Z # v := v^{1/2} = 1/sqrt(2 * (v0 + 1)) * (v + e)\r\n2022-08-20T10:05:12.4664050Z v[0] += 1.0\r\n2022-08-20T10:05:12.4664310Z blas.scal(1.0 / math.sqrt(2.0 * v[0]), v)\r\n2022-08-20T10:05:12.4664548Z \r\n2022-08-20T10:05:12.4664751Z # beta[k] *= ( aa / bb )**1/2\r\n2022-08-20T10:05:12.4665097Z W['beta'][k] *= math.sqrt( aa / bb )\r\n2022-08-20T10:05:12.4665331Z \r\n2022-08-20T10:05:12.4665510Z ind += m\r\n2022-08-20T10:05:12.4665708Z \r\n2022-08-20T10:05:12.4665895Z \r\n2022-08-20T10:05:12.4666158Z # 's' blocks\r\n2022-08-20T10:05:12.4666360Z #\r\n2022-08-20T10:05:12.4666633Z # Let st, zt be the updated variables in the old scaling:\r\n2022-08-20T10:05:12.4666886Z #\r\n2022-08-20T10:05:12.4667184Z # st = Ls * Ls', zt = Lz * Lz'.\r\n2022-08-20T10:05:12.4667411Z #\r\n2022-08-20T10:05:12.4667735Z # where Ls and Lz are the 's' components of s, z.\r\n2022-08-20T10:05:12.4667992Z #\r\n2022-08-20T10:05:12.4668302Z # 1. SVD Lz'*Ls = Uk * lambda_k^+ * Vk'.\r\n2022-08-20T10:05:12.4668526Z #\r\n2022-08-20T10:05:12.4668739Z # 2. New scaling is\r\n2022-08-20T10:05:12.4668957Z #\r\n2022-08-20T10:05:12.4669289Z # r[k] := r[k] * Ls * Vk * diag(lambda_k^+)^{-1/2}\r\n2022-08-20T10:05:12.4669698Z # rti[k] := r[k] * Lz * Uk * diag(lambda_k^+)^{-1/2}.\r\n2022-08-20T10:05:12.4669951Z #\r\n2022-08-20T10:05:12.4670124Z \r\n2022-08-20T10:05:12.4670493Z work = matrix(0.0, (max( [0] + [r.size[0] for r in W['r']])**2, 1))\r\n2022-08-20T10:05:12.4671033Z ind = mnl + ml + sum([ len(v) for v in W['v'] ])\r\n2022-08-20T10:05:12.4671299Z ind2, ind3 = ind, 0\r\n2022-08-20T10:05:12.4671594Z for k in range(len(W['r'])):\r\n2022-08-20T10:05:12.4671924Z r, rti = W['r'][k], W['rti'][k]\r\n2022-08-20T10:05:12.4672164Z m = r.size[0]\r\n2022-08-20T10:05:12.4672356Z \r\n2022-08-20T10:05:12.4672564Z # r := r*sk = r*Ls\r\n2022-08-20T10:05:12.4672858Z blas.gemm(r, s, work, m = m, n = m, k = m, ldB = m, ldC = m,\r\n2022-08-20T10:05:12.4673126Z offsetB = ind2)\r\n2022-08-20T10:05:12.4673545Z blas.copy(work, r, n = m**2)\r\n2022-08-20T10:05:12.4673885Z \r\n2022-08-20T10:05:12.4674070Z # rti := rti*zk = rti*Lz\r\n2022-08-20T10:05:12.4674352Z blas.gemm(rti, z, work, m = m, n = m, k = m, ldB = m, ldC = m,\r\n2022-08-20T10:05:12.4674620Z offsetB = ind2)\r\n2022-08-20T10:05:12.4674939Z blas.copy(work, rti, n = m**2)\r\n2022-08-20T10:05:12.4675176Z \r\n2022-08-20T10:05:12.4696294Z # SVD Lz'*Ls = U * lmbds^+ * V'; store U in sk and V' in zk.\r\n2022-08-20T10:05:12.4696880Z blas.gemm(z, s, work, transA = 'T', m = m, n = m, k = m, ldA = m,\r\n2022-08-20T10:05:12.4697207Z ldB = m, ldC = m, offsetA = ind2, offsetB = ind2)\r\n2022-08-20T10:05:12.4697652Z lapack.gesvd(work, lmbda, jobu = 'A', jobvt = 'A', m = m, n = m,\r\n2022-08-20T10:05:12.4698006Z ldA = m, U = s, Vt = z, ldU = m, ldVt = m, offsetS = ind,\r\n2022-08-20T10:05:12.4698319Z offsetU = ind2, offsetVt = ind2)\r\n2022-08-20T10:05:12.4698543Z \r\n2022-08-20T10:05:12.4698741Z # r := r*V\r\n2022-08-20T10:05:12.4699127Z blas.gemm(r, z, work, transB = 'T', m = m, n = m, k = m, ldB = m,\r\n2022-08-20T10:05:12.4699410Z ldC = m, offsetB = ind2)\r\n2022-08-20T10:05:12.4699675Z blas.copy(work, r, n = m**2)\r\n2022-08-20T10:05:12.4700021Z \r\n2022-08-20T10:05:12.4700204Z # rti := rti*U\r\n2022-08-20T10:05:12.4700602Z blas.gemm(rti, s, work, n = m, m = m, k = m, ldB = m, ldC = m,\r\n2022-08-20T10:05:12.4700867Z offsetB = ind2)\r\n2022-08-20T10:05:12.4701098Z blas.copy(work, rti, n = m**2)\r\n2022-08-20T10:05:12.4701318Z \r\n2022-08-20T10:05:12.4701645Z # r := r*lambda^{-1/2}; rti := rti*lambda^{-1/2}\r\n2022-08-20T10:05:12.4702010Z for i in range(m):\r\n2022-08-20T10:05:12.4702263Z \u003e a = 1.0 / math.sqrt(lmbda[ind+i])\r\n2022-08-20T10:05:12.4702566Z E ZeroDivisionError: float division by zero\r\n2022-08-20T10:05:12.4702754Z \r\n2022-08-20T10:05:12.4703110Z /usr/share/miniconda3/envs/test-env/lib/python3.10/site-packages/cvxopt/misc.py:628: ZeroDivisionError\r\n```\r\n\r\n\u003c/details\u003e\r\n\r\n_Originally posted by @bnavigator in https://github.com/python-control/python-control/issues/759#issuecomment-1221272177_","author":{"url":"https://github.com/bnavigator","@type":"Person","name":"bnavigator"},"datePublished":"2022-08-20T10:10:38.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":10},"url":"https://github.com/761/python-control/issues/761"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:232cf273-d323-ec84-f789-ef516c186ff8 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 9CA0:163852:3603527:49E6252:6979D510 |
| html-safe-nonce | 38fc98669c3afca708cbc7478d992446a9660fb592bdfe544a8f12d903300017 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5Q0EwOjE2Mzg1MjozNjAzNTI3OjQ5RTYyNTI6Njk3OUQ1MTAiLCJ2aXNpdG9yX2lkIjoiMjMxNzM5MTI0NjAzNDMyNjgwMCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 8a60b4a01db754956249e4d9b353a845d6fc6344d2330b24a749239352ac942c |
| hovercard-subject-tag | issue:1345114788 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python-control/python-control/761/issue_layout |
| twitter:image | https://opengraph.githubassets.com/2ae0a6be799773ef4476c4e7000bc9e2e9867001aa6aa3d6d6282341a2e16de4/python-control/python-control/issues/761 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/2ae0a6be799773ef4476c4e7000bc9e2e9867001aa6aa3d6d6282341a2e16de4/python-control/python-control/issues/761 |
| og:image:alt | Whack-a-mole! Now this cvxopt test is flaky passivity_test.py::test_ispassive_edge_cases : https://github.com/python-control/python-control/runs/7930805491?check_suite_focus=true#step:6:3450 Detail... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | bnavigator |
| hostname | github.com |
| expected-hostname | github.com |
| None | c049b65ec7e54cbf2521f5a560b6527714c612b0bd169188e2ea6e16f83bd5f4 |
| turbo-cache-control | no-preview |
| go-import | github.com/python-control/python-control git https://github.com/python-control/python-control.git |
| octolytics-dimension-user_id | 2285872 |
| octolytics-dimension-user_login | python-control |
| octolytics-dimension-repository_id | 22791752 |
| octolytics-dimension-repository_nwo | python-control/python-control |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 22791752 |
| octolytics-dimension-repository_network_root_nwo | python-control/python-control |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 87b137883e35e2766c3d0f6a257c4044f6390b83 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width