diff --git a/xbanalysis/problems/gba_problem.py b/xbanalysis/problems/gba_problem.py
index 0e5dba8508b7c232a21394628971250621b85e7b..966126cd2c6d3699a58a21506d607f3ed6baa6ef 100644
--- a/xbanalysis/problems/gba_problem.py
+++ b/xbanalysis/problems/gba_problem.py
@@ -78,6 +78,8 @@ class GbaProblem:
 
         # calculate stoichiometric sub-matrices and scale them according to volume
         # TODO: sparce matrix storage and calculations
+        specis_x_mrs = self.get_stoic_matrix(self.var_sids, self.mr_rids)
+        self.dof = specis_x_mrs.shape[1] - np.linalg.matrix_rank(specis_x_mrs)
         metab_x_mrs = self.get_stoic_matrix(self.var_metab_sids, self.mr_rids)
         self.metab_x_psrs = self.get_stoic_matrix(self.var_metab_sids, self.ps_rids)
         self.enz_x_mrs = self.get_stoic_matrix(self.var_enz_sids, self.mr_rids)
diff --git a/xbanalysis/solvers/gba_ipopt_problem.py b/xbanalysis/solvers/gba_ipopt_problem.py
index 7f3322bd1b1c09b2651574c386897a0b8f24b8ff..958431cf4372b8e81d7dd7824d39bfe7ea5e911b 100644
--- a/xbanalysis/solvers/gba_ipopt_problem.py
+++ b/xbanalysis/solvers/gba_ipopt_problem.py
@@ -81,4 +81,5 @@ class GbaIpoptProblem:
         self.nit = iter_count
         if self.report_freq > 0:
             if iter_count % self.report_freq == 0:
-                print(f'[{iter_count:5d}] growth rate: {-3600 *obj_value:.5f}')
+                print(f'[{iter_count:5d}] growth rate: {-3600 *obj_value:.5f}, '
+                      f"density constr: {self.gba_problem.last_values['heq_density'][1]}")