returnValue FunctionEvaluationTree::exportCode(	FILE *file,
												const char *fcnName,
												const char *realString,
												int         precision,
												uint        _numX,
												uint		_numXA,
												uint		_numU,
												uint		_numP,
												uint		_numDX
												) const{

    int run1;
    int nni = 0;

	for (run1 = 0; run1 < n; run1++)
		if (lhs_comp[run1] + 1 > nni)
			nni = lhs_comp[run1] + 1;
	
	unsigned numX = _numX > 0 ? _numX : getNX();
	unsigned numXA = _numXA > 0 ? _numXA : getNXA();
	unsigned numU = _numU > 0 ? _numU : getNU();
	unsigned numP = _numP > 0 ? _numP : getNP();
	unsigned numDX = _numDX > 0 ? _numDX : getNDX();

	acadoFPrintf(file, "void %s(const %s* in, %s* out)\n{\n", fcnName,
			realString, realString);
    if( numX > 0 ){
        acadoFPrintf(file,"const %s* xd = in;\n", realString );
    }
    if( numXA > 0 ){
        acadoFPrintf(file,"const %s* xa = in + %d;\n", realString,numX );
    }
    if( getNU() > 0 ){
        acadoFPrintf(file,"const %s* u  = in + %d;\n", realString,numX+numXA );
    }
    if( getNUI() > 0 ){
        acadoFPrintf(file,"const %s* v  = in + %d;\n", realString,numX+numXA+numU );
    }
    if( numP > 0 ){
        acadoFPrintf(file,"const %s* p  = in + %d;\n", realString,numX+numXA+numU+getNUI() );
    }
    if( getNPI() > 0 ){
        acadoFPrintf(file,"const %s* q  = in + %d;\n", realString,numX+numXA+numU+getNUI()+numP );
    }
    if( getNW() > 0 ){
        acadoFPrintf(file,"const %s* w  = in + %d;\n", realString,numX+numXA+numU+getNUI()+numP+getNPI() );
    }
    if( numDX > 0 ){
        acadoFPrintf(file,"const %s* dx = in + %d;\n", realString,numX+numXA+numU+getNUI()+numP+getNPI()+getNW() );
    }
    if( getNT() > 0 ){
        acadoFPrintf(file,"const %s* t = in + %d;\n", realString,numX+numXA+numU+getNUI()+numP+getNPI()+getNW()+numDX );
    }
    if (n > 0)
    {
    	acadoFPrintf(file, "/* Vector of auxiliary variables; number of elements: %d. */\n", n);
    	acadoFPrintf(file, "%s* a = %s;\n", realString, globalExportVariableName.getName() );
    	acadoFPrintf(file, "\n/* Compute intermediate quantities; */\n");
    }

    Stream *auxVarIndividualNames = new Stream[nni];
	for( run1 = 0; run1 < n; run1++ )
		auxVarIndividualNames[lhs_comp[run1]] << "a" << "[" << run1 << "]";

	// Export intermediate quantities
	for (run1 = 0; run1 < n; run1++)
	{
		// Convert the name for intermediate variables for subexpressions
		sub[run1]->setVariableExportName(VT_INTERMEDIATE_STATE, auxVarIndividualNames);

		acadoFPrintf(file, "%s[%d] = ", "a", run1);
		file << *sub[run1];
		acadoFPrintf(file, ";\n");
	}

    acadoFPrintf(file,"\n/* Compute outputs: */\n");

	// Export output quantities
	for (run1 = 0; run1 < dim; run1++)
	{
		// Convert names for interm. quantities for output expressions
		f[run1]->setVariableExportName(VT_INTERMEDIATE_STATE, auxVarIndividualNames);

		acadoFPrintf(file, "out[%d] = ", run1);
		file << *f[run1];
		acadoFPrintf(file, ";\n");
	}

    acadoFPrintf(file,"}\n\n");

    delete [] auxVarIndividualNames;

    return SUCCESSFUL_RETURN;
}
returnValue FunctionEvaluationTree::exportCode(	FILE *file,
												const char *fcnName,
												const char *realString,
												int         precision,
												uint        _numX,
												uint		_numXA,
												uint		_numU
												) const{

    int run1;
    int nni = 0;

    for( run1 = 0; run1 < n; run1++ )
        if( lhs_comp[run1]+1 > nni )
            nni = lhs_comp[run1]+1;
	
	uint numX;
	if( _numX > 0 ) {
		numX = _numX;
	}
	else {
		numX = getNX();
	}
	
	uint numXA;
	if( _numXA > 0 ) {
		numXA = _numXA;
	}
	else {
		numXA = getNXA();
	}
	
	uint numU;
	if( _numU > 0 ) {
		numU = _numU;
	}
	else {
		numU = getNU();
	}

    acadoFPrintf(file,"void %s( const %s* acado_x, %s* acado_f ){\n", fcnName,realString,realString );
    if( numX > 0 ){
        acadoFPrintf(file,"const %s* acado_xd = acado_x;\n", realString );
    }
    if( numXA > 0 ){
        acadoFPrintf(file,"const %s* acado_xa = acado_x + %d;\n", realString,numX );
    }
    if( getNU() > 0 ){
        acadoFPrintf(file,"const %s* acado_u  = acado_x + %d;\n", realString,numX+numXA );
    }
    if( getNUI() > 0 ){
        acadoFPrintf(file,"const %s* acado_v  = acado_x + %d;\n", realString,numX+numXA+numU );
    }
    if( getNP() > 0 ){
        acadoFPrintf(file,"const %s* acado_p  = acado_x + %d;\n", realString,numX+numXA+numU+getNUI() );
    }
    if( getNPI() > 0 ){
        acadoFPrintf(file,"const %s* acado_q  = acado_x + %d;\n", realString,numX+numXA+numU+getNUI()+getNP() );
    }
    if( getNW() > 0 ){
        acadoFPrintf(file,"const %s* acado_w  = acado_x + %d;\n", realString,numX+numXA+numU+getNUI()+getNP()+getNPI() );
    }
    if( getNDX() > 0 ){
        acadoFPrintf(file,"const %s* acado_dx = acado_x + %d;\n", realString,numX+numXA+numU+getNUI()+getNP()+getNPI()+getNW() );
    }
    acadoFPrintf(file,"\n");
    acadoFPrintf(file,"/* COMPUTE INTERMEDIATE STATES: */\n");
    acadoFPrintf(file,"/* ---------------------------- */\n");

    //
    // This is a (not so quick) hack to have a flexible name for interm.
    // quantities, but helps. It general case it should be done with
    // ExportVariable -- to be able to set a working structure, too. So:
    //
    // TODO: setGlobalExportvariable should set the full name once....
    //

    String auxVarName;
    if ( auxVariableStructName.isEmpty() )
    {
    	auxVarName = auxVariableName;
    }
    else
    {
    	auxVarName = auxVariableStructName;
    	auxVarName += ".";
    	auxVarName += auxVariableName;
    }

    Stream *auxVarIndividualNames = new Stream[nni];
	for( run1 = 0; run1 < n; run1++ )
		auxVarIndividualNames[lhs_comp[run1]] << auxVarName << "[" << run1 << "]";


    // Export intermediate quantities
    for( run1 = 0; run1 < n; run1++ )
    {
    	// Convert the name for intermediate variables for subexpressions
    	sub[ run1 ]->setVariableExportName(VT_INTERMEDIATE_STATE, auxVarIndividualNames );

        acadoFPrintf(file,"%s[%d] = ", auxVarName.getName(), run1 );
        file << *sub[run1];
        acadoFPrintf(file,";\n");
    }

    acadoFPrintf(file,"\n");
    acadoFPrintf(file,"/* COMPUTE OUTPUT: */\n");
    acadoFPrintf(file,"/* --------------- */\n");

    // Export output quantities
    for( run1 = 0; run1 < dim; run1++ )
    {
    	// Convert names for interm. quantities for output expressions
    	f[ run1 ]->setVariableExportName(VT_INTERMEDIATE_STATE, auxVarIndividualNames );

    	acadoFPrintf(file,"acado_f[%d] = ", run1 );
        file << *f[run1];
        acadoFPrintf(file,";\n");
    }

    acadoFPrintf(file,"}\n\n");

    delete [] auxVarIndividualNames;

    return SUCCESSFUL_RETURN;
}