
    BeUW                        d Z ddlmZmZmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZ  e
j.                          ddgZ G d de      Z G d de      Z G d	 d
e      Z G d de      Zd ZefdZ d Z! G d de      Z" G d de      Z# G d de      Z$ G d de      Z% G d de%      Z& G d de      Z' G d de      Z( G d de      Z) G d d e      Z* G d! d"e      Z+ G d# d$e      Z,d% Z- eed&'      Z. eed(z   ed(z   d&)      Z/ e ed*            Z0 ee0 ee      z         jc                  d+       Z2 e ed,ez   e       ed- e ee            z         z    e ed.       ed,ez   e      z         z         jc                  d/       Z3 ed0      Z4 ed1      Z5 ed2      Z6 ed3      Z7 ed4      Z8 ed5      Z9 ed6      Z: ed7      Z; ed8      Z< ed9      Z= ed:      Z> ed;      Z?e3e/z   ed<      z   ed=      z  Z@ ee4 ee@      z   e5z         ZA ee. ed>      z         ZBe6 e eeB      e/z         j                  d?      z   e7z   ZDe@eAz  ZE e ed@      eEz    e e edA            eEz         z         ZF edB       eFz   ZG ee@ ee;e<z        z         ZHdC ee@      j                  dD      z   dEz    eeH      j                  dF      z   ZIeIjc                  e&        ed@      eIz   ZJeJjc                  e-       e3e/z  dGz  ZKe4 edH      z    eeK      z   e5z   ZLeLjc                  e$       eLeIz  eJz   edE      z  ZMeFeMz  ZNeGeMz  ZOe>e/z    eeD      z    e edB      e2j                  dB      z         z   e:z   ZPePjc                  e"       e8 eeE      z   e9z   ZQe>e/z    eeQ      j                  dI      z    eeO e e edA            eNz         z         j                  dJ      z   e:z   ZReRjc                  e#       e@ZSeEd-z  ZTeTeS e e edA            eSz         z   eTz   z  ZU e ed@      eUz    eeU      z   eU eeU      z    eeU      z   z        ZVdC ee@      j                  dD      z   dEz    ee@d-z        j                  dF      z   ZWeWjc                  e%        ed@      eWz   ZXeXjc                  e-       e3e/z  dGz  ZYe8 eeY      z   e9z   ZZeZjc                  e$       eZeVz  eWz  eXz   edE      z  Z[ ee?e@j                  d;      z         Z\e=e? z   e/j                  dK      z   e\z    e ee[            j                  dJ      z   e:z   Z]e]jc                  e'       e=e\z   dCz    ee/dLz         z    eeE      j                  dM      z   dEz    ee@      j                  dF      z   e:z   Z^e^jc                  e)       e=e/j                  dK      z    eeD      z   e\z   e:z   Z_e_jc                  e*       eRePz  e_z  e]z  e^z  Z` ee`       e       z   Zaeaj                  dN ee      z          eaj                  dO ee      z           G dP de      ZceddQk(  reaj                  dR       ySyS)Ta  
Amply: a GNU MathProg data-parser

This module implements a parser for a subset of the GNU MathProg language,
namely parameter and set data records.

Amply uses the Pyparsing library to parse input:
    http://pyparsing.wikispaces.com

Usage:
    Create an Amply object, optionally passing in a string to parse.

    >>> a = Amply("param T := 3;")

    Symbols that are defined can be accessed as attributes or items.

    >>> print(a.T)
    3.0
    >>> print(a['T'])
    3.0

    The load_string and load_file methods can be used to parse additional data

    >>> a.load_string("set N := 1 2 3;")
    >>> a.load_file(open('some_file.dat'))

    An Amply object can be constructed from a file using Amply.from_file

    >>> a = Amply.from_file(open('some_file.dat'))


How it works:
    The Amply class parses the input using Pyparsing. This results in a list
    of Stmt objects, each representing a MathProg statement. The statements
    are then evaluated by calling their eval() method.
    )CombineGroupKeywordLiteralNotAny	OneOrMoreOptionalParseExceptionParserElementParseResultsQuotedStringSkipTo	StringEndSuppressWord
