home › Forums › # Technical Support › Time and Absolute Values? › Reply To: Time and Absolute Values?
Hi Fishwaldo,
Thank you for your post and for sharing information about an interesting application of fuzzylite.
I have been thinking about your case since I read about it, and I have one solution.
As for now, I am reluctant to allow the kind of rules you present, but I will surely consider it for another version of fuzzylite in the future.
My solution is to create an InputVariable called Time, besides InputVariable Room, as follows:
InputVariable: Time
enabled: true
range: 0.0 23.59
term: After6pm Function ge(Time, 18)
term: Before6pm Function lt(Time, 18)
term: After8pm Function ge(Time, 20)
term: Before8pm Function lt(Time, 20)
InputVariable: Room
enabled: true
range: 0.0 1.0
term: Occupied Function eq(Room, 1.0)
term: Empty Function ~eq(Room, 1.0)
Then, the rules would be:
RuleBlock:
conjunction: AlgebraicProduct
activation: AlgebraicProduct
rule: if Room is Occupied and Time is After6pm then AirCond is fullspeed
The changes you need to make in fuzzylite are the following:
In Operation.h, you need to create the following methods,
static scalar gt(scalar a, scalar b); //greater than
static scalar ge(scalar a, scalar b); //greater than or equal to
static scalar eq(scalar a, scalar b); //equal to
static scalar le(scalar a, scalar b); //less than or equal to
static scalar lt(scalar a, scalar b); //less than
static scalar Operation::logicalNot(scalar a) {
return isEq(a, 1.0) ? 0.0 : 1.0; //Implementation in Operation.cpp
}
and within the methods utilize the respective calls to Op::isGt
, Op::isGE
, etc.
In Function.cpp, you need to add the new methods as follows:
loadBuiltInFunctions(){
this->functions["gt"] = new BuiltInFunction("gt", &(fl::Op::gt));
this->functions["ge"] = new BuiltInFunction("ge", &(fl::Op::ge));
this->functions["eq"] = new BuiltInFunction("eq", &(fl::Op::eq));
this->functions["le"] = new BuiltInFunction("le", &(fl::Op::le));
this->functions["lt"] = new BuiltInFunction("lt", &(fl::Op::lt));
}
loadOperators(){
int p = 7;
this->operators["!"] = new Operator("!", &(fl::Op::logicalNot), p, 1);
}
As for time, you will have to set the input value for Time manually before processing the Engine.
I have already incorporated the aforementioned changes to fuzzylite v5.0, but I discourage you from using the master repository as it is work in progress and plenty of changes are being made.
Re