o
    ˷ed                     @   s   d dl mZ d dlmZmZ d dlZd dlZd dlm	Z	m
Z
 dd ZG dd dZG d	d
 d
ZG dd dZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& ZG d'd( d(Zd)d* ZdS )+    deque)combinationspermutationsN)edges_equalpairwisec                 C   s   t | dd dS )zConsume the iterator entirely.r   )maxlenNr   )iterator r
   Y/var/www/ideatree/venv/lib/python3.10/site-packages/networkx/algorithms/tests/test_dag.py_consume   s   r   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )TestDagLongestPathzBUnit tests computing the longest path in a directed acyclic graph.c                 C   s   t  }t |g ksJ d S NnxDiGraphdag_longest_pathselfGr
   r
   r   
test_empty      zTestDagLongestPath.test_emptyc                 C   ,   g d}t |}t |g dksJ d S )N)      r      r      r      r!      )r      )r   r   r   r!   r#   r   r   edgesr   r
   r
   r   test_unweighted1      
z#TestDagLongestPath.test_unweighted1c                 C   r   )Nr   r   r   r   r   r!   r   r   r   r!   r    r   r   r   r   r!   r   r%   r
   r
   r   test_unweighted2   r(   z#TestDagLongestPath.test_unweighted2c                 C   s4   t  }g d}|| t |g dksJ d S )N)r   r   )r   r   r   )r   r   r   )r   r!   r   )r   r!   r   )r   r#   r   )r   r   r!   )r   r   add_weighted_edges_fromr   )r   r   r&   r
   r
   r   test_weighted"   s   
z TestDagLongestPath.test_weightedc                 C      t  }tt jt j| d S r   )r   GraphpytestraisesNetworkXNotImplementedr   r   r
   r
   r   test_undirected_not_implemented(   r   z2TestDagLongestPath.test_undirected_not_implementedc                 C   sx   dd t dD }t }||d |d  ||d |d  ||d |d  ||d |d  t| dS )	zTests that computing the longest path does not depend on
        nodes being orderable.

        For more information, see issue #1989.

        c                 S   s   g | ]}t  qS r
   )object.0nr
   r
   r   
<listcomp>5   s    z=TestDagLongestPath.test_unorderable_nodes.<locals>.<listcomp>r   r   r   r   r   N)ranger   r   add_edger   )r   nodesr   r
   r
   r   test_unorderable_nodes,   s   	z)TestDagLongestPath.test_unorderable_nodesN)
__name__
__module____qualname____doc__r   r'   r/   r3   r9   rB   r
   r
   r
   r   r      s    r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TestDagLongestPathLengthz\Unit tests for computing the length of a longest path in a
    directed acyclic graph.

    c                 C   sp   g d}t |}t |dksJ g d}t |}t |dks$J t  }|d t |dks6J d S )Nr   r   r   r    r"   )r!   r$   r   r)   r   r   )r   r   dag_longest_path_lengthadd_noder%   r
   r
   r   test_unweightedF   s   


z(TestDagLongestPathLength.test_unweightedc                 C   r4   r   )r   r5   r6   r7   r8   rI   r   r
   r
   r   r9   T   r   z8TestDagLongestPathLength.test_undirected_not_implementedc                 C   s0   g d}t  }|| t |dksJ d S )Nr0   r!   )r   r   r2   rI   r%   r
   r
   r   r3   X   s   
z&TestDagLongestPathLength.test_weightedN)rC   rD   rE   rF   rK   r9   r3   r
   r
   r
   r   rG   @   s
    rG   c                   @   s   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1S )2TestDAGc                 C   s   d S r   r
   )clsr
   r
   r   setup_class`   s   zTestDAG.setup_classc                 C   s   t g d}t jt jfD ]}t||dksJ q|dd t jt jfD ]}tt jt	|| q&|
dd t jt jfD ]}t||dksKJ q?|
dd tt |dv s]J tt |dkshJ d S )N)r   r,   r   r   r   r   r   r   r   r   r   >   rO   rP   )r   r   topological_sort lexicographical_topological_sorttupler@   r6   r7   NetworkXUnfeasibler   remove_edge)r   DG	algorithmr
   r
   r   test_topological_sort1d   s   zTestDAG.test_topological_sort1c                 C   s`   t jd}t |rJ t | rJ t t ddgr"J t t ddgs.J d S )Nr   r*   r+   )r   
