
    +#hKE                         d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 	  G d de      Z
 G d d	ej                        Z G d
 de	      Zy)    )defaultdictN)Evaluate)	Signature)Teleprompterc                       e Zd ZdZ ej
                  d      Z ej                  d      Z ej                  d      Z	y)BasicGenerateInstructiona  You are an instruction optimizer for large language models. I will give you a ``signature`` of fields (inputs and outputs) in English. Your task is to propose an instruction that will lead a good language model to perform the task well. Don't be afraid to be creative.z,The initial instructions before optimizationdesc0The improved instructions for the language modelUThe string at the end of the prompt, which will help the model start solving the taskN)
__name__
__module____qualname____doc__dspy
InputFieldbasic_instructionOutputFieldproposed_instruction proposed_prefix_for_output_field     \/var/www/html/sandstorm/venv/lib/python3.12/site-packages/dspy/teleprompt/copro_optimizer.pyr   r   #   sD     W'-[\+4++1cd'7t'7'7d($r   r   c                       e Zd ZdZ ej
                  ej                        Z ej                  d      Z
 ej                  d      Zy) GenerateInstructionGivenAttemptsa  You are an instruction optimizer for large language models. I will give some task instructions I've tried, along with their corresponding validation scores. The instructions are arranged in increasing order based on their scores, where higher scores indicate better quality.

    Your task is to propose a new instruction that will lead a good language model to perform the task even better. Don't be afraid to be creative.)formatr   r	   r   N)r   r   r   r   r   r   dsppassages2textattempted_instructionsr   r   r   r   r   r   r   r   -   sK    W -T__C4E4EF+4++1cd'7t'7'7d($r   r   c                   D    e Zd Z	 	 	 	 	 	 d	dZd Zd Zd Zd Zd Zd Z	y)
COPRONc                     |dk  rt        d      || _        || _        || _        || _        || _        || _        d|v r t        j                  j                  d       y y )N   zBreadth must be greater than 1verbosezDeprecationWarning: 'verbose' has been deprecated. To see all information for debugging, use 'dspy.set_log_level('debug')'. In the future this will raise an error.)

ValueErrormetricbreadthdepthinit_temperatureprompt_modeltrack_statsr   loggerwarning)selfr*   r&   r'   r(   r)   r+   _kwargss           r   __init__zCOPRO.__init__:   sj     a<=>>
 0(&KK  !F  G  r   c                    t        |d   j                         |d   j                               D ]  \  }}| j                  |      j                  | j                  |      j                  k7  r y| j                  |      j                  j                         ^ }}| j                  |      j                  j                         ^ }}||k7  s y y)NprogramFT)zip
predictors_get_signatureinstructionsfieldsvalues)r.   
candidate1
candidate2p1p2_p1_last_fieldp2_last_fields           r   _check_candidates_equalzCOPRO._check_candidates_equalP   s    *Y/::<j>S>^>^>`a 	FB""2&33t7J7J27N7[7[[ $ 3 3B 7 > > E E GQ $ 3 3B 7 > > E E GQ-	 r   c                     g }g }d}|D ]Y  }d}|d   |k(  r1|D ]  }| j                  ||      sd} n |s|j                  |       n|g}|d   }|rI|j                  |       [ |S )NFscoreT)r@   append)r.   
candidatesfinal_candidates
last_batchlast_batch_scorecrepeatc2s           r   _drop_duplicateszCOPRO._drop_duplicatesZ   s    
 	+AFz--$ B33Ar:!% %%a(S
#$W:  ''*	+  r   c                 $   | j                  |      }t        j                  j                  d|j                          t        j                  j                  dt        |j                  j                               d   j                  d           y )Nzi: zp: rB   prefix)	r5   r   r,   debugr6   listr7   r8   json_schema_extra)r.   	predictor	signatures      r   _print_signaturezCOPRO._print_signaturen   sq    ''	2	C	 6 6789CY%5%5%<%<%> ? C U UV^ _`abr   c                 d    t        |d      r|j                  S t        |d      r|j                  S y Nextended_signaturerS   hasattrrW   rS   )r.   rR   s     r   r5   zCOPRO._get_signaturet   s4    923///Y,&&& -r   c                 T    t        |d      r||_        y t        |d      r||_        y y rV   rX   )r.   rR   updated_signatures      r   _set_signaturezCOPRO._set_signaturez   s,    923+<I(Y,"3I -r   c                   |j                         }t        d5|| j                  d|}d}|j                         D ci c]  }t	        |      g g g g g d }}|j                         D ci c]  }t	        |      g g g g g d }	}| j
                  rddl}
