Convert simple LTI state-space feedback system from Simulink

First of all, great work on this toolbox. We in the gravitational wave instrumentation community are trying to ditch MATLAB and use tools like this in Python to model control systems and dynamics. I've got what I think is a pretty basic question but I hope someone has some time to help. I hope this is the right place to post this sort of question.
I'm trying to convert a Simulink model for a triple-stage pendulum that looks like this...

...into a python-control system. It's a relatively simple model implemented as a state-space system (the red SSM100g block) with a few feedback loops and some input/output combining. I've got as far as implementing the ABCD matrices from the SSM100g model:
import numpy as np
from control import ss

A = [...] # 36x36 matrix
B = [...] # 36x24 matrix
C = [...] # 24x36 matrix
D = np.zeros((24, 24))

SUS_TRIPLE = ss(A, B, C, D)

This seems to work ok, I can plot transfer functions etc. with SUS_TRIPLE.freqresp(...) but now I'd like to combine some of the inputs and outputs into "higher level" inputs and outputs (act_1_x etc.) and add some feedback (turqoise gain and sum blocks) as per the screenshot above. I see there is a "Feedback interconnection" command but I don't know whether it's appropriate here. I also wonder if there is some way to abstract some of the low-level inputs/outputs of this state-space model into higher level ones, akin to Simulink's "subsystem" blocks. In the end I'd like to have another system that I can again call .freqresp(...) on.
Is this possible to do? Are there perhaps some examples showing how to do this? I guess this is or will be a common task in the future, converting Simulink models to python-control. Any help would be appreciated!

Hi,
you already found the control.feedback() function of the block diagram algebra group. There are some more functions to define system interconnections such as control.connect().
Another higher level possiblity do build your model would be the new InterconnectedSystem class of the control.iosys module. You put SUS_TRIPLE in one system and your feedback controllers into another e.g. ECD, where the inputs and outputs match those of SUS_TRIPLE and then do SUS_TRIPLE.feedback(other=ECD, sign=-1).  (The docstring of control.iosys.InterconnectedSystem.feedback is wrong though.) You will end up with 3 additional dummy inputs for the roll, y and z feedback loops.  Make sure your signs and additions with the input signals are properly reflected in SUS_TRIPLE or ECD.

Thanks a lot for your reply, @bnavigator! I'm going to attempt to use InterconnectedSystem. I need to define the ECD system though. Any suggestions how to do that? Writing ABCD matrices directly seems difficult. I guess I need to use B to map from the 24 outputs of SSM100g to the 6 internal "ECD" states, then use C to map these back to the 24 inputs of SSM100g. Is there some way to take a shortcut, e.g. with a helper function in python-control?

You do the mapping in the constructor of InterconnectedSystem() by specifying tuples in the connections= parameter.
https://python-control.readthedocs.io/en/0.8.3/iosys.html#module-usage
Or you use control.append() to put SUS_TRIPLE and the 6  ECD controllers into one 30x30 system and then define Q for control.connect()

Ah, I see! And how do I define the ECD system such that it behaves as a single 6x1 transfer matrix? I only see ways to instantiate systems from ABCD (state-space) or poles/zeros (transfer function).

Instead of -1 and ground connector and working signal-by-signal fashion, make a generic input signal Mux that collects all the reference signals (0 if direct negative feedback, leave out the columns of B if not used). Also collect all the gains into a matrix so you will have the classic feedback interconnection. Then you are back in the standard domain.

Ah, I see! And how do I define the ECD system such that it behaves as a single 6x1 transfer matrix? I only see ways to instantiate systems from ABCD (state-space) or poles/zeros (transfer function).

I guess you mean 6x6. control.append() works here as well. IIRC, if ECD contains just scalar gains for each signal, internally it works the same as if you collect the signals into a diagonal 6x6 (TransferFunction or StateSpace.D) matrix manually, just as Ilhan suggested