ZeroOrMore	alphanumsdelimitedListlineEndnumsoneOfAmply
AmplyErrorc                       e Zd ZdZy)AmplyObjectzX
    Represents the value of some object (e.g. a Set object
    or Parameter object
    N__name__
__module____qualname____doc__     +lib/python3.12/site-packages/amply/amply.pyr   r   D   s    r"   r   c                       e Zd ZdZd Zy)	AmplyStmta  
    Represents a statement that has been parsed

    Statements implement an eval method. When the eval method is called, the
    Stmt object is responsible for modifying the Amply object that
    gets passed in appropriately (i.e. by adding or modifying a symbol)
    c                     t               N)NotImplementedError)selfamplys     r#   evalzAmplyStmt.evalT   s    !##r"   N)r   r   r   r    r+   r!   r"   r#   r%   r%   K   s    $r"   r%   c                       e Zd ZdZy)	NoDefaultz
    Sentinel
    Nr   r!   r"   r#   r-   r-   X       r"   r-   c                       e Zd ZdZy)r   z
    Amply Exception Class
    Nr   r!   r"   r#   r   r   ^   r.   r"   c              #      K   g }t        |       D ]1  \  }}|j                  |       |dz   |z  dk(  s#t        |       g }3 |rt        |       yyw)z'
    Yields n-tuples from iterator
       r   N)	enumerateappendtuple)itncixs        r#   chunkr:   d   s`      	A" 1	EQ;!(NA	
 	Ah 	s
   0A"Ac                     || v r| |   S t        |t              r.|dd D ]  }| |   } 	 | j                  |d   |      }|t        ur|S |t        ur|S t	               )aY  
    Convenience method for walking down a series of nested dictionaries

    keys is a tuple of strings

    access_data(dict, ('key1', 'key2', 'key3') is equivalent to
    dict['key1']['key2']['key3']

    All dictionaries must exist, but the last dictionary in the hierarchy
    does not have to contain the final key, if default is set.
    N)
isinstancer4   getr-   KeyError)	curr_dictkeysdefaultsymrs        r#   access_datarE   r   st     y$9 	'C!#I	'MM$r(G,IHi
*r"   c                    t        | j                               }t               }t        | j                               D ]*  }|j	                  t        |j                                      , i }|D ]  }i ||<   |D ]  }| |   |   ||   |<     |S )z;
    Transpose a matrix represented as a dict of dicts
    )listrA   setvaluesupdate)datarowscolsdcolrows         r#   	transposerQ      s    
 		D5D$++-  $DN#$ 	A )# 	)Cs)C.AcF3K	)) Hr"   c                   "    e Zd ZdZd Zd Zd Zy)
SetDefStmtz/
    Represents a set definition statement
    c                     |d   dk(  sJ |d   | _         |j                  dd       | _        t        |j                  dd            | _        y )Nr   rH   r1   dimen
subscriptsr!   )namer>   rU   lenrV   r)   tokenss     r#   __init__zSetDefStmt.__init__   sE    ayE!!1I	ZZ.
fjjr:;r"   c                 j    d| j                   j                  d| j                  d| j                  dS )N<: [z]>)	__class__r   rW   rU   r)   s    r#   __repr__zSetDefStmt.__repr__   s!    !%!8!8$))TZZPPr"   c                 ~    t        | j                  | j                        }|j                  | j                  |       y )N)rV   rU   )	SetObjectrV   rU   
_addSymbolrW   )r)   r*   set_objs      r#   r+   zSetDefStmt.eval   s*    tdjjIG,r"   Nr   r   r   r    r[   rb   r+   r!   r"   r#   rS   rS      s    <Q-r"   rS   c                   "    e Zd ZdZd Zd Zd Zy)SetStmtz$
    Represents a set statement
    c                     |d   dk(  sJ |d   | _         |j                  d      | _        |j                  dd       | _        y )Nr   rH   r1   recordsmember)rW   r>   rk   rl   rY   s     r#   r[   zSetStmt.__init__   s>    ayE!!1I	zz),jj40r"   c           	          d| j                   j                  d| j                  d| j                  d| j                  d	S )Nr]   r^   r_   z] = >)r`   r   rW   rl   rk   ra   s    r#   rb   zSetStmt.__repr__   s.    NN##IIKKLL	
 	
