Search in sources :

Example 1 with BranchElement

use of org.iobserve.analysis.behavior.karlsruhe.data.BranchElement in project iobserve-analysis by research-iobserve.

the class LoopBranchModelCreator method detectLoopsWithinBranchSequence.

/**
 * Detects loops within a branch sequence 1. Finds all iterated segments within the given
 * sequence 2. For each obtained segment the loop count is determined 3. The loops are examined
 * if they overlap If there is an overlap between two loops, the loop that replaces less
 * sequence elements is filtered out 4. The loop elements are inserted into the sequence
 * Iterates until no new loops are found
 *
 * @param branchSequence
 *            that is examined for iterated behavior
 */
private void detectLoopsWithinBranchSequence(final List<ISequenceElement> branchSequence) {
    if (branchSequence.size() > 1) {
        final List<LoopElement> loopElements = new ArrayList<>();
        loopElements.clear();
        // The exit element of a sequence is not considered for the loop detection
        int branchSequenceSizeWithoutExitElement = branchSequence.size();
        if (branchSequence.get(branchSequence.size() - 1).getClass().equals(ExitElement.class)) {
            branchSequenceSizeWithoutExitElement = branchSequenceSizeWithoutExitElement - 1;
        }
        if (branchSequence != null && branchSequenceSizeWithoutExitElement > 0) {
            for (int indexOfElementInElementList = 0; indexOfElementInElementList < branchSequenceSizeWithoutExitElement; indexOfElementInElementList++) {
                // sequences of the branches
                if (branchSequence.get(indexOfElementInElementList).getClass().equals(BranchElement.class)) {
                    final BranchElement loopi = (BranchElement) branchSequence.get(indexOfElementInElementList);
                    for (int i = 0; i < loopi.getBranchTransitions().size(); i++) {
                        this.detectLoopsWithinBranchSequence(loopi.getBranchTransitions().get(i).getBranchSequence());
                    }
                }
                // If a loop is detected it is memorized
                for (int i = 0; i < (branchSequenceSizeWithoutExitElement - indexOfElementInElementList) / 2; i++) {
                    final int elementsToCheck = (branchSequenceSizeWithoutExitElement - indexOfElementInElementList) / 2 - i;
                    boolean isALoop = true;
                    final LoopElement loopElement = new LoopElement();
                    for (int k = 0; k < elementsToCheck; k++) {
                        final ISequenceElement element1 = branchSequence.get(indexOfElementInElementList + k);
                        final ISequenceElement element2 = branchSequence.get(indexOfElementInElementList + elementsToCheck + k);
                        if (element1.getClass().equals(CallElement.class) && element2.getClass().equals(CallElement.class)) {
                            if (!this.areSequenceElementsEqual(element1, element2)) {
                                isALoop = false;
                                break;
                            }
                        } else if (element1.getClass().equals(BranchElement.class) && element2.getClass().equals(BranchElement.class)) {
                            if (!this.areSequenceElementsEqual(element1, element2)) {
                                isALoop = false;
                                break;
                            }
                        } else {
                            isALoop = false;
                            break;
                        }
                        loopElement.addElementToLoopSequence(branchSequence.get(indexOfElementInElementList + k));
                    }
                    if (isALoop) {
                        loopElement.setStartIndexInBranchSequence(indexOfElementInElementList);
                        loopElement.setEndIndexInBranchSequence(indexOfElementInElementList + elementsToCheck + elementsToCheck - 1);
                        // Determines the number of loops for each loop
                        this.determineLoopCount(loopElement, branchSequence);
                        loopElements.add(loopElement);
                    }
                }
            }
            if (!loopElements.isEmpty()) {
                // Filters the loops from overlapping loops
                this.filterLoops(loopElements);
                // Find Loops within the loops
                for (final LoopElement loopElement : loopElements) {
                    this.detectLoopsWithinBranchSequence(loopElement.getLoopSequence());
                }
                // Inserts the loops into the branch
                this.insertLoopsIntoBranch(loopElements, branchSequence);
            }
        }
    }
}
Also used : LoopElement(org.iobserve.analysis.behavior.karlsruhe.data.LoopElement) CallElement(org.iobserve.analysis.behavior.karlsruhe.data.CallElement) ISequenceElement(org.iobserve.analysis.behavior.karlsruhe.data.ISequenceElement) ArrayList(java.util.ArrayList) BranchElement(org.iobserve.analysis.behavior.karlsruhe.data.BranchElement)

Example 2 with BranchElement

use of org.iobserve.analysis.behavior.karlsruhe.data.BranchElement in project iobserve-analysis by research-iobserve.

