docs: def validate(self):
          """
          Validates whether the particular model is created properly
          """
          if self.stoichiometry_matrix.cols != self.propensities.rows:
              raise ValueError('There must be a column in stoichiometry matrix '
                               'for each row in propensities matrix. '
                               'S ({0.rows}x{0.cols}): {0!r} , '
                               'propensities ({1.rows}x{1.cols}): {1!r}'.format(self.stoichiometry_matrix,
                                                                                self.propensities))
  
          if self.stoichiometry_matrix.rows != len(self.species):
              raise ValueError('There must be a row in stoichiometry matrix for each variable. '
                               'S ({0.rows}x{0.cols}): {0!r}, variables: {1!r}'.format(self.stoichiometry_matrix,
                                                                                       self.species))
  
          seen_free_symbols = set()
          parameters = set(self.parameters)
          species = set(self.species)
  
          # Check if there are any parameters in both lists
          intersection = parameters & species
          if intersection:
              raise ValueError("Some symbols are in both parameters and species lists")
  
          both = parameters | species
          for row in self.propensities:
              free_symbols = row.free_symbols
              # Do not check the seen symbols twice
              free_symbols = free_symbols - seen_free_symbols
              for symbol in free_symbols:
                  if symbol not in both:
                      raise ValueError('Propensity {0!r} '
                                       'contains a free symbol {1!r} '
                                       'that is not in listed in parameters or species lists '
                                       'Parameters: {2!r}; '
                                       'Species: {3!r}'.format(row, symbol,
                                                               self.parameters,
                                                               self.species))
  
              seen_free_symbols.update(free_symbols)