r"   c                 "   | j                   |j                  v r+|j                  | j                      }t        |t              sJ t               }|j	                  | j
                  | j                         |j                  | j                   |       y r'   )rW   symbolsr=   rd   addDatarl   rk   re   r)   r*   objs      r#   r+   zSetStmt.eval   sb    99%--		*Cc9--+CDKK.C(r"   Nrg   r!   r"   r#   ri   ri      s    1
)r"   ri   c                       e Zd ZdZd Zd Zy)SliceRecordz4
    Represents a parameter or set slice record
    c                 $    t        |      | _        y r'   )r4   
componentsrY   s     r#   r[   zSliceRecord.__init__   s    -r"   c                 P    d| j                   j                  d| j                  dS Nr]   r^   rn   )r`   r   rw   ra   s    r#   rb   zSliceRecord.__repr__   s    !^^44dooFFr"   N)r   r   r   r    r[   rb   r!   r"   r#   ru   ru      s    (Gr"   ru   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TabularRecordz/
    Represents a parameter tabular record
    c                 V    |j                   | _        |j                  | _        d| _        y )NF)columns_columnsrK   _data
transposedrY   s     r#   r[   zTabularRecord.__init__   s    [[
r"   c                     || _         y r'   )r   )r)   ts     r#   setTransposedzTabularRecord.setTransposed   s	    r"   c              #      K   t        | j                        }|j                         rL|j                         }|j                  t	        | j
                              }||f |j                         rKy y wr'   )Chunkerr   notEmptyr:   rX   r~   )r)   r7   	row_labelrK   s       r#   _rowszTabularRecord._rows   sT     DJJjjl	I773t}}-.DT/! jjls   A0A53A5c                     i }| j                         D ]0  \  }}i ||<   t        | j                  |      D ]  \  }}|||   |<    2 | j                  rt	        |      S |S r'   )r   zipr~   r   rQ   )r)   rN   rP   rK   rO   values         r#   rK   zTabularRecord.data   sl     	$ICAcF!$--6 $
U##s$	$ ??Q<Hr"   c                 X    d| j                   j                  d| j                         dS ry   r`   r   rK   ra   s    r#   rb   zTabularRecord.__repr__   s    !^^44diikBBr"   N)	r   r   r   r    r[   r   r   rK   rb   r!   r"   r#   r{   r{      s!     
"	Cr"   r{   c                       e Zd ZdZd Zd Zy)
MatrixDataz-
    Represents a set matrix data record
    c              #   F   K   | j                   D ]  }|d   |dd  f  y w)Nr   r1   )r   )r)   rP   s     r#   r   zMatrixData._rows  s-     :: 	"Ca&#ab'/!	"s   !c                     g }| j                         D ]\  \  }}t        | j                  |      D ]>  \  }}|dk(  s| j                  r|j	                  ||f       ,|j	                  ||f       @ ^ |S )N+)r   r   r~   r   r3   )r)   rN   r   rK   rO   r   s         r#   rK   zMatrixData.data  su    #zz| 	3OIt!$--6 3
