scalar Function::membership(scalar x) const { if (not this->_root.get()) { throw fl::Exception("[function error] function <" + _formula + "> not loaded.", FL_AT); } if (this->_engine) { for (int i = 0; i < this->_engine->numberOfInputVariables(); ++i) { InputVariable* input = this->_engine->getInputVariable(i); this->variables[input->getName()] = input->getInputValue(); } for (int i = 0; i < this->_engine->numberOfOutputVariables(); ++i) { OutputVariable* output = this->_engine->getOutputVariable(i); this->variables[output->getName()] = output->getOutputValue(); } } this->variables["x"] = x; return this->evaluate(&this->variables); }
scalar Antecedent::activationDegree(const TNorm* conjunction, const SNorm* disjunction, const Expression* node) const { if (not node->isOperator) { //then it is a Proposition const Proposition* proposition = dynamic_cast<const Proposition*> (node); if (not proposition->variable->isEnabled()){ return 0.0; } bool isAny = false; for (std::size_t i = 0; i < proposition->hedges.size(); ++i) { isAny |= proposition->hedges.at(i)->name() == Any().name(); if (isAny) return 1.0; } InputVariable* inputVariable = dynamic_cast<InputVariable*> (proposition->variable); scalar result = proposition->term->membership(inputVariable->getInputValue()); for (std::size_t i = 0; i < proposition->hedges.size(); ++i) { result = proposition->hedges.at(i)->hedge(result); } return result; } //if node is an operatorsk const Operator* fuzzyOperator = dynamic_cast<const Operator*> (node); if (not fuzzyOperator->left or not fuzzyOperator->right) { std::ostringstream ex; ex << "[syntax error] left and right operands must exist"; throw fl::Exception(ex.str(), FL_AT); } if (fuzzyOperator->name == Rule::FL_AND) return conjunction->compute( this->activationDegree(conjunction, disjunction, fuzzyOperator->left), this->activationDegree(conjunction, disjunction, fuzzyOperator->right)); if (fuzzyOperator->name == Rule::FL_OR) return disjunction->compute( this->activationDegree(conjunction, disjunction, fuzzyOperator->left), this->activationDegree(conjunction, disjunction, fuzzyOperator->right)); std::ostringstream ex; ex << "[syntax error] operator <" << fuzzyOperator->name << "> not recognized"; throw fl::Exception(ex.str(), FL_AT); }