#include "funinterface.h" #include #include "matrix.hpp" //typeCheck bool BuiltinFunc::hasOneSonNode(vector &sonNode) { return sonNode.at(0)->getType() == Num; } bool BuiltinFunc::hasTwoSonNodes(vector &sonNode) { return sonNode.at(0)->getType() == Num && sonNode.at(1)->getType() == Num; } bool BuiltinFunc::assignmentCheck(vector &sonNode) { if(sonNode.at(0)->getType() == Var) { BasicNode* result=sonNode.at(1)->eval(); if(copyHelp::isLiteral(result)) { return true; } } else return false; } bool BuiltinFunc::onestr(vector &sonNode) { return sonNode.at(0)->getType() == String; } bool BuiltinFunc::oneMat(vector &sonNode) { return sonNode.at(0)->getType() == Matrix; } bool BuiltinFunc::twoVec(vector &sonNode) { return sonNode.at(0)->getType() == Vector && sonNode.at(1)->getType() == Vector; } bool BuiltinFunc::twoMat(vector &sonNode) { return sonNode.at(0)->getType() == Matrix && sonNode.at(1)->getType() == Matrix; } bool BuiltinFunc::vecNum(vector &sonNode) { return sonNode.at(0)->getType() == Vector && sonNode.at(1)->getType() == Num; } bool BuiltinFunc::matNum(vector &sonNode) { return sonNode.at(0)->getType() == Matrix && sonNode.at(1)->getType() == Num; } bool BuiltinFunc::matNum2(vector &sonNode) { return sonNode.at(0)->getType() == Matrix && sonNode.at(1)->getType() == Num && sonNode.at(2)->getType() == Num; } bool BuiltinFunc::matNum3(vector &sonNode) { return sonNode.at(0)->getType() == Matrix && sonNode.at(1)->getType() == Num && sonNode.at(2)->getType() == Num && sonNode.at(3)->getType() == Num; } bool BuiltinFunc::matVec(vector &sonNode) { return sonNode.at(0)->getType() == Matrix && sonNode.at(1)->getType() == Vector; } bool BuiltinFunc::pmatVecNum(vector &sonNode) { return sonNode.at(0)->getType() == Var && ((VarNode*)sonNode.at(0))->getValType() == Matrix && sonNode.at(1)->getType() == Vector && sonNode.at(2)->getType() == Num; } double BuiltinFunc::getNum(BasicNode *node) { return dynamic_cast(node)->getNum(); } //FunBody BasicNode* BuiltinFunc::add(vector &sonNode) { return new NumNode(BuiltinFunc::getNum(sonNode[0]) + BuiltinFunc::getNum(sonNode[1])); } BasicNode* BuiltinFunc::sub(vector &sonNode) { return new NumNode(BuiltinFunc::getNum(sonNode[0]) - BuiltinFunc::getNum(sonNode[1])); } BasicNode* BuiltinFunc::mul(vector &sonNode) { return new NumNode(BuiltinFunc::getNum(sonNode[0]) * BuiltinFunc::getNum(sonNode[1])); } BasicNode* BuiltinFunc::div(vector &sonNode) { return new NumNode(BuiltinFunc::getNum(sonNode[0]) / BuiltinFunc::getNum(sonNode[1])); } BasicNode* BuiltinFunc::pow(vector &sonNode) { return new NumNode(std::pow(BuiltinFunc::getNum(sonNode[0]), BuiltinFunc::getNum(sonNode[1]))); } BasicNode* BuiltinFunc::sin(vector &sonNode) { return new NumNode(std::sin(BuiltinFunc::getNum(sonNode[0]))); } BasicNode* BuiltinFunc::cos(vector &sonNode) { return new NumNode(std::cos(BuiltinFunc::getNum(sonNode[0]))); } BasicNode* BuiltinFunc::log(vector &sonNode) { return new NumNode(std::log(BuiltinFunc::getNum(sonNode[1])) / std::log(BuiltinFunc::getNum(sonNode[0]))); } BasicNode* BuiltinFunc::ln(vector &sonNode) { return new NumNode(std::log(BuiltinFunc::getNum(sonNode[0]))); } BasicNode* BuiltinFunc::puts(vector &sonNode) { cout << ((StringNode*)sonNode[0])->getStr(); return new nullNode(); } BasicNode* BuiltinFunc::vecDot(vector &sonNode) { vectorNode* m1=(vectorNode*)sonNode[0]; vectorNode* m2=(vectorNode*)sonNode[1]; return new NumNode(m1->dot(*m2)); } BasicNode* BuiltinFunc::matDot(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; matrixNode* m2=(matrixNode*)sonNode[1]; return new matrixNode(m1->dot(*m2)); } BasicNode* BuiltinFunc::vecAdd(vector &sonNode) { vectorNode* m1=(vectorNode*)sonNode[0]; vectorNode* m2=(vectorNode*)sonNode[1]; return new vectorNode(m1->add(*m2)); } BasicNode* BuiltinFunc::matAdd(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; matrixNode* m2=(matrixNode*)sonNode[1]; return new matrixNode(m1->add(*m2)); } BasicNode* BuiltinFunc::vecSub(vector &sonNode) { vectorNode* m1=(vectorNode*)sonNode[0]; vectorNode* m2=(vectorNode*)sonNode[1]; vectorNode rm2=m2->mul(-1); return new vectorNode(m1->add(rm2)); } BasicNode* BuiltinFunc::matSub(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; matrixNode* m2=(matrixNode*)sonNode[1]; matrixNode rm2=m2->mul(-1); return new matrixNode(m1->add(rm2)); } BasicNode* BuiltinFunc::vecMul(vector &sonNode) { vectorNode* v1=(vectorNode*)sonNode[0]; NumNode* d2=(NumNode*)sonNode[1]; return new vectorNode(v1->mul(d2->getNum())); } BasicNode* BuiltinFunc::matMul(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; NumNode* d2=(NumNode*)sonNode[1]; return new matrixNode(m1->mul(d2->getNum())); } BasicNode* BuiltinFunc::getCVector(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; NumNode* d2=(NumNode*)sonNode[1]; return new vectorNode(m1->getCVector(d2->getNum())); } BasicNode* BuiltinFunc::getRVector(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; NumNode* d2=(NumNode*)sonNode[1]; return new vectorNode(m1->getRVector(d2->getNum())); } BasicNode* BuiltinFunc::setCVector(vector &sonNode) { matrixNode* m1=(matrixNode*)(((VarNode*)sonNode[0])->getVal()); vectorNode* v2=(vectorNode*)sonNode[1]; NumNode* n3=(NumNode*)sonNode[2]; m1->setCVector(*v2,n3->getNum()); return new nullNode(); } BasicNode* BuiltinFunc::setRVector(vector &sonNode) { matrixNode* m1=(matrixNode*)(((VarNode*)sonNode[0])->getVal()); vectorNode* v2=(vectorNode*)sonNode[1]; NumNode* n3=(NumNode*)sonNode[2]; m1->setRVector(*v2,n3->getNum()); return new nullNode(); } BasicNode* BuiltinFunc::det(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; return new NumNode(m1->det()); } BasicNode* BuiltinFunc::inv(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; return new matrixNode(m1->inv()); } BasicNode* BuiltinFunc::adjoint(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; return new matrixNode(m1->adjoint()); } BasicNode* BuiltinFunc::linerSolve(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; vectorNode* m2=(vectorNode*)sonNode[1]; return new vectorNode(matrixNode::solve(*m1,*m2)); } BasicNode* BuiltinFunc::assignment(vector &sonNode) { VarNode* v=(VarNode*)sonNode[0]; v->setVal(copyHelp::copyVal(sonNode[1])); //在参数类型检查时已经进行eval return v->eval(); //支持yoda表达法 } BasicNode* BuiltinFunc::rsub(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; NumNode* n1=(NumNode*)sonNode[1]; NumNode* n2=(NumNode*)sonNode[2]; NumNode* n3=(NumNode*)sonNode[3]; m1->rsub(n1->getNum(),n2->getNum(),n3->getNum()); return new matrixNode(*m1); } BasicNode* BuiltinFunc::rmul(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; NumNode* n1=(NumNode*)sonNode[1]; NumNode* n2=(NumNode*)sonNode[2]; m1->rmul(n1->getNum(),n2->getNum()); return new matrixNode(*m1); } BasicNode* BuiltinFunc::rswap(vector &sonNode) { matrixNode* m1=(matrixNode*)sonNode[0]; NumNode* n1=(NumNode*)sonNode[1]; NumNode* n2=(NumNode*)sonNode[2]; m1->rswap(n1->getNum(),n2->getNum()); return new matrixNode(*m1); }