i }t        t              }|j                         D ]  }d}d}| j                  |      j                  j                         ^ }}| j                  |      j                  }| j                  |      j                  |   j                  d   }| j                  rnt        j                   j#                  | j                        5   t        j$                  t&        | j(                  dz
  | j*                        |	      }ddd       n: t        j$                  t&        | j(                  dz
  | j*                        |	      }j,                  j.                  j1                  |       |j,                  j2                  j1                  |       |j,                  |t	        |      <   i |t	        |      <    | j                  r:t        j4                  j7                  | j                  j9                  d
              |}|}|j                         }t;        | j<                        D 	]:  }t        j4                  j?                  d|dz    d| j<                   d       g }tA        tC        |j                         |j                                     D ]  \  }\  }}|t	        |         }tE        |j                               dkD  r|t	        |         }tA        |      D ]  \  }}|j.                  jG                  d      jG                         |j2                  jG                  d      jG                         }}| j                  |      j                  j                         ^ }}| j                  |      jI                  |      jK                  ||      } | jM                  ||        tA        |j                               D ];  \  }!}t        j4                  j7                  d|!dz           | jO                  |       = t        j4                  j?                  d|dz    d| j<                   d|dz    dtE        |       d|dz    dtE        |j                                d        ||fd|i|}"| j                  r<t        j4                  j7                  d| j                  j9                  d
              |dz  }d}#t        j4                  j7                  d||f        ||f|t	        |         v r|t	        |         ||f   d   |"k\  rd}#|#r'|"|j                         |||d|t	        |         ||f<   tE        |      | j(                  z
  |k  su|j1                  |"        | j
                  r|	t	        |         d   j1                  |       |	t	        |         d   j1                  tQ        |             |	t	        |         d   j1                  tS        |      tE        |      z         |	t	        |         d   j1                  tU        |             |	t	        |         d    j1                  
jW                  |             tQ        |t	        |         jY                         d! "      }$| j                  |      j                  j                         ^ }}| j                  |      jI                  |$d#         jK                  ||$d         } | jM                  ||        t        j4                  j7                  d$t	        |       d%|$d#    d&|$d           t        j4                  j7                  d'       tA        |j                               D ]8  \  }!}t        j4                  j7                  d|!        | jO                  |       :  || j<                  dz
  k(  r ni }%|j                         D ]\  }&g }'| j(                  }(tU        tE        |t	        |&               |(      }(t[        |t	        |&         jY                               })|)j]                  d( d)       | j
                  r|)D *cg c]  }*|*d   	 c}*dd* }+|t	        |&         d   j1                  |       |t	        |&         d   j1                  tQ        |+             |t	        |&         d   j1                  tS        |+      tE        |+      z         |t	        |&         d   j1                  tU        |+             |t	        |&         d    j1                  
jW                  |+             t;        |(dz
  d+d+      D ]b  }!|'j1                  d,|(|!z
   d-|)|!   d#           |'j1                  d.|(|!z
   d-|)|!   d           |'j1                  d/|(|!z
   d-|)|!   d           d | j                  rkt        j                   j#                  | j                        5   t        j$                  t^        | j(                  | j*                        |'0      },ddd       n7 t        j$                  t^        | j(                  | j*                        |'0      },| j                  r<t        j4                  j7                  d1| j                  j9                  d
              ,j,                  |%t	        |&      <   |t	        |&         j.                  ja                  |,j,                  j.                         |t	        |&         j2                  ja                  |,j,                  j2                         _ | j                  r:t        j4                  j7                  | j                  j9                  d
              |%}	= g }|j                         D ]i  }|ja                  t[        |t	        |         jY                                      | j
                  sEt[        |t	        |         jY                               })|)j]                  d2 d)       |)D *cg c]  }*|*d   	 c}*dd* }+|t	        |         d   j1                         |t	        |         d   j1                  tQ        |+             |t	        |         d   j1                  tS        |+      tE        |+      z         |t	        |         d   j1                  tU        |+             |t	        |         d    j1                  
jW                  |+             l |j]                  d3 d)       | jc                  |      }|d   d4   }-||-_2        ||-_3        | j
                  r||-_4        |	|-_5        |-S c c}w c c}w # 1 sw Y   
