/*
   * (non-Javadoc)
   * @see de.hpi.bpt.hypergraph.abs.IDirectedHyperGraph#getEdgesWithSourcesAndTargets(java.util.Collection, java.util.Collection)
   */
  public Collection<E> getEdgesWithSourcesAndTargets(Collection<V> ss, Collection<V> ts) {
    Collection<E> result = new ArrayList<E>();
    if (ss == null && ts == null) return result;
    if (ss.size() == 0 && ts.size() == 0) return result;

    if (ss != null && ss.size() > 0) {
      V v = ss.iterator().next();
      Collection<E> es = this.getEdgesWithSource(v);
      if (es == null) return result;
      Iterator<E> i = es.iterator();
      while (i.hasNext()) {
        E e = i.next();
        if (e.hasSources(ss) && e.hasTargets(ts)) result.add(e);
      }
    } else if (ts != null && ts.size() > 0) {
      V v = ts.iterator().next();
      Collection<E> es = this.getEdgesWithTarget(v);
      if (es == null) return result;
      Iterator<E> i = es.iterator();
      while (i.hasNext()) {
        E e = i.next();
        if (e.hasSources(ss) && e.hasTargets(ts)) result.add(e);
      }
    }

    return result;
  }
  /*
   * (non-Javadoc)
   * @see de.hpi.bpt.hypergraph.abs.IDirectedHyperGraph#getEdgesWithSources(java.util.Collection)
   */
  public Collection<E> getEdgesWithSources(Collection<V> vs) {
    Collection<E> result = new ArrayList<E>();
    if (vs == null || vs.size() == 0) return result;

    Iterator<E> i = this.getEdges(vs.iterator().next()).iterator();
    while (i.hasNext()) {
      E e = i.next();
      if (e.hasSources(vs)) result.add(e);
    }

    return result;
  }