generatorscomplete_graphis_directed_acyclic_graphto_directedr5   r   r   r
   r
   r   test_is_directed_acyclic_graphy   s
   z&TestDAG.test_is_directed_acyclic_graphc                 C   s   t dgdgdgdgdgdgdgdgd	gd
	}tt jtt | t |r*J |dd tt | t |s>J d S )Nr   r   r   r!   r               )	r   r   r   r   r!      r^   r_   r`   )	r   r   r6   r7   rT   r   rQ   r[   rU   r   rV   r
   r
   r   test_topological_sort2   s"   zTestDAG.test_topological_sort2c                    s   t    dd tddD   dd tddD   dd tddD   d	d tdd
D   fdd}|tt    dd tt j	t
t   d S )Nc                 S      g | ]}d |fqS )r   r
   r<   ir
   r
   r   r>          z2TestDAG.test_topological_sort3.<locals>.<listcomp>r   r!   c                 S   re   )r   r
   rf   r
   r
   r   r>      rh   	   c                 S   re   )r#   r
   rf   r
   r
   r   r>      rh   r^   c                 S   re   )r   r
   rf   r
   r
   r   r>      rh   ra   c                    sL   t | tsJ t| t ksJ t| dD ]\}}t ||r#J qd S )Nr   )
isinstancelistsetr   r   has_path)orderuvrV   r
   r   validate   s
   z0TestDAG.test_topological_sort3.<locals>.validater`   r   )r   r   add_edges_fromr?   rk   rQ   r@   r6   r7   rT   r   )r   rr   r
   rq   r   test_topological_sort3   s   zTestDAG.test_topological_sort3c                 C   s.   t  }|dd tt jtt | d S )Nr   r   )r   r5   r@   r6   r7   NetworkXErrorr   rQ   r   r
   r
   r   test_topological_sort4   s   zTestDAG.test_topological_sort4c                 C   s2   t  }|dd tt |ddgksJ d S )Nr   r   )r   r   r@   rk   rQ   r   r
   r
   r   test_topological_sort5   s   zTestDAG.test_topological_sort5c                    s`   t jt jfD ]'  fdd} fdd} fdd}tt| tt| tt j| qd S )Nc                     s<   t g d} d} | D ]}|rd}| d| d qd S )Nr   r   r*   TFr!   )r   r   r@   rV   firstxrW   r
   r   runtime_error   s   z5TestDAG.test_topological_sort6.<locals>.runtime_errorc                     6   t g d} d} | D ]}|rd}| d qd S )Nrx   TFr   r   r   remove_nodery   r|   r
   r   unfeasible_error      
z8TestDAG.test_topological_sort6.<locals>.unfeasible_errorc                     r~   )Nrx   TFr   r   ry   r|   r
   r   runtime_error2   r   z6TestDAG.test_topological_sort6.<locals>.runtime_error2)r   rQ   rR   r6   r7   RuntimeErrorrT   )r   r}   r   r   r
   r|   r   test_topological_sort6   s   zTestDAG.test_topological_sort6c                 C   s.   t g d}tt |g dgksJ d S )N)r   r   r*   r+   r.   r   r   rk   all_topological_sortsrc   r
   r
   r   test_all_topological_sorts_1   s    z$TestDAG.test_all_topological_sorts_1c                 C   sF   t g d}tt |g dg dg dg dg dgks!J d S )N)r,   r   r   r   r   r   r+   )r   r   r   r   r!   )r   r   r   r!   r   )r   r   r   r   r!   )r   r   r   r!   r   )r   r   r!   r   r   )r   r   sortedr   rc   r
   r
   r   test_all_topological_sorts_2   s   z$TestDAG.test_all_topological_sorts_2c                 C   sF   dd }dd }dd }t tj| t tj| t tj| d S )Nc                  S       t g d} tt |  d S )N)r   r   r*   r   r   r+   r   rq   r
   r
   r   
unfeasible      z8TestDAG.test_all_topological_sorts_3.<locals>.unfeasiblec                  S   s    t ddg} tt |  d S )Nr   r   )r   r5   rk   r   r   r
   r
   r   not_implemented   r   z=TestDAG.test_all_topological_sorts_3.<locals>.not_implementedc                  S   r   )N)r   r   r   )r   
MultiGraphrk   r   r   r
   r
   r   not_implemted_2   s   z=TestDAG.test_all_topological_sorts_3.<locals>.not_implemted_2)r6   r7   r   rT   r8   )r   r   r   r   r
   r
   r   test_all_topological_sorts_3   s   z$TestDAG.test_all_topological_sorts_3c                 C   sJ   t  }tdD ]}|| qtttt|jtt 	|ks#J d S )Nr$   )
r   r   r?   rJ   r   maprk   r   rA   r   )r   rV   rg   r
   r
   r   test_all_topological_sorts_4   s   z$TestDAG.test_all_topological_sorts_4c                 C   s8   t g d}tt |tg dg dgksJ d S )N)r   r   r   r*   r    r    r    r.   )r   r   r   r!   r   )r   MultiDiGraphr   r   rc   r
   r
   r   'test_all_topological_sorts_multigraph_1   s   z/TestDAG.test_all_topological_sorts_multigraph_1c                 C   sd   d}g }t d|D ]}|||d fg|  q	t|}tt|tt d|d gks0J d S )Nri   r   )r?   extendr   r   rk   r   )r   Nr&   rg   rV   r
   r
   r   'test_all_topological_sorts_multigraph_2  s   
*z/TestDAG.test_all_topological_sorts_multigraph_2c                 C   sv   t  }t jjj}|g d ||dh dksJ ||dddhks&J ||dt ks0J tt j	||d d S )Nr   r,   r   r   r+   r   r#   r"   r#   >   r   r   r   r!   r   r   r      )
r   r   
algorithmsdag	ancestorsrs   rl   r6   r7   ru   )r   r   r   r
   r
   r   test_ancestors	     
zTestDAG.test_ancestorsc                 C   sv   t  }t jjj}|g d ||dh dksJ ||dh dks&J ||dt ks0J tt j	||d d S )Nr   r   >   r   r   r#   r   >   r   r   r!   r#   r   r   )
r   r   r   r   descendantsrs   rl   r6   r7   ru   )r   r   r   r
   r
   r   test_descendants  r   zTestDAG.test_descendantsc                 C   s4  t g d}g d}tt | |sJ t g d}g d}tt | |s.J t g d}g d}t|dd |D  }ttt | |sRJ t g d}g d}ttt | |skJ t g d}g d}ttt | |sJ t g d}g d}ttt | |sJ t d	d
ddifd
dddifdg}t |}| D ]\}}|	|||	||ksJ qd}t dd t
|D }t |}| D ]\}}|	|||	||ksJ qt  }tt j t j|dd W d    d S 1 sw   Y  d S )Nrx   r   r,   r   r   r   r   r*   r   r   r   r   r,   r   r   r   r   r   r   r   r   r   r   )r   r   r,   r   c                 S      g | ]}||fqS r
   r
   r;   r
   r
   r   r>   $  rh   z3TestDAG.test_transitive_closure.<locals>.<listcomp>r   r   ar   br   r*   
   c                 s   $    | ]}||d  d|dfV  qdS )r   r   )fweightNr
   rf   r
   r
   r   	<genexpr>:     " z2TestDAG.test_transitive_closure.<locals>.<genexpr>zwrong input)	reflexive)r   r   r   transitive_closurer&   r   r5   r   r   get_edge_datar?   r6   r7   ru   )r   r   solutionsolnHro   rp   kr
   r
   r   test_transitive_closure  s@   $

$zTestDAG.test_transitive_closurec                 C   s  t g d}g d}t|dd |D  }tt | |s"J tt |d |s/J tt |d |s<J tt |d  |sIJ t g d}g d}t|d	d |D  }tt | |skJ tt |d |sxJ tt |d |sJ tt |d  |sJ t g d
}tg d}t|dd |D  }ttt | |sJ ttt |d |sJ ttt |d  |sJ ttt |d |sJ t g d}g d}t|dd |D  }tt | |sJ tt |d |sJ tt |d |s$J tt |d  |s2J t g d}g d}t|dd |D  }tt | |sUJ tt |d |scJ tt |d |sqJ tt |d  |sJ t g d}g d}t|dd |D  }tt | |sJ tt |d |sJ tt |d |sJ tt |d  |sJ d S )Nrx   r   c                 S   r   r
   r
   r;   r
   r
   r   r>   F  rh   z=TestDAG.test_reflexive_transitive_closure.<locals>.<listcomp>FTr   r   c                 S   r   r
   r
   r;   r
   r
   r   r>   N  rh   r   r   c                 S   r   r
   r
   r;   r
   r
   r   r>   V  rh   c                 S   r   r
   r
   r;   r
   r
   r   r>   ^  rh   c                 S   r   r
   r
   r;   r
   r
   r   r>   f  rh   c                 S   r   r
   r
   r;   r
   r
   r   r>   n  rh   )	r   r   r   r   r   r&   r5   r   r   )r   r   r   r   r
   r
   r   !test_reflexive_transitive_closureC  sT    z)TestDAG.test_reflexive_transitive_closurec                 C   s0  t g d}t jjj}g d}t|| |sJ t g d}g d}t|| |s1J t g d}t	t j
|| t ddddifddd	d
ifdg}||}| D ]\}}||||||kslJ qZd}t dd t|D }||}| D ]\}}||||||ksJ qd S )Nrx   r   r   r   r   r   r   r   r   r   r*   r   c                 s   r   )r   bar)foor   Nr
   rf   r
   r
   r   r     r   z6TestDAG.test_transitive_closure_dag.<locals>.<genexpr>)r   r   r   r   transitive_closure_dagr   r&   r5   r6   r7   r8   r   r?   )r   r   r   r   r   ro   rp   r   r
   r
   r   test_transitive_closure_dagt  s&   
$z#TestDAG.test_transitive_closure_dagc                 C   s   t g d}t jjj}g d}t|| |sJ t g d}t jjj}g d}t|| |s6J t g d}t	t j
|| d S )Nr   rx   r   r   )r   r   r   r   transitive_reductionr   r&   r5   r6   r7   r8   )r   r   r   r   r
   r
   r   test_transitive_reduction  s   

z!TestDAG.test_transitive_reductionc                 C   s4   dd |D }dd |D }t |t |ksJ d S )Nc                 S      g | ]}t |qS r
   	frozensetr<   r   r
   r
   r   r>     rh   z-TestDAG._check_antichains.<locals>.<listcomp>c                 S   r   r
   r   r   r
   r
   r   r>     rh   )rl   )r   r   resultsolresr
   r
   r   _check_antichains  s   zTestDAG._check_antichainsc                    s0  t jjj t g d}g dgdgdgdgg}| t || t g d}g dgdgddgdgddgddgg d	d
gd
dgdgddgdgdgg}| t || t g d}g dgd
gdgddgdd
gdgdgddgdd
gddgg dg dddgdgg}| t || t ddgdgdgdgd}g dgdgdgdgddgddgdgg}| t || t  }| t |g g t  }|g d g dgdgddgdgddgddgg dg}| t ||  fdd}t g d}t	
t j|| t g d}t	
t j|| d S )Nrx   r   r   r   r   rH   r$   r#   )r#   r$   r   r!   )r   r,   r*   r    r"   )r   r   r#   )r   r   r!   )r   r   r   r   r   r   r   r   )r   r   r   c                    s   t  | S r   )rk   r{   
antichainsr
   r   r     s   z"TestDAG.test_antichains.<locals>.fr   )r   r   r   r   r   r   rk   add_nodes_fromr5   r6   r7   r8   rT   )r   r   r   r   r
   r   r   test_antichains  sj   
&*zTestDAG.test_antichainsc                 C   sp   t g d}tt |g dksJ tt j|dd dg dks%J tt j|dd dg dks6J d S )N)r   r   r   r-   r   )r   r   r   r   r!   r#   c                 S   s   | S r   r
   r   r
   r
   r   <lambda>  s    z?TestDAG.test_lexicographical_topological_sort.<locals>.<lambda>keyc                 S   s   |  S r   r
   r   r
   r
   r   r     s    )r   r!   r   r   r#   r   )r   r   rk   rR   r   r
   r
   r   %test_lexicographical_topological_sort  s   "&z-TestDAG.test_lexicographical_topological_sortc                    sv   G dd d dd } fddt dD t }g d}|fd	d
|D  ttj||d}|ks9J dS )z
        Check the case of two or more nodes with same key value.
        Want to avoid exception raised due to comparing nodes directly.
        See Issue #3493
        c                   @   s   e Zd Zdd Zdd ZdS )zATestDAG.test_lexicographical_topological_sort2.<locals>.Test_Nodec                 S   s   || _ d| _d S )Nr   )labelpriority)r   r=   r
   r
   r   __init__  s   
zJTestDAG.test_lexicographical_topological_sort2.<locals>.Test_Node.__init__c                 S   s   d| j  dS )NzNode())r   r   r
   r
   r   __repr__  s   zJTestDAG.test_lexicographical_topological_sort2.<locals>.Test_Node.__repr__N)rC   rD   rE   r   r   r
   r
   r
   r   	Test_Node  s    r   c                 S   s   | j S r   )r   )noder
   r
   r   sorting_key  s   zCTestDAG.test_lexicographical_topological_sort2.<locals>.sorting_keyc                    s   g | ]} |qS r
   r
   r;   )r   r
   r   r>     rh   zBTestDAG.test_lexicographical_topological_sort2.<locals>.<listcomp>r   )r   r   r   r   )r   r   r   c                 3   s$    | ]\}} |  | fV  qd S r   r
   )r<   r   r   )
test_nodesr
   r   r     r   zATestDAG.test_lexicographical_topological_sort2.<locals>.<genexpr>r   N)r?   r   r   rs   rk   rR   )r   r   r   r&   sortingr
   )r   r   r   &test_lexicographical_topological_sort2  s   z.TestDAG.test_lexicographical_topological_sort2N)rC   rD   rE   classmethodrN   rX   r]   rd   rt   rv   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   rL   _   s4    

		(1<rL   c               
   C   s   t ddgddgdgg ddgg g d } dd	 t | D }g d
ddgdgdgg}||ks2J t | j}|dd dd	 t |D }||ksNJ d S )Nr   r   r   r!   r$   r#   )r   r   r   r   r!   r#   r$   c                 S   r   r
   r   r<   genr
   r
   r   r>     rh   z0test_topological_generations.<locals>.<listcomp>)r   r#   r$   r   c                 S   r   r
   r   r   r
   r
   r   r>     rh   )r   r   reversetopological_generationsr   r&   r@   )r   generationsexpectedMGr
   r
   r   test_topological_generations  s    r   c                  C   s"   t  } tt | g ksJ d S r   )r   r   rk   r   r   r
   r
   r   "test_topological_generations_empty  s   r   c                  C   s\   t ddgddgddgg} tt j tt |  W d    d S 1 s'w   Y  d S )Nr   r   r   )r   r   r6   r7   rT   rk   r   r   r
   r
   r   "test_topological_generations_cycle  s   "r   c                  C   s*   t  } t | g d t | rJ d S )Nr   r   r   r   r   r   	add_cycleis_aperiodicr   r
   r
   r   test_is_aperiodic_cycle!  s   r   c                  C   s:   t  } t | g d t | g d t | sJ d S )Nr   )r   r   r!   r#   r$   r   r   r
   r
   r   test_is_aperiodic_cycle2'     r   c                  C   s:   t  } t | g d t | g d t | rJ d S )Nr   )r   r   r!   r#   r   r   r
   r
   r   test_is_aperiodic_cycle3.  r   r   c                  C   s6   t  } t | g d | dd t | sJ d S )Nr   r   r   r   r   r   r@   r   r   r
   r
   r   test_is_aperiodic_cycle45     r   c                  C   s6   t  } t | g d | dd t | sJ d S )Nr   r   r   r   r
   r
   r   test_is_aperiodic_selfloop<  r   r   c                  C   s   t  } tt jt j|  d S r   )r   r5   r6   r7   ru   r   r   r
   r
   r   test_is_aperiodic_raiseC  r   r   c                  C   s    t t  } t | rJ d S r   )r   r   davis_southern_women_graphr   r   r
   r
   r   test_is_aperiodic_bipartiteH  s   r   c                  C   s&   t jddt  d} t | rJ d S )Nr      create_using)r   full_rary_treer   r   r   r
   r
   r   test_is_aperiodic_rary_treeN  s   r  c                  C   s`   t  } t | g d t | g d t | rJ | dd | dd t | s.J d S )Nr   )r!   r#   r$   r   r   r   r!   r$   )r   r   r   r   r@   r   r
   r
   r   test_is_aperiodic_disconnectedS  s   r  c                  C   s6   t  } t | g d | dd t | rJ d S )Nr   r   r   r   r
   r
   r   test_is_aperiodic_disconnected2^  r   r  c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )TestDagToBranchingz>Unit tests for the :func:`networkx.dag_to_branching` function.c                 C   sH   t g d}t |}t g d}t |sJ t ||s"J dS )znTests that a directed acyclic graph with a single degree
        zero node produces an arborescence.

        )r   r   r,   r   )r   r,   r   r   N)r   r   dag_to_branchingis_arborescenceis_isomorphicr   r   Br   r
   r
   r   test_single_rooth  s
   
