fix the equation solver

This commit is contained in:
Krasimir Angelov
2026-08-20 18:39:04 +02:00
parent db9a4b913f
commit 0bba6ae1ea
+19 -24
View File
@@ -366,26 +366,7 @@ bool PgfAbstractParser::instantiate(ref<PgfConcrRule> rule1, size_t *values1, re
ref<PgfConcrRule> rule2, size_t *values2, ref<PgfLParam> lparam2) ref<PgfConcrRule> rule2, size_t *values2, ref<PgfLParam> lparam2)
{ {
size_t i01 = lparam1->i0; size_t i01 = lparam1->i0;
for (size_t i = 0; i < lparam1->n_terms; i++) {
if (values1[lparam1->terms[i].var] > 0) {
i01 += lparam1->terms[i].factor * (values1[lparam1->terms[i].var]-1);
}
}
size_t i02 = lparam2->i0; size_t i02 = lparam2->i0;
for (size_t i = 0; i < lparam2->n_terms; i++) {
if (values2[lparam2->terms[i].var] > 0) {
i02 += lparam2->terms[i].factor * (values2[lparam2->terms[i].var]-1);
}
}
if (i01 > i02) {
i01 -= i02;
i02 = 0;
} else {
i02 -= i01;
i01 = 0;
}
size_t i1 = 0, i2 = 0; size_t i1 = 0, i2 = 0;
while (i1 < lparam1->n_terms || i2 < lparam2->n_terms) { while (i1 < lparam1->n_terms || i2 < lparam2->n_terms) {
@@ -394,6 +375,7 @@ bool PgfAbstractParser::instantiate(ref<PgfConcrRule> rule1, size_t *values1, re
if (i1 < lparam1->n_terms) { if (i1 < lparam1->n_terms) {
t1 = lparam1->terms[i1]; t1 = lparam1->terms[i1];
if (values1[t1.var] > 0) { if (values1[t1.var] > 0) {
i01 += t1.factor * (values1[t1.var]-1);
i1++; i1++;
continue; continue;
} }
@@ -405,6 +387,7 @@ bool PgfAbstractParser::instantiate(ref<PgfConcrRule> rule1, size_t *values1, re
if (i2 < lparam2->n_terms) { if (i2 < lparam2->n_terms) {
t2 = lparam2->terms[i2]; t2 = lparam2->terms[i2];
if (values2[t2.var] > 0) { if (values2[t2.var] > 0) {
i02 += t2.factor * (values2[t2.var]-1);
i2++; i2++;
continue; continue;
} }
@@ -412,8 +395,10 @@ bool PgfAbstractParser::instantiate(ref<PgfConcrRule> rule1, size_t *values1, re
} }
if (scale1 > scale2) { if (scale1 > scale2) {
size_t min = (i02 / t1.factor); ssize_t min = (i02 / t1.factor - i01 / t1.factor);
size_t max = min; ssize_t max = min;
if (min < 0)
return false;
while (i2 < lparam2->n_terms) { while (i2 < lparam2->n_terms) {
t2 = lparam2->terms[i2]; t2 = lparam2->terms[i2];
size_t f = t2.factor / t1.factor; size_t f = t2.factor / t1.factor;
@@ -422,10 +407,12 @@ bool PgfAbstractParser::instantiate(ref<PgfConcrRule> rule1, size_t *values1, re
if (values2[t2.var] == 0) { if (values2[t2.var] == 0) {
max += f * (rule2->ranges[t2.var]-1); max += f * (rule2->ranges[t2.var]-1);
} else {
min += f * (values2[t2.var]-1);
max += f * (values2[t2.var]-1);
} }
i2++; i2++;
} }
i02 %= t1.factor;
if (min >= rule1->ranges[t1.var]) if (min >= rule1->ranges[t1.var])
return false; return false;
@@ -437,10 +424,14 @@ bool PgfAbstractParser::instantiate(ref<PgfConcrRule> rule1, size_t *values1, re
return false; return false;
} }
i01 %= t1.factor;
i02 %= t1.factor;
i1++; i1++;
} else { } else {
size_t min = (i01 / t2.factor); size_t min = (i01 / t2.factor - i02 / t2.factor);
size_t max = min; size_t max = min;
if (min < 0)
return false;
while (i1 < lparam1->n_terms) { while (i1 < lparam1->n_terms) {
t1 = lparam1->terms[i1]; t1 = lparam1->terms[i1];
size_t f = t1.factor / t2.factor; size_t f = t1.factor / t2.factor;
@@ -449,10 +440,12 @@ bool PgfAbstractParser::instantiate(ref<PgfConcrRule> rule1, size_t *values1, re
if (values1[t1.var] == 0) { if (values1[t1.var] == 0) {
max += f * (rule1->ranges[t1.var]-1); max += f * (rule1->ranges[t1.var]-1);
} else {
min += f * (values1[t1.var]-1);
max += f * (values1[t1.var]-1);
} }
i1++; i1++;
} }
i01 %= t2.factor;
if (min >= rule2->ranges[t2.var]) if (min >= rule2->ranges[t2.var])
return false; return false;
@@ -464,6 +457,8 @@ bool PgfAbstractParser::instantiate(ref<PgfConcrRule> rule1, size_t *values1, re
return false; return false;
} }
i01 %= t2.factor;
i02 %= t2.factor;
i2++; i2++;
} }
} }