
    M/Ph.              	       	   d Z ddlZddlmc mZ ddlmZ  G d d          Z	 G d d          Z
dZ G d d	          Z ej        d
dd                                          Zed                             dd                                          Zej        \  ZZe                    e                              dd          Zeddddf                             ddez                                            Z ee                    d                     ej        j        Z eedd                    g dZ ee                     d                              ed                     ddgZ! ej"        d e!D                       Z#e#                    d e$e!          ez            Z#ej%        ee#f         Z#ed         dddf         Z& ej'        ej        d                   ez  Z(ed         e(dk    z  Z) ej*        edge)gd          Z+g Z, e-d          D ]!Z.e,/                    ee(e.k                        " ej*        edg ej0        ej        d                   gd          Z1g dg dg dddggZ2g Z, e-d          D ]-Z.e,/                    e1e2e.                  e(e.k                        .dZ3d  e-d          D             Z4ej5        e3ge3 ej6        e4          7                                z   f         Z8 ej'        d          Z9d   e- e$e8          dz
            D             Z: ej'        d          Z;d! e:D             Z<d" e,D             Z= e	ee=d          Z>dZ?e?r$ ej@        e>jA         ej0        d                    ZBg d#ZCe?r ej@        e>jA        eC          ZD ej@        e>jA         ejE        d          d$%          ZF	 eFg d&         ZGeGdxx         d'z  cc<    eeGeCz
              ee>H                                           d(d)d*gfd+g d,fgfZI eJ eKg dd-  e-d          D                                 ZL eJ eKg dg d.                    ZLeLM                    g g g d/           g g g g d0g d1g d2ddgd3ZN eeeLeIeN          ZO eeOP                    eOjQ                              ed4            eeOjR                   dS )5a.  conditional logit and nested conditional logit

nested conditional logit is supposed to be the random utility version
(RU2 and maybe RU1)

References:
-----------
currently based on:
Greene, Econometric Analysis, 5th edition and draft (?)
Hess, Florian, 2002, Structural Choice analysis with nested logit models,
    The Stats Journal 2(3) pp 227-252

not yet used:
Silberhorn Nadja, Yasemin Boztug, Lutz Hildebrandt, 2008, Estimation with the
    nested logit model: specifications and software particularities,
    OR Spectrum
Koppelman, Frank S., and Chandra Bhat with technical support from Vaneet Sethi,
    Sriram Subramanian, Vincent Bernardin and Jian Zhang, 2006,
    A Self Instructing Course in Mode Choice Modeling: Multinomial and
    Nested Logit Models

Author: josef-pktd
License: BSD (simplified)
    N)optimizec                   ,    e Zd ZdZd Zd Zd ZddZdS )	TryCLogita|  
    Conditional Logit, data handling test

    Parameters
    ----------

    endog : array (nobs,nchoices)
        dummy encoding of realized choices
    exog_bychoices : list of arrays
        explanatory variables, one array of exog for each choice. Variables
        with common coefficients have to be first in each array
    ncommon : int
        number of explanatory variables with common coefficients

    Notes
    -----

    Utility for choice j is given by

        $V_j = X_j * beta + Z * gamma_j$

    where X_j contains generic variables (terminology Hess) that have the same
    coefficient across choices, and Z are variables, like individual-specific
    variables that have different coefficients across variables.

    If there are choice specific constants, then they should be contained in Z.
    For identification, the constant of one choice should be dropped.


    c                    || _         | _        | _        |j        \  | _        | _        t                    | _        fdt          d          D             }t          j	        gt          j
        |                                          z   f         fdt          t                    dz
            D             }|| _        t          j        d          fd|D             }d S )Nc                 <    g | ]}|         j         d          z
  S    shape.0iiexog_bychoicesncommons     e/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/statsmodels/sandbox/regression/runmnl.py
<listcomp>z&TryCLogit.__init__.<locals>.<listcomp>F   +    JJJ2>"%+A.w6JJJ       c           	          g | ]F}t           j        t          j        d dg          t          |         |dz                     f         GS r   r	   npr_arrayzr   r   zis     r   r   z&TryCLogit.__init__.<locals>.<listcomp>H   X     3 3 3 bh1v..qB2a4/AAB 3 3 3r   r	      c                      g | ]
}|         S  r"   r   idxbetas     r   r   z&TryCLogit.__init__.<locals>.<listcomp>N       ???3T#Y???r   endogr   r   r   nobsnchoiceslenranger   r   r   cumsumbeta_indicesarange	selfr(   r   r   betaindr.   betaidx_bychoicesr%   r   s	     ``   @@r   __init__zTryCLogit.__init__>   s    
,#(; 	4=N++ KJJJJqJJJUG9g(9(9(@(@(B(BBBC3 3 3 3!&s2wwqy!1!13 3 3( y||????,???r   c                     t          j        | j        | j        f          }t	          | j                  D ]:}t          j        | j        |         || j        |                            |dd|f<   ;|S zthese are the V_i
        Nr   emptyr)   r*   r,   dotr   r.   r1   paramsres	choiceinds       r   xbetaszTryCLogit.xbetasQ   y     h	4=122t}-- 	L 	LI!vd&9)&D&,T->y-I&J L  LC)