z#TestDagToBranching.test_single_rootc                 C   sV   t g d}t |}t g d}t |sJ t |r!J t ||s)J dS )zTests that a directed acyclic graph with multiple degree zero
        nodes creates an arborescence with multiple (weakly) connected
        components.

        )r   r   r,   r   )r!   r   )r   r,   r   r   r"   )r#   r$   N)r   r   r	  is_branchingr
  r  r  r
   r
   r   test_multiple_rootss  s   
z&TestDagToBranching.test_multiple_rootsc                 C   s2   t jddt  d}t |}t ||sJ dS )zTests that a directed acyclic graph that is already an
        arborescence produces an isomorphic arborescence as output.

        r   r  N)r   balanced_treer   r	  r  )r   Ar  r
   r
   r   test_already_arborescence  s   
z,TestDagToBranching.test_already_arborescencec                 C   sR   t jddt  d}t jddt  d}t ||}t |}t ||s'J dS )z}Tests that a directed acyclic graph that is already a
        branching produces an isomorphic branching as output.

        r   r  N)r   r  r   disjoint_unionr	  r  )r   T1T2r   r  r
   r
   r   test_already_branching  s
   
z)TestDagToBranching.test_already_branchingc                 C   sN   t tj ttddd}t| W d   dS 1 s w   Y  dS )z3Tests that a non-acyclic graph causes an exception.abcT)cyclicN)r6   r7   r   	HasACycler   r   r	  r   r
   r
   r   test_not_acyclic  s   "z#TestDagToBranching.test_not_acyclicc                 C   @   t tj tt  W d    d S 1 sw   Y  d S r   )r6   r7   r   r8   r	  r5   r   r
   r
   r   test_undirected     "z"TestDagToBranching.test_undirectedc                 C   r  r   )r6   r7   r   r8   r	  r   r   r
   r
   r   test_multigraph  r  z"TestDagToBranching.test_multigraphc                 C   r  r   )r6   r7   r   r8   r	  r   r   r
   r
   r   test_multidigraph  r  z$TestDagToBranching.test_multidigraphN)rC   rD   rE   rF   r  r  r  r  r  r  r  r   r
   r
   r
   r   r  e  s    (	r  c                  C   s>   t d} t | dt | d  koh dk dS    dS )z_Regression test to ensure anscestors and descendants work as expected on
    undirected graphs.r!   r   >   r   r   r   r   N)r   
path_graphr   r   r   r
   r
   r   %test_ancestors_descendants_undirected  s   
4r"  )collectionsr   	itertoolsr   r   r6   networkxr   networkx.utilsr   r   r   r   rG   rL   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r"  r
   r
   r
   r   <module>   s6    /   +]