UC<#y!12)S!123	3 r"   N)r   r   r   r    r   rK   r!   r"   r#   r   r     s    "	r"   r   c                   "    e Zd ZdZd Zd Zd Zy)	ParamStmtz*
    Represents a parameter statement
    c                     |d   dk(  sJ |j                   | _         |j                  | _        |j                  dd      | _        || _        y Nr   paramrB   )rW   rk   r>   rB   rZ   rY   s     r#   r[   zParamStmt.__init__  s@    ayG##KK	~~zz)Q/r"   c                 j    d| j                   j                  d| j                  d| j                  dS )Nr]   r^   z = rn   )r`   r   rW   rk   ra   s    r#   rb   zParamStmt.__repr__#  s!    "&.."9"9499dllSSr"   c                    | j                   |j                  v r+|j                  | j                      }t        |t              sJ t               }|j                  dk(  rt        | j                        dk7  r/t        dj                  | j                   | j                              t        | j                  d         dk(  sJ |j                  | j                   | j                  d   d          y |j                  | j                  j                         | j                         |j                  | j                   |       y )Nr   r1   z0Error in number of records of {} when reading {})rB   )rW   rp   r=   ParamObjectrV   rX   rk   r   formatrZ   re   rq   asListrB   rr   s      r#   r+   zParamStmt.eval&  s    99%--		*Cc;//-C>>Q4<< A% FMM		4;; 
 t||A'1,,TYYQ(:;KK++-t||KDTYY,r"   Nrg   r!   r"   r#   r   r     s    T-r"   r   c                   *    e Zd ZdZd Zd Zd ZddZy)r   zE
    Chunker class - used to consume tuples from
    an iterator
    c                 `    t        |      | _        d| _        d| _        | j	                          y)z.
        it is a sequence or iterator
        FN)iterr5   emptynext_getNext)r)   r5   s     r#   r[   zChunker.__init__B  s&    
 r(
	r"   c                     | j                   }	 t        | j                        | _         |S # t        $ r d| _        Y |S w xY w)z
        basically acts as a 1 element buffer so that
        we can detect if we've reached the end of the
        iterator
        T)r   r5   StopIterationr   )r)   olds     r#   r   zChunker._getNextL  sE     ii	TWWDI 
  	DJ
	s   * >>c                     | j                    S )z:
        Test if the iterator has reached the end
        )r   ra   s    r#   r   zChunker.notEmptyZ  s    
 ::~r"   Nc                 ~    || j                         S t        |      D cg c]  }| j                          c}S c c}w )zt
        Return a list with the next n elements from the iterator,
        or the next element if n is None
        )r   range)r)   r6   r8   s      r#   r:   zChunker.chunka  s3    
 9==?").q2A222s   :r'   )r   r   r   r    r[   r   r   r:   r!   r"   r#   r   r   <  s    
3r"   r   c                   "    e Zd ZdZd Zd Zd Zy)ParamTabbingStmtz7
    Represents a parameter tabbing data statement
    c                     |d   dk(  sJ |j                  dd      | _        |j                  | _        |j                  | _        y r   )r>   rB   paramsrK   rY   s     r#   r[   zParamTabbingStmt.__init__p  s9    ayG##zz)Q/mmKK	r"   c                    t        | j                        D ]i  \  }}||j                  v r|j                  |   }nt        d|z        | j	                  |j
                        D ]  \  }}|j                  |||           k y )NzParam %s not previously defined)r2   r   rp   r   r   rV   setValue)r)   r*   r8   
param_namers   subsrK   s          r#   r+   zParamTabbingStmt.evalw  s{    &t{{3 	,MAzU]]*mmJ/ !BZ!OPP"jj8 ,
dT47+,	,r"   c              #      K   t        | j                        }|j                         rM|j                  |      }|j                  t	        | j
                              }||f |j                         rLy y wr'   )r   rK   r   r:   rX   r   )r)   n_subscriptsr7   rV   rK   s        r#   r   zParamTabbingStmt._rows  sX     DIIjjl.J773t{{+,Dt$$ jjls   A1A64A6N)r   r   r   r    r[   r+   r   r!   r"   r#   r   r   k  s     ,%r"   r   c                       e Zd ZdZd Zd Zy)ParamDefStmtz+
    Represents a parameter definition
    c                     |d   dk(  sJ |j                  d      | _        |j                  d      | _        |j                  dt              | _        y )Nr   r   rW   rV   rB   )r>   rW   rV   r-   rB   rY   s     r#   r[   zParamDefStmt.__init__  sC    ayG##JJv&	 **\2zz)Y7r"   c                     fd	 t        fd| j                  D              }j                  | j                  t        || j                               y # t        $ r d}Y >w xY w)Nc                 D    |    }||j                   y|j                   S Nr1   )rU   )symbolsr*   s     r#   	_getDimenz$ParamDefStmt.eval.<locals>._getDimen  s%    fAyAGGO77Nr"   c              3   .   K   | ]  } |        y wr'   r!   ).0r   r   s     r#   	<genexpr>z$ParamDefStmt.eval.<locals>.<genexpr>  s      G!1 Gs   r1   )sumrV   	TypeErrorre   rW   r   rB   )r)   r*   num_subscriptsr   s    ` @r#   r+   zParamDefStmt.eval  sX    		  Gt GGN 	K$MN  	N	s   A A&%A&N)r   r   r   r    r[   r+   r!   r"   r#   r   r     s    8Or"   r   c                   D    e Zd ZdefdZddZd Zd Zd Zd Z	d Z
