ó
î&]\c           @` s  d  Z  d d l m Z m Z m Z d d l Z d d l m Z m Z d d l	 m
 Z
 m Z m Z m Z d d l Z d d l m Z d d l m Z d d l m Z m Z d d	 l m Z d d
 l m Z d d d d d d d g Z d d d d d „ Z d e f d „  ƒ  YZ d S(   s)   test sparse matrix construction functionsi    (   t   divisiont   print_functiont   absolute_importN(   t   arrayt   matrix(   t   assert_equalt   assert_t   assert_array_equalt   assert_array_almost_equal_nulp(   t   raises(   t   check_free_memory(   t
   csr_matrixt
   coo_matrix(   t	   construct(   t   randt   csrt   csct   coot   bsrt   diat   lilt   dokg{®Gáz„?c         C` sm   | d  k r t j } n- t | t t j f ƒ rE t j j | ƒ } n  | j } t j |  | | | | | | ƒ S(   N(	   t   Nonet   npt   randomt
   isinstancet   intt   integert   RandomStatet   randnR   (   t   mt   nt   densityt   formatt   dtypet   random_statet   data_rvs(    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   _sprandn   s    	t   TestConstructUtilsc           B` sõ   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e j j d „  ƒ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c   
      C` s²  t  d d d d d g g ƒ } t  d d d d d g d d d d	 d
 g g ƒ } t  d d d d d g d d d d	 d
 g d d d d d g g ƒ } g  } | j | d d d d g g f ƒ | j | d g d d d g g f ƒ | j | d g d d d g d g g f ƒ | j | d g d d d d g g f ƒ | j | d g d d d d g g f ƒ | j | d g d d d d g g f ƒ | j | d g d d d d g d d g g f ƒ | j | d g d d d d g d d g g f ƒ | j | d g d d d d g d d g g f ƒ | j | d g d d d d d d g d d d d g d d d d g g f ƒ | j | d g d d d d d d g d d d d g d d d d g g f ƒ | j | d g d d d d d d d g d d d d d g d d d d d g g f ƒ | j | d d g d d d d d g d d d g d d d g g f ƒ | j | d d g d d d d d d g d d d d g d d d d g g f ƒ | j | d d g d d d d d d d d g d d d d d d g d d d d d d g d d d d d d g d d d d d d g d d d d d d g g f ƒ | j | d d d g d d d d d d d d g d d d d d d g d d d d d d g d d d d	 d d g d d d d d
 d g d d d d d d g g f ƒ | j | d d d g d d d d d d d g d d d d	 d g d d d d d
 g d d d d d g d d d d d g d d d d d g g f ƒ xB | D]: \ } } } } }	 t t j | | | | ƒ j ƒ  |	 ƒ qpWd  S(   Ni   i   i   i   i   i   i   i   i	   i
   i   i   i   i   i   i    iÿÿÿÿiýÿÿÿiüÿÿÿ(   R   t   appendR   R   t   spdiagst   todense(
   t   selft   diags1t   diags2t   diags3t   casest   dt   oR   R   t   result(    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_spdiags#   sR    "%+(((111LLUFO-0-c   
      C` s°  t  d d d d d g ƒ } t  d d d d	 d
 g ƒ } t  d d d d d g ƒ } g  } | j | d  d d d g g f ƒ | j | d  g d g d d g g f ƒ | j | d  g d g d d g d g g f ƒ | j | d  g d g d d d g g f ƒ | j | d  g d g d d d g g f ƒ | j | d  g d g d d d g d d g g f ƒ | j | d  g d g d d d g d d g g f ƒ | j | d  g d g d  d d d d g d d d d g d d d d g g f ƒ | j | d  g d g d! d d d d g d d d d g d d d d g g f ƒ | j | d  g d g d" d d d d d g d d d d d g d d d d d g g f ƒ | j | d  g d g d# d d d d d g d d d d d g d d d d d g g f ƒ | j | d  g d g d$ d d d d d g d d d d d g d d d d d g g f ƒ | j | d  g d g d% d d d d d g d d d d d g d d d d d g g f ƒ | j | d  g d g d& d d d d d g d d d d d g d d d d d g g f ƒ | j | d  g d g d' d d d d d g d d d d d g d d d d d g g f ƒ | j | d  g d g d( d d d d d g d d d d d g d d d d d g g f ƒ | j | d  g d g d) d d d g d d d g d d d g d d d g d d d g g f ƒ | j | d  g d g d* d d d g d d d g d d d g d d d g d d d g g f ƒ | j | d  g d g d+ d d d g d d d g d d d g d d d g d d d g g f ƒ | j | d  g d g d, d d d g d d d g d d d g d d d g d d d g g f ƒ | j | d  g d g d- d d d g d d d g d d d g d d d g d d d g g f ƒ | j | d  g d g d. d d d g d d d g d d d g d d d g d d d g g f ƒ | j | d  g d g d/ d d d g d d d g d d d g d d d g d d d g g f ƒ | j | d  | d  g d d g d0 d d d g d d d g d d d g g f ƒ | j | d  | d  g d d g d1 d d d d g d d d d g d d d d g g f ƒ | j | d  | d  g d d g d2 d d d d d d g d d d d d d g d d d d d d g d d d d d d g d d d d d d g d d d d d d g g f ƒ | j | d  | | d  g d d d g d3 d d d d d g d d d d d g d d d d d g d d d d	 d g d d d d d
 g g f ƒ | j | d  | d  | g d d d g d4 d d d d d g d d d d d g d d d d d g d d d d d g d d d d d g d d d d d g g f ƒ | j | g d g d5 d g g f ƒ | j | d  | g d d g d6 d d d g d d d g d d d g g f ƒ | j t j  d d d g d d d g g ƒ d d g d7 d d d g d d d g d d d g g f ƒ | j d d d g d d d g d8 d d d g d d d g d d d g g f ƒ xÆ | D]¾ \ } } } } d | | | | f }	 t t j | | d | ƒj ƒ  | d |	 ƒ| d | d k rê
t | d d ƒ rê
t | d ƒ t	 | ƒ k rê
t t j | | ƒ j ƒ  | d |	 ƒqê
qê
Wd  S(9   Ni   i   i   i   i   i   i   i   i	   i
   i   i   i   i   i   i    iÿÿÿÿiþÿÿÿiüÿÿÿiýÿÿÿs   %r %r %r %rt   shapet   err_msgt   __len__(   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (   i   i   (
   R   R'   R   R   R   t   diagsR)   t   hasattrt   lent   max(
   R*   t   at   bt   cR.   R/   R0   R3   R1   R4   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt
   test_diagsR   sv    #)/,,55PPYYYYYYY_______QZ8;;%Md-Cc         C` sD   t  d d d d d g ƒ } t t j | ƒ j ƒ  t j | ƒ ƒ d  S(   Ni   i   i   i   i   (   R   R   R   R6   R)   R   t   diag(   R*   R:   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_diags_default™   s    c         C` sG   t  d d d d d g d d d d d g g ƒ } t t t j | ƒ d  S(   Ni   i   i   i   i   i   (   R   t   assert_raisest
   ValueErrorR   R6   (   R*   R:   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_diags_default_bad   s    0c         C` s®  t  d d d d d g ƒ } t  d d d d	 d
 g ƒ } t  d d d d d g ƒ } g  } | j | d  g d d f ƒ | j | d  | | d  g d d d g d f ƒ | j | d  | | d  g d d d g d f ƒ | j | d  | | d  g d d d g d  f ƒ | j g  d d d g d  f ƒ | j d g d g d f ƒ | j | g d d  f ƒ x0 | D]( \ } } } t t t j | | | ƒ q_Wt t t j d  g g d g ƒ d  S(   Ni   i   i   i   i   i   i   i   i	   i
   i   i   i   i   i   i    iÿÿÿÿiüÿÿÿiûÿÿÿ(   i   i   (   i   i   (   i   i   (   i   i   (   R   R'   R   R@   RA   R   R6   t	   TypeError(   R*   R:   R;   R<   R.   R/   R0   R3   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_diags_bad¡   s    000c   
      C` sw  t  j j d ƒ x`d d d d d d g D]F} d | d t  j j d d ƒ } t  j | d | d ƒ } t  j j | ƒ | |  } g  | D]" } t  j j | t | ƒ ƒ ^ qŒ } t j	 | | ƒ } t
 g  t | | ƒ D] \ } } t  j | | ƒ ^ qÙ ƒ }	 t | j ƒ  |	 ƒ t | ƒ d k r) t j	 | d | d ƒ } t  j | d | d ƒ }	 t | j ƒ  |	 ƒ q) q) Wd  S(	   NiÒ  i   i   i   i   i   i
   i    (   R   R   t   seedt   randintt   aranget   shuffleR   t   absR   R6   t   sumt   zipR>   R   R)   R8   (
   R*   t   n_diagsR   t   offsetst   qt	   diagonalst   matt   xt   jt	   dense_mat(    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_diags_vs_diag´   s    !
/:c         C` s]   t  j d g d g d d d t ƒ} t | j t ƒ t | j ƒ  d d g d d g g ƒ d  S(   Ngš™™™™™@i    R3   i   R"   (   i   i   (   R   R6   R   R   R"   R)   (   R*   RQ   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_diags_dtypeÏ   s    $c         C` sg   t  t d ƒ ƒ } xN t d d ƒ D]= } t t j | | ƒ j ƒ  t j | g | g ƒ j ƒ  ƒ q" Wd  S(   Ni   iûÿÿÿi   (   t   listt   rangeR   R   R6   t   toarray(   R*   R/   t   k(    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_diags_one_diagonalÔ   s    c         C` s#   t  j g  ƒ } t | j d ƒ d  S(   Ni    (   i    i    (   R   R6   R   R3   (   R*   RQ   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_diags_emptyÚ   s    c         C` s  t  t j d ƒ j ƒ  d g g ƒ t  t j d ƒ j ƒ  d d g d d g g ƒ t j d d d d d ƒ} t  | j t j d ƒ ƒ t  | j d ƒ xj t D]b } t j d d | ƒ} t  | j | ƒ t  | j ƒ  d d d g d d d g d d d g g ƒ q› Wd  S(	   Ni   i   i    i   R"   t   int8R!   R   (   R   R   t   identityRX   R"   R   R!   t   sparse_formats(   R*   t   It   fmt(    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_identityÞ   s    ".c      
   C` sÊ  t  t j d d ƒ j ƒ  d g g ƒ t  t j d d ƒ j ƒ  d d d g d d d g g ƒ t  t j d d ƒ j ƒ  d d g d d g d d g g ƒ t  t j d d ƒ j ƒ  d d d g d d d g d d d g g ƒ t  t j d d d d ƒj t j d ƒ ƒ x¿ d d g D]± } x¨ d d g D]š } x‘ t d d	 ƒ D]€ } t  t j | | d
 | ƒj ƒ  t j | | d
 | ƒƒ | | k r:t  t j | d
 | ƒj ƒ  t j | | d
 | ƒƒ q:q:Wq$WqWd  S(   Ni   i   i   i    R"   t   int16i   iûÿÿÿi   RY   (   R   R   t   eyeRX   R"   R   RW   (   R*   R   R   RY   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_eyeë   s    %7:C+7c         C` s  t  t j d ƒ j ƒ  d g g ƒ t  t j d ƒ j ƒ  d d g d d g g ƒ t j d d d d d ƒ} t  | j t j d ƒ ƒ t  | j d ƒ xj t D]b } t j d d | ƒ} t  | j | ƒ t  | j ƒ  d d d g d d d g d d d g g ƒ q› Wd  S(	   Ni   i   i    i   R"   R\   R!   R   (   R   R   Rc   RX   R"   R   R!   R^   (   R*   R_   R`   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_eye_oneú   s    ".c      	   C` sD  g  } | j  t d g g ƒ ƒ | j  t d g g ƒ ƒ | j  t d g g ƒ ƒ | j  t d g g ƒ ƒ | j  t d g d g g ƒ ƒ | j  t d d g g ƒ ƒ | j  t d d g d d g g ƒ ƒ | j  t d d g d d g g ƒ ƒ | j  t d d d	 g d
 d d g g ƒ ƒ | j  t d d g d d g d d g g ƒ ƒ | j  t d d d g d d d g d d d
 g g ƒ ƒ | j  t d d d d d d d
 g g ƒ ƒ | j  t d d d d g d d d d g g ƒ ƒ xb | D]Z } xQ | D]I } t j t | ƒ t | ƒ ƒ j ƒ  } t j | | ƒ } t | | ƒ qïWqâWd  S(   Ni    iÿÿÿÿi   i
   i   i   i   i   iúÿÿÿi   i   i   g      à?g      À?g      
@g      @(   R'   R   R   t   kronR   R)   R   R   (   R*   R.   R:   R;   R1   t   expected(    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt	   test_kron  s&    %%+.7+1$c         C` s¹  g  } | j  t d g g ƒ ƒ | j  t d g g ƒ ƒ | j  t d g g ƒ ƒ | j  t d g g ƒ ƒ | j  t d d g d d g g ƒ ƒ | j  t d d g d d g g ƒ ƒ | j  t d d d	 g d
 d d g d d d g g ƒ ƒ | j  t d d d g d d d g d d d
 g g ƒ ƒ x | D]ˆ } x | D]w } t j t | ƒ t | ƒ ƒ j ƒ  } t j t j t	 | ƒ ƒ | ƒ t j | t j t	 | ƒ ƒ ƒ } t
 | | ƒ q6Wq)Wd  S(   Ni    iÿÿÿÿi   i
   i   i   i   i   iúÿÿÿi   i   iþÿÿÿ(   R'   R   R   t   kronsumR   R)   R   Rf   Rc   R8   R   (   R*   R.   R:   R;   R1   Rg   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_kronsum  s    %%77$"c         C` s„  t  d d g d d g g ƒ } t  d d g g ƒ } t d d g d d g d d g g ƒ } t t j | | g ƒ j ƒ  | ƒ t t j | | g d t j ƒj t j ƒ t t j | j	 ƒ  | j	 ƒ  g ƒ j ƒ  | ƒ t t j | j	 ƒ  | j	 ƒ  g d t j ƒj t j ƒ t t j | j	 ƒ  | j	 ƒ  g d t j ƒj
 j t j ƒ t t j | j	 ƒ  | j	 ƒ  g d t j ƒj j t j ƒ d  S(   Ni   i   i   i   i   i   R"   (   R   R   R   R   t   vstackR)   R   t   float32R"   t   tocsrt   indicest   int32t   indptr(   R*   t   At   BRg   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_vstack1  s    	"+'-
!!c         C` s  t  d d g d d g g ƒ } t  d g d g g ƒ } t d d d g d d d g g ƒ } t t j | | g ƒ j ƒ  | ƒ t t j | | g d t j ƒj t j ƒ t t j | j	 ƒ  | j	 ƒ  g ƒ j ƒ  | ƒ t t j | j	 ƒ  | j	 ƒ  g d t j ƒj t j ƒ d  S(   Ni   i   i   i   i   i   R"   (
   R   R   R   R   t   hstackR)   R   Rl   R"   t   tocsc(   R*   Rq   Rr   Rg   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_hstackD  s    "+'-c         C` s„  t  d d g d d g g ƒ } t  d g d g g ƒ } t  d g g ƒ } t  d ƒ } t d d d g d d d g d d d g g ƒ } t t j | | g d  | g g ƒ j ƒ  | ƒ t d d d g d d d g d d d g g ƒ } t t j | d  g d  | g g ƒ j ƒ  | ƒ t d d g d d g d d g g ƒ } t t j d  | g | d  g g ƒ j ƒ  | ƒ t t j d ƒ ƒ } t t j d  d  g g ƒ j ƒ  | ƒ t t j d  | g | d  g g ƒ j ƒ  | ƒ t d g g ƒ } t t j d  | g | d  g g ƒ j ƒ  | ƒ t	 t
 ƒ   } t j | g | g g ƒ Wd  QX| j d	 ƒ t	 t
 ƒ  } t j | | g g ƒ Wd  QX| j d
 ƒ d  S(   Ni   i   i   i   i   i   i   i    s.   Got blocks\[1,0\]\.shape\[1\] == 1, expected 2s.   Got blocks\[0,1\]\.shape\[0\] == 1, expected 2(   i    i    (   i    i    (   R   R   R   R   t   bmatR   R)   R   t   emptyR@   RA   t   match(   R*   Rq   Rr   t   Ct   DRg   t   excinfo(    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt	   test_bmatR  s6    ..	.%..c         C` s°   t  d ƒ d } t t j | | f d t ƒƒ } | j ƒ  } t j | | f d ƒ } t t j	 t j
 t j | j ƒ | ƒ ƒ ƒ t | j j t j ƒ t | j j t j ƒ d S(   s6    test for indptr overflow when concatenating matrices i0u  iè€  R"   i    N(   R
   R   R   t   onest   boolt   copyR   t   _compressed_sparse_stackR   t   allt   equalt   diffRp   R   Rn   R"   t   int64(   R*   R   Rq   Rr   Rz   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_concatenate_int32_overflowy  s    
!+c      	   C` sÈ   t  d d g d d g g ƒ } t  d g d g g ƒ } t  d g g ƒ } t d d d d g d d d d g d d d d g d d d d g d d d d g g ƒ } t t j | | | f ƒ j ƒ  | ƒ d	 S(
   s    basic test for block_diag i   i   i   i   i   i   i   i    N(   R   R   R   R   t
   block_diagR)   (   R*   Rq   Rr   Rz   Rg   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_block_diag_basic‡  s    c         C` sD   t  t j d d g d g ƒ j ƒ  d d d g d d d g g ƒ d S(   s)    block_diag with scalar and 1d arguments i   i   i   i    N(   R   R   R‡   RX   (   R*   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_block_diag_scalar_1d_args•  s    !c         C` s×   t  t j d d g g ƒ j ƒ  t d d g g ƒ ƒ t  t j d d g g g ƒ j ƒ  t d d g g ƒ ƒ t  t j d g d g g g ƒ j ƒ  t d g d g g ƒ ƒ t  t j d g ƒ j ƒ  t d g g ƒ ƒ d S(   s    block_diag with one matrix i   i    N(   R   R   R‡   R)   R   (   R*   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_block_diag_1›  s    !$c      	   ` sõ  xît  t f D]à‰  xƒ t j t j t j t j t j t j t j	 g D]Q } ˆ  d d d d d | ƒ} t
 | j | ƒ t
 | j d ƒ t
 | j d ƒ qD Wˆ  d d d d d d ƒ} t
 | j t j ƒ ˆ  d d d d d t j j d ƒ ƒ} t | j | j ƒ t | j | j ƒ t | j | j ƒ xU d d d	 d
 g D]A } ˆ  d d d | ƒ} t
 | j t | t j | j ƒ ƒ ƒ q:Wx? d d d d g D]+ } ˆ  d d d | ƒ} t
 | j | ƒ q’Wt t ‡  f d †  ƒ t t ‡  f d †  ƒ q Wd  S(   Ni   i
   R    gš™™™™™¹?R"   R#   iá  g        g      à?g      ð?R   R   R   R   R!   c           ` s   ˆ  d d d ƒ S(   Ni   i
   gš™™™™™ñ?(    (    (   t   f(    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   <lambda>Ã  s    c           ` s   ˆ  d d d ƒ S(   Ni   i
   gš™™™™™¹¿(    (    (   R‹   (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyRŒ   Ä  s    (   i   i
   (   t   sprandR%   R   Rl   t   float64t
   longdoubleRo   R…   t	   complex64t
   complex128R   R"   R3   t   nnzt   doubleR   R   R   t   datat   rowt   colR   t   prodR!   R@   RA   (   R*   t   tRQ   t   x1t   x2R    R`   (    (   R‹   s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_random_sampling§  s,    "*c      
   C` s   xˆ d  d t j j ƒ  f D]n } t d d d d d t j d | ƒ} t t j t j d | j	 ƒ ƒ ƒ t t j t j | j	 d	 ƒ ƒ ƒ q Wd  S(
   Niá  i
   i   R    g      à?R"   R#   i    i   (
   R   R   R   R   R   RŽ   R   R‚   t
   less_equalR”   (   R*   R#   RQ   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt	   test_randÆ  s
    	"c      
   C` s   xˆ d  d t j j ƒ  f D]n } t d d d d d t j d | ƒ} t t j t j | j	 d ƒ ƒ ƒ t t j t j d	 | j	 ƒ ƒ ƒ q Wd  S(
   Niá  i
   i   R    g      à?R"   R#   i    i   (
   R   R   R   R   R%   RŽ   R   t   anyt   lessR”   (   R*   R#   RQ   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt
   test_randnÎ  s
    	"c         C` s   t  j d d d d ƒ} d  S(   Ni
   R"   R/   (   R   R   (   R*   R:   (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   test_random_accept_str_dtypeØ  s    (   t   __name__t
   __module__R2   R=   R?   RB   RD   RT   RU   RZ   R[   Ra   Rd   Re   Rh   Rj   Rs   Rv   R}   t   pytestt   markt   slowR†   Rˆ   R‰   RŠ   R›   R   R    R¡   (    (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyR&   "   s2   	/	G															'						
(   t   __doc__t
   __future__R    R   R   t   numpyR   R   R   t   numpy.testingR   R   R   R   R¤   R	   R@   t   scipy._lib._testutilsR
   t   scipy.sparseR   R   R   t   scipy.sparse.constructR   R   R^   R   R%   t   objectR&   (    (    (    s@   lib/python2.7/site-packages/scipy/sparse/tests/test_construct.pyt   <module>   s   "