the class PcmUsageModelBuilder method transformSequenceToScenarioBehavior.

/**
 * Creates a scenario behavior corresponding to the passed sequence. The sequence can be a
 * branch sequence or a loop sequence. It creates a sequence of entry level system calls
 * including loops within the sequence. It sets the successors and predecessors.
 *
 * @param indexOfScenario
 *            states the index of the created scenario within the usage scenario
 * @param sequence
 *            that is transformed to a scenario behavior
 * @param branch
 *            contains the child branches of the branch whose behavior is created
 * @return the created scenario behavior
 */
private // NOCS
ScenarioBehaviour transformSequenceToScenarioBehavior(// NOCS
final int indexOfScenario, final List<ISequenceElement> sequence, final Branch branch) {
    final ScenarioBehaviour scenarioBehaviour = UsageModelFactory.createScenarioBehaviour();
    final Start start = UsageModelFactory.createAddStartAction("", scenarioBehaviour);
    final Stop stop = UsageModelFactory.createAddStopAction("", scenarioBehaviour);
    EntryLevelSystemCall lastESysCall = UsageModelFactory.createEmptyEntryLevelSystemCall();
    boolean isLastElementACall = false;
    Loop lastLoop = UsageModelFactory.createEmptyLoop();
    boolean isLastElementALoop = false;
    org.palladiosimulator.pcm.usagemodel.Branch lastLoopBranch = UsagemodelFactory.eINSTANCE.createBranch();
    boolean isLastElementALoopBranch = false;
    org.palladiosimulator.pcm.usagemodel.Branch lastBranch = UsagemodelFactory.eINSTANCE.createBranch();
    boolean isLastElementABranch = false;
    /**
     * Loops over all elements of the sequence and creates a corresponding scenario behavior by
     * connecting the elements via successor and predecessor connections.
     */
    for (final ISequenceElement branchElement : sequence) {
        // Element is a entryLevelSystemCall
        if (branchElement.getClass().equals(CallElement.class)) {
            EntryLevelSystemCall eSysCall = null;
            // Workaround TODO
            final String operationSignature = branchElement.getOperationSignature().replaceAll("\\(.*\\)", "()");
            final String[] operationSplit = operationSignature.split(" ");
            final OperationSignature modelOperationSignature = CorrespondenceUtility.findModelElementForOperation(this.correspondenceModel, Repository.class, branchElement.getClassSignature(), operationSplit[operationSplit.length - 1]);
            if (modelOperationSignature != null) {
                PcmUsageModelBuilder.LOGGER.debug("Usage: Found Correspondent: {}", modelOperationSignature.getEntityName());
                eSysCall = UsageModelFactory.createEntryLevelSystemCall(this.repositoryLookupModel, modelOperationSignature);
            }
            if (eSysCall != null) {
                if (isLastElementACall) {
                    UsageModelFactory.connect(lastESysCall, eSysCall);
                } else if (isLastElementALoop) {
                    UsageModelFactory.connect(lastLoop, eSysCall);
                } else if (isLastElementALoopBranch) {
                    UsageModelFactory.connect(lastLoopBranch, eSysCall);
                } else if (isLastElementABranch) {
                    UsageModelFactory.connect(lastBranch, eSysCall);
                } else {
                    UsageModelFactory.connect(start, eSysCall);
                }
                UsageModelFactory.addUserAction(scenarioBehaviour, eSysCall);
                lastESysCall = eSysCall;
                isLastElementACall = true;
                isLastElementALoop = false;
                isLastElementALoopBranch = false;
                isLastElementABranch = false;
            }
        } else if (branchElement.getClass().equals(LoopElement.class)) {
            // Element is a loop
            final Loop loop = this.createLoop(scenarioBehaviour, (LoopElement) branchElement);
            if (isLastElementACall) {
                UsageModelFactory.connect(lastESysCall, loop);
            } else if (isLastElementALoop) {
                UsageModelFactory.connect(lastLoop, loop);
            } else if (isLastElementALoopBranch) {
                UsageModelFactory.connect(lastLoopBranch, loop);
            } else if (isLastElementABranch) {
                UsageModelFactory.connect(lastBranch, loop);
            } else {
                UsageModelFactory.connect(start, loop);
            }
            lastLoop = loop;
            isLastElementALoop = true;
            isLastElementACall = false;
            isLastElementALoopBranch = false;
            isLastElementABranch = false;
        } else if (branchElement.getClass().equals(LoopBranchElement.class)) {
            // Element is a
            // looped Branch
            final org.palladiosimulator.pcm.usagemodel.Branch loopBranch = this.createLoopBranch(scenarioBehaviour, (LoopBranchElement) branchElement);
            if (isLastElementACall) {
                UsageModelFactory.connect(lastESysCall, loopBranch);
            } else if (isLastElementALoop) {
                UsageModelFactory.connect(lastLoop, loopBranch);
            } else if (isLastElementALoopBranch) {
                UsageModelFactory.connect(lastLoopBranch, loopBranch);
            } else if (isLastElementABranch) {
                UsageModelFactory.connect(lastBranch, loopBranch);
            } else {
                UsageModelFactory.connect(start, loopBranch);
            }
            lastLoopBranch = loopBranch;
            isLastElementALoopBranch = true;
            isLastElementACall = false;
            isLastElementALoop = false;
            isLastElementABranch = false;
        } else if (branchElement.getClass().equals(BranchElement.class)) {
            // Element is a
            // Branch
            final org.palladiosimulator.pcm.usagemodel.Branch branchInter = this.createBranch(scenarioBehaviour, (BranchElement) branchElement);
            if (isLastElementACall) {
                UsageModelFactory.connect(lastESysCall, branchInter);
            } else if (isLastElementALoop) {
                UsageModelFactory.connect(lastLoop, branchInter);
            } else if (isLastElementALoopBranch) {
                UsageModelFactory.connect(lastLoopBranch, branchInter);
            } else if (isLastElementABranch) {
                UsageModelFactory.connect(lastBranch, branchInter);
            } else {
                UsageModelFactory.connect(start, branchInter);
            }
            lastBranch = branchInter;
            isLastElementABranch = true;
            isLastElementALoopBranch = false;
            isLastElementACall = false;
            isLastElementALoop = false;
        } else {
            break;
        }
    }
    // checks if the branch got child branches
    if (branch == null) {
        if (isLastElementACall) {
            UsageModelFactory.connect(lastESysCall, stop);
        } else if (isLastElementALoop) {
            UsageModelFactory.connect(lastLoop, stop);
        } else if (isLastElementALoopBranch) {
            UsageModelFactory.connect(lastLoopBranch, stop);
        } else if (isLastElementABranch) {
            UsageModelFactory.connect(lastBranch, stop);
        } else {
            UsageModelFactory.connect(start, stop);
        }
    } else {
        final org.palladiosimulator.pcm.usagemodel.Branch branchUM = this.createChildBranch(scenarioBehaviour, indexOfScenario, branch);
        if (branchUM != null) {
            if (isLastElementACall) {
                UsageModelFactory.connect(lastESysCall, branchUM);
                UsageModelFactory.connect(branchUM, stop);
            } else if (isLastElementALoop) {
                UsageModelFactory.connect(lastLoop, branchUM);
                UsageModelFactory.connect(branchUM, stop);
            } else if (isLastElementALoopBranch) {
                UsageModelFactory.connect(lastLoopBranch, branchUM);
                UsageModelFactory.connect(branchUM, stop);
            } else if (isLastElementABranch) {
                UsageModelFactory.connect(lastBranch, branchUM);
                UsageModelFactory.connect(branchUM, stop);
            } else {
                UsageModelFactory.connect(start, branchUM);
                UsageModelFactory.connect(branchUM, stop);
            }
        } else {
            if (isLastElementACall) {
                UsageModelFactory.connect(lastESysCall, stop);
            } else if (isLastElementALoop) {
                UsageModelFactory.connect(lastLoop, stop);
            } else if (isLastElementALoopBranch) {
                UsageModelFactory.connect(lastLoopBranch, stop);
            } else if (isLastElementABranch) {
                UsageModelFactory.connect(lastBranch, stop);
            } else {
                UsageModelFactory.connect(start, stop);
            }
        }
    }
    return scenarioBehaviour;
}
Also used : Loop(org.palladiosimulator.pcm.usagemodel.Loop) EntryLevelSystemCall(org.palladiosimulator.pcm.usagemodel.EntryLevelSystemCall) Start(org.palladiosimulator.pcm.usagemodel.Start) Stop(org.palladiosimulator.pcm.usagemodel.Stop) ISequenceElement(org.iobserve.analysis.behavior.karlsruhe.data.ISequenceElement) LoopElement(org.iobserve.analysis.behavior.karlsruhe.data.LoopElement) ScenarioBehaviour(org.palladiosimulator.pcm.usagemodel.ScenarioBehaviour) OperationSignature(org.palladiosimulator.pcm.repository.OperationSignature) Branch(org.iobserve.analysis.behavior.karlsruhe.data.Branch) LoopBranchElement(org.iobserve.analysis.behavior.karlsruhe.data.LoopBranchElement) BranchElement(org.iobserve.analysis.behavior.karlsruhe.data.BranchElement)

