|
From: <le...@us...> - 2006-12-01 17:27:37
|
Revision: 47
http://svn.sourceforge.net/qcell/?rev=47&view=rev
Author: lessm
Date: 2006-12-01 09:27:34 -0800 (Fri, 01 Dec 2006)
Log Message:
-----------
- LocalFunction class added
Added Paths:
-----------
trunk/qcell/baseheaders/LocalFunction.h
trunk/qcell/basesources/LocalFunction.cpp
Added: trunk/qcell/baseheaders/LocalFunction.h
===================================================================
--- trunk/qcell/baseheaders/LocalFunction.h (rev 0)
+++ trunk/qcell/baseheaders/LocalFunction.h 2006-12-01 17:27:34 UTC (rev 47)
@@ -0,0 +1,70 @@
+#ifndef _LOCAL_FUNCTION_H
+#define _LOCAL_FUNCTION_H
+
+#include <QVector>
+#include <QString>
+
+#include <math.h>
+
+class LocalFunction
+{
+
+public:
+
+ enum FUNCTION_TYPE
+ {
+ SWITCH,
+ SUM,
+ MIXED_SUM_SWITCH,
+ PRODUCT,
+ MIXED_PRODUCT_SWITCH,
+ SCRIPT
+ };
+
+private:
+ QVector<int> valueTable;
+ QVector<int> sumArguments;
+ QVector<int> productArguments;
+ QVector<int> freeArguments;
+ FUNCTION_TYPE functionMode;
+ int numArg, maxArgVal;
+ QString script;
+
+protected:
+ void resizeValueTable(void);
+public:
+
+ LocalFunction();
+ ~LocalFunction();
+
+ void inti(int numberOfArguments, int AlphabetSize);
+
+ // args is vector contein index of arguments to sum
+ void setSumArguments(QVector<int> args);
+
+ void setProductArguments(QVector<int> args);
+
+ void setSwitchFunction(void);
+
+ //
+ void setScript(QString scriptData);
+
+ // method set type of function (normally function type is set automatically when setSumArguments, setProductArguments, setSwitchFunction or setScript methosd ar used)
+ void setFunctonType(LocalFunction::FUNCTION_TYPE type);
+ LocalFunction::FUNCTION_TYPE getFunctonType(void);
+
+ int addFunctionValueArgumentsNumberRequest(void);
+
+ // fill value table with val
+ void setDefaultValue(int val);
+
+ // first value is sum or product if function have sum or product arguments
+ //
+ bool addFunctionValue(int value, QVector<int> args);
+
+ int resolve(QVector<int> arg);
+
+ double resolve(QVector<double> arg);
+};
+
+#endif
Added: trunk/qcell/basesources/LocalFunction.cpp
===================================================================
--- trunk/qcell/basesources/LocalFunction.cpp (rev 0)
+++ trunk/qcell/basesources/LocalFunction.cpp 2006-12-01 17:27:34 UTC (rev 47)
@@ -0,0 +1,218 @@
+#include "../baseheaders/LocalFunction.h"
+
+void LocalFunction::resizeValueTable(void)
+{
+ switch(functionMode)
+ {
+ case LocalFunction::FUNCTION_TYPE::SUM:
+ case LocalFunction::FUNCTION_TYPE::PRODUCT:
+ valueTable.resize(maxArgVal);
+ break;
+
+ case LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH:
+ valueTable.resize(freeArguments.size() * maxArgVal * (sumArguments.size() * (maxArgVal - 1) + 1));
+ break;
+
+ case LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH:
+ valueTable.resize(freeArguments.size() * maxArgVal * (pow(maxArgVal - 1, productArguments.size()) + 1));
+ break;
+
+ case LocalFunction::FUNCTION_TYPE::SWITCH:
+ valueTable.resize(numArg * maxArgVal);
+ break;
+ }
+}
+
+LocalFunction::LocalFunction()
+{
+ functionMode = LocalFunction::FUNCTION_TYPE::SWITCH;
+}
+
+LocalFunction::~LocalFunction()
+{
+ functionMode = LocalFunction::FUNCTION_TYPE::SWITCH;
+}
+
+void LocalFunction::inti(int numberOfArguments, int AlphabetSize)
+{
+ numArg = numberOfArguments;
+ maxArgVal = AlphabetSize;
+}
+
+void LocalFunction::setSumArguments(QVector<int> arg)
+{
+ if(arg.size()<=numArg)
+ {
+ sumArguments = arg;
+ freeArguments.clear();
+ valueTable.clear();
+ for(int i=0;i<numArg;++i)
+ if(!sumArguments.contains(i))
+ freeArguments<<i;
+
+ if(freeArguments.size()==0)
+ functionMode = LocalFunction::FUNCTION_TYPE::SUM;
+ else
+ if(freeArguments.size()==numArg)
+ functionMode = LocalFunction::FUNCTION_TYPE::SWITCH;
+ else
+ functionMode = LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH;
+ }
+}
+
+void LocalFunction::setProductArguments(QVector<int> arg)
+{
+ if(arg.size()<=numArg)
+ {
+ productArguments = arg;
+ freeArguments.clear();
+ valueTable.clear();
+ for(int i=0;i<numArg;++i)
+ if(!productArguments.contains(i))
+ freeArguments<<i;
+ if(freeArguments.size()==0)
+ functionMode = LocalFunction::FUNCTION_TYPE::PRODUCT;
+ else
+ if(freeArguments.size()==numArg)
+ functionMode = LocalFunction::FUNCTION_TYPE::SWITCH;
+ else
+ functionMode = LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH;
+ }
+}
+
+void LocalFunction::setSwitchFunction(void)
+{
+ functionMode = LocalFunction::FUNCTION_TYPE::SWITCH;
+}
+
+void LocalFunction::setScript(QString scriptData)
+{
+ script = scriptData;
+ functionMode = LocalFunction::FUNCTION_TYPE::SCRIPT;
+}
+
+void LocalFunction::setFunctonType(LocalFunction::FUNCTION_TYPE type)
+{
+ functionMode = type;
+}
+
+LocalFunction::FUNCTION_TYPE LocalFunction::getFunctonType(void)
+{
+ return functionMode;
+}
+
+int LocalFunction::addFunctionValueArgumentsNumberRequest(void)
+{
+ switch(functionMode)
+ {
+ case LocalFunction::FUNCTION_TYPE::SUM:
+ case LocalFunction::FUNCTION_TYPE::PRODUCT:
+ return 1;
+
+ case LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH:
+ case LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH:
+ return freeArguments.size() + 1;
+
+ case LocalFunction::FUNCTION_TYPE::SWITCH:
+ return freeArguments.size();
+ }
+
+ return 0;
+}
+
+void LocalFunction::setDefaultValue(int val)
+{
+ if(valueTable.empty())
+ resizeValueTable();
+ if(val < 0)
+ val = 0;
+ if(val > maxArgVal - 1)
+ val = maxArgVal - 1;
+
+ valueTable.fill(val);
+}
+
+
+
+bool LocalFunction::addFunctionValue(int value, QVector<int> args)
+{
+ int i, index = 0;
+ if(valueTable.empty())
+ resizeValueTable();
+ switch(functionMode)
+ {
+ case LocalFunction::FUNCTION_TYPE::SUM:
+ case LocalFunction::FUNCTION_TYPE::PRODUCT:
+ index = args[0];
+ break;
+
+ case LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH:
+ case LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH:
+ for(i=0;i<freeArguments.size();++i)
+ index += args[i+1] * pow(maxArgVal, i);
+ index *= args[0];
+ break;
+
+ case LocalFunction::FUNCTION_TYPE::SWITCH:
+ for(i=0;i<numArg;++i)
+ index += args[i] * pow(maxArgVal, i);
+ break;
+ }
+ valueTable[index] = value;
+ return 1;
+}
+
+int LocalFunction::resolve(QVector<int> args)
+{
+ int i, index = 0;
+ if(valueTable.empty())
+ resizeValueTable();
+ if(functionMode==LocalFunction::FUNCTION_TYPE::SCRIPT)
+ return -1;
+
+ switch(functionMode)
+ {
+ case LocalFunction::FUNCTION_TYPE::SUM:
+ case LocalFunction::FUNCTION_TYPE::PRODUCT:
+ index = args[0];
+ break;
+
+ case LocalFunction::FUNCTION_TYPE::MIXED_SUM_SWITCH:
+ case LocalFunction::FUNCTION_TYPE::MIXED_PRODUCT_SWITCH:
+ for(i=0;i<freeArguments.size();++i)
+ index += args[i+1] * pow(maxArgVal, i);
+ index *= args[0];
+ break;
+
+ case LocalFunction::FUNCTION_TYPE::SWITCH:
+ for(i=0;i<numArg;++i)
+ index += args[i] * pow(maxArgVal, i);
+ break;
+ case LocalFunction::FUNCTION_TYPE::SCRIPT:
+ break;
+ }
+ return valueTable[index];
+}
+
+double LocalFunction::resolve(QVector<double> args)
+{
+ int i;
+ double out = 0.0;
+ switch(functionMode)
+ {
+ case LocalFunction::FUNCTION_TYPE::SUM:
+ for (i=0;i<args.size();++i)
+ out += args[i];
+ break;
+ case LocalFunction::FUNCTION_TYPE::PRODUCT:
+ out = args[0];
+ for (i=1;i<args.size();++i)
+ out *= args[i];
+ break;
+
+ case LocalFunction::FUNCTION_TYPE::SCRIPT:
+ break;
+ }
+
+ return out;
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|