ChemBalancer was partially adapted from Arun et al.'s balancing algorithm, which was originally proposed as a step to identify chemical impurities produced in reactions. The workflow of ChemBalancer is shown in Figure , and summarised below. A reaction is defined as complete if atoms of each element and electron charges are balanced between LHS and RHS of a reaction equation. Hence, for a given reaction record, the first step for ChemBalancer is to determine the atom and the electron balances. By default, ChemBalancer ignores the counts of hydrogen atoms, since from perspective of solving linear algebra of reaction balancing, a valid reaction with mass conservation and all other atoms and electron charges balanced between LHS and RHS cannot give a degree of freedom for hydrogen imbalance. Hydrogen atoms should have been already balanced between LHS and RHS. If a reaction imbalance includes atom and electron counts, but the types (chemical elements) are identical, this reaction can be balanced with stoichiometry. A linear solver in ChemPy API was used to determine stoichiometric coefficients. In some rare cases, large values of stoichiometric coefficients are added to reaction participants. Since the chance of having large numbers of molecules react together to trigger a reaction is low, an arbitrary value of six was set as an upper limit for stoichiometric coefficients. Here we must differentiate the small molecules synthesis from polymerisation reactions which could be represented by chemical equations with very large stoichiometric coefficients.