Example 3 with BranchElement

use of org.iobserve.analysis.behavior.karlsruhe.data.BranchElement in project iobserve-analysis by research-iobserve.

the class BranchModelCreator method mergeBranches.

/**
 * Merges branches.
 *
 * @param branch
 *            whose child branches are merged
 * @param doChildBranchesExist
 * @return
 */
private boolean mergeBranches(final Branch branch, final boolean doChildBranchesExist) {
    int indexOfEqualElements = 0;
    boolean isElementEqual = false;
    // their sequences
    for (int i = branch.getChildBranches().get(0).getBranchSequence().size() - 1; i >= 0; i--) {
        final ISequenceElement branchElement = branch.getChildBranches().get(0).getBranchSequence().get(i);
        isElementEqual = false;
        for (final Branch childBranch : branch.getChildBranches()) {
            if (childBranch.getBranchSequence().size() - 1 - indexOfEqualElements < 0) {
                isElementEqual = false;
                break;
            } else if (this.doBranchElementsMatch(branchElement, childBranch.getBranchSequence().get(childBranch.getBranchSequence().size() - 1 - indexOfEqualElements))) {
                isElementEqual = true;
            } else {
                isElementEqual = false;
                break;
            }
        }
        if (!isElementEqual) {
            break;
        }
        indexOfEqualElements++;
    }
    // Creates a new branch element that replaces the child branches that are merged
    final BranchElement branchElement = new BranchElement();
    final List<ISequenceElement> sequenceToAddToBranch = new ArrayList<>();
    for (int i = 0; i < indexOfEqualElements; i++) {
        sequenceToAddToBranch.add(0, branch.getChildBranches().get(0).getBranchSequence().get(branch.getChildBranches().get(0).getBranchSequence().size() - 1));
        for (final Branch childBranch : branch.getChildBranches()) {
            childBranch.getBranchSequence().remove(childBranch.getBranchSequence().size() - 1);
        }
    }
    for (final Branch childBranch : branch.getChildBranches()) {
        final BranchTransitionElement branchTransition = new BranchTransitionElement();
        branchTransition.setBranchSequence(childBranch.getBranchSequence());
        branchTransition.setTransitionLikelihood(childBranch.getBranchLikelihood());
        branchElement.addBranchTransition(branchTransition);
    }
    branch.getBranchSequence().add(branchElement);
    branch.getBranchSequence().addAll(sequenceToAddToBranch);
    // Removes the replaced child branches
    if (doChildBranchesExist) {
        final List<Branch> newChildBranches = branch.getChildBranches().get(0).getChildBranches();
        branch.getChildBranches().clear();
        branch.setChildBranches(newChildBranches);
    } else {
        branch.getChildBranches().clear();
    }
    if (doChildBranchesExist || indexOfEqualElements > 0) {
        this.fusionPerformed = true;
        return true;
    } else {
        return false;
    }
}
Also used : BranchTransitionElement(org.iobserve.analysis.behavior.karlsruhe.data.BranchTransitionElement) Branch(org.iobserve.analysis.behavior.karlsruhe.data.Branch) ISequenceElement(org.iobserve.analysis.behavior.karlsruhe.data.ISequenceElement) ArrayList(java.util.ArrayList) BranchElement(org.iobserve.analysis.behavior.karlsruhe.data.BranchElement)

