public ConceptLattice irreducibleClosure() {
        ConceptLattice conceptLatice = new ConceptLattice();
        // associates each node to a new closed set of join irreducibles
        TreeSet<Node> meet = this.meetIrreducibles();
        TreeSet<Node> join = this.joinIrreducibles();
        TreeMap<Node, Concept> closure = new TreeMap<Node, Concept>();
        Lattice lattice = new Lattice(this);
        lattice.transitiveClosure();
        lattice.reflexiveClosure();
        for (Node to : lattice.getNodes()) {
            ComparableSet jx = new ComparableSet();
            for (Node from : lattice.getPredecessorNodes(to)) {
                if (join.contains(from)) {
                    jx.add(from);
                }
            }
            ComparableSet mx = new ComparableSet();
            for (Node from : lattice.getSuccessorNodes(to)) {
                if (meet.contains(from)) {
                    mx.add(from);
                }
            }
            closure.put(to, new Concept(jx, mx));
        }
        // addition of nodes
        for (Node n : this.getNodes()) {
            conceptLatice.addNode(closure.get(n));
        }
        // addition of edges
        for (Edge ed : this.getEdges()) {
            conceptLatice.addEdge(closure.get(ed.getFrom()), closure.get(ed.getTo()));
        }
        return conceptLatice;
    }