private void updateStats(double currentTime, EventNetwork g) {
		//carter butts style two paths
		//see his paper "A relational event framework for social action"
		//for a source and a target node
		//we look at all possible intermediaries and take the minimum of the path from source to inter, or inter to target
		//and all all those up
		
		//there's got to be a more efficient way to do this than i am
		
		DenseMatrix64F edgeMatrix1 = g.getEdgeMatrix(m_attr1, currentTime);
		DenseMatrix64F edgeMatrix2 = g.getEdgeMatrix(m_attr2, currentTime);
		
		//matrix building grunt work
		if( m_dir1 == Direction.IN ) {
			CommonOps.transpose(edgeMatrix1);
		}
		
		if( m_dir2 == Direction.IN ) {
			CommonOps.transpose(edgeMatrix2);
		}
		
		///HAHAHA MATRIX MULTIPLICATION IS DISTRIBUTIVE WAOOOSH
		if( m_dir1 == Direction.SYM ) {
			DenseMatrix64F edgeMatrix1T = edgeMatrix1.copy();
			CommonOps.transpose(edgeMatrix1T);
			CommonOps.addEquals(edgeMatrix1, edgeMatrix1T);
		}
		
		if( m_dir2 == Direction.SYM ) {
			DenseMatrix64F edgeMatrix2T = edgeMatrix2.copy();
			CommonOps.transpose(edgeMatrix2T);
			CommonOps.addEquals(edgeMatrix2, edgeMatrix2T);
		}
		
		
		//and now let's do the adding up
		m_twoPaths = new DenseMatrix64F(edgeMatrix1.numRows, edgeMatrix2.numCols);
		for(int src = 0; src < edgeMatrix1.numRows; src++) {
			for(int trg = 0; trg < edgeMatrix2.numCols; trg++) {
				double summand = 0.0;
				for(int proxy = 0; proxy < edgeMatrix1.numCols; proxy++) {
					summand += Math.min(edgeMatrix1.get(src, proxy), edgeMatrix2.get(proxy, trg));
				}
				m_twoPaths.set(src, trg, summand);
			}
		}
		
		//VITAL SIDE EFFECT STEP
		statsTime = currentTime;
	}