Ok, I think I've implemented the system with feedback but I'm having trouble seeing any effect of the feedback.
First of all, some perhaps useful information about two aspects I found tricky while building the system: first, the system returned by InterconnectedSystem does not have a freqresp method. It seems I have to linearise it first (even though the constituent systems are themselves linear). I therefore added a call to find_eqpt then linearize. The second problem was that the system returned by linearize does not copy over the inputs/outputs from the system it is linearizing. This means I have to use the system I passed into linearize to look up the correct indices for the inputs/outputs when I plot the transfer functions. I hope that linearize doesn't do any remapping of the inputs or outputs.
(I also had trouble with the docs - for example in specifying the connections, I first had all my tuples in (output, input) form but it turns out it needs (input, output) form. Maybe it could instead just detect which is an input and which is an output so order doesn't matter? Also, why does InterconnectedSystem take a sequence of (in, out) tuples for connections but two separate lists of inputs and inplist / outputs and outlist? Why not be consistent with connections and use sequences of tuples too?)
Now the problem seems to be that the feedback isn't doing anything. I am not sure if this is because of some issue with the way I've built the feedback or because of something to do with the linearization. The responses with and without feedback are identical; I'd expect the feedback to broaden some of the resonances:

Perhaps the problem is in the way I linearise the system. I have to set parameters of linearize and find_eqpt which I just guessed and are probably wrong. Can anyone see what I'm supposed to put here? It's a linear system, and ultimately I want transfer functions from each input to each output assuming small perturbations around zero. This is really stretching my knowledge of state-space systems...
Perhaps it's useful if I post my whole script. This shows the response of an input to output in the damped and undamped case. The damped case should have broader, smaller resonances. It looks like my feedback isn't doing anything.
"""100g state space model."""

import numpy as np
import matplotlib.pyplot as plt
from control import ss, linearize, find_eqpt
from control.iosys import LinearIOSystem, InterconnectedSystem

A = [
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [-152.53882610042035, 1.5571920487715416e-11, -0.011200156128132915, 1.632559549476257e-7, -1.413679342720125, -4.093359544048649e-11, 54.759209981719074, -2.003371085743382e-11, 0.01111599273426369, -2.5509597113526e-8, 2.7591338153072824, 5.412858953805167e-11, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [2.0849649640385726e-12, -145.2731502117568, 9.934442657551588e-9, 0.0003678612482892676, 9.713842032496462e-11, 0.41222315924168185, -2.6663023105712876e-12, 47.555605820245994, 4.656408908970109e-8, -0.0006654280945320643, -1.2555522934432573e-11, -0.3207695984640116, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-0.011655967003511137, 9.83070193955856e-9, -415.4616995105061, 3.1306134749929204e-11, 0.002266377046996563, -1.422633780257092e-9, 0.0116218973819107, 4.664345630464335e-8,<PHONE_NUMBER>634585, -1.405363161359301e-11, 0.0010758728848655346, -2.576128872048418e-10, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0.00009153475730179002, 0.13768235176566324, 1.779328089502842e-8, -40.33566768070241, 4.775630208967757e-7, 0.05515222377933442, -0.000012949383725565499, -0.13768238324684695, -7.421351595388594e-9, 18.410676906038006, -1.3844040708141626e-7, -0.012669553955798114, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-1123.897865020629, 6.31924763953394e-8, 1.816977198449706, 7.138230997697364e-7, -248.21697606442186, -2.081071479118392e-7,<PHONE_NUMBER>759626, -8.450027075705214e-8, -2.218607222194627, -1.2187834894017893e-7,<PHONE_NUMBER>963982, 2.2730013763767726e-7, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-2.7834928034366927e-8,<PHONE_NUMBER>9966913, -4.939652472414061e-7, 0.0073599618128027955, -8.96143076934678e-8, -125.191380162728, 5.89977725842689e-9, 78.48581645908328, 3.779265784358153e-7, -0.005915984415823647, -2.204615208168721e-9, 28.068315801949264, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [119.0659799672878, -4.99222270495723e-12, 0.025241390744125194, -5.0288626114639114e-8, 1.611150201795317, 1.1477120994184478e-11, -170.41158607034222, 4.990603146133157e-12, -0.02524718274544071, 5.554015022181705e-8, -5.629379009070131, -1.3937182261466907e-11, 51.345606103054415, 8.098805932006082e-16, 5.792001384964716e-6, -5.282167744454775e-16, 0.22099954399727242, 1.3401615178387531e-17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-8.135914520461128e-9,<PHONE_NUMBER>2530481, 1.0165117263203341e-7, 0.010094478937997822, -2.7488528895097526e-10, 0.5151551108370259, 8.135914483817255e-9, -155.02525012947387, 5.18178015683491e-7, -0.014317826247156584, 1.5831891788229847e-10, 0.4243474279077066, 3.6643873450693484e-17, 51.34584950416905, -6.198292562251438e-7, 0.005216253302724892, -6.652788379271886e-18, -0.22116445540777152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-0.8599067268714619, 1.016600429178664e-7,<PHONE_NUMBER>389339, 5.2682229733267385e-11, -0.1139924268237351, 2.399191304485224e-9, 0.8205177586217574, 5.181694216367054e-7, -5858.35274778959, -1.027215280438951e-10, 0.303281539727261, 3.6891320659807203e-9, 0.03938896824997887, -6.198294507029915e-7, 5536.763609650645, 8.214520190955501e-18, -0.0036277980230806977, 2.635885639936502e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-0.00027103083107860254, 9.100106106364594, -1.33679796107476e-7,<PHONE_NUMBER>531706, -1.5511541958348471e-6, -0.18656088303334561, 0.00027103082981721664, -16.821900782903985, 2.1987126646406236e-7, -521.5980633107704, 4.330657645451153e-6, 5.986764463548667, 1.2613858995249816e-12, 7.721794676539076, -8.618277975474366e-8,<PHONE_NUMBER>8392323, -2.2614713388806203e-13, -5.540348936284742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [29504.94953578678, -1.5750247170387362e-7, -36.76608963226808, -2.6916843722091054e-6, 3599.0193661861854, -7.116943652485516e-8, -28192.437572713083, 6.437534025050492e-8,<PHONE_NUMBER>098742, 4.4444808730484926e-6, -9908.369155011565, 7.486757314997423e-8, -1312.511963073688, 9.312587148592841e-8, -873.6199242776096, -2.7381735188442515e-13,<PHONE_NUMBER>4902348, -3.960181860586082e-10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [1.2806800531734902e-7, -2324.3475128946584, -1.901698374909116e-6, -0.08289534677361209, 2.0808848399932063e-6,<PHONE_NUMBER>355864, -1.2806800494102543e-7, 1436.6869280650687, 0.000012503272523472946, 0.07344847423025279, 4.971655571578583e-8, -14058.975204108547, -3.763235867883215e-16,<PHONE_NUMBER>295848, -0.000010601299959772482, -0.01546516704989307, 6.746904384986648e-17, 12820.083137583044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., 51.742760790314726, 0., 0.000013716387971413233, 0., -0.26410177736066937, 0., -51.74276079031472, 0., -0.00001371638797141324, 0., -0.2227076081323087, 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., 0., 51.74276079030108, -6.246208300444574e-7, 0.00012111283067720439, 0., 0.2641018086596424, 0., -51.74276079030108, 6.246208300444575e-7, -0.00003569604078781505, 0., 0.2227076000274016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., 0.00001371638796795784, -6.24620843965403e-7, 5579.562402705861, 0., -0.008401377310340305, -3.1541583186116577e-9, -0.00001371638797141324, 6.246208300444575e-7, -5579.562402705861, 0., -0.0007048950583954906, -2.656257158002136e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., -4.969593954370689e-12, 0.2074106702391023, -3.872365905890584e-10,<PHONE_NUMBER>7654845, -6.476605912591494e-13, -0.5034584280701414, 4.969593954370689e-12, -0.2074106702391023, 3.8723596467944313e-10, -174.78104623810026, 1.6366098126848681e-12, 0.5581490939336098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., 1125.2881245297842, -9.443548173972684e-16, 3.56166565166429, -7.957899327649086e-13,<PHONE_NUMBER>4194476, 2.2922802928084886e-15, -1125.2881245297842, 9.443548173972684e-16, -3.561665651677849, 7.957899312239311e-13, -370.5851229723677, -2.541290595486223e-15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., 1.4781791960679892e-16, -755.9283033219236, 9.016051532303482e-6, -0.0034235691852996294, 1.9264318592274217e-17, 12946.717248096731, -1.4781791960679892e-16,<PHONE_NUMBER>219236, -9.016036958622386e-6, 0.002188551379809207, -4.8680085322943655e-17, -13097.14755062692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
]

B = [
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [97.77961611870134, 4.462158613729219e-12, 0.0000841633903683493, -1.4017147364298802e-7, -0.06575674483775706, -8.044890542716096e-12, 4.4023400553011465, 5.048537424572038e-18, 4.9253829005284997e-8, -4.2399299620123075e-13, 0.745582387246381, 1.8158842640675715e-14, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [5.813375660191332e-13, 97.71754439151086, -5.6498488793041536e-8, -8.947728279499771e-7, 5.5720452514576386e-15, 0.057913099998327625, 5.0485374245720376e-18, 4.402250788131766, -3.827186239014313e-17, 2.558190087388631e-20, 4.2066121264474165e-14, -0.3205005913999008, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [0.00003406962147187582, -5.6474145633099976e-8,<PHONE_NUMBER>127103, 7.992811243349669e-12, -0.00002062262907015307, -3.948956637885892e-9, 4.9253829005284997e-8, -3.827186239014313e-17, 4.402183483023066, -1.3337786691084542e-16, 0.0002345420544871952, 1.8226023869625456e-13, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [-0.0000785853735762208, 3.148118779550124e-8, -1.0372393543674137e-8, 21.924992166679925, 6.76964498380342e-14, -0.018918161093184876, -4.239929962012307e-13, 1.7358203652622798e-20, -1.333778669108454e-16, 2470.490241460335, -6.141120068658153e-10, -0.7771560032324645, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [518.4388730446669, 2.1307777497085335e-8, 0.40163001723824177, -6.673280538737889e-7, -0.3486499193238116, -4.0174388132092054e-11, 0.745582387246381, 4.206612126447417e-14, 0.0002345420544871952, -6.141120068658157e-10, 3550.3924958904204, 1.931846662591109e-13, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [2.1935151052604557e-8, -222.8592938587527, 1.1603866581803556e-7, -0.002636245048002088, -5.875213459952077e-12, 37.00204576122579, 1.8158842640675715e-14, -0.3205005913999008, 1.8226023869625456e-13, -0.7771560032324645, 1.931846662591108e-13, 1526.1935368548127, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.594166746621905, -4.296099160391767e-18, -1.2901557443080627e-8, -1.4320332480060735e-13, 0.000430051933908293, 4.2723474909044076e-17, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -4.296099160391768e-18, 9.594208883422214, 6.549505774613767e-20, 1.4045602010915124, -2.183168688697192e-15, -0.00041903840286619255, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -1.2901557443080628e-8, 6.549505774613728e-20, 9.594209990896351, 2.227014855628041e-15, -1.4414760073460722, -6.644106443685691e-19, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -1.4320332480060735e-13, 1.4045602010915124, 2.2270148556280538e-15, 46818.67545332534, -7.423383182462161e-11, -13.967947383832945, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.000430051933908293, -2.183168688697179e-15, -1.4414760073460722, -7.423383182462118e-11, 48049.20238324044, 2.214702246457863e-14, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 4.2723474909044076e-17, -0.00041903840286619255, -6.64410644368573e-19, -13.967947383832945, 2.2147022464578756e-14, 32496.023404859825, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.668374746205163, 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.668374746205163, 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.668374746205163, 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 47384.38214957986, -2.1574429850095904e-10, -1.409423155194457],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -2.1574429850095904e-10, 48851.97850512945, 6.417199003430134e-15],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -1.409423155194457, 6.4171990034301325e-15, 32817.01238111918],
]

C = [
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
]

D = np.zeros((24, 24))

# Suspension model.
SQL_TRIPLE_SUS_DYNAMICS = ss(A, B, C, D)

lever_yaw = 0.0845
lever_pitch = 0.0845
lever_roll = 0.0845
ecd_x = 0.12
ecd_y = 0.12
ecd_z = 0.12
ecd_yaw = lever_yaw ** 2 * ecd_x / 2
ecd_pitch = lever_pitch ** 2 * ecd_z / 2
ecd_roll = lever_roll ** 2 * ecd_y

# Eddy current damping. Implemented as a state-space model with only a D coefficient
# (the 6×6 feedback matrix).
ECD_DYNAMICS = ss(
    [],
    [],
    [],
    [
        [ecd_x, 0, 0, 0, 0, 0],
        [0, ecd_y, 0, 0, 0, 0],
        [0, 0, ecd_z, 0, 0, 0],
        [0, 0, 0, ecd_yaw, 0, 0],
        [0, 0, 0, 0, ecd_pitch, 0],
        [0, 0, 0, 0, 0, ecd_roll],
    ]
)

# Create IO systems.
SQL_TRIPLE = LinearIOSystem(
    SQL_TRIPLE_SUS_DYNAMICS,
    name="sql_triple",
    inputs=(
        # Displacement (m).
        "displace_x",
        "displace_y",
        "displace_z",
        # Rotation (radian?).
        "rotate_yaw",
        "rotate_pitch",
        "rotate_roll",
        # Actuation (N).
        "act_x_1",
        "act_y_1",
        "act_z_1",
        "act_yaw_1",
        "act_pitch_1",
        "act_roll_1",
        "act_x_2",
        "_unused_1",
        "_unused_2",
        "act_yaw_2",
        "act_pitch_2",
        "_unused_3",
        "act_x_3",
        "_unused_4",
        "_unused_5",
        "act_yaw_3",
        "act_pitch_3",
        "_unused_6",
    ),
    outputs=(
        # Displacement (m).
        "long_1",
        "_unused_1",
        "_unused_2",
        "_unused_3",
        "_unused_4",
        "_unused_5",
        "long_2",
        "_unused_6",
        "_unused_7",
        "_unused_8",
        "_unused_9",
        "_unused_10",
        "long_3",
        "trans_3",
        "vert_3",
        "yaw_3",
        "pitch_3",
        "roll_3",
        # Eddy current damping (force?) (N?).
        "ecd_x",
        "ecd_y",
        "ecd_z",
        "ecd_yaw",
        "ecd_pitch",
        "ecd_roll",
    )
)

ECD = LinearIOSystem(
    ECD_DYNAMICS,
    name="ecd",
    inputs=(
        "x_in",
        "y_in",
        "z_in",
        "yaw_in",
        "pitch_in",
        "roll_in",
    ),
    outputs=(
        "x_out",
        "y_out",
        "z_out",
        "yaw_out",
        "pitch_out",
        "roll_out",
    )
)

# Connect eddy current feedback.
SQL_TRIPLE_WITH_FB = InterconnectedSystem(
    (SQL_TRIPLE, ECD),
    name="100g",
    connections=(
        # SQL triple output -> ECD input
        ("ecd.x_in", "sql_triple.ecd_x"),
        ("ecd.y_in", "sql_triple.ecd_y"),
        ("ecd.z_in", "sql_triple.ecd_z"),
        ("ecd.yaw_in", "sql_triple.ecd_yaw"),
        ("ecd.pitch_in", "sql_triple.ecd_pitch"),
        ("ecd.roll_in", "sql_triple.ecd_roll"),
        # ECD output -> SQL triple input
        ("sql_triple.act_x_1", "-ecd.x_out"),
        ("sql_triple.act_y_1", "-ecd.y_out"),
        ("sql_triple.act_z_1", "-ecd.z_out"),
        ("sql_triple.act_yaw_1", "-ecd.yaw_out"),
        ("sql_triple.act_pitch_1", "-ecd.pitch_out"),
        ("sql_triple.act_roll_1", "-ecd.roll_out"),
    ),
    inputs=(
        "displace_x",
        "displace_y",
        "displace_z",
        "rotate_yaw",
        "rotate_pitch",
        "rotate_roll",
        "act_x_1",
        "act_y_1",
        "act_z_1",
        "act_yaw_1",
        "act_pitch_1",
        "act_roll_1",
        "act_x_2",
        "act_yaw_2",
        "act_pitch_2",
        "act_x_3",
        "act_yaw_3",
        "act_pitch_3",
    ),
    inplist=(
        "sql_triple.displace_x",
        "sql_triple.displace_y",
        "sql_triple.displace_z",
        "sql_triple.rotate_yaw",
        "sql_triple.rotate_pitch",
        "sql_triple.rotate_roll",
        "sql_triple.act_x_1",
        "sql_triple.act_y_1",
        "sql_triple.act_z_1",
        "sql_triple.act_yaw_1",
        "sql_triple.act_pitch_1",
        "sql_triple.act_roll_1",
        "sql_triple.act_x_2",
        "sql_triple.act_yaw_2",
        "sql_triple.act_pitch_2",
        "sql_triple.act_x_3",
        "sql_triple.act_yaw_3",
        "sql_triple.act_pitch_3",
    ),
    outputs=(
        "long_1",
        "long_2",
        "long_3",
        "trans_3",
        "vert_3",
        "yaw_3",
        "pitch_3",
        "roll_3",
    ),
    outlist=(
        "sql_triple.long_1",
        "sql_triple.long_2",
        "sql_triple.long_3",
        "sql_triple.trans_3",
        "sql_triple.vert_3",
        "sql_triple.yaw_3",
        "sql_triple.pitch_3",
        "sql_triple.roll_3",
    )
)

# Linearise the feedback system. Apparently I can't just call SQL_TRIPLE_WITH_FB.freqresp().
# The parameters to find_eqpt and linearize here are just guesses...
eqpt = find_eqpt(SQL_TRIPLE_WITH_FB, [0] * SQL_TRIPLE_WITH_FB.nstates, 0)
sys = linearize(SQL_TRIPLE_WITH_FB, eqpt[0], 0)

freq = np.logspace(-2, 3, 1000)
# Frequency response with feedback.
mag1, phase1, _ = sys.freqresp(2 * np.pi * freq)
# Frequency response without feedback.
mag2, phase2, _ = SQL_TRIPLE.freqresp(2 * np.pi * freq)

# Plot the two cases: feedback and no feedback.
plt.loglog(freq, mag1[SQL_TRIPLE_WITH_FB.find_output("long_3"), SQL_TRIPLE_WITH_FB.find_input("act_x_1"), :], label="FB")
plt.loglog(freq, mag2[SQL_TRIPLE.find_output("long_3"), SQL_TRIPLE.find_input("act_x_1"), :], "--", label="No FB")
plt.grid(True)
plt.legend()
plt.show()

The InterconnectedSystem class is supposed to maintain things as a LinearIOSystem if there are no nonlinear elements, but that functionality may be missing from the InterconnectedSystem constructor.  This would be a good enhancement and shouldn't be too hard to implement.
In the current implementation, calling linearize generates a StateSpace object, which doesn't have labeled signals.  However, it should be possible (and pretty easy) to return  a LinearIOSystem object, which would have the signal labels (and still be a linear system => freqresp would work).
Both good enhancements.  I'll try to find some time to implement, but if someone else wants to take a crack, perhaps create a separate  issue (referencing this one) and assign it to yourself?

@murrayrm do you think the problem with InterconnectedSystem not maintaining a LinearIOSystem has anything to do with the lack of apparent feedback in my model?
And if I understand your reply correctly, it sounds like I shouldn't need to call linearize at all (if InterconnectedSystem maintained things as a LinearIOSystem). Is there some way I can hack this to work with the current InterconnectedSystem?

@murrayrm do you think the problem with InterconnectedSystem not maintaining a LinearIOSystem has anything to do with the lack of apparent feedback in my model?

Hi I looked into the code a little bit and it turns out that this is exactly the problem. Setting up the connection map manually does not automatically call the appropriate StateSpace.feedback() method for linear state space systems as iosys.feedback(ss1, ss2) would do. Right now a "feedback" modeled in an InterconnectedSystem would only work in a nonlinear simulation. But the linearize() does not use the feedback interconnection map.

And if I understand your reply correctly, it sounds like I shouldn't need to call linearize at all (if InterconnectedSystem maintained things as a LinearIOSystem). Is there some way I can hack this to work with the current InterconnectedSystem?

Yeah we would need @murrayrm's suggestion to manintain LinearIOSystem by InterconnectedSystem and enhance LinearIOSystem to call StateSpace.feedback() with a properly reformated StateSpace system when it detects feedback loops in the connection map. Not that easy to to program in a general way, I think.
Sorry to lead you into the wrong direction. I guess @ilayn's suggestion to use a signal mux and call StateSpace.feedback() directly will be easier for now. That's basically the special case of the general approach described above.

Umm, we could be completely wrong here. There is a feedback in your plot, just not very strong. I rewrote your example and just used the "classical" control.feedback() function for state space systems and I got the same plot:
"""100g state space model."""

import numpy as np
import matplotlib.pyplot as plt
import control

A = [
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
    [-152.53882610042035, 1.5571920487715416e-11, -0.011200156128132915, 1.632559549476257e-7, -1.413679342720125, -4.093359544048649e-11, 54.759209981719074, -2.003371085743382e-11, 0.01111599273426369, -2.5509597113526e-8, 2.7591338153072824, 5.412858953805167e-11, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [2.0849649640385726e-12, -145.2731502117568, 9.934442657551588e-9, 0.0003678612482892676, 9.713842032496462e-11, 0.41222315924168185, -2.6663023105712876e-12, 47.555605820245994, 4.656408908970109e-8, -0.0006654280945320643, -1.2555522934432573e-11, -0.3207695984640116, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-0.011655967003511137, 9.83070193955856e-9, -415.4616995105061, 3.1306134749929204e-11, 0.002266377046996563, -1.422633780257092e-9, 0.0116218973819107, 4.664345630464335e-8,<PHONE_NUMBER>634585, -1.405363161359301e-11, 0.0010758728848655346, -2.576128872048418e-10, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0.00009153475730179002, 0.13768235176566324, 1.779328089502842e-8, -40.33566768070241, 4.775630208967757e-7, 0.05515222377933442, -0.000012949383725565499, -0.13768238324684695, -7.421351595388594e-9, 18.410676906038006, -1.3844040708141626e-7, -0.012669553955798114, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-1123.897865020629, 6.31924763953394e-8, 1.816977198449706, 7.138230997697364e-7, -248.21697606442186, -2.081071479118392e-7,<PHONE_NUMBER>759626, -8.450027075705214e-8, -2.218607222194627, -1.2187834894017893e-7,<PHONE_NUMBER>963982, 2.2730013763767726e-7, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-2.7834928034366927e-8,<PHONE_NUMBER>9966913, -4.939652472414061e-7, 0.0073599618128027955, -8.96143076934678e-8, -125.191380162728, 5.89977725842689e-9, 78.48581645908328, 3.779265784358153e-7, -0.005915984415823647, -2.204615208168721e-9, 28.068315801949264, 0., 0., 0., 0., 0., 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [119.0659799672878, -4.99222270495723e-12, 0.025241390744125194, -5.0288626114639114e-8, 1.611150201795317, 1.1477120994184478e-11, -170.41158607034222, 4.990603146133157e-12, -0.02524718274544071, 5.554015022181705e-8, -5.629379009070131, -1.3937182261466907e-11, 51.345606103054415, 8.098805932006082e-16, 5.792001384964716e-6, -5.282167744454775e-16, 0.22099954399727242, 1.3401615178387531e-17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-8.135914520461128e-9,<PHONE_NUMBER>2530481, 1.0165117263203341e-7, 0.010094478937997822, -2.7488528895097526e-10, 0.5151551108370259, 8.135914483817255e-9, -155.02525012947387, 5.18178015683491e-7, -0.014317826247156584, 1.5831891788229847e-10, 0.4243474279077066, 3.6643873450693484e-17, 51.34584950416905, -6.198292562251438e-7, 0.005216253302724892, -6.652788379271886e-18, -0.22116445540777152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-0.8599067268714619, 1.016600429178664e-7,<PHONE_NUMBER>389339, 5.2682229733267385e-11, -0.1139924268237351, 2.399191304485224e-9, 0.8205177586217574, 5.181694216367054e-7, -5858.35274778959, -1.027215280438951e-10, 0.303281539727261, 3.6891320659807203e-9, 0.03938896824997887, -6.198294507029915e-7, 5536.763609650645, 8.214520190955501e-18, -0.0036277980230806977, 2.635885639936502e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [-0.00027103083107860254, 9.100106106364594, -1.33679796107476e-7,<PHONE_NUMBER>531706, -1.5511541958348471e-6, -0.18656088303334561, 0.00027103082981721664, -16.821900782903985, 2.1987126646406236e-7, -521.5980633107704, 4.330657645451153e-6, 5.986764463548667, 1.2613858995249816e-12, 7.721794676539076, -8.618277975474366e-8,<PHONE_NUMBER>8392323, -2.2614713388806203e-13, -5.540348936284742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [29504.94953578678, -1.5750247170387362e-7, -36.76608963226808, -2.6916843722091054e-6, 3599.0193661861854, -7.116943652485516e-8, -28192.437572713083, 6.437534025050492e-8,<PHONE_NUMBER>098742, 4.4444808730484926e-6, -9908.369155011565, 7.486757314997423e-8, -1312.511963073688, 9.312587148592841e-8, -873.6199242776096, -2.7381735188442515e-13,<PHONE_NUMBER>4902348, -3.960181860586082e-10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [1.2806800531734902e-7, -2324.3475128946584, -1.901698374909116e-6, -0.08289534677361209, 2.0808848399932063e-6,<PHONE_NUMBER>355864, -1.2806800494102543e-7, 1436.6869280650687, 0.000012503272523472946, 0.07344847423025279, 4.971655571578583e-8, -14058.975204108547, -3.763235867883215e-16,<PHONE_NUMBER>295848, -0.000010601299959772482, -0.01546516704989307, 6.746904384986648e-17, 12820.083137583044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., 51.742760790314726, 0., 0.000013716387971413233, 0., -0.26410177736066937, 0., -51.74276079031472, 0., -0.00001371638797141324, 0., -0.2227076081323087, 0., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., 0., 51.74276079030108, -6.246208300444574e-7, 0.00012111283067720439, 0., 0.2641018086596424, 0., -51.74276079030108, 6.246208300444575e-7, -0.00003569604078781505, 0., 0.2227076000274016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., 0.00001371638796795784, -6.24620843965403e-7, 5579.562402705861, 0., -0.008401377310340305, -3.1541583186116577e-9, -0.00001371638797141324, 6.246208300444575e-7, -5579.562402705861, 0., -0.0007048950583954906, -2.656257158002136e-9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., -4.969593954370689e-12, 0.2074106702391023, -3.872365905890584e-10,<PHONE_NUMBER>7654845, -6.476605912591494e-13, -0.5034584280701414, 4.969593954370689e-12, -0.2074106702391023, 3.8723596467944313e-10, -174.78104623810026, 1.6366098126848681e-12, 0.5581490939336098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., 1125.2881245297842, -9.443548173972684e-16, 3.56166565166429, -7.957899327649086e-13,<PHONE_NUMBER>4194476, 2.2922802928084886e-15, -1125.2881245297842, 9.443548173972684e-16, -3.561665651677849, 7.957899312239311e-13, -370.5851229723677, -2.541290595486223e-15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0., 0., 0., 0., 0., 0., 1.4781791960679892e-16, -755.9283033219236, 9.016051532303482e-6, -0.0034235691852996294, 1.9264318592274217e-17, 12946.717248096731, -1.4781791960679892e-16,<PHONE_NUMBER>219236, -9.016036958622386e-6, 0.002188551379809207, -4.8680085322943655e-17, -13097.14755062692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
]

B = [
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [97.77961611870134, 4.462158613729219e-12, 0.0000841633903683493, -1.4017147364298802e-7, -0.06575674483775706, -8.044890542716096e-12, 4.4023400553011465, 5.048537424572038e-18, 4.9253829005284997e-8, -4.2399299620123075e-13, 0.745582387246381, 1.8158842640675715e-14, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [5.813375660191332e-13, 97.71754439151086, -5.6498488793041536e-8, -8.947728279499771e-7, 5.5720452514576386e-15, 0.057913099998327625, 5.0485374245720376e-18, 4.402250788131766, -3.827186239014313e-17, 2.558190087388631e-20, 4.2066121264474165e-14, -0.3205005913999008, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [0.00003406962147187582, -5.6474145633099976e-8,<PHONE_NUMBER>127103, 7.992811243349669e-12, -0.00002062262907015307, -3.948956637885892e-9, 4.9253829005284997e-8, -3.827186239014313e-17, 4.402183483023066, -1.3337786691084542e-16, 0.0002345420544871952, 1.8226023869625456e-13, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [-0.0000785853735762208, 3.148118779550124e-8, -1.0372393543674137e-8, 21.924992166679925, 6.76964498380342e-14, -0.018918161093184876, -4.239929962012307e-13, 1.7358203652622798e-20, -1.333778669108454e-16, 2470.490241460335, -6.141120068658153e-10, -0.7771560032324645, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [518.4388730446669, 2.1307777497085335e-8, 0.40163001723824177, -6.673280538737889e-7, -0.3486499193238116, -4.0174388132092054e-11, 0.745582387246381, 4.206612126447417e-14, 0.0002345420544871952, -6.141120068658157e-10, 3550.3924958904204, 1.931846662591109e-13, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [2.1935151052604557e-8, -222.8592938587527, 1.1603866581803556e-7, -0.002636245048002088, -5.875213459952077e-12, 37.00204576122579, 1.8158842640675715e-14, -0.3205005913999008, 1.8226023869625456e-13, -0.7771560032324645, 1.931846662591108e-13, 1526.1935368548127, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.594166746621905, -4.296099160391767e-18, -1.2901557443080627e-8, -1.4320332480060735e-13, 0.000430051933908293, 4.2723474909044076e-17, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -4.296099160391768e-18, 9.594208883422214, 6.549505774613767e-20, 1.4045602010915124, -2.183168688697192e-15, -0.00041903840286619255, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -1.2901557443080628e-8, 6.549505774613728e-20, 9.594209990896351, 2.227014855628041e-15, -1.4414760073460722, -6.644106443685691e-19, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -1.4320332480060735e-13, 1.4045602010915124, 2.2270148556280538e-15, 46818.67545332534, -7.423383182462161e-11, -13.967947383832945, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.000430051933908293, -2.183168688697179e-15, -1.4414760073460722, -7.423383182462118e-11, 48049.20238324044, 2.214702246457863e-14, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 4.2723474909044076e-17, -0.00041903840286619255, -6.64410644368573e-19, -13.967947383832945, 2.2147022464578756e-14, 32496.023404859825, 0., 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.668374746205163, 0., 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.668374746205163, 0., 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 9.668374746205163, 0., 0., 0.],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 47384.38214957986, -2.1574429850095904e-10, -1.409423155194457],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -2.1574429850095904e-10, 48851.97850512945, 6.417199003430134e-15],
    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., -1.409423155194457, 6.4171990034301325e-15, 32817.01238111918],
]

C = [
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
]

D = np.zeros((24, 24))

# Suspension model. 24x24
sql_triple_sus = control.ss(A, B, C, D)

sql_inputs = [
    # Displacement (m).
    "displace_x",
    "displace_y",
    "displace_z",
    # Rotation (radian?).
    "rotate_yaw",
    "rotate_pitch",
    "rotate_roll",
    # Actuation (N).
    "act_x_1",
    "act_y_1",
    "act_z_1",
    "act_yaw_1",
    "act_pitch_1",
    "act_roll_1",
    "act_x_2",
    "_unused_1",
    "_unused_2",
    "act_yaw_2",
    "act_pitch_2",
    "_unused_3",
    "act_x_3",
    "_unused_4",
    "_unused_5",
    "act_yaw_3",
    "act_pitch_3",
    "_unused_6",
]
sql_outputs = [
    # Displacement (m).
    "long_1",
    "_unused_1",
    "_unused_2",
    "_unused_3",
    "_unused_4",
    "_unused_5",
    "long_2",
    "_unused_6",
    "_unused_7",
    "_unused_8",
    "_unused_9",
    "_unused_10",
    "long_3",
    "trans_3",
    "vert_3",
    "yaw_3",
    "pitch_3",
    "roll_3",
    # Eddy current damping (force?) (N?).
    "ecd_x",
    "ecd_y",
    "ecd_z",
    "ecd_yaw",
    "ecd_pitch",
    "ecd_roll",
]

lever_yaw = 0.0845
lever_pitch = 0.0845
lever_roll = 0.0845
ecd_x = 0.12
ecd_y = 0.12
ecd_z = 0.12
ecd_yaw = lever_yaw ** 2 * ecd_x / 2
ecd_pitch = lever_pitch ** 2 * ecd_z / 2
ecd_roll = lever_roll ** 2 * ecd_y

# Feedback controller: Eddy current damping.
ecd_D = np.zeros((len(sql_inputs), len(sql_outputs)))
ecd_D[sql_inputs.index("act_x_1"), sql_outputs.index("ecd_x")] = ecd_x
ecd_D[sql_inputs.index("act_y_1"), sql_outputs.index("ecd_y")] = ecd_y
ecd_D[sql_inputs.index("act_z_1"), sql_outputs.index("ecd_z")] = ecd_z
ecd_D[sql_inputs.index("act_yaw_1"), sql_outputs.index("ecd_yaw")] = ecd_yaw
ecd_D[sql_inputs.index("act_pitch_1"), sql_outputs.index("ecd_pitch")] = ecd_pitch
ecd_D[sql_inputs.index("act_roll_1"), sql_outputs.index("ecd_roll")] = ecd_roll
ecd = control.ss([], [], [], ecd_D)

sql_triple_sus_cl = control.feedback(sql_triple_sus, ecd, sign=-1)

freq = np.logspace(-2, 3, 1000)
# Frequency response with feedback.
mag1, phase1, _ = sql_triple_sus_cl.freqresp(2 * np.pi * freq)
# Frequency response without feedback.
mag2, phase2, _ = sql_triple_sus.freqresp(2 * np.pi * freq)

# Plot the two cases: feedback and no feedback.
plt.loglog(freq,
           mag1[sql_outputs.index("long_3"), sql_inputs.index("act_x_1"), :],
           '-',
           label="Closed Loop")
plt.loglog(freq,
           mag2[sql_outputs.index("long_3"), sql_inputs.index("act_x_1"), :],
           "--",
           label="Open Loop")
plt.grid(True)
plt.legend()
plt.show()

And if you increase the gain for the ecd feedback, there is more damping:
ecd = control.ss([], [], [], 100*ecd_D)

So it's possible that your code is completely fine and the iosys module is suitable for your task. Maybe it's the model itself. Do you expect a different output, based on your Simulink model?

 I wasn't looking closely enough. I was confused because MATLAB's linear analysis toolbox automatically chooses appropriate frequency vector and in this case used high enough resolution to make it obvious. Thanks a lot for your help! Much appreciated.
Do you know why what you said above, i.e.

Setting up the connection map manually does not automatically call the appropriate StateSpace.feedback() method for linear state space systems as iosys.feedback(ss1, ss2) would do. Right now a "feedback" modeled in an InterconnectedSystem would only work in a nonlinear simulation.

is not causing a problem in this case?
What do the developers think of adding a simplified form of this code as an example to the docs? There might be others looking to translate Simulink models to Python. I am happy to clean it up a bit and make a PR if people think this would be useful.

Because linearize() numerically simulates the dynamics of the connected model and catches the feedback.
https://github.com/python-control/python-control/blob/6b24bb42a8da5b15cb79699e74fb33b30ba7935a/control/iosys.py#L549-L561
https://github.com/python-control/python-control/blob/6b24bb42a8da5b15cb79699e74fb33b30ba7935a/control/iosys.py#L1021-L1048
Depending on your system you still lose precision by converting to non-linear and performing these numerical calculations. Extending InterconnectedSystem to directly connect linear systems would be a good enhancement IMHO.

This is a pretty old discussion (almost pre-pandemic), but there are a several enhancements suggested here and also @SeanDS volunteered to create a simplified version of this code as an example for people converting from SIMULINK to python-control, which would be great. Adding some labels to the issue so that we don't forget to look back at it (at some point...).

Update: several of the features in this issue have now been implemented:

The linearize function now maintains signal names.
There is an interconnect function that can be used to interconnect linear or nonlinear systems using signal names.
Interconnections of LinearIOSystems via interconnect or via overloaded operators become LinearICSystems and preserve the linear structure.

With these changes, I believe that all of the new features in this thread have been implement.  The only thing missing is turning this into an example.  @SeanDS volunteered to do that (8 months ago), so I am going to close this issue and wait for a PR to come through -:).

Update: several of the features in this issue have now been implemented:

The linearize function now maintains signal names.
There is an interconnect function that can be used to interconnect linear or nonlinear systems using signal names.
Interconnections of LinearIOSystems via interconnect or via overloaded operators become LinearICSystems and preserve the linear structure.

With these changes, I believe that all of the new features in this thread have been implement.  The only thing missing is turning this into an example.  @SeanDS volunteered to do that (8 months ago), so I am going to close this issue and wait for a PR to come through -:).

@murrayrm Thanks for the feature implementations! I haven't forgotten about this, hopefully I can make a PR for you soon.

@murrayrm Thanks for the feature implementations! I haven't forgotten about this, hopefully I can make a PR for you soon.


Issue #122, TensorFlow

#122 NOTE:

Please fill out the template below

Did you read the instructions in the README?

Y

Have you read the instructions in CONTRIBUTING?

Y

Have you written this article by yourself? Have you taken inspiration from anywhere and then written it in your words?

Yes, I've written this article by myself & also took inspiration from various online resources!

@the-ethan-hunt I've included the changes as requested!


Release 2.6.0

Codecov Report

Merging #760 into release-2.6.0 will decrease coverage by 0.02%.
The diff coverage is 0%.

@@                 Coverage Diff                 @@
##             release-2.6.0     #760      +/-   ##
===================================================
- Coverage            39.85%   39.83%   -0.03%
  Complexity             990      990
===================================================
  Files                  149      149
  Lines                10083    10090       +7
  Branches              1117     1118       +1
===================================================
  Hits                  4019     4019
- Misses                5647     5654       +7
  Partials               417      417

Impacted Files
Coverage Δ
Complexity Δ

...java/org/sunbird/common/util/CloudStorageUtil.java
0% <0%> (ø)
0 <0> (ø)
:arrow_down:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 854b1c6...c869bbe. Read the comment docs.


Lists Number Comparisons and Conversions

Add Number Comparison functions for Integer and Long types.
Addresses #66 but does not completely resolve it.

The NumberComparison methods involving Integer and Long offer more precision than Float or Double. Thus, the code that attempts to check the length of strings before comparing the strings is not useful. The branches cannot be reached, and so should be removed.
These branches have no use at the moment, except to potentially support a non-standard Number implementation. The library does not plan to support non-standard Number implementations at this time.


However you accidentally committed an UpgradeLog.htm file...

Actually, don't bother, I was able to force push to your branch and remove it. Thanks!

Ok, great!


Fix bug in Android versions >= 22

You were checking for Lollipop rather than >= Lollipop :)

Thanks a lot for your pull request (=


feature: possible typescript support?

Is your feature request related to a problem? Please describe.
It's always weird and annoying for me to write lua. Is it possible to also support typescript as an alternative?
Describe the solution you'd like
Bundle https://github.com/TypeScriptToLua/TypeScriptToLua into a single-file javascript, and use quickjs-ng to to evaluate the script to transpile the typescript into lua before executing.
If the way can be accepted, I can make a pull request in the near future.
Describe alternatives you've considered
No response
Additional context
No response

The main concern is that this might increase the binary size for around 400k, I guess. If the binary size matters, we can make it an opt-in feature

for the following xmake.lua:
add_rules("mode.debug", "mode.release")

target("console")
    set_kind("binary")
    add_files("src/*.c")
    if is_mode("debug") then
        add_defines("DEBUG")
    end```

the equivalent xmake.ts can be something like:

```typescript
add_rules("mode.debug", "mode.release")

target('console')(console => {
    console.kind = 'binary'
    console.add_files(...)
    if(is_mode(...)) console.add_defines(...)
})```

the syntax can be discussed later after the basic transpile implementation is completed.

Currently, we do not consider other languages as built-in configuration. However, you can write a tool to convert ts to lua, and then call the xmake command. For example: xmake-ts

May I ask the reason? TS support wouldn't increase the complexity of maintenance of other component.

However, if I want to fully integrate with the xmake ecosystem, the best way is to make it an official function. SoiI don't want to create a third-party repo for the support

May I ask the reason? TS support wouldn't increase the complexity of maintenance of other component.

Binary size and Reduce third-party libraries
xmake needs to introduce as few third-party dependencies as possible to keep it lightweight and cross-platform. Especially the introduction of dependencies on core binary. Too many third-party dependencies will also make packaging very difficult, such as debian/archlinux and other distribution packages.
Currently xmake has introduced lua-cjson, lz4, tbox, sv, xxhash and other dependencies. In order to package xmake into debian. Several of its dependent libraries, such as tbox, sv, etc., took us several years to successfully push into debian.
In the future, I will try to implement cjson, semver, hash myself to reduce third-party dependencies as much as possible. And ensure that the binary is as small as possible.

might increase the binary size for around 400k

This is unacceptable to us. In addition, I am not sure whether quickjs-ng has been included in all distributions, otherwise it will affect the packaging of xmake.
Configuration consistency
We need to keep the configuration style as simple and consistent as possible.
Therefore, we will only consider one language(Lua)
Too many different types of language configurations will only make the configuration style confusing and make it more difficult for new users to get started.
Increased maintenance workload
In addition, it will also make xmake's own projects and documents more difficult to maintain, increasing our maintenance workload.
Other reason
I don't like ts/js

In addition, I am not sure whether quickjs-ng has been included in all distributions, otherwise it will affect the packaging of xmake.

As a popular embedding framework, quickjs is already available on nearly all platforms. It even (and is designed to) runs on embedding platforms so this shouldn't be a concern.

In addition, it will also make xmake's own projects and documents more difficult to maintain, increasing our maintenance workload

We can keep the consistency between TS and Lua api (this can be done automatically), thus the document wouldn't have to be maintained separately for the TS part.

might increase the binary size for around 400k
I checked again and found that the size can be reduced to about 100k.

We need to keep the configuration style as simple and consistent as possible.

The style can be the same if you'd like to. We can just use TS syntax and keep xmake dsl in mind.

I don't like ts/js

It's not JavaScript, it's lua with the syntax from TypeScript.

make it more difficult for new users to get started.

There's also many people who dislikes lua. If we support typescript, more of them can benefit from xmake.

If we cannot make it directly into xmake, is it acceptable to release it as a package in xmake repo, which done the conversation? Then we can do something like this:
// xmake.lua
add_requires("xmake-ts")
// xmake.ts
target('xxx') ....

Also would the xmake repo accept code generated from xmake-ts?

There's also many people who dislikes lua. If we support typescript, more of them can benefit from xmake.

I'm sorry if this sounds harsh, but then they should look elsewhere or get over it. You shouldn't use, or not use, a tool just for it's language choice, but whether it fits your project's needs. You are of course free to make a third-party transpiler or any plugin, nobody can stop you, but I don't think you can expect official support beyond questions or resolving technical issues in xmake itself.

There's also many people who dislikes lua. If we support typescript, more of them can benefit from xmake.

I'm sorry if this sounds harsh, but then they should look elsewhere or get over it. You shouldn't use, or not use, a tool just for it's language choice, but whether it fits your project's needs. You are of course free to make a third-party transpiler or any plugin, nobody can stop you, but I don't think you can expect official support beyond questions or resolving technical issues in xmake itself.

Well that's okay. You can see that I'm using xmake despite I dislike xmake, so it's not "based on languaged choice."
As I don't want to make our conversation a quarrel, and knowing that you personally dislike TS, I've abandoned the idea of implementing it in xmake core. I'll make it a separate project then.

I can't find it but there's an issue about allowing to use xmake with a simple yaml file for simple projects (similar to Cargo), and as far as I remember someone created a plugin for that, I guess the same is possible for typescript.
However it wouldn't be part of xmake core and xmake-repo, as it would fracture the xmake ecosystem and cause more harm than good.


md5 of imported source is in a wrong place

Godot version:
Godot 3.0 b08735f20987a6188fd54c5e2dcd072dc316b413
OS/device including version:
any OS
Issue description:
Currently source_md5 is located within the .import file near the source file. So when you change the source, reimport and commit the files, it doesn't get reimported for other people who pull the changes. Shouldn't it be located within the .import folder, associated with the imported file?

Yeah, I think the MD5 shouldn't be commited, then it doesn't belong to the *.import files.

Ah, I see. Technically you can commit the .import folder now and it should
work fine. That said, probably should add the MD5 of the imported files to
the check..
On Wed, Dec 20, 2017 at 11:56 AM, George Marques<EMAIL_ADDRESS>wrote:

Yeah, I think the MD5 shouldn't be commited, then it doesn't belong to the
*.import files.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/godotengine/godot/issues/14858#issuecomment-353084389,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AF-Z20LlbE3d-v3ndfQVwSmEzUwE1bo_ks5tCSAPgaJpZM4RH-Fz
.

I agree, the md5 should be somewhere in the .import folder, not the *.import file :)

BTW, while you could commit the .import folder, I don't think you should. Git isn't helpful for binary files, so adding copies of it in the same repository is just a waste of space. It's more practical to let each contributor reimport stuff they need.

It could probably just be another path added to the [remap] block?
For instance, I have an image with an import file with:
path.s3tc="res://.import/grid_default.png-d70f242c379990a079b4f22ba9d11a2e.s3tc.stex"
path.etc2="res://.import/grid_default.png-d70f242c379990a079b4f22ba9d11a2e.etc2.stex"

Just add another:
path.md5="res://.import/grid_default.png-d70f242c379990a079b4f22ba9d11a2e.md5"

or

path.hash="res://.import/grid_default.png-d70f242c379990a079b4f22ba9d11a2e.hash"

It would work the same as the current md5 in the [deps] block, but it wouldn't be committed to version control. Therefore, anyone who's computer needs to update the file will.

@NathanWarden It's simply easier to keep an md5 of the exported file. The editor filesystem keeps a cache of all modification dates anyway, so this check will only be performed if the date of the source file changes.

The problem right now is that Godot is detecting that source file changes and goes and checks MD5 as it should, but it does not check the MD5 of the imported files, which it should.

I committed the .import folder too, and now everytime I open the editor it wants to reimport some of the files (namely the .obj resources). The only thing that changes is the md5 in the .import file, though.

@reduz I see what you're saying. That would certainly fix the problem :)

@reduz if you check stored md5 against imported file, the check will always yield that it is up to date (since *.import file would keep md5 of the last imported file), even if the source actually changed.  So checking against imported file seems useless, unless I'm missing something.

@endragor Current check is against the source file, what I want to do is check against source AND imported file.


Could not read MapProperty with types: ObjectProperty ObjectProperty

Hello!  This is from a serialization attempt on an object from Borderlands 3, not Fortnite, so feel free to chuck this in the bin.  I'm pretty sure it's technically a more generic situation than just BL3, though, even if it might not be showing up in Fortnite data at the moment.
Anyway, I've got an object which fails to serialize, with the following output:
Error: Property error occurred:
Export type: OakCharacterSoundLogicComponent
Property Tag: CharacterSoundData (MapProperty) 56
Could not read MapProperty with types: ObjectProperty ObjectProperty

OakCharacterSoundLogicComponent is clearly a BL3-specific class type, but the error's getting thrown because num_keys_to_remove isn't zero, in this block: https://github.com/SirWaddles/JohnWickParse/blob/master/src/assets.rs#L1718-L1721
As a test, I tried doing a little loop from 0..num_keys_to_remove in there, immediately after reading the value, calling this in each iteration:
read_map_value(reader, key_type, "StructProperty", name_map, import_map)

... and it allowed JWP to produce a serialization for me.  Obviously this doesn't correctly process what it's being told to -- no idea what keys it's requesting be removed or whatever, but the serialization looks reasonable, and produces something at least.
Anyway, here's the files in question, if you're willing to take a peek:
https://apocalyptech.com/scratchpad/jwp/BPChar_PunkBadass.uasset
https://apocalyptech.com/scratchpad/jwp/BPChar_PunkBadass.uexp
... and the serialization once I put in my improper little hack there:
https://apocalyptech.com/scratchpad/jwp/BPChar_PunkBadass.json
Let me know if I can provide any more info!  And again, totally understandable if you don't want to deal with this, of course.  :)  Cheers!

I still don't understand this. I think your solution is correct, but what possible use could there be to remove some keys from a map before it's even loaded?
My concern is that this entry somehow affected the contents of the array itself, and it never came up as an issue when loading files from Fortnite.

Heh, yeah, it's a weird one.  I'm still not very familiar with how these things are laid out, so I'm not really sure what kind of keys it's saying to remove in the first place.  I did check the in-game property on the console (using the only useful console command BL3 lets us use, getall) and it looks like the serialization for that export does match what I got out of there.
Anyway, thanks for committing regardless!  Your tool's been invaluable in getting BL3 modding going.  :)


Lumberjack artifacts in maven repository don't work with gradle

TL;DR
I am trying to integrate with Lumberjack library using Java and Gradle. Gradle is configured with
repositories {
    mavenCentral()

    maven {
        url = uri("https://us-maven.pkg.dev/abcxyz-artifacts/maven-repo")
        content {
            includeGroup("com.abcxyz.lumberjack")
            includeGroup("com.abcxyz.jvs")
        }
    }
}

dependencies {
   ...
    implementation("com.abcxyz.lumberjack:audit-client-library:0.0.5") {
        exclude(group = "org.slf4j", module = "slf4j-simple")
    }
   ...
}

When I run a build I get the following error:
Execution failed for task ':kaptGenerateStubsKotlin'.
> Could not resolve all files for configuration ':compileClasspath'.
   > Could not resolve com.abcxyz.lumberjack:audit-client-library:0.0.5.
     Required by:
         project :
      > Could not resolve com.abcxyz.lumberjack:audit-client-library:0.0.5.
         > inconsistent module metadata found. Descriptor: com.abcxyz.lumberjack:audit-client-library:0.0.1 Errors: bad version: expected='0.0.5' found='0.0.1'

If I download the artifact from https://us-maven.pkg.dev/abcxyz-artifacts/maven-repo/com/abcxyz/lumberjack/audit-client-library/0.0.5/audit-client-library-0.0.5.pom I see that the version was not replaced but is
  <artifactId>audit-client-library</artifactId>
  <groupId>com.abcxyz.lumberjack</groupId>
  <version>${revision}</version>

The same seems to apply for JVS dependency
Execution failed for task ':kaptGenerateStubsKotlin'.
> Could not resolve all files for configuration ':compileClasspath'.
   > Could not resolve com.abcxyz.jvs:jvs-client:0.0.3.
     Required by:
         project : > com.abcxyz.lumberjack:audit-client-library:0.0.5
      > Could not resolve com.abcxyz.jvs:jvs-client:0.0.3.
         > inconsistent module metadata found. Descriptor: com.abcxyz.jvs:jvs-client:${revision} Errors: bad version: expected='0.0.3' found='${revision}'

I googled this problem and it seems your build might be affected by this issue https://stackoverflow.com/questions/41086512/maven-issue-to-build-one-module-using-revision-property.
If I apply the fix (https://maven.apache.org/maven-ci-friendly.html#install-deploy - flatten plugin) to a local build and install the artefacts locally, version is set correctly.
Expected behavior
Version in the produced artifact should match release version.
Observed behavior
Artifact was produced with the correct layout but version inside the pom did not match the release version.
Environment Details
Java 20
Gradle 8.3

Additional information
No response

fixed by https://github.com/abcxyz/jvs/pull/373 and https://github.com/abcxyz/lumberjack/pull/454.
You can use com.abcxyz.lumberjack:audit-client-library:0.0.6 to verify the issue already got fixed.


TestAssert is assumed to be a CRD in the cluster

What happened:
This is possibly a bug, or possibly my complete misunderstanding of how TestAssert is meant to work!
I have a TestAssert definition in 01-assert.yaml file:
apiVersion: kuttl.dev/v1beta1
kind: TestAssert
timeout: 5
collectors:
  - type: command
    command: echo hello

kuttl reports the following:
case.go:366: retrieving API resource for kuttl.dev/v1beta1, Kind=TestAssert failed: the server could not find the requested resource

What you expected to happen:
TestAssert is recognised by kuttl and has the behaviour described in the documentation.
How to reproduce it (as minimally and precisely as possible):
See above specification and below environment details.
Anything else we need to know?:
Environment:

Kubernetes version (use kubectl version):

Client Version: v1.26.1
Kustomize Version: v4.5.7
Server Version: v1.25.4

KUTTL version (use kubectl kuttl version):

KUTTL Version: version.Info{GitVersion:"0.15.0", GitCommit:"f6d64c9", BuildDate:"2023-01-03T21:32:35Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"darwin/arm64"}

Cloud provider or hardware configuration:
OS (e.g. from /etc/os-release):
Kernel (e.g. uname -a):
Install tools:
Others:

This is not a bug. Maybe it should be explained in a better way in the documentation.
When you use a filename xx-assert.yaml, KUTTL expects to match exactly the object from your file. So, with this content file:
apiVersion: kuttl.dev/v1beta1
kind: TestAssert
timeout: 5
collectors:
  - type: command
    command: echo hello

KUTTL will try to look for a TestAssert object in your Kubernetes cluster.
Since what you want is KUTTL to "execute" that file, you need to rename your file from 01-assert.yaml to something like  01-check-command.yaml for instance.

Thanks for responding @iblancasa
The documentation, quoted below (emphasis mine), would imply it should be in the xx-assert.yaml file:

The TestAssert object can be used to specify settings for a test step's assert and must be specified in the test step's assert YAML.

Sorry. I misunderstood something from the first message.
I tried the file you provided and it works for me:
$ kuttl test check
2023/03/03 10:23:44 kutt-test config testdirs is overridden with args: [ check ]
=== RUN   kuttl
    harness.go:462: starting setup
    harness.go:252: running tests using configured kubeconfig.
    harness.go:275: Successful connection to cluster at: https://<IP_ADDRESS>:37213
    harness.go:360: running tests
    harness.go:73: going to run test suite with timeout of 30 seconds for each step
    harness.go:372: testsuite: check has 1 tests
=== RUN   kuttl/harness
=== RUN   kuttl/harness/mytest
=== PAUSE kuttl/harness/mytest
=== CONT  kuttl/harness/mytest
    logger.go:42: 10:23:44 | mytest | Creating namespace: kuttl-test-resolved-boa
    logger.go:42: 10:23:44 | mytest/1- | starting test step 1-
    logger.go:42: 10:23:44 | mytest/1- | test step completed 1-
    logger.go:42: 10:23:44 | mytest | mytest events from ns kuttl-test-resolved-boa:
    logger.go:42: 10:23:44 | mytest | Deleting namespace: kuttl-test-resolved-boa
=== CONT  kuttl
    harness.go:405: run tests finished
    harness.go:513: cleaning up
    harness.go:570: removing temp folder: ""
--- PASS: kuttl (5.15s)
    --- PASS: kuttl/harness (0.00s)
        --- PASS: kuttl/harness/mytest (5.12s)
PASS

$ kuttl version
KUTTL Version: version.Info{GitVersion:"0.15.0", GitCommit:"f6d64c9", BuildDate:"2023-01-03T21:32:35Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.26.1
Kustomize Version: v4.5.7
Server Version: v1.25.3

Just to verify: did you try to rename the file from 01-assert.yaml to 01-check.yaml (e.g.)?
How your kuttl-test.yaml file looks like?

I tried to reproduce this, unsuccessfully:
[mowsiany@mowsiany x]$ find
.
./tt
./tt/01-assert.yaml
[mowsiany@mowsiany x]$ cat tt/01-assert.yaml
apiVersion: kuttl.dev/v1beta1
kind: TestAssert
timeout: 5
collectors:
  - type: command
    command: echo hello
[mowsiany@mowsiany x]$ KUBECONFIG=$HOME/.../kubeconfig.txt .../kubectl-kuttl test .
2023/08/09 09:00:41 running without a 'kuttl-test.yaml' configuration
2023/08/09 09:00:41 kutt-test config testdirs is overridden with args: [ . ]
=== RUN   kuttl
    harness.go:462: starting setup
    harness.go:252: running tests using configured kubeconfig.
    harness.go:275: Successful connection to cluster at: https://<censored>
    harness.go:360: running tests
    harness.go:73: going to run test suite with timeout of 30 seconds for each step
    harness.go:372: testsuite: . has 1 tests
=== RUN   kuttl/harness
=== RUN   kuttl/harness/tt
=== PAUSE kuttl/harness/tt
=== CONT  kuttl/harness/tt
    logger.go:42: 09:00:44 | tt | Creating namespace: kuttl-test-prime-jawfish
    logger.go:42: 09:00:45 | tt/1- | starting test step 1-
    logger.go:42: 09:00:46 | tt/1- | test step completed 1-
    logger.go:42: 09:00:46 | tt | tt events from ns kuttl-test-prime-jawfish:
    logger.go:42: 09:00:46 | tt | Deleting namespace: kuttl-test-prime-jawfish
=== NAME  kuttl
    harness.go:405: run tests finished
    harness.go:513: cleaning up
    harness.go:570: removing temp folder: ""
--- PASS: kuttl (11.14s)
    --- PASS: kuttl/harness (0.00s)
        --- PASS: kuttl/harness/tt (7.18s)
PASS
[mowsiany@mowsiany x]$

This cluster definitely does not have the kuttl CRDs installed. This should not be necessary.
FTR, kuttl is supposed to filter out the TestAssert objects from the list of objects it will try to match against. Apparently for some reason this condition is not kicking in, and as a result the TestAssert is treated like any other k8s resource and kuttl tries to find it on the server, which fails.
I suspect something is broken in the way kuttl loads objects from the yaml file.
Whoever can reproduce this ( @jaypipes or @iainsproat ) , please provide the full output from kuttl. I wonder if you get any "object detected with no GVK Kind for path" messages there.

You are executing kubectl kuttl test against a Kube cluster that already has the kuttl.dev/v1beta1 CRDs installed into it. But when those CRDs are not installed in the target Kube cluster, you get the problem that @iainsproat wrote about.

No. I'm using a newly created kind cluster. Without installing anything.

And by default, kuttl.dev's CRDs are not installed into a Kubernetes cluster under test. I think that there should be a Helm chart that installs these kuttl.dev CRDs along with the kuttl krew plugin otherwise users are not able to use the TestStep/TestAssert/TestSuite CRs.

As I pointed out, it is not needed.
Can you provide a reproducer for your problem?


Ledvance AC31267 outdoor plug request

Hi!
Can you please add support for this?
https://www.amazon.co.uk/LEDVANCE-4058075570979-Steckdose-Messfunktion-Außenbereich/dp/B08YR4KRGX
Thanks

We can't add support for a device without a dump of the firmware.  If you are able to provide one, support can be added.  If not, you may try to find a compatible firmware by finding which firmware version your device has: https://github.com/tuya-cloudcutter/tuya-cloudcutter/wiki/FAQ#how-do-i-find-out-what-firmware-version-my-device-has

on it :)

@sebagsm No dump has been supplied yet, so I'm closing this issue as stale.  If you are able to provide a firmware dump, please attach it here and re-open this issue.

Dump added. I hope it has the right format.
ltchiptool_bk72xx_2024-09-26_16-33-17.zip

Added as LEDVANCE SmartPlus AC31267 Outdoor Plug v1.1.8


Questions about LOSS

Thank you for your great work,  may I ask where to set the beta in the total Loss? Looking forward to reply!

4.1. Implementation Details
...weights βl used to re-balance the loss between different lay-
ers are set to linearly growing from 1 to 3 across P2 to P7.


Unifying consolidated and non-consolidated interfaces

Right now there are two different worlds for consolidated vs non-consolidated metadata:
consolidated
import { openConsolidated, FetchStore } from "zarrita";

const store = new FetchStore("http://localhost:8080/data.zarr");
const { open, root, contents } = openConsolidated(store);
const grp = root();

const knownKey = contents.keys().next().value
const node = open(knownKey, { kind: "array" });
// just an alias for contents.get(knownKey) but type safe and allows relative paths

non-consolidated
import { open, root, FetchStore } from "zarrita";

const store = new FetchStore("http://localhost:8080/data.zarr");
const grp = await open(store);
const node = await open(grp.resolve("foo"));

But then the end users have to deal with switching between these worlds.
I can see a use case where we don't know if the metadata is consolidated or not, but if it is, it would be nice to avoid loading that metadata over the network (i.e., we have something like AnnData).
In #109 , @keller-mark had the idea to start tracking information about the stores (which we can do with WeakMaps). I wonder if we could extend this idea to opening consolidated metadata. I'm wondering if we could do something similar to keep track of the contents we've opened so far for a store:
import { openConsolidated, open, FetchStore } from "zarrita";

const store = new FetchStore("http://localhost:8080/data.zarr");
const contents = await openConsolidated(store);
// Map<AbsolutePath, Array<DataType, Store> | Group<Store>>

const grp = open(store, { kind: "group" }); // uses the consolidated metadata for the store
const store = open(grp.resolve("foo"), { kind: "array" });

This would mean that if you know you have consolidated metadata, you could just use contents directly. But if you don't know if it's consolidated or not, you could "try" to open consolidated for a performance boost:
await openConsolidated(store, { returnContents: false }); // creates a tracker of the consolidated metadata
const grp = open(store, { kind: "group" }); // uses the consolidated metadata for the store
const store = open(grp.resolve("foo"), { kind: "array" });

Another idea is that this could just be a special store:
interface Listable {
  contents(): Array<{ path: AbsolutePath, kind: "array" | "group" }>;
}

async function withConsolidated<Store extends Readable>(store: Store) Pick<Store, "get"> & Listable {
  const known_metadata = await try_consolidated(store);
  return {
    get(...args: Parameters<Store["get"]>) {
      let [key, opts] = args;
      if (key in known_metadata) return known_metadata[key];
      let maybe_bytes =  store.get(key, opts);
      if (is_meta_key(key) && maybe_bytes) { // add to known_metadata
      return maybe_bytes;
    },
    contents() {
      return list_nodes(known_metadata);
    }
  }
}

The reason I chose to use contents over keys is because keys for Map would list all contents (including chunks).

Added in #119


Incorrect precision for number type is set in case of export to new table

System information:

Operating system (distribution) and version win10
DBeaver version 21.1.4

Connection specification:

Database name and version Snowflake

Describe the problem you're observing:
Incorrect precision (100) for number type is set in case of export to new table. So data transfer cannot be performed due to error.

Steps to reproduce, if exist:

Start table export to db (table should contain numeric columns)
Perform export to the new table and check generated ddl - precision for numeric type is automatically set to 100.

NUMBER type returned to Snowflake and NUMERIC type returned to Netezza. It will help with data types mapping.


left-sidebar filter: add topics filter that works like linkedin's. List top 5 (by volume?) with additional text field input option

Closing b/c dup. now that jack added a very similar feature issue


Add parameter DefaultLinkToExistingAccess

The PowerShell cmdlet Set-SPOSite offers to set the default Sharing link to "Existing Access" by means of the DefaultLinkToExistingAccess switch, e.g.
Set-SPOSite -Identity https://contoso.sharepoint.com/sites/site1 -DefaultLinkToExistingAccess

Is there any chance that is parameter will be added on Tenant level as well?
For example in the Set-PnPTenant cmdlet?
Another related question:
Why does the parameter DefaultSharingLinkType not include an option to go for "ExistingAccess" or alike? The documentation states the following:

-DefaultSharingLinkType
[...]
The values are: None Direct Internal AnonymousAccess

@officedocsbot assign @yogkumgit

Hello @Markus-Hanisch
Markus, how are you?
Sorry if I misunderstood your message, if I do, please let me know, however I think that your inquiries will be better suited for SharePoint UserVoice. As here we are limited  to documentation fixes.

@get-itips
Well, maybe you are right. Can you tell me where I can find the Code for the existing Cmdlet Set-SPOSite cmdlet.
Maybe I can figure out how to adjust the PnPSite cmdlet accordingly to provide the same parameter(?)

@Markus-Hanisch
Markus, thanks for getting back.
SharePoint Online cmdlets are not open-sourced (Set-SPOSite),  so you have the option to suggest changes and additions using a resource like user voice, however SharePoint PnP cmdlets are open sourced and they are community-driven. I recommend visiting this resource and also you can find the code for Set-PnPSite here.
Hope this helps you

@get-itips  Thank you very much for the contribution and sharing this explanation. @Markus-Hanisch Hope this comment is helpful for you. If you see a documentation update is required, please feel free to open an issue for the same. We proceed here to close it. Thanks for taking out some time to open the issue. Appreciate and encourage you to do the same in future also.


uffd: Remove threads that do not exist anymore

CI gfxreconstruct build queued with queue ID 215784.

CI gfxreconstruct build # 4410 running.

CI gfxreconstruct build # 4410 passed.

Right, good catch. Requires some locking

CI gfxreconstruct build queued with queue ID 216544.

CI gfxreconstruct build queued with queue ID 216555.

CI gfxreconstruct build # 4421 running.

CI gfxreconstruct build # 4421 passed.

CI gfxreconstruct build queued with queue ID 220398.

CI gfxreconstruct build # 4442 running.

CI gfxreconstruct build # 4442 passed.


Update stress calculation for MACE

MACE requires the stress to be computed directly rather than through the 'stress volume'

@swagataroy123 can you add your comment/review here instead of the private one?

@swagataroy123

I checked the constant.convert_units code and it does not take care of stress. @ajhoffman1229 , do you use some other codes in htvs for stress conversion units for VASP?
Yes, there is some code for the conversion in htvs. I will send a link in Slack (since it's a private repo).


basic installer instructions should be already found in README itself

It's custom that in order to do a "standard" install (that is any kind of install of your software that is not a special case) can be just read directly from the README.
Currently the README links just to a document. If we can, we should avoid that and just give  the one (or multi) liner(s) that allow you to install it easy and (hopefully) fast.

will be revisited in newer release


Added inline links for better readability / referencing

Thanks! Sorry this sat for so long, really appreciate your help! The inline links definitely make this easier to read.

Glad it was helpful!


Python linter minor changes, add argparse

No logic changes.

C0303: remove trailing whitespaces,
W0611: Unused import json,
W0611: Unused Tag imported,
R1722: Consider using sys.exit()
add shebang,
C0411: change import order,
add options to ignore checks: line-too-long, missing-docstring
add argparse.

I didn't test the resulting script yet.

Everything looks fine. Merged


Update comments for SecurityToken.ReadToken method

Updated the comments for the SecurityToken.ReadToken method to reflect the actual return type, which is SecurityToken instead of JwtSecurityToken.

@mgblackwater i think it is ok to that the comments use JwtSecurityToken, this gives users knowledge of the actual type returned.


fix(mergeAll): add source subscription to composite before actually subscribing

Add subscriptions for source Observables to mergeAll composite subscription before actually subscribing to any of these Observables, so that if source Observable emits synchronously and consumer of mergeAll unsubscribes at that moment (for example take operator), subscription to source is unsubscribed as well and Observable stops emitting.
Closes #2476

Coverage increased (+0.001%) to 97.69% when pulling 98ca13310aa80bbb4f467d17e0674775b79df811 on Podlas29:fix-merge-all-inner-subscriptions into 01e1343629c579b573f2a2e47c575bc4b0ae0877 on ReactiveX:master.

@benlesh done.

Coverage increased (+0.001%) to 97.681% when pulling f6b694938073b68e3d1afd20b3ba222390523da2 on Podlas29:fix-merge-all-inner-subscriptions into 3e9d5295f118c29193f88ea825902ac359901119 on ReactiveX:master.

@benlesh I've rebased this PR.


The data forecasted by Seita (linear-OLS model v2) is hard to distinguish in UI

The data forecasted by the OpenWeatherMap has dotted lines
The data forecasted by Seita (linear-OLS model v2) is sold just like the actuals I load.
Is it because the type for Seita (linear-OLS model v2) is forecasting script instead of forecaster?

Yes, I believe "forecaster" is now the needed term.
Not sure where we should document that. Maybe in a tutorial?

That would be nice but the problem is that the build in forecast Seita (linear-OLS model v2) has type  forecasting script. I do not think I can change that.
I.e. documentation will not fix the bug

@Flix6x Should this be a change in the code?

@Flix6x Should this be a change in the code?

Yes, this is a bug in line 235 of data/services/forecasting.py.
@Ragnar-the-mighty want to create the PR? We could restrict it to changing the one line, or include a db revision that updates the data source type of existing data as well. We had a previous revision that did the same, but since users may since have been adding forecasts of the old type again, we might want to run this migration step once more.

@Flix6x
Since this affect migration, why not change the UI code to also look for "forecasting script" and give it a dotted line?

@Ragnar-the-mighty could you check whether #1211 fixes your issue?

Yes, that fix make it much easier to distinguish forecaster script data


pdm shell doesn't spawn a shell

Hi.
I ran into this plugin, hoping to give pdm a shell command, the same than exists in pipenv, poetry or hatch: spawn a sub shell, with the current virtualenv loaded. I was also redirected to pdm-shell by PDM maintainers thinking that was what pdm-shell was doing.
Howerever, pdm shell outputs what seems to be some shell commands and no shell is spawned. There is then a mismatch between the plugin title/the command, and the behavior.
People expect pdm shell to behave like pipenv shell, poetry shell and hatch shell.

This is not the goal of pdm-shell. The current function is determined after careful consideration. It refers to the opinions of the PDM authors. It provides a way to enter the current environment in the simplest and most portable way.
By the way, since PDM takes virtual environments by default, it should be easier to use the way virtual environments are activated (and there are plenty of tried and tested practices here).

OK. I plan to write a pdm-shell plugin that spawns a shell with virtualenv activated, as other package managers do. The customer I work for is heavily reliant on the xxx shell workflow, and I also think there a handsome of developers would like to have a pdm shell too. Would you accept to rename your project on PyPI so this pdm shell project can have the pdm-shell name on PyPI?


Google play button

PR Title

The purpose of this Pull Request is to fix #77
Description

create the button with fontawesome icon and tailwindcss
How you solved

I create a button tag and add the fontawesome icon and style it with tailwindcss
Screenshots

Checklist

[x] I have Made this contribution as per the CONTRIBUTING guide in this repo
[x] I have tested in local Environment.
[x] I have made the fix as per issue converstaion
[x] I have starred the repository ⭐

@iamkennis
Great looking as per requirement, please also complete other store buttons too
Thanks


suggest argument name completions for annotations that are imported

suggest argument name completions for annotations that are imported
addresses #25089, but doesn't fix it entirely
changed a typo in the test compared to #25098

I'm not totally sure if this works. I'm not sure how to test this in webstorm for example.

Thank you! This looks good to me. I've recast it as https://codereview.chromium.org/1497773002/ following our standard commit process.

This change has now landed. Thanks!

@danrubel awesome :+1:


Added DC feature to Availability and backup section

Domain controller are supported on all the Windows Server guests but with production checkpoints only.

@kaushika-msft,
Thanks for your contribution as a Microsoft full-time employee or intern. You do not need to sign a CLA.
Thanks,
Microsoft Pull Request Bot

Thanks, Kaushik - merging now. Due to a publishing freeze, you'll see this fix live at launch. Let me know if you need a staging link to verify the fix. - Liza