All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ca.appsimulations.jlqninterface.lqn.model.LqnModel Maven / Gradle / Ivy

Go to download

Java API to solve, analyze and manipulate Layered Qeueuing Network (LQN) models

There is a newer version: 1.1.0
Show newest version
package ca.appsimulations.jlqninterface.lqn.model;
/**
 * @author Yasir Shoaib (2011,2012)
 * Contributors:
 * Yasir Shoaib - Implementation
 * 

* Some LQN classes and their members are outlined as UML class diagrams in LQNS User Manual. * For details regarding these LQN classes and members refer to LQNS User Manual. */ import ca.appsimulations.jlqninterface.lqn.entities.*; import ca.appsimulations.jlqninterface.utilities.Utility; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @Slf4j @Component @Data @NoArgsConstructor @Accessors(fluent = true, chain = true) public class LqnModel { private LqnXmlDetails xmlDetails; private SolverParams solverParams; private ArrayList tasks = new ArrayList<>(); private ArrayList refTasks = new ArrayList<>(); private ArrayList entries = new ArrayList<>(); private ArrayList processors = new ArrayList<>(); private ArrayList activities = new ArrayList<>(); private Result result = new Result(); private int maxBelow = 0; public void addTask(Task t) { tasks.add(t); } public void addProcessor(Processor p) { processors.add(p); } public void addEntry(Entry e) { entries.add(e); } public void addActivity(ActivityDefBase a) { activities.add(a); } public int processorsSize() { return processors.size(); } public int tasksSize() { return tasks.size(); } public Processor processorAtIndex(int index) { return processors.get(index); } public Task taskAtIndex(int index) { return tasks.get(index); } public ArrayList buildRefTasksFromExistingTasks() { for (Task t : tasks) { if (t.getScheduling() == TaskSchedulingType.REF) { refTasks.add(t); } } return refTasks; } // Call Entry.linkEntries() after dest array is properly set. // After this method, Task.buildDestTree() may be called. public void linkEntries() { int entriesSize = entries.size(); for (int k = 0; k < entriesSize; k++) { Entry e = entries.get(k); e.clearDestSrcEntries(); } for (int k = 0; k < entries.size(); k++) { Entry e = entries.get(k); int size = e.getSyncDestStrSize(); for (int i = 0; i < size; i++) { Entry tmp = entryByName(e.getSyncDestStr(i)); if (tmp != null) { e.addSyncDest(tmp); } } e.linkSynchCalls(); } } public ArrayList buildSrcEntries(String entryName) { //find srcEntries without calling linkEntries ArrayList srcEntries = new ArrayList(); int entriesSize = this.entries.size(); for (int k = 0; k < entriesSize; k++) { Entry src = this.entries.get(k); int size = src.getSyncDestStrSize(); for (int i = 0; i < size; i++) { if (src.getSyncDestStr(i).equals(entryName)) { srcEntries.add(src); } } } return srcEntries; } public String getProcessorsToQuotationStrArray() { return Utility.listToQuotationStrArray(processors); } public String buildProcessorsCDataString() { StringBuilder strB = new StringBuilder(); strB.append(" processors = array_create(); \n" + " processors = " + Utility.listToQuotationStrArray(processors) + ";\n" + " procData = array_create();\n"); for (int i = 0; i < processors.size(); i++) { Processor p = processors.get(i); strB.append(" procData[\"" + p + "\"] = [\"" + p + "\", " + p.getMutiplicityString() + "] ;\n"); } return strB.toString(); } // Call buildDestTree() method after calling linkEntries() public void buildDestTree() { for (int i = 0; i < tasks.size(); i++) { Task t = tasks.get(i); t.clearBelow(); } for (int i = 0; i < tasks.size(); i++) { Task t = tasks.get(i); if (t.getSrcTasksSize() == 0) { buildDestTreeRec(t); } } for (int i = 0; i < tasks.size(); i++) { Task t = tasks.get(i); int curBelowSize = t.getBelowSize(); if (maxBelow < curBelowSize) { maxBelow = curBelowSize; } } } private void buildDestTreeRec(Task parent) { int size = parent.getDestTasksSize(); for (int i = 0; i < size; i++) { Task child = parent.getDestTaskAtIndex(i); buildDestTreeRec(child); parent.addToBelow(child); parent.addAllTasksBelowtoBelow(child); } } public void printDestTree() { StringBuilder strB = new StringBuilder(); strB.append("Dest Tree\n"); strB.append("-----------\n"); for (int k = 0; k < tasks.size(); k++) { Task t = tasks.get(k); strB.append(String.format("%-25s", "Below(" + t.getName() + "):")); int size = t.getBelowSize(); for (int i = 0; i < size; i++) { strB.append(String.format("%-25s", t.getBelowAtIndex(i).getName())); } strB.append("(size: " + size + ")\t"); strB.append("\n"); } log.debug(strB.toString()); } public String getTasksToQuotationStrArray() { return Utility.listToQuotationStrArray(tasks); } public String buildTasksCDataString() { StringBuilder strB = new StringBuilder(); strB.append(" tasks = array_create(); \n").append( " tasks = " + Utility.listToQuotationStrArray(tasks) + ";\n"); strB.append(" taskData = array_create();\n"); for (int i = 0; i < tasks.size(); i++) { Task t = tasks.get(i); strB.append(" taskData[\"" + t + "\"] = [\"" + t + "\", "); if (t.getEntrySize() != 0) { Entry e = t.getEntryAtIndex(0); strB.append("\"" + e.getName() + "\", "); if (e.getEntryType() == EntryAcType.PH1PH2) { if (e.getActivityAtPhase(1) != null) { strB.append(e.getActivityAtPhase(1).getHost_demand_mean() + ", "); } else { strB.append("0.0 , "); } } else if (e.getEntryType() == EntryAcType.NONE) { // TODO strB.append("-1" + ", "); } } strB.append(t.getMutiplicityString() + "] ;\n"); } return strB.toString(); } public ArrayList taskWithBelowSize(int size) { ArrayList list = new ArrayList(); for (int i = 0; i < tasks.size(); i++) { Task t = tasks.get(i); if (t.getBelowSize() == size) { list.add(t); } } return list; } public void organizeTasksBasedBelowSize() throws Exception { ArrayList newArray = new ArrayList(); for (int j = maxBelow; j >= 0; j--) { ArrayList list = taskWithBelowSize(j); for (int i = 0; i < list.size(); i++) { Task t = list.get(i); newArray.add(t); } } if (tasks.size() != newArray.size()) { throw new Exception("tasks size != newArray size"); } tasks.clear(); tasks = newArray; } public void resetAll() { activities.clear(); entries.clear(); tasks.clear(); refTasks.clear(); processors.clear(); } public String buildBelowCDataString() { StringBuilder strB = new StringBuilder(); strB.append(" Below = array_create(); \n"); for (int i = 0; i < tasks.size(); i++) { Task t = tasks.get(i); strB.append(" Below[\"" + t.getName() + "\"] = "); strB.append(t.getBelowQutotationStrArray()); strB.append(";"); strB.append("\n"); } return strB.toString(); } public Processor processorByName(String name) { return processorByName(name, false); } public Processor processorByName(String name, boolean createNew) { int size = processors.size(); for (int i = 0; i < size; i++) { Processor p = processors.get(i); if (p.getName().equals(name)) { return p; } } if (createNew) { return (new Processor(this, name)); } return null; } public Task taskByName(String name) { ArrayList ts = tasks; int size = ts.size(); for (int i = 0; i < size; i++) { Task t = ts.get(i); if (t.getName().equals(name)) { return t; } } return null; } public Task taskByName(String name, Processor p, boolean createNew) { Task t = findTaskInProcessor(name, p); if (t != null) { return t; } if (createNew) { return (new Task(this, name, p)); } return null; } private Task findTaskInProcessor(String name, Processor p) { if (p == null) { return null; } ArrayList ts = p.getTasks(); int size = ts.size(); for (int i = 0; i < size; i++) { Task t = ts.get(i); if (t.getName().equals(name)) { return t; } } return null; } public Entry entryByName(String name) { int size = entries.size(); for (int i = 0; i < size; i++) { Entry e = entries.get(i); if (e.getName().equals(name)) { return e; } } return null; } public Entry entryByName(String name, Task t, boolean createNew) { ArrayList theEntries = t.getEntries(); int size = theEntries.size(); for (int i = 0; i < size; i++) { Entry e = theEntries.get(i); if (e.getName().equals(name)) { return e; } } if (createNew) { return (new Entry(this, name, t)); } return null; } public ActivityPhases activityPHByName(String name, Entry e, int phase, boolean createNew) { ActivityDefBase a = e.getActivityByName(name); if ((a != null) && (a.getName().equals(name))) { return (ActivityPhases) a; } else if (createNew) { return (new ActivityPhases(this, name, e, phase)); } return null; } public ActivityDef activityDefByName(String name, Task t, TaskActivity tA, Entry e, boolean createNew) { ActivityDef a = t.getActivityByName(name, tA); if ((a != null) && (a.getName().equals(name))) { return a; } else if (createNew) { return (new ActivityDef(this, name, t, tA, e)); } return null; } public List nonRefTasks() { return tasks.stream().filter(task -> task.isRefTask() == false).collect(Collectors.toList()); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy