Skip to content

Commit

Permalink
testing more variations
Browse files Browse the repository at this point in the history
  • Loading branch information
skeating committed Jan 21, 2025
1 parent 2136a9c commit fa17697
Show file tree
Hide file tree
Showing 3 changed files with 225 additions and 31 deletions.
36 changes: 9 additions & 27 deletions src/sbml/conversion/ExpressionAnalyser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,18 +217,15 @@ void ExpressionAnalyser::substituteParametersForExpressions()
}
else // j > 0 so not the first expression
{
if (exp->type == TYPE_K_MINUS_X_MINUS_Y)
if (exp->type == TYPE_K_MINUS_X_MINUS_Y ||
exp->type == TYPE_K_MINUS_X)
{
// we have a different value for k-x-y
// we know this because the expressions are in order and k-x-y is always first
// and the code that decides whether to add the expression well have checked that it is not identical
// so we if we have an expression of this type but is not first then it must be
// k-x-y but with a different value
addSingleNewParameter(exp);
}
else if (exp->type == TYPE_K_MINUS_X)
{
// k-x will always be replaced by a new variable
// similarly for k-x
addSingleNewParameter(exp);
}
else if (exp->type == TYPE_K_PLUS_V_MINUS_X_MINUS_Y)
Expand All @@ -242,7 +239,7 @@ void ExpressionAnalyser::substituteParametersForExpressions()
// need to create a new parameter
addNewParameterPlusVOrW(exp);
}
else if (mExpressions[j - 1]->type == TYPE_K_MINUS_X_MINUS_Y)
else if (getSubstitutionValuesByType(TYPE_K_MINUS_X_MINUS_Y) != NULL)
{
// here we are dealing with the fact that we have k+v-x-y and k-x-y
// need to check whether they have the same values for k,x,y
Expand Down Expand Up @@ -339,9 +336,10 @@ void ExpressionAnalyser::substituteParameters(SubstitutionValues_t* exp)
}
}

