
    3j!                       d dl mZ d dlmZ d dlmZ  ej
                  d      Z G d dej                        Z G d d      Z	 G d	 d
e	      Z
 G d de	      Z G d de	      Zedk(  rd dlZ ej                          yy)    )annotations)environment)exceptions21zfeatures.outputFormatsc                      e Zd Zy)OutputFormatExceptionN)__name__
__module____qualname__     K/DATA/.local/lib/python3.12/site-packages/music21/features/outputFormats.pyr   r   	   s    r   r   c                  .    e Zd ZdZddZd ZddZd	dZy)
OutputFormatzR
    Provide output for a DataSet, which is passed in as an initial argument.
    Nc                     d | _         || _        y N)ext_dataSet)selfdataSets     r   __init__zOutputFormat.__init__   s    r   c                     y)z4
        Get the header as a list of lines.
        Nr   )r   s    r   getHeaderLineszOutputFormat.getHeaderLines   s     	r   c                     y r   r   )r   includeClassLabel	includeId	lineBreaks       r   	getStringzOutputFormat.getString   s    r   c                4   | t         j                  | j                        }t        |      j	                  | j                        st        d      t        |dd      5 }|j                  | j                  ||             ddd       |S # 1 sw Y   |S xY w)z^
        Write the file. If not file path is given, a temporary file will be written.
        N)suffixz2Could not get a temp file with the right extensionwzutf-8)encodingr   r   )	environLocalgetTempFiler   strendswithr   openwriter   )r   fpr   r   fs        r   r(   zOutputFormat.write!   s     :))):B2w)'(\]]"cG,GGDNN5F-6 # 8 9 - 	 - 	s    #BBr   TTN)NTT)r   r	   r
   __doc__r   r   r   r(   r   r   r   r   r      s     r   r   c                  4     e Zd ZdZd fd	ZddZddZ xZS )OutputTabOrangez
    Tab delimited file format used with Orange.

    For more information, see:

    https://orange3.readthedocs.io/projects/orange-data-mining-library/en/latest/tutorial/data.html#saving-the-data
    c                4    t         |   |       d| _        y )Nr   z.tabsuperr   r   r   r   	__class__s     r   r   zOutputTabOrange.__init__8       )r   c                    g }|j                  | j                  j                  ||             g }| j                  j                  ||      D ]=  }||j                  d       |du r|j                  d       -|j                  d       ? |j                  |       g }| j                  j	                  |      D ]=  }||j                  d       |du r|j                  d       -|j                  d	       ? |j                  |       |S )
a  
        Get the header as a list of lines.

        >>> f = [features.jSymbolic.ChangesOfMeterFeature]
        >>> ds = features.DataSet()
        >>> ds.addFeatureExtractors(f)
        >>> of = features.outputFormats.OutputTabOrange(ds)
        >>> for x in of.getHeaderLines(): print(x)
        ['Identifier', 'Changes_of_Meter']
        ['string', 'discrete']
        ['meta', '']

        >>> ds = features.DataSet(classLabel='Composer')
        >>> ds.addFeatureExtractors(f)
        >>> of = features.outputFormats.OutputTabOrange(ds)
        >>> for x in of.getHeaderLines(): print(x)
        ['Identifier', 'Changes_of_Meter', 'Composer']
        ['string', 'discrete', 'discrete']
        ['meta', '', 'class']

        r"   stringTdiscrete
continuousr   metaclass )appendr   getAttributeLabelsgetDiscreteLabelsgetClassPositionLabels)r   r   r   postrowxs         r   r   zOutputTabOrange.getHeaderLines<   s   . DMM44/9 5 F 	G 00"3y 1 JAy

8$d

:&

<(J 	C 55	5JAy

6"d

7#

2 K 	Cr   c                (   |d}g }| j                  ||      }|| j                  j                  |      z   }|D ]E  }g }|D ]  }	|j                  t	        |	              |j                  dj                  |             G |j                  |      S )zT
        Get the complete DataSet as a string with the appropriate headers.
        
r"   r   	r   r   getFeaturesAsListr>   r%   join
r   r   r   r   msgheaderdatarC   subes
             r   r   zOutputTabOrange.getStringo   s     I$$7H/8 % :77/ 8 1 1CC

3q6" JJtyy~&	 
 ~~c""r   r   TTr+   r   r	   r
   r,   r   r   r   __classcell__r4   s   @r   r.   r.   /   s    1f#r   r.   c                  4     e Zd ZdZd fd	ZddZddZ xZS )	OutputCSVz%
    Comma-separated value list.
    c                4    t         |   |       d| _        y )Nr0   z.csvr1   r3   s     r   r   zOutputCSV.__init__   r5   r   c                b    g }|j                  | j                  j                  ||             |S )a`  
        Get the header as a list of lines.

        >>> f = [features.jSymbolic.ChangesOfMeterFeature]
        >>> ds = features.DataSet(classLabel='Composer')
        >>> ds.addFeatureExtractors(f)
        >>> of = features.outputFormats.OutputCSV(ds)
        >>> of.getHeaderLines()[0]
        ['Identifier', 'Changes_of_Meter', 'Composer']
        r"   )r>   r   r?   )r   r   r   rB   s       r   r   zOutputCSV.getHeaderLines   s7     DMM44/9 5 F 	Gr   c                *   |d}g }| j                  ||      }|| j                  j                  ||      z   }|D ]E  }g }|D ]  }	|j                  t	        |	              |j                  dj                  |             G |j                  |      S )NrF   r"   ,rI   rL   s
             r   r   zOutputCSV.getString   s    I$$7H/8 % :77/9 8 F FCC

3q6" JJsxx}%	 
 ~~c""r   r   rR   r+   rS   rU   s   @r   rW   rW      s     #r   rW   c                  4     e Zd ZdZd fd	ZddZddZ xZS )
OutputARFFa  
    An ARFF (Attribute-Relation File Format) file.

    See
    https://web.archive.org/web/20160212022757/http://weka.wikispaces.com/ARFF+%28stable+version%29
    for more details

    >>> oa = features.outputFormats.OutputARFF()
    >>> oa.ext
    '.arff'
    c                4    t         |   |       d| _        y )Nr0   z.arffr1   r3   s     r   r   zOutputARFF.__init__   s    )r   c                   g }| j                   j                  ||      }| j                   j                  ||      }| j                   j                  |      }|j	                  d| j                   j                                 t        |      D ]  \  }}||   }	||   }
|
sH|	|j	                  d| d       *|	du r|j	                  d| d       D|j	                  d| d       Z| j                   j                         }dj                  |      }|j	                  d	|z   d
z           |j	                  d       |S )a  
        Get the header as a list of lines.

        >>> f = [features.jSymbolic.ChangesOfMeterFeature]
        >>> ds = features.DataSet(classLabel='Composer')
        >>> ds.addFeatureExtractors(f)
        >>> of = features.outputFormats.OutputARFF(ds)
        >>> for x in of.getHeaderLines(): print(x)
        @RELATION Composer
        @ATTRIBUTE Identifier STRING
        @ATTRIBUTE Changes_of_Meter NUMERIC
        @ATTRIBUTE class {}
        @DATA

        r"   r:   z
@RELATION z@ATTRIBUTE z STRINGTz NUMERICr[   z@ATTRIBUTE class {}z@DATA)	r   r?   r@   rA   r>   getClassLabel	enumerategetUniqueClassValuesrK   )r   r   r   rB   attrsdiscreteLabelsclassLabelsi	attrLabelr8   
classLabelvaluesjoineds                r   r   zOutputARFF.getHeaderLines   sA      00/9 1 F88/9 9 Fmm::Y:Oj!<!<!> ?@A%e,LAy%a(H$QJ#KK+i[ @A%KK+i[ ABKK+i[ AB;;=&)069C?@ - 	Gr   c                R   |d}g }| j                  ||      }|D ]  }|j                  |        | j                  j                  |      }|D ]E  }g }|D ]  }	|j                  t	        |	              |j                  dj                  |             G |j                  |      S )NrF   r"   rG   r[   )r   r>   r   rJ   r%   rK   )
r   r   r   r   rM   rN   rC   rO   rP   rQ   s
             r   r   zOutputARFF.getString   s    I$$7H/8 % :CJJsO  }}../ / 1 CC

3q6" JJsxx}%	 
 ~~c""r   r   rR   r+   rS   rU   s   @r   r]   r]      s    
+Z#r   r]   __main__N)
__future__r   music21r   r   Environmentr#   Music21Exceptionr   r   r.   rW   r]   r   mainTestr   r   r   <module>rs      s    "   &{&&'?@	L99 	 DP#l P#f&# &#RQ# Q#h zG r   