示例#1
0
Expression::Expression(
		const char* expr,
		const PiSDFParam* const * params, int nParam){
	nElt_ = evaluateNTokens(expr);
	stack_ = CREATE_MUL(PISDF_STACK, nElt_, Token);

	Token* output = stack_;
	Token stack[MAX_NVAR_ELEMENTS];
	int ixOutput = 0;
	int ixStack = 0;

	const char *ptr = expr;
	Token t;

	while(getNextToken(&t, &ptr, params, nParam)){
		switch(t.type){
		case VALUE:
		case PARAMETER:
			output[ixOutput++] = t;
			break;
		case OPERATOR:
			while(ixStack > 0
					&& stack[ixStack-1].type == OPERATOR
					&& precedence[t.opType] <= precedence[stack[ixStack-1].opType]){
				ixStack--;
				output[ixOutput++] = stack[ixStack];
			}
			stack[ixStack++] = t;
			break;
		case LEFT_PAR:
			stack[ixStack++] = t;
			break;
		case RIGHT_PAR:
			while(ixStack > 0 && stack[ixStack-1].type != LEFT_PAR){
				ixStack--;
				output[ixOutput++] = stack[ixStack];
			}
			if(ixStack == 0){
				throw "Parsing Error missing left parenthesis\n";
			}
			ixStack--;
			break;
		}
	}

	while(ixStack > 0){
		ixStack--;
		output[ixOutput++] = stack[ixStack];
	}
	nElt_ = ixOutput;
}
示例#2
0
int nullSpace(int* topo_matrix, int* brv, int nbEdges, int nbVertices){
	Rational* ratioMatrix = CREATE_MUL(TRANSFO_STACK, nbVertices*nbEdges, Rational);
	Rational* ratioResult = CREATE_MUL(TRANSFO_STACK, nbVertices, Rational);

//	printf("Topo Matrix:\n");
//	for(int i=0; i<nbEdges; i++){
//		for(int j=0; j<nbVertices; j++){
//			printf("%d : ", topo_matrix[i*nbVertices+j]);
//		}
////		printf("\033[2D");
//		printf("\n");
//	}

	/* Copy matrix into ratioMatrix */
	for(int i=0; i<nbEdges*nbVertices; i++){
		ratioMatrix[i] = topo_matrix[i];
	}

//	printf("Topo Matrix: Rational\n");
//	for(int i=0; i<nbEdges; i++){
//		for(int j=0; j<nbVertices; j++){
//			printf("%d,%d : ", ratioMatrix[i*nbVertices+j].getNominator(), ratioMatrix[i*nbVertices+j].getDenominator());
//		}
////		printf("\033[2D");
//		printf("\n");
//	}

	for (int i=0; i < nbEdges; i++) {
		Rational pivotMax = ratioMatrix[i*nbVertices+i].getAbs();
		int maxIndex = i;

		for (int t = i+1; t < nbEdges; t++) {
			Rational newPivot = ratioMatrix[t*nbVertices+i].getAbs();
			if (newPivot > pivotMax) {
				maxIndex = t;
				pivotMax = newPivot;
			}
		}

		if (pivotMax != 0 && maxIndex != i) {
			/* Switch Rows */
			Rational tmp;
			for (int t = 0; t < nbVertices; t++) {
				tmp = ratioMatrix[maxIndex*nbVertices+t];
				ratioMatrix[maxIndex*nbVertices+t] = ratioMatrix[i*nbVertices+t];
				ratioMatrix[i*nbVertices+t] = tmp;
			}
		} else if (maxIndex == i && (pivotMax != 0)) {
			/* Do nothing */
		} else {
			break;
		}

		Rational odlPivot = ratioMatrix[i*nbVertices+i];
		for (int t = i; t < nbVertices; t++) {
			ratioMatrix[i*nbVertices+t] = ratioMatrix[i*nbVertices+t] / odlPivot;
		}

		for (int j = i + 1; j < nbEdges; j++) {
			if (ratioMatrix[j*nbVertices+i] != 0) {
				Rational oldji = ratioMatrix[j*nbVertices+i];

				for (int k = 0; k < nbVertices; k++) {
					ratioMatrix[j*nbVertices+k] =
							ratioMatrix[j*nbVertices+k] - (oldji * ratioMatrix[i*nbVertices+k]);
				}
			}
		}
	}

	for (int i = 0; i < nbVertices; i++) {
		ratioResult[i] = 1;
	}

	for(int i = nbEdges-1; i >= 0; i--){
		Rational val = 0;

		for (int k = i + 1; k < nbVertices; k++) {
			val = val + (ratioMatrix[i*nbVertices+k] * ratioResult[k]);
		}
		if (val != 0) {
			if(ratioMatrix[i*nbVertices+i] == 0){
				throw "elt diagonal zero\n";
			}
			ratioResult[i] = val.getAbs() / ratioMatrix[i*nbVertices+i];
		}
	}

	int lcm = 1;
	for(int i=0; i<nbVertices; i++){
		lcm = compute_lcm(lcm, ratioResult[i].getDenominator());
	}
	for(int i=0; i<nbVertices; i++){
		brv[i] = abs(ratioResult[i].getNominator() * lcm / ratioResult[i].getDenominator());
	}

	StackMonitor::free(TRANSFO_STACK, ratioMatrix);
	StackMonitor::free(TRANSFO_STACK, ratioResult);

	return 0;
}
示例#3
0
文件: lrt.cpp 项目: hewumars/Spider
int LRT::runOneJob(){
	void* msg;
	if(Platform::getLrtCommunicator()->ctrl_start_recv(&msg)){
		switch(((UndefinedMsg*) msg)->msgIx){
		case MSG_START_JOB:{
			StartJobMsg* jobMsg = (StartJobMsg*) msg;
			Fifo *inFifos = (Fifo*) ((char*)jobMsg + 1*sizeof(StartJobMsg));
			Fifo *outFifos = (Fifo*) ((char*)inFifos + jobMsg->nbInEdge*sizeof(Fifo));
			Param *inParams = (Param*) ((char*)outFifos + jobMsg->nbOutEdge*sizeof(Fifo));

			void** inFifosAlloc = CREATE_MUL(stack_, jobMsg->nbInEdge, void*);
			void** outFifosAlloc = CREATE_MUL(stack_, jobMsg->nbOutEdge, void*);
			Param* outParams = CREATE_MUL(stack_, jobMsg->nbOutParam, Param);

			for(int i=0; i<(int)jobMsg->nbInEdge; i++){
				inFifosAlloc[i] = (void*) Platform::getLrtCommunicator()->data_recv(&inFifos[i]);
			}

			for(int i=0; i<(int)jobMsg->nbOutEdge; i++){
				outFifosAlloc[i] = (void*) Platform::getLrtCommunicator()->data_start_send(&outFifos[i]);
			}

			Time start = Platform::get()->getTime();

			if(jobMsg->specialActor && jobMsg->fctIx < 6)
				specialActors[jobMsg->fctIx](inFifosAlloc, outFifosAlloc, inParams, outParams);
			else if((int)jobMsg->fctIx < nFct_)
				fcts_[jobMsg->fctIx](inFifosAlloc, outFifosAlloc, inParams, outParams);
			else
				throw "Cannot find actor function\n";

			Time end = Platform::get()->getTime();

			sendTrace(jobMsg->srdagIx, start, end);

			for(int i=0; i<(int)jobMsg->nbOutEdge; i++){
				Platform::getLrtCommunicator()->data_end_send(&outFifos[i]);
			}

			if(jobMsg->nbOutParam != 0){
				int size = sizeof(ParamValueMsg)+jobMsg->nbOutParam*sizeof(Param);
				ParamValueMsg* msgParam = (ParamValueMsg*) Platform::getLrtCommunicator()->ctrl_start_send(size);
				Param* params = (Param*)(msgParam+1);

				msgParam->msgIx = MSG_PARAM_VALUE;
				msgParam->srdagIx = jobMsg->srdagIx;
				memcpy(params, outParams, jobMsg->nbOutParam*sizeof(Param));

				Platform::getLrtCommunicator()->ctrl_end_send(size);
			}

			stack_->free(inFifosAlloc);
			stack_->free(outFifosAlloc);
			stack_->free(outParams);
			stack_->freeAll();
			break;
		}
		case MSG_CLEAR_TIME:{
			ClearTimeMsg* timeMsg = (ClearTimeMsg*) msg;
			Platform::get()->rstTime(timeMsg);
			break;}
		case MSG_STOP_LRT:
			run_ = false;
			break;
		case MSG_PARAM_VALUE:
		default:
			throw "Unexpected message received\n";
		}
		Platform::getLrtCommunicator()->ctrl_end_recv();
		return 1;
	}
	return 0;
}