r   c                 J   |                      |          }t          j        |          }|                    d          }||                    d          d d d f         z  }| j        t          j        |          z                      d          }|                                 S Nr	   )r>   r   expsumr(   log)r1   r;   xbexpxbsumexpxbprobsloglikes          r   rI   zTryCLogit.loglike[   s    [[  r

99Q<<eiill111T6**:u-22155 ~r   Nc                 f    |t          j        d          }t          j        | j        |d          S )N   '  maxfun)r   zerosr   fminrI   )r1   start_paramss     r   fitzTryCLogit.fitg   s.    8A;;L}T\<FFFFr   N)__name__
__module____qualname____doc__r4   r>   rI   rR   r"   r   r   r   r      sh         >@ @ @&  
 
 
G G G G G Gr   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )
TryNCLogitzj
    Nested Conditional Logit (RUNMNL), data handling test

    unfinished, does not do anything yet

    c                    || _         | _        | _        |j        \  | _        | _        t                    | _        fdt          d          D             }t          j	        gt          j
        |                                          z   f         fdt          t                    dz
            D             }|| _        t          j        d          fd|D             }d S )Nc                 <    g | ]}|         j         d          z
  S r   r
   r   s     r   r   z'TryNCLogit.__init__.<locals>.<listcomp>~   r   r   r   c           	          g | ]F}t           j        t          j        d dg          t          |         |dz                     f         GS r   r   r   s     r   r   z'TryNCLogit.__init__.<locals>.<listcomp>   r   r   r	   r    c                      g | ]
}|         S r"   r"   r#   s     r   r   z'TryNCLogit.__init__.<locals>.<listcomp>   r&   r   r'   r0   s	     ``   @@r   r4   zTryNCLogit.__init__u   s    
,#(; 	4=N++ KJJJJqJJJUG9g(9(9(@(@(B(BBBC3 3 3 3!&s2wwqy!1!13 3 3( y||????,???r   c                     t          j        | j        | j        f          }t	          | j                  D ]:}t          j        | j        |         || j        |                            |dd|f<   ;|S r6   r7   r:   s       r   r>   zTryNCLogit.xbetas   r?   r   c                     |                      |          }t          j        ||z            }|                    d          }t          j        |          }||d d d f         z  }|t
          fS rA   )r>   r   rB   rC   rD   logsumexpxp)r1   r;   taurE   rF   rG   logsumexpxbrH   s           r   loglike_leafbranchzTryNCLogit.loglike_leafbranch   sf     [[  r#v99Q<<fX&&hqqqv&&k!!r   c                 J   g }t           D ]0}|                     ||          \  }}|                    |           1t          j        |          }t          j        ||z            }|                    d          }t          j        t                    }	||d d d f         z  }d S rA   )	branchesrc   appendr   column_stackrB   rC   rD   rG   )
r1   r;   ra   ivsbrH   ivexptiv	sumexptivrb   s
             r   loglike_branchzTryNCLogit.loglike_branch   s     	 	A//<<IE2JJrNNNN oc""CJJqMM	fX&&y4((r   N)rT   rU   rV   rW   r4   r>   rc   rm   r"   r   r   rY   rY   m   s]         @ @ @(  	" 	" 	") ) ) ) )r   rY   c                        e Zd ZdZd ZddZdS )RU2NMNLzENested Multinomial Logit with Random Utility 2 parameterization

    c                 Z    || _         || _        || _        || _        d| _        i | _        d S )N )r(   datadicttree	paramsind	branchsumrH   )r1   r(   exogrs   rt   s        r   r4   zRU2NMNL.__init__   s0    
	"


r   Nc                    | j         }| j        | j        }| j        }t	          |t
                    r|\  }}t          ||                    t          d|           g }t          r	|         }n|}|D ]*}t          |           ||                     ||          z   }+t          d||           |D ]!}	| j	        |	         d|z   dz   gz   | j	        |	<   "n|
                    |           |dz   dd                    | j        |                   z  z   g| j	        |<   t          rBt          fd|D                       }