Aggregations

BranchElement (org.iobserve.analysis.behavior.karlsruhe.data.BranchElement)3 ISequenceElement (org.iobserve.analysis.behavior.karlsruhe.data.ISequenceElement)3 ArrayList (java.util.ArrayList)2 Branch (org.iobserve.analysis.behavior.karlsruhe.data.Branch)2 LoopElement (org.iobserve.analysis.behavior.karlsruhe.data.LoopElement)2 BranchTransitionElement (org.iobserve.analysis.behavior.karlsruhe.data.BranchTransitionElement)1 CallElement (org.iobserve.analysis.behavior.karlsruhe.data.CallElement)1 LoopBranchElement (org.iobserve.analysis.behavior.karlsruhe.data.LoopBranchElement)1 OperationSignature (org.palladiosimulator.pcm.repository.OperationSignature)1 EntryLevelSystemCall (org.palladiosimulator.pcm.usagemodel.EntryLevelSystemCall)1 Loop (org.palladiosimulator.pcm.usagemodel.Loop)1 ScenarioBehaviour (org.palladiosimulator.pcm.usagemodel.ScenarioBehaviour)1 Start (org.palladiosimulator.pcm.usagemodel.Start)1 Stop (org.palladiosimulator.pcm.usagemodel.Stop)1