ASCEND includes a number of features for checking that a model is correctly written. Currently the following checks are performed.
Firstly, the model's instance tree is checked for integrity. Instances are checked for being of the correct type, un-executed statements are searched for, correct parent-child relationships are verified and Cliques are checked for containing items of identical type. The function RecursiveCheckInstance in ascend/compiler/check.c does the hard work for this one.
Degrees of freedom check
The degrees of freedom check tests to see if a model is underspecified (too many unknown variables, not enough equations) or overspecified (too many equations, not enough free variables), or structurally singular. The code in the file ascend/solver/slvDOF.c, together with the functions mtx_output_assign and mtx_symbolic_rank from ascend/linear/mtx_perms.c do this work.
A structurally singular system is one which has the variables and equations arranged in such a way that it is impossible to develop a strategy for solving them.