t          d|d	                    |          |
           |
S d	                    |          S t          d
||           |S )z5walking a tree bottom-up based on dictionary
        subtreeru   *z-probz(%s)z, c              3   (   K   | ]}|         V  d S rS   r"   )r   birr   s     r   	<genexpr>z$RU2NMNL.calc_prob.<locals>.<genexpr>   s'      <<<<<<<<r   zfinal branch withrq   zworking on branch)r(   rr   rt   ru   
isinstancetupleprinttestxb	calc_probrH   rf   joinrC   )r1   rs   keysr(   rt   ru   namerx   ri   k	leavessumrr   s              @r   r   zRU2NMNL.calc_prob   s    
=N	N	 dE"" 	% MD'$''')W%%%D !$TN		 	 @ @a%q$(?(??		+y$/// G G $
1tg1E0F F
1G KK $w &4>$3G)H)H H!I  JDJt %<<<<t<<<<<	)4	JJJ  wwt}}$!4333r   rS   )rT   rU   rV   rW   r4   r   r"   r   r   ro   ro      sA           & & & & & &r   ro   zTableF23-2.txtr	   z4Mode   Ttme   Invc    Invt      GC     Hinc    PSize)skip_headernamesModer   r    rK   )AirTrainBusCarGCTtmec                 (    g | ]}t           |         S r"   )dta)r   r   s     r   r   r     s    GGGTs4yGGGr   HincHincaF)usemaskConst)r   r   r   r   )r   r   r      c                 f    g | ].}t          t          |         j        j                  t          z
  /S r"   )r+   xidtyper   r   r   r   s     r   r   r   '  s.    
>
>
>r3r"v|!""7*
>
>
>r   c           	          g | ]P}t           j        t          j        d dg          t          t          |         t          |dz                     f         QS r   )r   r   r   r   r   r   s     r   r   r   *  sW     + + + uRXq!f%%a2r"Q$x&889 + + +r   c                 (    g | ]}t           |         S r"   )r%   )r   r$   s     r   r   r   .  s    ***sc***r   c                 t    g | ]5}|                     t                                        t          d           6S )r   )viewfloatreshaper)   )r   xxs     r   r   r   8  s2    
8
8
8r2775>>!!$r**
8
8
8r   )geF ^ÿgA} Rg$7?gd`@gʡE@gX5;N	@rL   rM   )r	   r   r      r      
   topFlyr   Ground)r   r   r   c                 (    g | ]}t           |         S r"   )xifloat)r   is     r   r   r   ]  s    1111WQZ111r   )Airdata	TraindataBusdataCardata)r   r   r   )r   r   ConstAr   )r   r   ConstT)r   r   ConstB)r   r   r   r   r   r   r   z
modru.probs)SrW   numpyr   numpy.lib.recfunctionslibrecfunctionsrecfscipyr   r   rY   r   ro   
genfromtxtsplitr   r   copyr(   r   r)   r*   r   r   	datafloatrv   r   rC   r   r   varnamesmodesmeanexog_choice_namesrg   exog_choicer+   c_exog_individualr/   choice_indexhincaappend_fieldsdta2r   r,   r   rf   onesdta1xivarr   r2   r   r   r-   r   r   betaindicesr%   betair   clogitdebugrP   rI   r<   tab2324res2rO   res3res3corrrR   tree0dictziprr   updatert   modrur   rs   rH   r"   r   r   <module>r      s   0     % % % % % % % % %      LG LG LG LG LG LG LG LG^?) ?) ?) ?) ?) ?) ?) ?)J 
5 5 5 5 5 5 5 5z bm$!PVVXXZ Z Z 	FBq!!&&((hHHUOO##Bq))	122r!H*--2244 eiill   9? hqrrl   &&& diill8R(( ) ) ) 6N boGG5FGGGHH!!"SS):%;%;H%DEEeE;&'f+aaaf% ry1&&1F\1_%TgYw>>>
 
%(( + +BIIib()**** t#y'"'#)A,*?*?)@%PPP	(	(	(	 	 	 	 	 	 
	
 
%(( 1 1BIId59olB./0000 
>
>UU1XX
>
>
>5'GHBHW--44666	67")A,,+ +ss2wwqy))+ + + ry||**k*** 9
8R
8
8
8	5'1	%	%	 4
(-


3
3C
?
?
? 28=11Dx}V^XRXa[[>>> """# r  h    fjjll    
UG_///0	
 422211a1113 3 4 4 4222BBBD D E E 	2        777//////f~ 	 	x	22 eooej!! " " " o    ek     r   