docs: private void computeMatrixTopoGraphHalfEdges_(int geometry_a, int geometry_b) {
  		boolean bRelationKnown = false;
  
  		int id_a = m_topo_graph.getGeometryID(geometry_a);
  		int id_b = m_topo_graph.getGeometryID(geometry_b);
  
  		m_visited_index = m_topo_graph.createUserIndexForHalfEdges();
  
  		for (int cluster = m_topo_graph.getFirstCluster(); cluster != -1; cluster = m_topo_graph
  				.getNextCluster(cluster)) {
  			int first_half_edge = m_topo_graph.getClusterHalfEdge(cluster);
              if (first_half_edge == -1)
              {
                  if (m_predicates_cluster != -1)
                  {
                      // Treat cluster as an interior point
                      switch (m_predicates_cluster)
                      {
                          case Predicates.AreaPointPredicates:
                              bRelationKnown = areaPointPredicates_(cluster, id_a, id_b);
                              break;
                          case Predicates.LinePointPredicates:
                              bRelationKnown = linePointPredicates_(cluster, id_a, id_b);
                              break;
                          default:
                              throw GeometryException.GeometryInternalError();
                      }
                  }
  
                  continue;
              }
  
  			int next_half_edge = first_half_edge;
  
  			do {
  				int half_edge = next_half_edge;
  				int visited = m_topo_graph.getHalfEdgeUserIndex(half_edge,
  						m_visited_index);
  
  				if (visited != 1) {
  					do {
  						// Invoke relational predicates
  						switch (m_predicates_half_edge) {
  						case Predicates.AreaAreaPredicates:
  							bRelationKnown = areaAreaPredicates_(half_edge,
  									id_a, id_b);
  							break;
  						case Predicates.AreaLinePredicates:
  							bRelationKnown = areaLinePredicates_(half_edge,
  									id_a, id_b);
  							break;
  						case Predicates.LineLinePredicates:
  							bRelationKnown = lineLinePredicates_(half_edge,
  									id_a, id_b);
  							break;
  						default:
  							throw GeometryException.GeometryInternalError();
  						}
  
  						if (bRelationKnown)
  							break;
  
  						m_topo_graph.setHalfEdgeUserIndex(half_edge,
  								m_visited_index, 1);
  						half_edge = m_topo_graph.getHalfEdgeNext(half_edge);
  					} while (half_edge != next_half_edge && !bRelationKnown);
  				}
  
  				if (bRelationKnown)
  					break;
  
  				next_half_edge = m_topo_graph.getHalfEdgeNext(m_topo_graph
  						.getHalfEdgeTwin(half_edge));
  			} while (next_half_edge != first_half_edge);
  
  			if (bRelationKnown)
  				break;
  		}
  
  		if (!bRelationKnown)
  			setRemainingPredicatesToFalse_();
  
  		m_topo_graph.deleteUserIndexForHalfEdges(m_visited_index);
  	}