xY wc c}*w # 1 sw Y    xY wc c}*w )6zwstudent is a program that needs to be optimized, note that it may be zero-shot or already pre-optimized for demos != [])devsetr&   r   )r(   maxaverageminstdNrN   )lmr#   )ntemperature)r   )rd   zIteration Depth: /.")rN   z
Predictor z	At Depth z, Evaluating Prompt Candidate #z for Predictor z of r^   z"prompt_model.inspect_history(n=1) Tz(instruction, prefix) rC   F)rC   r2   instructionrN   r(   r(   r_   r`   ra   rb   c                     | d   S NrC   r   )	candidates    r   <lambda>zCOPRO.compile.<locals>.<lambda>   s    enovew r   )keyri   zUpdating Predictor z to:
i: z
p: zFull predictor with update: c                     | d   S rk   r   xs    r   rm   zCOPRO.compile.<locals>.<lambda>  
    1W: r   )rn   reverse
   rB   zInstruction #z: zPrefix #zResulting Score #)r   z)(self.prompt_model.inspect_history(n=1)) c                     | d   S rk   r   rp   s    r   rm   zCOPRO.compile.<locals>.<lambda>L  rr   r   c                     | d   S rk   r   rp   s    r   rm   zCOPRO.compile.<locals>.<lambda>U  s
    aj r   r2   r   )6deepcopyr   r&   r4   idr+   numpyr   dictr5   r7   keysr6   rQ   r*   r   settingscontextPredictr   r'   r)   completionsr   rD   r   r,   rO   inspect_historyranger(   info	enumerater3   lenstripwith_instructionswith_updated_fieldsr\   rT   r_   sumra   rb   r8   rP   sortr   extendrL   candidate_programstotal_callsresults_bestresults_latest).r.   studenttrainseteval_kwargsmoduleevaluater   pr   r   nprE   evaluated_candidatesrR   r   basic_prefixr=   last_keyinstructlatest_candidatesall_candidatesmodule_clonedlatest_scoresp_ip_oldp_newcandidates_c_irI   ri   rN   r[   irC   replace_entrybest_candidatenew_candidatesp_baseattemptsshortest_lenbest_predictorsrq   scoresinstrbest_programs.                                                 r   compilezCOPRO.compile   sE   !!#O8DKKO;OZ`ZkZkZm
UVBqERr"RPP
 
 [aZkZkZm
UVBqERr"RPP
 
 
*40  **, 	5I $L..y9@@EEGLQ $ 3 3I > K K..y9@@J\\]efL  ]]**d.?.?*@ ; t||0,,*$($9$9  ):	 ;H; ;4<<,llQ& $ 5 5 %6	7   55<<=NO  AAHHV(0(<(<Jr)}%24 I//	52 KK!2!2!B!BQ!B!G HJ&#( JJ
 O	/A KK01Qtzzl!DEM (1V5F5F5H,JaJaJc1d'e O5#^eU/5	:v((*+a/"05	#K
 (4 -4FC ..44S9??A::@@EKKM "(K $(#6#6u#=#D#D#I#I#KLQ++E2**;7,,Xf,E &
 ''/@A )2,2I2I2K(L 99))Jqse*<=--i89 KK$$#AaC5$**5TUXYZUZT[[\]`al]m\nn}  B  CD  D  ~E  EI  JM  NT  N_  N_  Na  Jb  Ic  cd  e %\R(RkRE(()),NtO`O`OpOpstOpOuNv*wx1$K$(MKK%%(>V?T>U&VW#V,0DRY0OO/5	:K;PQRYZ^cc,1M$ &+'3'<'<'>+6&,%&R,RY7f8MN ;'$,,6#=%,,U3[-4^ ##"2e9-g6==a@"2e9-e4;;C<NO"2e9-i8??M@RUXYfUg@gh"2e9-e4;;C<NO"2e9-e4;;BFF=<QR "%%9"U)%D%K%K%MSw!x#2259@@EEGH''.&&~m'DE((.:R(S "
 ##E+<=!!)"U)In]>[=\\abpqybza{| !!"@A$-l.E.E.G$H 5LAyKK%%
1#&67)))45[O5b DJJN"N ++- .#||"3';BvJ'G#H,W"&';BvJ'G'N'N'P"Q  $$)=t$L##2ABQajB3BGF F,W5<<Q? F,U3::3v;G F,Y7>>s6{SQW[?XY F,U3::3v;G F,U3::266&>J|a/R8 iAOOmLN3C2oVWFXYfFgEh$ijOOh|A~.>bQRAST\A]@^$_`OO&7Q7Gr/Z[J\]dJeIf$gh	i $$..$2C2C.D ;!<"ll(,(=(=! 2:	!;; ;DLL8,,$($9$9 .6	7E $$KK%%(QRVRcRcRsRsvwRsRxQy&z{-2->->r&z*r&z*??FFuGXGXGmGmnr&z*KKRR%%FFY.`   !!T%6%6%F%F%F%K$LN ._O	/b 
**, 	JId#79#F#M#M#OPQ"&';ByM'J'Q'Q'S"T$$)=t$L.=>!G*>sCR	]+G4;;A>R	]+E299#f+FR	]+I6==c&kCPVK>WXR	]+E299#f+FR	]+E299"&&.I	J 	0$?**:6
!!}Y/*4'#. (4L%*8L'w

$; ;F C; ;D ?s/   w*w&;w$w1(8w6x$w.	6x )NNrt      gffffff?F)
r   r   r   r0   r@   rL   rT   r5   r\   r   r   r   r   r!   r!   9   s<     G, (c'4`r   r!   )collectionsr   r   r   dspy.evaluate.evaluater   dspy.signaturesr   dspy.teleprompt.telepromptr   r   r   r!   r   r   r   <module>r      sF    # 
  + % 34y 	t~~ 	gL gr   