Skip to content

Commit

Permalink
Add support to Delayed Result.
Browse files Browse the repository at this point in the history
  • Loading branch information
quancs committed Sep 7, 2018
1 parent ca4a1e7 commit cf376e8
Show file tree
Hide file tree
Showing 15 changed files with 1,121 additions and 854 deletions.
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
Table of Contents
=================

* [UPSimulator](#upsimulator)
* [UPLanguage](#uplanguage)
* [Usage](#usage)
Expand Down Expand Up @@ -33,6 +32,7 @@ Table of Contents
* [Membrane Create Result](#membrane-create-result)
* [Membrane Dissolve Result](#membrane-dissolve-result)
* [Membrane Division Result](#membrane-division-result)
* [Delayed Result](#delayed-result)
* [Mathematical Operators](#mathematical-operators)
* [Other Projects used in UPSimulator](#other-projects-used-in-upsimulator)
* [ANTLR](#antlr)
Expand Down Expand Up @@ -370,6 +370,12 @@ Rule r= a -> divide({ <property=1> b },{ <property=2> c^3 });
```
In the code above, **divide** is Membrane Division Result. Membrane Division Result will divide current membrane into two parts. Inside the division result, **Property Result**s and **Object Result**s can be added.

#### Delayed Result
```
Rule r= a -> delay(b,2);
```
In the code above, **delay(b,2)** is a delayed result. Delayed result will be delayed to be set. Object Result, Membrane Create Result, Dissolve Result and Division Result can be delayed.

## Mathematical Operators
The mathematical expression's parsing and evaluation is done by [aviator](https://github.com/killme2008/aviator). Please check the supported operators at its website https://github.com/killme2008/aviator/.

Expand Down
4 changes: 2 additions & 2 deletions resources/grammar/UPLanguage.g4
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ prule : 'Rule' ruleName ('[' abcDim ']')* '=' (regCondition '/')? propertyCond

ruleName : Name | Letters;
condition : promoterCondition | inhibitorCondition | boolCondition | probabilisticCondition;
result : objResult | positionResult | memDissolveResult | memCreateResult | memDivisionResult;
result : objResult | positionResult | memDissolveResult | memCreateResult | memDivisionResult | delayedResult;
delayedResult : 'delay' '('(objResult | positionResult | memDissolveResult | memCreateResult | memDivisionResult) ',' Integer ')';
memDivisionResult: 'divide' '(' '{' additionalResults '}' ',' '{' additionalResults '}' ')';
additionalResults: propertyResult* objResult*;

memCreateResult : membraneType ':' membraneName ('[' formulaDim ']')* ('{' additionalResults '}')? ;
memDissolveResult: 'dissolve' ( '(' 'all' ')' )?;
propertyResult : '<' (propertyName '=')? propertyValue '>';//Default propertyName=Status
Expand Down
15 changes: 12 additions & 3 deletions src/upsimulator/core/PController.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import upsimulator.recognizer.UPLanguageLexer;
import upsimulator.recognizer.UPLanguageParser;
import upsimulator.recognizer.UPLanguageRecognizer;
import upsimulator.rules.results.DelayedResult;

/**
* PController is a controller of simulation.<br>
Expand Down Expand Up @@ -141,8 +142,16 @@ public void run() {
leftStep--;
}

for (; leftStep == -1 && (runOneStep() > 0 || satisfiedRulesCount > 0);)
;
for (int maxDelay = DelayedResult.getMaxDelay() + 1; leftStep == -1 && (satisfiedRulesCount > 0 || maxDelay > 0);) {
int ruleUsed = runOneStep();
if (ruleUsed == 0) {
if (maxDelay == 0)
break;
else
maxDelay--;
} else
maxDelay = DelayedResult.getMaxDelay() + 1;
}

leftStep = 0;
try {
Expand Down Expand Up @@ -235,7 +244,7 @@ private int runOneStep() {
long endTime = System.nanoTime();
long timeUsed = endTime - startTime;
UPSLogger.result(this, "step:" + step + "\t\trules used : " + totalUsed + "\t\ttime used:" + ((double) timeUsed / 1000000) + "ms");
UPSLogger.debug(this, "\n" + "step:" + step);
UPSLogger.debug(this, "\n" + "step:" + (step - 1) + "->" + step);
UPSLogger.debug(this, uMap);
UPSLogger.result(this, environment.toString() + "\n");

Expand Down
3 changes: 3 additions & 0 deletions src/upsimulator/core/PRule.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import upsimulator.rules.conditions.ObjectConditionsWithTarget;
import upsimulator.rules.conditions.PriorityCondition;
import upsimulator.rules.conditions.RegularExpressionCondition;
import upsimulator.rules.results.DelayedResult;
import upsimulator.rules.results.MembranePropertyResult;
import upsimulator.rules.results.MembraneStatusResult;
import upsimulator.speedup.PossibleValueCombiner;
Expand Down Expand Up @@ -328,6 +329,8 @@ public void addResult(Result result) {
results.add(result);
if (result instanceof Condition)
addCondition((Condition) result);
if (result instanceof DelayedResult && ((DelayedResult) result).getResult() instanceof Condition)
conditions.add((Condition) ((DelayedResult) result).getResult());
}

private class DimensionInfo {
Expand Down
22 changes: 21 additions & 1 deletion src/upsimulator/core/PTunnel.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import upsimulator.interfaces.Result;
import upsimulator.interfaces.Tunnel;
import upsimulator.interfaces.UPSLogger;
import upsimulator.rules.results.DelayedResult;

/**
* PTunnel is a connection between membranes, used to transfer results.
Expand All @@ -27,16 +28,22 @@ public class PTunnel implements Tunnel {
private boolean isOpen;
private TunnelType type;
private HashMap<Result, Integer> heldResults;
private ArrayList<DelayedResult> delayedResults;
private ArrayList<Integer> delayedResultTimes;

public PTunnel(TunnelType type) {
heldResults = new HashMap<>();
delayedResults = new ArrayList<>();
delayedResultTimes = new ArrayList<>();
targets = new ArrayList<Membrane>();
this.type = type;
open();
}

public PTunnel() {
heldResults = new HashMap<>();
delayedResults = new ArrayList<>();
delayedResultTimes = new ArrayList<>();
targets = new ArrayList<Membrane>();
this.type = TunnelType.Here;
open();
Expand Down Expand Up @@ -88,7 +95,10 @@ public int compare(Membrane o1, Membrane o2) {

@Override
public void holdResult(Result result, int times) {
if (heldResults.containsKey(result)) {
if (result instanceof DelayedResult && ((DelayedResult) result).getDelay() > 0) {
delayedResults.add((DelayedResult) result);
delayedResultTimes.add(times);
} else if (heldResults.containsKey(result)) {
heldResults.put(result, heldResults.get(result) + times);
} else
heldResults.put(result, times);
Expand Down Expand Up @@ -162,6 +172,16 @@ public void pushResult() {
}

heldResults.clear();
for (int i = delayedResults.size() - 1; i >= 0; i--) {
DelayedResult result = delayedResults.get(i);
if (result.getDelay() == 0) {
holdResult(result, delayedResultTimes.get(i));
delayedResults.remove(i);
delayedResultTimes.remove(i);
} else {
result.reduceDelay();
}
}

// Check if need to close this Tunnel
if (source.isDeleted())
Expand Down
7 changes: 5 additions & 2 deletions src/upsimulator/recognizer/UPLanguage.interp

Large diffs are not rendered by default.

66 changes: 34 additions & 32 deletions src/upsimulator/recognizer/UPLanguage.tokens
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,13 @@ T__46=47
T__47=48
T__48=49
T__49=50
Integer=51
Double=52
Letters=53
Name=54
COMMENT=55
WS=56
T__50=51
Integer=52
Double=53
Letters=54
Name=55
COMMENT=56
WS=57
'Environment'=1
'{'=2
'}'=3
Expand All @@ -76,31 +77,32 @@ WS=56
'->'=20
'|'=21
'&'=22
'divide'=23
'delay'=23
'('=24
')'=25
':'=26
'dissolve'=27
'all'=28
'<'=29
'>'=30
'in'=31
'out'=32
'here'=33
'go'=34
'random'=35
'%'=36
'*'=37
'&&'=38
'||'=39
'>='=40
'=='=41
'!='=42
'<='=43
'≠'=44
'@'=45
'!'=46
'in.'=47
'go.'=48
'probability'=49
'?'=50
'divide'=26
':'=27
'dissolve'=28
'all'=29
'<'=30
'>'=31
'in'=32
'out'=33
'here'=34
'go'=35
'random'=36
'%'=37
'*'=38
'&&'=39
'||'=40
'>='=41
'=='=42
'!='=43
'<='=44
'≠'=45
'@'=46
'!'=47
'in.'=48
'go.'=49
'probability'=50
'?'=51
7 changes: 7 additions & 0 deletions src/upsimulator/recognizer/UPLanguageBaseVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,13 @@ public class UPLanguageBaseVisitor<T> extends AbstractParseTreeVisitor<T> implem
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitResult(UPLanguageParser.ResultContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDelayedResult(UPLanguageParser.DelayedResultContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
Expand Down
7 changes: 5 additions & 2 deletions src/upsimulator/recognizer/UPLanguageLexer.interp

Large diffs are not rendered by default.

Loading

0 comments on commit cf376e8

Please sign in to comment.