@Override
		public double[] derivn(double time, double[] currentMarking) {
			
			updateExpressionValuesTable(currentMarking);
			
			double[] derivativePlaceOverDerivativeTime = new double[input.getSpecies().size()];
			List<Specie> species = input.getSpecies();

			for (int i = 0; i < species.size(); i++) {
				Specie specie = species.get(i);

				List<Integer> expressionsForSpecie = specieExpressionsTable.get(specie);
				
				/**
				 * Convention:
				 * 
				 * expressionIndex > 0, if the value must be added
				 * expressionIndex < 0, if the value must be subtracted
				 */
				for (Integer expressionIndex : expressionsForSpecie) {
					ExpressionValue expressionValue = expressionValuesTable.get(Math.abs(expressionIndex));
					
					if (expressionIndex > 0) {
						derivativePlaceOverDerivativeTime[i] += expressionValue.getValue();
					} else {
						derivativePlaceOverDerivativeTime[i] -= expressionValue.getValue();
					}
				}
			}

			return derivativePlaceOverDerivativeTime;

		}