Esempio n. 1
0
std::string CppCode::methodCode(Method* method) {
    std::string mCode=tabStr, tmpStr;
    Variable *var = method->getReturnVariable();
    if (var->getDataType()=="DOUBLE") {
        this->isDouble = true;
    }

    mCode += this->generateDatatype(var)+" ";

    mCode += method->getName()+"(";
    for (int i=0; i<method->getNumberOfParameters(); i++) {
        var = method->getParameterAt(i);
        if (var->getDataType()=="DOUBLE") {
            this->isDouble = true;
        }
        if (i>0) {
            mCode += ", ";
        }

        mCode += this->generateDatatype(var)+" "; //int a, vector<string> b etc.
        mCode += var->getName();
    }
    mCode += ") {\n        ";
    mCode += this->generateDatatype(method->getReturnVariable())+" out;\n\n";
    mCode += "        return out;\n    }\n";
    return mCode;
}
fdmath::Matrix44 TransformPath::compute(GraphicsAPI& api) {
	Matrix44 camMatrix;
	if (!camera.isNull()) {
		Camera* cam = api.getVariableValueT<Camera*>(camera);
		fdmath::Transform transform = cam->getViewPair().getOutToIn();
		camMatrix = Matrix44(transform);
	} else {
		camMatrix = Matrix44::createIdentity();
	}

	if (!subTransform.isNull()) {
		Variable* subTransformVar = api.getVariable(subTransform);

		if (subTransformVar->getDataType() == FVT_TRANSFORM_PATH) {
			TransformPath* transformPath = 
					subTransformVar->getValueT<TransformPath>();
			return camMatrix * transformPath->compute(api);
		} else if (subTransformVar->getValue() != NULL) {
			fdmath::Matrix44 subTransformMatrix = *(fdmath::Matrix44*)
					subTransformVar->getValue();
			return camMatrix * subTransformMatrix;
		} else {
			return camMatrix;
		}
	} else {
		return camMatrix;
	}
}
Esempio n. 3
0
std::string CppCode::generateFullTestReader(Problem& problem) {
    Method* method = problem.getMethod();
    Variable* var;
    std::string code =  
        tabStr + "const std::string currentDateTime() {\n"+
        tabStr + tabStr + "time_t     now = time(0);\n"+
        tabStr + tabStr + "struct tm  tstruct;\n"+
        tabStr + tabStr + "char       buf[80];\n" +
        tabStr + tabStr + "tstruct = *localtime(&now);\n"+
        tabStr + tabStr + "strftime(buf, sizeof(buf), \"%Y-%m-%d %X\", &tstruct);\n"+
        tabStr + tabStr + "return buf;\n"+
        tabStr+"}\n\n"+
        tabStr+"//This method will only accept input files that are formatted in proper way.\n"+
        tabStr+"//Command line example: "+problem.getClassName()+".exe -2 <"+problem.getClassName()+".io\n"+
        tabStr+"bool run_full_test() {\n" +
        tabStr+tabStr+"int testCase, N, caseNo, correct=0;\n";
    //declare all variables
    for (int i=0; i<method->getNumberOfParameters(); i++) {
        var = method->getParameterAt(i);
        code+= tabStr+tabStr+this->generateDatatype(var)+" "+var->getName()+";\n";//vector<int> var;
        //if we have an array then we will create another variable to read single item of that array, redundant but easy to code :|
        if (var->isArray()) {
            code += tabStr+tabStr+this->convertDataType(var->getDataType())+" "+var->getName()+"_sin;\n"; //with _in suffix
        }
    }
    var = method->getReturnVariable();
    code+= tabStr+tabStr+this->generateDatatype(var)+" "+var->getName()+";\n";//vector<int> var;
    if (var->isArray()) {
        code += tabStr+tabStr+this->convertDataType(var->getDataType())+" "+var->getName()+"_sin;\n"; //with _in suffix
    }
    code += "\n";
    code+= tabStr+tabStr+"std::cin>>testCase; std::cin.ignore(10, '\\n');\n" +
        tabStr+tabStr+"for (int i=0; i<testCase; i++) {\n" +
        tabStr+tabStr+tabStr+"std::cin>>caseNo; std::cin.ignore(10, '\\n');\n";
    //code to read all parameters
    for (int i=0; i<method->getNumberOfParameters(); i++) {
        code += this->generateSingleCaseReader(method->getParameterAt(i), tabStr+tabStr);
    }
    //code to read expected result
    code += this->generateSingleCaseReader(method->getReturnVariable(), tabStr+tabStr);

    //code to run class.Method(parameters...)
    code += tabStr+tabStr+tabStr+"clock_t start_           = clock();\n";
    code += tabStr+tabStr+tabStr+this->generateDatatype(method->getReturnVariable())+" received_ = " +
        problem.getClassName()+"()."+method->getName()+"(";

    for (int i=0; i<method->getNumberOfParameters(); i++) {
        if (i) {
            code += ", ";
        }
        code += method->getParameterAt(i)->getName();
    }
    code += ");\n";
    code += tabStr+tabStr+tabStr+"correct += verify_case(caseNo, " + method->getReturnVariable()->getName()  + ", received_, clock()-start_);\n";

    code+=tabStr+tabStr+"}//end of testCase for loop\n\n";
    code += tabStr+tabStr +"if (testCase == 0) {\n" +
            tabStr+tabStr+tabStr+"cerr << \"No test cases run.\" << endl;\n" +
            tabStr+tabStr+"} else if (correct < testCase) {\n"+
            tabStr+tabStr+tabStr+"cerr << \"Some cases FAILED (passed \" << correct << \" of \" << testCase << \").\" << endl;\n"+
            tabStr+tabStr+"} else {\n"+
            tabStr+tabStr+tabStr+"cerr << \"All \" << testCase << \" tests passed!\" << endl;\n"+
            tabStr+tabStr+tabStr+"std::ofstream ofs(\""+problem.getClassName()+".st\", std::ios_base::app);\n"+
            tabStr+tabStr+tabStr+"ofs<<currentDateTime()<<std::endl;\n"+
            tabStr+tabStr+tabStr+"ofs.close();\n"+
            tabStr+tabStr+"}\n"+
            tabStr+tabStr+"return true;\n"+
          tabStr+"}\n\n";
    return code;
}
Esempio n. 4
0
std::string CppCode::generateVerifyCase(Problem& problem) {
    Variable* reType = problem.getMethod()->getReturnVariable();
    std::string typeName = this->generateDatatype(reType);
    std::string mCode;
    mCode = "    int verify_case(int casenum, const " + typeName + " &expected, const " + typeName + " &received, clock_t elapsed) { \n" +
            "        cerr << \"Example \" << casenum << \"... \"; \n" +
            "\n" +
            "        string verdict;\n" +
            "        vector<string> info;\n" +
            "        char buf[100];\n" +
            "\n" +
            "        if (elapsed > CLOCKS_PER_SEC / 200) {\n" +
            "            sprintf(buf, \"time %.2fs\", elapsed * (1.0/CLOCKS_PER_SEC));\n" +
            "            info.push_back(buf);\n" +
            "        }\n" +
            "\n";

    // Print "PASSED" or "FAILED" based on the result
    if (reType->getDataType()=="DOUBLE") {
        mCode +=
            std::string(
            "        if (compareDouble(expected, received)) {\n") +
            "            verdict = \"PASSED\";\n" +
            "            double rerr = moj_relative_error(expected, received); \n" +
            "            if (rerr > 0) {\n" +
            "                sprintf(buf, \"relative error %.3e\", rerr);\n" +
            "                info.push_back(buf);\n" +
            "            }\n";
    } else {
        mCode +=
            std::string("        if (expected == received) {\n") +
            "            verdict = \"PASSED\";\n";
    }
    mCode += 
            std::string("        } else {\n") +
            "            verdict = \"FAILED\";\n" +
            "        }\n" +
            "\n" +
            "        cerr << verdict;\n" +
            "        if (!info.empty()) {\n" +
            "            cerr << \" (\";\n" +
            "            for (int i=0; i<(int)info.size(); ++i) {\n" +
            "                if (i > 0) cerr << \", \";\n" +
            "                cerr << info[i];\n" +
            "            }\n" +
            "            cerr << \")\";\n" +
            "        }\n" +
            "        cerr << endl;\n" +
            "\n" +
            "        if (verdict == \"FAILED\") {\n";

    if (reType->getDataType()=="STRING" &&	!reType->isArray()) {
        mCode += 
            std::string("            cerr << \"    Expected: \\\"\" << expected << \"\\\"\" << endl;\n") +
            "            cerr << \"    Received: \\\"\" << received << \"\\\"\" << endl;\n";
    } else {
        mCode += 
            std::string("            cerr << \"    Expected: \" << expected << endl; \n") +
            "            cerr << \"    Received: \" << received << endl; \n";
    }
        mCode +=
            std::string("        }\n") +
            "\n" +
            "        return verdict == \"PASSED\";\n" +
            "    }\n" +
            "\n";
    return mCode;
}