d	 Zy
)r   r   c                 ~    || _         || _        i | _        | j                  t	        dg| j                   z               y N*)rV   rB   rK   	_setSliceru   )r)   rV   rB   s      r#   r[   zParamObject.__init__  s5    $	 	{C54??#:;<r"   c           	      r   fd}|D ]+  }t        |t              r| j                  |       &t        |t              rt	        | j
                        dz   }t	        |      |z  dk7  r!t        dt	        | j
                        z        t        |t	        | j
                        dz         D ]   }| j                  |d d  ||d                " t        |t              s|j                         }|D ]@  }t        ||   j                               D ]  \  }	}
| j                  ||	f ||
             ! B . y )Nc                     | dk(  rS | S )N.r!   )vrB   s    r#   _vzParamObject.addData.<locals>._v  s    CxHr"   r1   r   z9Incomplete data record, expecting %d subscripts per valuer<   )r=   ru   r   rG   rX   free_indicesr   r:   r   r{   rK   items)r)   rK   rB   r   recordrec_lenr7   record_data
row_symbol
col_symbolr   s     `        r#   rq   zParamObject.addData  s1   	
  	KF&+.v&FD)d//014v;(A-$025d6G6G2HI  vs4+<+<'='AB 5AMM!CR&"QrU)45FM2$kkm"- KJ-1+j2I2O2O2Q-R K)
Ez:&>5	JKK	Kr"   c                     t        |j                        | _        t        | j                        D cg c]  \  }}|dk(  s| c}}| _        y c c}}w r   )rG   rw   current_slicer2   r   r)   slicer8   r   s       r#   r   zParamObject._setSlice  sA    !%"2"23+4T5G5G+HU41aAQTHQUUs   AAc                 "   |dk(  r| j                   }t        |      t        | j                        k(  sJ | j                  }t	        | j                  |      D ]
  \  }}|||<    | j
                  }|d d D ]  }||vri ||<   ||   } |||d   <   y )Nr   r<   )rB   rX   r   r   r   rK   )r)   rp   r   symbol_pathindexr   r@   s          r#   r   zParamObject.setValue  s    C<LLE7|s4#4#4555(( !2!2G< 	(ME6!'K	( II	!#2& 	*FY&$&	&!!&)I	* &+	+b/"r"   c                 D    t        | j                  || j                        S r'   )rE   rK   rB   r)   keys     r#   __getitem__zParamObject.__getitem__  s    499c4<<88r"   c                 P    d| j                   j                  d| j                  dS ry   r   ra   s    r#   rb   zParamObject.__repr__      !^^44dii@@r"   c                      | j                   |k(  S r'   rK   r)   others     r#   __eq__zParamObject.__eq__      yyE!!r"   c                      | j                   |k7  S r'   r   r   s     r#   __ne__zParamObject.__ne__  r   r"   N)r   )r   r   r   r-   r[   rq   r   r   r   rb   r   r   r!   r"   r#   r   r     s2    "#Y =K2V+ 9A""r"   r   c                   b    e Zd Zd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y)rd   Nc                 x    || _         || _        | j                  dk(  rg | _        d | _        y i | _        d | _        y Nr   )rU   rV   rK   r   )r)   rV   rU   s      r#   r[   zSetObject.__init__  s>    
$??aDI " DI!r"   c                    | j                  |      }| j                  +| j                  | j                  dg| j                  z         |D ]  }t	        |t
              r| j                  |j                         /t	        |t              rR| j                  d| _        | j                  dgdz         |j                         }|D ]  }| j                  ||        | j                  ||        y )Nr      )_memberListrU   r   r   r=   ru   rw   r   rK   	_addValue_addSimpleData)r)   rl   rK   	dest_listr   rN   r   s          r#   rq   zSetObject.addData  s    $$V,	::!d&8&8&@NNC54::-. 	7F&+.v001FJ/::%!"DJNNC519-KKM 1ANN9a01 ##Iv6	7r"   c                     || _         t        | j                         D cg c]  \  }}|dk(  s| c}}| _        y c c}}w r   )r   r2   r   r   s       r#   r   zSetObject._setSlice  s6    "+4T5G5G+HU41aAQTHQUUs   <<c                     || j                   S t        |      | j                  k(  sJ | j                   }|d d D ]  }||vri ||<   ||   } |d   |vrg ||d   <   ||d      S )Nr<   )rK   rX   rV   )r)   rl   r@   r   s       r#   r   zSetObject._memberList
  s    >996{doo--II	Sbk 	*FY&$&	&!!&)I	* ":Y&$&IfRj!$$r"   c                 F    t        |t        t        f      rt        |      S yr   )r=   r4   rG   rX   )r)   rN   s     r#   _dataLenzSetObject._dataLen  s    a%'q6Mr"   c                 .   t        |d   t              rt        |d         }nd}| j                  || _        | j                  (| j                  t        dg| j                  z               t        | j                        |k(  r(|j                         D ]  }| j                  ||        y t        | j                        dkD  r9|r7t        |t        | j                              D ]  }| j                  ||        y t        d|| j                  fz        )Nr   r1   r   zBDimension of elements (%d) does not match declared dimension, (%d))r=   r   rX   rU   r   r   r4   r   r   r   r:   r   )r)   	data_listrK   inferred_dimenrN   r7   s         r#   r   zSetObject._addSimpleData  s    d1g|, a\NN::'DJ%NN5#!345t  !^3[[] -y!,-""#a'N4T%6%6!78 -y!,- +.<djj-IJ r"   c                    | j                   dk(  r|j                  |       y t        | j                        | j	                  |      k(  sJ t        | j                        }t        |t        t
        f      r$t        | j                  |      D ]
  \  }}|||<    n,t        | j                        dk(  sJ ||| j                  d   <   |j                  t        |             y )Nr1   r   )
rU   r3   rX   r   r   rG   r   r=   r4   r   )r)   r   itemto_addr   r   s         r#   r   zSetObject._addValue6  s    ::?T"t(()T]]4-@@@$,,-F$.$'(9(94$@ *LE5$)F5M* 4,,-22/3t((+,U6]+r"   c                 d    | j                   s| j                  |   S t        | j                  |      S r'   )rV   rK   rE   r   s     r#   r   zSetObject.__getitem__E  s(    99S>!499c**r"   c                 ,    t        | j                        S r'   )rX   rK   ra   s    r#   __len__zSetObject.__len__J  s    499~r"   c                 ,    t        | j                        S r'   )r   rK   ra   s    r#   __iter__zSetObject.__iter__M  s    DIIr"   c                     || j                   v S r'   r   )r)   r   s     r#   __contains__zSetObject.__contains__P  s    tyy  r"   c                      | j                   |k(  S r'   r   r   s     r#   r   zSetObject.__eq__S  r   r"   c                      | j                   |k7  S r'   r   r   s     r#   r   zSetObject.__ne__V  r   r"   c                 P    d| j                   j                  d| j                  dS ry   r   ra   s    r#   rb   zSetObject.__repr__Y  r   r"   )r   N)r   r   r   r[   rq   r   r   r   r   r   r   r   r   r  r   r   rb   r!   r"   r#   rd   rd     sJ    	"7(V%
2,+
!""Ar"   rd   c                 .    | d   j                  d       | S )Nr   T)r   )rZ   s    r#   mark_transposedr  ]  s    
1ID!Mr"   r1   )exact_)	bodyCharsminz+ -c                     t        | d         S r   )intr   s    r#   <lambda>r  g  s    c!A$i r"   z+-r   ze Ec                     t        | d         S r   )floatr  s    r#   r  r  l  s    51; r"   (){}r_   ];r   -r   rH   rB   "'inrV   z(tr),rU   :r}   z:=rK   r   trrl   rk   rW   r^   r   #zend;c                   R     e Zd ZdZd	dZd Z fdZd Zd Zd Z	e
d        Z xZS )
r   z 
    Data parsing interface
    c                 4    i | _         | j                  |       y)zi
        Create an Amply parser instance

        @param s (default ""): initial string to parse
        N)rp   load_string)r)   r   s     r#   r[   zAmply.__init__
  s     r"   c                 >    || j                   v r| j                   |   S y)zV
        Override so that symbols can be accessed using
        [] subscripts
        Nrp   r   s     r#   r   zAmply.__getitem__  s$    
 $,,<<$$ r"   c                 d    || j                   v r| j                   |   S t        t        |   |      S )zH
        Override so that symbols can be accessed as attributes
        )rp   superr   __getattr__)r)   rW   r`   s     r#   r&  zAmply.__getattr__  s2     4<<<<%%UD-d33r"   c                 "    || j                   |<   y)z
        Adds a symbol to this instance.

        Typically, this class is called by objects created by
        the parser, and should not need to be called by users
        directly
        Nr#  )r)   rW   r   s      r#   re   zAmply._addSymbol%  s     #Tr"   c                     	 t         j                  |      D ]  }|j                  |         y# t        $ r}t	        |       t        |      d}~ww xY w)zN
        Load and parse string

        @param string string to parse
        N)grammarparseStringr+   r
   print)r)   stringrs   exs       r#   r!  zAmply.load_string0  sN    	%**62  	%&M $$	%s   +. 	AAAc                 B    | j                  |j                                y)zH
        Load and parse file

        @param f file-like object
        N)r!  read)r)   fs     r#   	load_filezAmply.load_file=  s     	"r"   c                 4    t        | j                               S )zk
        Create a new Amply instance from file (factory method)

        @param f file-like object
        )r   r/  )r0  s    r#   	from_filezAmply.from_fileE  s     QVVXr"   ) )r   r   r   r    r[   r   r&  re   r!  r1  staticmethodr3  __classcell__)r`   s   @r#   r   r     s:    	%4	#%#  r"   __main__zparser_rr_diag.htmlN)fr    	pyparsingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   enablePackrat__all__objectr   r%   r-   	Exceptionr   r:   rE   rQ   rS   ri   ru   r{   r   r   r   r   r   r   rd   r  r   r   signsetParseActionintegernumberLPARENRPARENLBRACERBRACELBRACKETRBRACKETENDPLUSMINUSKW_PARAMKW_SET
