package com.plectix.simulator.simulationclasses.perturbations; import java.util.List; import com.plectix.simulator.interfaces.ConnectedComponentInterface; import com.plectix.simulator.simulationclasses.injections.Injection; import com.plectix.simulator.simulator.SimulationData; import com.plectix.simulator.staticanalysis.Rule; import com.plectix.simulator.staticanalysis.stories.storage.EventBuilder; import com.plectix.simulator.staticanalysis.stories.storage.NullEvent; import com.plectix.simulator.staticanalysis.stories.storage.StoryStorageException; /** * This class implements rule of perturbation. * @author avokhmin * */ public final class PerturbationRule extends Rule { private int count; // TODO cannot we just use MAX_VALUE here? private boolean inf = false; private static NullEvent nullEvent = new NullEvent(); /** * The CRulePerturbation constructor. * * @param ruleRate rate of the rule * @param ruleID unique rule identificator * @param isStorify <tt>true</tt> if simulator run in storify mode, <tt>false</tt> otherwise */ public PerturbationRule(List<ConnectedComponentInterface> left, List<ConnectedComponentInterface> right, String name, double ruleRate, int ruleID, boolean isStorify) { super(left, right, name, ruleRate, ruleID, isStorify); } /** * This method sets count of apply this rule. * @param count given count */ public final void setCount(double count) { if (count == Double.POSITIVE_INFINITY) { inf = true; this.count = -1; } else this.count = (int) count; } public final void applyRuleForStories(List<Injection> injectionList, EventBuilder eventContainer, SimulationData simulationData, boolean isLast) throws StoryStorageException { check(); apply(injectionList, eventContainer, simulationData, false); count--; } @Override public final void applyRule(List<Injection> injections, SimulationData simulationData) throws StoryStorageException { check(); apply(injections, nullEvent, simulationData, false); count--; } /** * Util method. Check a need to apply this and {@link #downRule()} if it need. */ private final void check() { if (!inf) { if (count <= 1) downRule(); } else { if (getLeftHandSide().get(0).getInjectionsWeight() == 1) downRule(); } } /** * Util method. Switch off current rule. */ private final void downRule() { setRuleRate(0.0); setInfinityRateFlag(false); setActivity(0.0); } }