FilterTraceNode[] previous = getPreviousFilters();
    private int calculateRemaining()     {	//the number of times this filter fires in the initialization	//schedule	int initFire = initMult;	//for now assume it is a filter trace node	FilterTraceNode[] previous = getPreviousFilters();	//if this is not a twostage, fake it by adding to initFire,	//so we always think the preWork is called	//if (!(filter instanceof SIRTwoStageFilter))	if(filter.isTwoStage())	    initFire++;		//the number of items produced by the upstream filter in	//initialization	int upStreamItems = 0;		if (previous.length == 1) {	    //calculate upstream items received during init  SPLITTER? change this...	    upStreamItems = previous[0].getFilter().getPushInt() * 		previous[0].getInitMult();	    if (previous[0].getFilter().isTwoStage()) {		/*upStreamItems -= ((SIRTwoStageFilter)previous.getFilter()).getPushInt();		  upStreamItems += ((SIRTwoStageFilter)previous.getFilter()).getInitPush();*/		upStreamItems -= previous[0].getFilter().getPushInt();		upStreamItems += previous[0].getFilter().getInitPush();	    }	}	else if (previous.length > 1)	    Utils.fail("Splits/Joins not supported");		//see my thesis for an explanation of this calculation	if (initFire  - 1 > 0) {	    bottomPeek = Math.max(0, 				  peek - (prePeek - prePop));	}	else	    bottomPeek = 0;		//may want to change to use initItemsReceived...	remaining = upStreamItems -	    (prePeek + 	     bottomPeek + 	     Math.max((initFire - 2), 0) * pop);		return remaining;    }