SubstitutionValues_t* ExpressionAnalyser::getSubstitutionValuesByType(ExpressionType_t type,
size_t index)
SubstitutionValues_t*
ExpressionAnalyser::getSubstitutionValuesByType(ExpressionType_t type)
{
unsigned int index = 0;
SubstitutionValues_t* exp = NULL;

while (exp == NULL && index < mExpressions.size())
Expand Down Expand Up @@ -376,15 +374,7 @@ void ExpressionAnalyser::addSingleNewParameter(SubstitutionValues_t* exp)

void ExpressionAnalyser::addNewParameterPlusVOrW(SubstitutionValues_t* exp, std::string vOrW)
{
ASTNode* var = NULL;
if (vOrW == "v")
{
var = exp->v_expression->deepCopy();
}
else
{
var = exp->w_expression->deepCopy();
}
ASTNode* var = (vOrW == "v") ? exp->v_expression->deepCopy() : exp->w_expression->deepCopy();
std::string zName = getUniqueNewParameterName();
exp->z_value = zName;
mNewVarCount++;
Expand All @@ -400,15 +390,7 @@ void ExpressionAnalyser::addNewParameterPlusVOrW(SubstitutionValues_t* exp, std:

void ExpressionAnalyser::addPreviousParameterPlusVOrW(SubstitutionValues_t* exp, SubstitutionValues_t* previous, std::string vOrW)
{
ASTNode* var = NULL;
if (vOrW == "v")
{
var = exp->v_expression->deepCopy();
}
else
{
var = exp->w_expression->deepCopy();
}
ASTNode* var = (vOrW == "v") ? exp->v_expression->deepCopy() : exp->w_expression->deepCopy();
exp->z_value = previous->z_value;
ASTNode* z = new ASTNode(AST_NAME);
z->setName(previous->z_value.c_str());
Expand Down
2 changes: 1 addition & 1 deletion src/sbml/conversion/ExpressionAnalyser.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ class LIBSBML_EXTERN ExpressionAnalyser

void substituteParameters(SubstitutionValues_t* values);

SubstitutionValues_t* getSubstitutionValuesByType(ExpressionType_t type, size_t index = 0);
SubstitutionValues_t* getSubstitutionValuesByType(ExpressionType_t type);


//void printSubstitutionValues(const SubstitutionValues_t* values1);
Expand Down
218 changes: 215 additions & 3 deletions src/sbml/conversion/test/TestExpressionAnalyser.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
+* @file TestExpressionAnalyser.cpp
* @file TestExpressionAnalyser.cpp
* @brief Tests for raterule to reaction converter
* @author Sarah Keating
* @author Alessandro Felder
Expand Down Expand Up @@ -1125,6 +1125,118 @@ START_TEST(test_analyse_1_different_replace_3)
}
END_TEST

START_TEST(test_analyse_1_different_replace_4)
{
RateRule* rr = d->getModel()->createRateRule();
rr->setVariable("a");
rr->setMath(SBML_parseFormula("k - x - y"));
RateRule* rr1 = d->getModel()->createRateRule();
rr1->setVariable("b");
rr1->setMath(SBML_parseFormula("k - x + w - a"));
converter->populateInitialODEinfo();
ExpressionAnalyser* analyser = new ExpressionAnalyser(m, converter->getOdePairs());

fail_unless(analyser->getNumExpressions() == 0);

analyser->detectHiddenSpecies();

fail_unless(analyser->getNumExpressions() == 2);
SubstitutionValues_t* value = analyser->getExpression(0);
fail_unless(value->k_value == "k");
fail_unless(value->x_value == "x");
fail_unless(value->y_value == "y");
fail_unless(value->z_value == "newVar1");
fail_unless(value->type == TYPE_K_MINUS_X_MINUS_Y);
fail_unless(formulas_equal("k - x - y", value->current));
fail_unless(formulas_equal("0", value->dxdt_expression));
fail_unless(formulas_equal("0", value->dydt_expression));
fail_unless(value->v_expression == NULL);
fail_unless(value->w_expression == NULL);
fail_unless(formulas_equal("newVar1", value->z_expression));
fail_unless(value->odeIndex == 0);
fail_unless(util_isNaN(value->k_real_value));

SubstitutionValues_t* value1 = analyser->getExpression(1);
fail_unless(value1->k_value == "k");
fail_unless(value1->x_value == "x");
fail_unless(value1->y_value == "a");
fail_unless(value1->z_value == "newVar2");
fail_unless(value1->type == TYPE_K_MINUS_X_PLUS_W_MINUS_Y);
fail_unless(formulas_equal("w + (k - x) - a", value1->current));
fail_unless(formulas_equal("0", value1->dxdt_expression));
fail_unless(formulas_equal("k - x - y", value1->dydt_expression));
fail_unless(formulas_equal("w", value1->w_expression));
fail_unless(formulas_equal("newVar2 + w", value1->z_expression));
fail_unless(value1->odeIndex == 1);
fail_unless(util_isNaN(value1->k_real_value));
fail_unless(analyser->getNumHiddenSpecies() == 2);

delete analyser;
}
END_TEST

START_TEST(test_analyse_1_different_replace_5)
{
setupSpecies(d->getModel(), "q", "c");
RateRule* rr = d->getModel()->createRateRule();
rr->setVariable("a");
rr->setMath(SBML_parseFormula("k - x - y"));
RateRule* rr2 = d->getModel()->createRateRule();
rr2->setVariable("q");
rr2->setMath(SBML_parseFormula("k - x - a"));
RateRule* rr1 = d->getModel()->createRateRule();
rr1->setVariable("b");
rr1->setMath(SBML_parseFormula("k + v - x - y"));
converter->populateInitialODEinfo();
ExpressionAnalyser* analyser = new ExpressionAnalyser(m, converter->getOdePairs());

fail_unless(analyser->getNumExpressions() == 0);

analyser->detectHiddenSpecies();

fail_unless(analyser->getNumExpressions() == 3);
SubstitutionValues_t* value = analyser->getExpression(0);
fail_unless(value->k_value == "k");
fail_unless(value->x_value == "x");
fail_unless(value->y_value == "y");
fail_unless(value->z_value == "newVar1");
fail_unless(value->type == TYPE_K_MINUS_X_MINUS_Y);
fail_unless(formulas_equal("k - x - y", value->current));
fail_unless(value->v_expression == NULL);
fail_unless(formulas_equal("newVar1", value->z_expression));
fail_unless(value->odeIndex == 0);
fail_unless(util_isNaN(value->k_real_value));

SubstitutionValues_t* value2 = analyser->getExpression(1);
fail_unless(value2->k_value == "k");
fail_unless(value2->x_value == "x");
fail_unless(value2->y_value == "a");
fail_unless(value2->z_value == "newVar2");
fail_unless(value2->type == TYPE_K_MINUS_X_MINUS_Y);
fail_unless(formulas_equal("k - x - a", value2->current));
fail_unless(value2->v_expression == NULL);
fail_unless(formulas_equal("newVar2", value2->z_expression));
fail_unless(value2->odeIndex == 2);
fail_unless(util_isNaN(value2->k_real_value));


SubstitutionValues_t* value1 = analyser->getExpression(2);
fail_unless(value1->k_value == "k");
fail_unless(value1->x_value == "x");
fail_unless(value1->y_value == "y");
fail_unless(value1->z_value == "newVar1");
fail_unless(value1->type == TYPE_K_PLUS_V_MINUS_X_MINUS_Y);
fail_unless(formulas_equal("k + v - x - y", value1->current));
fail_unless(formulas_equal("v", value1->v_expression));
fail_unless(formulas_equal("newVar1 + v", value1->z_expression));
fail_unless(value1->odeIndex == 2);
fail_unless(util_isNaN(value1->k_real_value));
fail_unless(analyser->getNumHiddenSpecies() == 1);

delete analyser;
}
END_TEST


START_TEST(test_analyse_1_two_terms_replace)
{
Expand Down Expand Up @@ -1176,6 +1288,57 @@ START_TEST(test_analyse_1_two_terms_replace)
}
END_TEST

START_TEST(test_analyse_2_replace_1)
{
RateRule* rr = d->getModel()->createRateRule();
rr->setVariable("a");
rr->setMath(SBML_parseFormula("k - x + w - y"));
RateRule* rr1 = d->getModel()->createRateRule();
rr1->setVariable("b");
rr1->setMath(SBML_parseFormula("k - x + w - a"));
converter->populateInitialODEinfo();
ExpressionAnalyser* analyser = new ExpressionAnalyser(m, converter->getOdePairs());

fail_unless(analyser->getNumExpressions() == 0);

analyser->detectHiddenSpecies();

fail_unless(analyser->getNumExpressions() == 2);
SubstitutionValues_t* value = analyser->getExpression(0);
fail_unless(value->k_value == "k");
fail_unless(value->x_value == "x");
fail_unless(value->y_value == "y");
fail_unless(value->z_value == "newVar1");
fail_unless(value->type == TYPE_K_MINUS_X_PLUS_W_MINUS_Y);
fail_unless(formulas_equal("w + (k - x) - y", value->current));
fail_unless(formulas_equal("0", value->dxdt_expression));
fail_unless(formulas_equal("0", value->dydt_expression));
fail_unless(value->v_expression == NULL);
fail_unless(formulas_equal("w", value->w_expression));
fail_unless(formulas_equal("newVar1 + w", value->z_expression));
fail_unless(value->odeIndex == 0);
fail_unless(util_isNaN(value->k_real_value));

SubstitutionValues_t* value1 = analyser->getExpression(1);
fail_unless(value1->k_value == "k");
fail_unless(value1->x_value == "x");
fail_unless(value1->y_value == "a");
fail_unless(value1->z_value == "newVar2");
fail_unless(value1->type == TYPE_K_MINUS_X_PLUS_W_MINUS_Y);
fail_unless(formulas_equal("w + (k - x) - a", value1->current));
fail_unless(formulas_equal("0", value1->dxdt_expression));
fail_unless(formulas_equal("w + (k - x) - y", value1->dydt_expression));
fail_unless(formulas_equal("w", value1->w_expression));
fail_unless(formulas_equal("newVar2 + w", value1->z_expression));
fail_unless(value1->odeIndex == 1);
fail_unless(util_isNaN(value1->k_real_value));
fail_unless(analyser->getNumHiddenSpecies() == 2);

delete analyser;
}
END_TEST


START_TEST(test_analyse_3_replace_1)
{
RateRule* rr = d->getModel()->createRateRule();
Expand Down Expand Up @@ -1354,18 +1517,63 @@ START_TEST(test_analyse_4_replace_3)
END_TEST


START_TEST(test_analyse_4_replace_4)
{
RateRule* rr = d->getModel()->createRateRule();
rr->setVariable("a");
rr->setMath(SBML_parseFormula("k - x - y"));
RateRule* rrb = d->getModel()->createRateRule();
rrb->setVariable("b");
rrb->setMath(SBML_parseFormula("k + v - x"));
converter->populateInitialODEinfo();
ExpressionAnalyser* analyser = new ExpressionAnalyser(m, converter->getOdePairs());

fail_unless(analyser->getNumExpressions() == 0);

analyser->detectHiddenSpecies();

fail_unless(analyser->getNumExpressions() == 2);
SubstitutionValues_t* value = analyser->getExpression(0);
fail_unless(value->k_value == "k");
fail_unless(value->x_value == "x");
fail_unless(value->y_value == "y");
fail_unless(value->z_value == "newVar1");
fail_unless(value->type == TYPE_K_MINUS_X_MINUS_Y);
fail_unless(formulas_equal("k - x - y", value->current));
fail_unless(formulas_equal("newVar1", value->z_expression));
fail_unless(value->odeIndex == 0);
fail_unless(util_isNaN(value->k_real_value));

SubstitutionValues_t* value1 = analyser->getExpression(1);
fail_unless(value1->k_value == "k");
fail_unless(value1->x_value == "x");
fail_unless(value1->y_value.empty());
fail_unless(value1->z_value == "newVar2");
fail_unless(value1->type == TYPE_K_PLUS_V_MINUS_X);
fail_unless(formulas_equal("k + v - x", value1->current));
fail_unless(formulas_equal("newVar2 + v", value1->z_expression));
fail_unless(value1->odeIndex == 1);
fail_unless(util_isNaN(value1->k_real_value));

fail_unless(analyser->getNumHiddenSpecies() == 2);

delete analyser;
}
END_TEST


Suite *
create_suite_TestExpressionAnalyser (void)
{
bool testing = false;
bool testing = true;
Suite *suite = suite_create("ExpressionAnalyser");
TCase *tcase = tcase_create("ExpressionAnalyser");
tcase_add_checked_fixture(tcase, ExpressionAnalyser_setup,
ExpressionAnalyser_teardown);

if (testing)
{
tcase_add_test(tcase, test_analyse_4_replace_2); //k+v-y & k-x
tcase_add_test(tcase, test_analyse_1_different_replace_5); //k-x-y & k-x-a & k+v-x-y
}
else
{
Expand Down Expand Up @@ -1395,11 +1603,15 @@ create_suite_TestExpressionAnalyser (void)
tcase_add_test(tcase, test_analyse_1_different_replace_1); //k-x-y & k+v-x-y
tcase_add_test(tcase, test_analyse_1_different_replace_2); //k-x-y & k+v-x-a
tcase_add_test(tcase, test_analyse_1_different_replace_3); //k-x-y & k-x+w-y
tcase_add_test(tcase, test_analyse_1_different_replace_4); //k-x-y & k-x+w-a
tcase_add_test(tcase, test_analyse_1_different_replace_5); //k-x-y & k-x-a & k+v-x-y
tcase_add_test(tcase, test_analyse_1_two_terms_replace); //(k+v-x-y)+(k-x)
tcase_add_test(tcase, test_analyse_2_replace_1); //k-x+w-y & k-x+w-a
tcase_add_test(tcase, test_analyse_3_replace_1); //k-x & k-y
tcase_add_test(tcase, test_analyse_4_replace_1); //k+v-x & k-x
tcase_add_test(tcase, test_analyse_4_replace_2); //k+v-y & k-x
tcase_add_test(tcase, test_analyse_4_replace_3); //k+v-x & k+v-y
tcase_add_test(tcase, test_analyse_4_replace_4); //k-x-y & k+v-x
}
suite_add_tcase(suite, tcase);

Expand Down

0 comments on commit fa17697

Please sign in to comment.