From: <le...@us...> - 2007-01-08 22:33:13
|
Revision: 129 http://svn.sourceforge.net/qcell/?rev=129&view=rev Author: lessm Date: 2007-01-08 14:33:11 -0800 (Mon, 08 Jan 2007) Log Message: ----------- - LocalFunction have toXmlString and fromXmlString methods Modified Paths: -------------- trunk/qcell/baseheaders/LocalFunction.h trunk/qcell/basesources/LocalFunction.cpp trunk/qcell/parsers/FQT/FQTParserPlugin.cpp trunk/qcell/visgui/MainWindow.cpp Modified: trunk/qcell/baseheaders/LocalFunction.h =================================================================== --- trunk/qcell/baseheaders/LocalFunction.h 2007-01-08 17:11:50 UTC (rev 128) +++ trunk/qcell/baseheaders/LocalFunction.h 2007-01-08 22:33:11 UTC (rev 129) @@ -6,6 +6,7 @@ #include <QDomDocument> #include <QDomElement> #include <QDomText> +#include <QDomNode> #include <QStringList> #include <math.h> @@ -47,7 +48,14 @@ void valueTableFromString(QString *string); void sumArgumentsFromString(QString *string); + QVector<int> valueTranslation(int value); + QString valueFormTableToString(int index); + + void setSumsFromString(QString sums); + void setValuesFromString(QString values); + void getArgumentsFromString(QString argString, QVector<int> &sums, QVector<int> &freeArgs); + public: LocalFunction(); @@ -83,6 +91,7 @@ bool setFunctionValue(int value, int sum); bool setFunctionValue(int value, QVector<int> args); bool setFunctionValue(int value, int sum, QVector<int> freeArgs); + bool setFunctionValue(int value, int sum, int freeArgsValue); bool setFunctionValue(int value, QVector<int> sums, QVector<int> freeArgs); int resolve(QVector<int> arg); Modified: trunk/qcell/basesources/LocalFunction.cpp =================================================================== --- trunk/qcell/basesources/LocalFunction.cpp 2007-01-08 17:11:50 UTC (rev 128) +++ trunk/qcell/basesources/LocalFunction.cpp 2007-01-08 22:33:11 UTC (rev 129) @@ -132,7 +132,130 @@ /// @todo } +QVector<int> LocalFunction::valueTranslation(int value) +{ + int count=0; + int mod; + QVector<int> output; + count = sumArguments.size() + freeArguments.size(); + output.resize(count); + count--; + for(int i=0;i<freeArguments.size();++i) + output[count--] = getAlphabetSize(); + + for(int i=0;i<sumArguments.size();++i) + output[count--] = sumArguments[i].size() * getAlphabetSize(); + for(int i=sumArguments.size() + freeArguments.size() - 1;i>=0;--i) + { + if(value>-1) + { + if(value<output[i]) + { + output[i] = value; + value = -1; + } + else + { + mod = value % output[i]; + value /= output[i]; + output[i] = mod; + } + } + else + { + output[i] = 0; + } + } + return output; +} + +QString LocalFunction::valueFormTableToString(int index) +{ + int split = sumArguments.size() - 1; + QVector<int> temp = valueTranslation(index); + QString out; + for(int i=0;i<temp.size();++i) + { + out += QString("%1").arg(temp[i]); + if(i==split) + out += "+"; + else + if(i!=temp.size()-1) + out += ","; + } + out += QString("=%1;").arg(valueTable[index]); + return out; +} + +void LocalFunction::setSumsFromString(QString sums) +{ + QVector<int> sumVector; + QStringList elements; + sums.remove('\n'); + sums.remove(' '); + QStringList list = sums.split(';', QString::SkipEmptyParts); + for(int i=0;i<list.size();++i) + { + sumVector.clear(); + elements = list[i].split(',', QString::SkipEmptyParts); + for(int j=0;j<elements.size();++j) + { + sumVector.append((elements[j]).toInt()); + } + if(!sumVector.isEmpty()) + { + if(i==0) + setSumArguments(sumVector); + else + addSumArguments(sumVector); + } + } +} + + + +void LocalFunction::setValuesFromString(QString values) +{ + QStringList valuesList, splitValues; + QVector<int> sumVector, argVector; + sumVector.resize(sumArguments.size()); + argVector.resize(freeArguments.size()); + + values.remove('\n'); + values.remove(' '); + + valuesList = values.split(';', QString::SkipEmptyParts); + for(int i=0;i<valuesList.size();++i) + { + splitValues = valuesList[i].split('=', QString::SkipEmptyParts); + if(splitValues.size()==2) + { + getArgumentsFromString(splitValues[0], sumVector, argVector); + setFunctionValue(splitValues[1].toInt(), sumVector, argVector); + } + } +} + +void LocalFunction::getArgumentsFromString(QString argString, QVector<int> &sums, QVector<int> &freeArgs) +{ + QStringList mainSplit, argumentsSplit; + + sums.clear(); + freeArgs.clear(); + mainSplit = argString.split('+', QString::SkipEmptyParts); + if(mainSplit.size()==2) + { + argumentsSplit = mainSplit[0].split(',', QString::SkipEmptyParts); + for(int i=0;i<argumentsSplit.size();++i) + sums.append((argumentsSplit[i]).toInt()); + + argumentsSplit = mainSplit[1].split(',', QString::SkipEmptyParts); + for(int i=0;i<argumentsSplit.size();++i) + freeArgs.append((argumentsSplit[i]).toInt()); + } +} + LocalFunction::LocalFunction() { functionMode = LocalFunction::SWITCH; @@ -225,7 +348,7 @@ int LocalFunction::getNumberOfArgs() { - return maxArgVal; + return numArg; } int LocalFunction::getAlphabetSize() @@ -335,6 +458,25 @@ return 1; } +bool LocalFunction::setFunctionValue(int value, int sum, int freeArgsValue) +{ + int index; + if(sumArguments.size()==0 || sumArguments.size()>1) + return 0; + if(valueTable.empty()) + resizeValueTable(); + switch(functionMode) + { + case LocalFunction::SUM_AND_SWITCH: + index = sum * pow(maxArgVal, freeArguments.size()) + freeArgsValue; + valueTable[index] = value; + break; + default: + return 0; + } + return 1; +} + bool LocalFunction::setFunctionValue(int value, QVector<int> sums, QVector<int> freeArgs) { int index; @@ -398,39 +540,94 @@ QString LocalFunction::toXmlString(void) { + int mpv; QDomDocument doc; QDomElement root, element; + QDomText text; + QString temp; + root = doc.createElement("LocalFunction"); - root.setAttribute("function_type", functionMode); - doc.appendChild(root); - - switch (functionMode) + root.setAttribute("ArgumentsNumber", getNumberOfArgs()); + root.setAttribute("InputAlphabet", getAlphabetSize()); + if(sumArguments.size()>0) { - case LocalFunction::SUM: + element = doc.createElement("Sums"); + temp.clear(); + for(int i=0;i<sumArguments.size();++i) { - /// @todo Implement function type SUM toXML - break; + temp += QString("\n%1").arg((sumArguments[i])[0]); + for(int j=1;j<sumArguments[i].size();++j) + { + temp += QString(",%1").arg((sumArguments[i])[j]); + } + temp += ";\n"; } - case LocalFunction::SUM_AND_SWITCH: + text = doc.createTextNode(temp); + element.appendChild(text); + root.appendChild(element); + } + + element = doc.createElement("Values"); + mpv = mostPopularValue(); + element.setAttribute("FillValue", mpv); + temp = "\n"; + for(int i=0;i<valueTable.size();++i) + { + if(valueTable[i] != mpv) { - break; + temp += valueFormTableToString(i); + temp += "\n"; } - case LocalFunction::SWITCH: - { - /// @todo Implement SWITCH function mode toXML - break; - } } + + text = doc.createTextNode(temp); + element.appendChild(text); + root.appendChild(element); + + doc.appendChild(root); return doc.toString(); } bool LocalFunction::fromXmlString(QString *xmlString) { - return 1; + QDomDocument doc; + doc.setContent(*xmlString); + return fromDomElement(&(doc.firstChildElement())); } bool LocalFunction::fromDomElement(QDomElement *xmlElement) { - return 1; + functionMode = LocalFunction::SWITCH; + valueTable.clear(); + sumArguments.clear(); + freeArguments.clear(); + numArg = maxArgVal = numElements = 0; + + QDomElement element; + QDomNode node; + QDomText text; + if(xmlElement->tagName()=="LocalFunction") + { + init(xmlElement->attribute("ArgumentsNumber").toInt(), xmlElement->attribute("InputAlphabet").toInt(), 666); + node = xmlElement->firstChild(); + while(!node.isNull()) + { + element = node.toElement(); + if(element.tagName()=="Sums") + setSumsFromString(element.text()); + + if(element.tagName()=="Values") + { + if(element.hasAttribute("FillValue")) + { + setDefaultValue(element.attribute("FillValue").toInt()); + setValuesFromString(element.text()); + } + } + node = node.nextSibling(); + } + return 1; + } + return 0; } Modified: trunk/qcell/parsers/FQT/FQTParserPlugin.cpp =================================================================== --- trunk/qcell/parsers/FQT/FQTParserPlugin.cpp 2007-01-08 17:11:50 UTC (rev 128) +++ trunk/qcell/parsers/FQT/FQTParserPlugin.cpp 2007-01-08 22:33:11 UTC (rev 129) @@ -237,7 +237,7 @@ QVector<QVector<int> > permutations; // setting the type of function - lf.setFunctonType(LocalFunction::SUM); + //lf.setFunctonType(LocalFunction::SUM); // setting the number of arguments the function will take // and the alphabet size lf.init(arguments_nr, values_nr, return_values_nr); @@ -246,11 +246,16 @@ lf.setSumArguments(arguments); /// @todo How the fuck set FQT function parameters eh? - foreach(int sum, results.keys()) - { - - } + switch(lf.getFunctonType()) + { + case LocalFunction::SUM_AND_SWITCH: + foreach(int sum, results.keys()) + { + for(int i=0;i<results.value(sum).size();++i) + lf.setFunctionValue((results.value(sum))[i], sum, i); + } + } return lf.toXmlString(); } Modified: trunk/qcell/visgui/MainWindow.cpp =================================================================== --- trunk/qcell/visgui/MainWindow.cpp 2007-01-08 17:11:50 UTC (rev 128) +++ trunk/qcell/visgui/MainWindow.cpp 2007-01-08 22:33:11 UTC (rev 129) @@ -11,11 +11,12 @@ MainWindow::MainWindow(QWidget* parent) { // GUI setup - earlies possible to show the user, that we're in buisness - setupUi(this); + setupUi(this); + sw = new simulationWindow(this); QLayoutItem* tmp = centralWidget()->layout()->takeAt(0); centralWidget()->layout()->addWidget(sw); - centralWidget()->layout()->addItem(tmp); + centralWidget()->layout()->addItem(tmp); // Plugin parsing /// @todo get that code out of here! ParserInterface* iParser; @@ -64,7 +65,6 @@ } } } - /// @todo This function doesn't belong here. It initializes things not fore GUI setupEngine(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |