
    rh!                       S SK Jr  S SKJr  S SKJr  \R
                  " S5      r " S S\R                  5      r " S S5      r	 " S	 S
\	5      r
 " S S\	5      r " S S\	5      r\S:X  a  S SKr\R                  " 5         gg)    )annotations)environment)exceptions21zfeatures.outputFormatsc                      \ rS rSrSrg)OutputFormatException
    N)__name__
__module____qualname____firstlineno____static_attributes__r	       X/home/james-whalen/.local/lib/python3.13/site-packages/music21/features/outputFormats.pyr   r   
   s    r   r   c                  <    \ rS rSrSrS	S jrS rS
S jrSS jrSr	g)OutputFormat   zJ
Provide output for a DataSet, which is passed in as an initial argument.
Nc                    S U l         Xl        g N)ext_dataSet)selfdataSets     r   __init__OutputFormat.__init__   s    r   c                    g)z$
Get the header as a list of lines.
Nr	   )r   s    r   getHeaderLinesOutputFormat.getHeaderLines   s     	r   c                    g r   r	   )r   includeClassLabel	includeId	lineBreaks       r   	getStringOutputFormat.getString   s    r   c                8   Uc  [         R                  U R                  S9n[        U5      R	                  U R                  5      (       d  [        S5      e[        USSS9 nUR                  U R                  UUS95        SSS5        U$ ! , (       d  f       U$ = f)zN
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/   OutputFormat.write"   s     :))):B2w))'(\]]"cG,GGDNN5F-6 # 8 9 - 	 -, 	s     B


B)r   r   r   TTN)NTT)
r
   r   r   r   __doc__r   r   r#   r/   r   r	   r   r   r   r      s     r   r   c                  D   ^  \ rS rSrSrSU 4S jjrSS jrS	S jrSrU =r	$ )
OutputTabOrange0   z
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                .   > [         TU ]  US9  SU l        g )Nr   z.tabsuperr   r   r   r   	__class__s     r   r   OutputTabOrange.__init__9       )r   c                "   / nUR                  U R                  R                  XS95        / nU R                  R                  XS9 HB  nUc  UR                  S5        M  USL a  UR                  S5        M1  UR                  S5        MD     UR                  U5        / nU R                  R	                  US9 HB  nUc  UR                  S5        M  USL a  UR                  S5        M1  UR                  S	5        MD     UR                  U5        U$ )
aR  
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   OutputTabOrange.getHeaderLines=   s    . DMM44/ 5 F 	G 00"3 1 JAy

8$d

:&

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

6"d

7#

2 K 	Cr   c                $   Uc  Sn/ nU R                  UUS9nXPR                  R                  US9-   nU HH  n/ nU H  n	UR                  [	        U	5      5        M     UR                  SR                  U5      5        MJ     UR                  U5      $ )zD
Get the complete DataSet as a string with the appropriate headers.

r)   r    	r   r   getFeaturesAsListrH   r,   join
r   r    r!   r"   msgheaderdatarM   subes
             r   r#   OutputTabOrange.getStringp   s     I$$7H/8 % :77/ 8 1 1CC

3q6" JJtyy~&	 
 ~~c""r   r   r   TTr3   
r
   r   r   r   r4   r   r   r#   r   __classcell__r=   s   @r   r6   r6   0   s    1f# #r   r6   c                  D   ^  \ rS rSrSrSU 4S jjrSS jrS	S jrSrU =r	$ )
	OutputCSV   z
Comma-separated value list.
c                .   > [         TU ]  US9  SU l        g )Nr9   z.csvr:   r<   s     r   r   OutputCSV.__init__   r?   r   c                Z    / nUR                  U R                  R                  XS95        U$ )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)   )rH   r   rI   )r   r    r!   rL   s       r   r   OutputCSV.getHeaderLines   s5     DMM44/ 5 F 	Gr   c                $   Uc  Sn/ nU R                  UUS9nXPR                  R                  XS9-   nU HH  n/ nU H  n	UR                  [	        U	5      5        M     UR                  SR                  U5      5        MJ     UR                  U5      $ )NrQ   r)   ,rT   rW   s
             r   r#   OutputCSV.getString   s    I$$7H/8 % :77/ 8 F FCC

3q6" JJsxx}%	 
 ~~c""r   r^   r   r_   r3   r`   rb   s   @r   rd   rd      s    "# #r   rd   c                  D   ^  \ rS rSrSrSU 4S jjrSS jrS	S jrSrU =r	$ )

OutputARFF   z
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                .   > [         TU ]  US9  SU l        g )Nr9   z.arffr:   r<   s     r   r   OutputARFF.__init__   s    )r   c                ~   / nU R                   R                  XS9nU R                   R                  XS9nU R                   R                  US9nUR	                  SU R                   R                  5        35        [        U5       H  u  pxXW   n	Xg   n
U
(       dM  U	c  UR	                  SU S35        M.  U	SL a  UR	                  SU S35        MJ  UR	                  SU S35        Ma  U R                   R                  5       nSR                  U5      nUR	                  S	U-   S
-   5        M     UR	                  S5        U$ )aq  
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)   rD   z
@RELATION z@ATTRIBUTE z STRINGTz NUMERICrk   z@ATTRIBUTE class {}z@DATA)	r   rI   rJ   rK   rH   getClassLabel	enumerategetUniqueClassValuesrV   )r   r    r!   rL   attrsdiscreteLabelsclassLabelsi	attrLabelrB   
classLabelvaluesjoineds                r   r   OutputARFF.getHeaderLines   s7      00/ 1 F88/ 9 Fmm::Y:Oj!<!<!> ?@A%e,LA%(H$J#KK+i[ @A%KK+i[ ABKK+i[ AB;;=&)069C?@ - 	Gr   c                T   Uc  Sn/ nU R                  UUS9nU H  nUR                  U5        M     U R                  R                  US9nU HH  n/ nU H  n	UR                  [	        U	5      5        M     UR                  SR                  U5      5        MJ     UR                  U5      $ )NrQ   r)   rR   rk   )r   rH   r   rU   r,   rV   )
r   r    r!   r"   rX   rY   rM   rZ   r[   r\   s
             r   r#   OutputARFF.getString   s    I$$7H/8 % :CJJsO  }}../ / 1 CC

3q6" JJsxx}%	 
 ~~c""r   r^   r   r_   r3   r`   rb   s   @r   rn   rn      s    +Z# #r   rn   __main__N)
__future__r   music21r   r   Environmentr*   Music21Exceptionr   r   r6   rd   rn   r
   mainTestr	   r   r   <module>r      s    "   &&'?@	L99 	 DP#l P#f'# '#TR# R#j z r   