B[xStart][xStart+xWidth][i1][i2] = B[0][xWidth][i1][i2];
    private void initUniform() {	// find the uniform rows	WorkEstimate work = partitioner.getWorkEstimate();	for (int i=0; i<uniform.length; i++) {	    SIRStream child1 = childConfig(0, i).getStream();	    int work1=0;	    // right now work estimate is stupid and only gets filter	    // works... should be extended to deal with containers and	    // pre-defined filters as well.	    if (child1 instanceof SIRFilter && !(child1 instanceof SIRPredefinedFilter)) {		work1 = work.getWork((SIRFilter)child1);	    } else {		continue;	    }	    // will try disproving this	    uniform[i] = true;	    search:	    for (int j=1; j<width[i]; j++) {		SIRStream child2 = childConfig(j, i).getStream();		if (!(child2 instanceof SIRFilter) || (child2 instanceof SIRPredefinedFilter) || work1!=work.getWork((SIRFilter)child2)) {		    uniform[i] = false;		    break search;		}	    }	}	// print out the uniform rows	/*	for (int i=0; i<uniform.length; i++) {	    if (uniform[i] && width[i]>1) {		System.err.println("Found row " + i + "/" + (uniform.length-1) + " of " + cont.getName() + " to be uniform.");	    }	}	*/	// now find maximal uniform regions with the same width, and alias their memoization tables	int low=0;	while (low<uniform.length) {	    while (low<uniform.length && !uniform[low]) {		low++;	    }	    if (low<uniform.length) {		int high = low;		while (high+1<uniform.length && uniform[high+1] && (width[high+1]==width[low])) {		    high++;		}		// alias low..high across the board, to point to values in 0'th column		for (int i1=low; i1<=high; i1++) {		    // only aliasing from i2=i1..high matters, but we'd just as well go i2=low...high		    for (int i2=low; i2<=high; i2++) {			for (int xWidth=0; xWidth<width[low]-1; xWidth++) {			    for (int xStart=1; xStart<width[low]-xWidth; xStart++) {				A[xStart][xStart+xWidth][i1][i2] = A[0][xWidth][i1][i2];			    }			}		    }		}	    }	    low++;	}    }