|
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.
|