KW_DEFAULTsingletuple_domain_indexsetResultsNamesubscript_domainrK   simple_datanon_dimen_simple_data
matrix_rowmatrix_datatr_matrix_dataset_slice_componentset_slice_record_set_record
set_recordnon_dimen_set_recordset_def_stmt
set_memberset_stmt	subscript
param_data
plain_dataplain_data_recordtabular_recordtr_tabular_recordparam_slice_componentparam_slice_recordparam_recordparam_default
param_stmtparam_tabbing_stmtparam_def_stmtstmtsr)  ignorer   r   create_diagramr!   r"   r#   <module>ro     s"  #H     0     L
!& 
$ 
$   *3 :&- -&)i )<	G& 	G CF  CF *"-	 "-J,3f ,3^%y %<O9 O2A"+ A"HtA tAn 	Ya 	i#oSa	@e
$d#
$
3
34G
H	dsXd4j))*+uU|d4$;5567
 .&'	  
#	#	#	#C=C=sms| 7	Y
	&<,	,|C/@	@	vf--6	7-.
H\*V34CCLQR   F6NT)Jx7NQU7U,VVW !))K7 6IdUl334
&&y12
 
**623    : &&!K/   o .vo+ F4L(=9L+MMPVV     ,,~=N;&
,{:   ! ww'"8"8"AABC 
	
    J 'd++h6
 z))(34 z(8C=*AJ*NOOnY  

 	 	    	CZ
*Xhsm4y@AAJNO 
 
6NZ&"449Z((6*+==>  &&y12
 ,,V45    m ,V$~5       1#- .C DDxO   ! !+ .   tn	  f&;&;I&FFG kF#$  Il#$33I>	?
 

    ) $ 	
 v} o$$X.	/
  ''/0 

   ! !"2 3 F#$ !  
	
    l +<.0:=@RR
U
ik
) sVG_$ % vw' (GF GT z01 r"   