-
-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Abstract the saturation variable index #222
Conversation
Codecov Report
@@ Coverage Diff @@
## master #222 +/- ##
==========================================
- Coverage 90.93% 90.86% -0.07%
==========================================
Files 24 24
Lines 3133 3143 +10
==========================================
+ Hits 2849 2856 +7
- Misses 284 287 +3
📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more |
Below are the benchmarks (first and last refer to the position of the saturation variable). Most of the differences are not very significant and go different ways except for QY where first is clearly better.
|
Thanks! It looks like JAK-STAT 1 also finishes with First |
I think for the sake of completeness it would be interesting to run benchmarks where the saturation polynomial is factored |
But that would require some tweaking in the MQS ideal. We can probably merge this with First for now |
For the record, the original model which stimulated this discussion we the following: ode = @ODEmodel(
x0'(t) = - D0 * x0(t),
x1'(t) = x0(t) - D1 * x1(t),
x2'(t) = m1 * x1(t) - D2 * x2(t),
x3'(t) = m2 * x2(t) - D3 * x3(t),
x4'(t) = m3 * x3(t) - D4*x4(t),
x02'(t) = - D02 * x02(t),
x12'(t) = x02(t) - g12*x12(t) - (m12 + f1/(1 + z1(t))) * ( ((z2(t))^20)/(tau+(z2(t))^20) ) * x12(t),
x22'(t) = (m12 + f1/(1 + z1(t))) * ( ((z2(t))^20)/(tau+(z2(t))^20) ) * x12(t) - D22 * x22(t),
x32'(t) = m22 * x22(t) - D32 * x32(t),
x42'(t) = m32 * x32(t) - D42 * x42(t),
z1'(t) = n*z1(t)*(m22*x22(t) + (m32- D32)*x32(t)- D42*x42(t) + m2*x2(t) + (m3-D3)*x3(t) - D4*x4(t))/(x32(t)+x42(t)+x3(t)+x4(t)),
z2'(t) = 1,
X1'(t) = x1(t) + x12(t),
y1(t) = x1(t) + x12(t),
y2(t) = x2(t) + x22(t),
y3(t) = x3(t) + x32(t),
y4(t) = x4(t) + x42(t),
Y1(t) = X1(t),
Y2(t) = C2 - (X1(t)*g12/D22 + (x0(t)/D02 +x12(t) + x22(t))/D22 + x2(t)/D2 + (x1(t) + x0(t)/D0)*(D2*g12+m1*D22)/(D1*D2*D22) ),
Y3(t) = C3 - (X1(t)*g12*m22/(D22*D32) + m22*(x0(t)/D02 + x12(t) + x22(t) + D22*x32(t)/m22)/(D22*D32) + m2*(x2(t) + x3(t)*D2/m2)/(D2*D3) + (x1(t) + x0(t)/D0)*(g12*m22*D2*D3+m1*m2*D22*D32)/(D1*D2*D3*D22*D32) ),
Y4(t) = C4 - (m22*m32*(X1(t)*g12 + x0(t)/D02 + x12(t) + x22(t) + D22*x32(t)/m22 + D22*D32*x42(t)/(m22*m32))/(D22*D32*D42) + m3*(m2*x2(t)/D2 + x3(t) + D3*x4(t)/m3)/(D3*D4) + (x1(t) + x0(t)/D0)*(g12*m22*m32*D2*D3*D4+m1*m2*m3*D22*D32*D42)/(D1*D2*D3*D4*D22*D32*D42) ),
Y5(t) = z2(t)
) from this paper. Here is also a mathematical rationale why putting the saturation variable first should be beneficial. Consider a subfield generated by
These functions are symmetric and in fact generate the field of all symmetric functions. The corresponding MQS ideal in
Now if we compute the Groebner basis in degrevlex with
Here we see a complicated quadratic equation on
Here the role of "pivotal" element is taken by |
Needs some benchmarks