[Ad-dev] [ADIC] #49: Cast Expressions

ADIC trac at mcs.anl.gov
Wed Jan 26 09:40:50 CST 2011


#49: Cast Expressions
------------------------------+---------------------------------------------
 Reporter:  snarayan          |       Owner:  snarayan
     Type:  defect            |      Status:  new     
 Priority:  minor             |   Milestone:          
Component:  Canonicalization  |     Version:  2.0     
 Keywords:                    |  
------------------------------+---------------------------------------------
 There seems to be no nice way to handle a type cast expression:
 void mini2(double *y, double *x)
 {
   int i;
   double j;
   y[i] = x[(int)(j)];
 }

 The XAIF created is:

         <xaif:AssignmentLHS>
           <xaif:SymbolReference annotation="28301536" scope_id="7"
 symbol_id="y" vertex_id="1"></xaif:SymbolReference>
           <xaif:ArrayElementReference vertex_id="1">
             <xaif:IndexTriplet>
               <xaif:Index>
                 <xaif:VariableReference vertex_id="4">
                   <xaif:SymbolReference annotation="28301632" scope_id="8"
 symbol_id="i" vertex_id="1"></xaif:SymbolReference>
                 </xaif:VariableReference>
                 <xaif:Intrinsic name="sub_scal_scal"
 vertex_id="6"></xaif:Intrinsic>
                 <xaif:Constant type="integer" value="1"
 vertex_id="5"></xaif:Constant>
                 <xaif:ExpressionEdge edge_id="1" position="1" source="4"
 target="6"></xaif:ExpressionEdge>
                 <xaif:ExpressionEdge edge_id="2" position="2" source="5"
 target="6"></xaif:ExpressionEdge>
               </xaif:Index>
             </xaif:IndexTriplet>
           </xaif:ArrayElementReference>
           <xaif:VariableReferenceEdge edge_id="1" source="1"
 target="1"></xaif:VariableReferenceEdge>
         </xaif:AssignmentLHS>
         <xaif:AssignmentRHS>
           <xaif:VariableReference vertex_id="7">
             <xaif:SymbolReference annotation="28301584" scope_id="7"
 symbol_id="x" vertex_id="1"></xaif:SymbolReference>
             <xaif:ArrayElementReference vertex_id="8">
               <xaif:IndexTriplet>
                 <xaif:Index>
                   <xaif:VariableReference vertex_id="11">
                     <xaif:SymbolReference annotation="34735904"
 scope_id="8" symbol_id="SgCastExp_34735904"
 vertex_id="1"></xaif:SymbolReference>
                   </xaif:VariableReference>
                 </xaif:Index>
               </xaif:IndexTriplet>
             </xaif:ArrayElementReference>
             <xaif:VariableReferenceEdge edge_id="1" source="1"
 target="8"></xaif:VariableReferenceEdge>
           </xaif:VariableReference>
         </xaif:AssignmentRHS>
       </xaif:Assignment>


 With the derivative code:
 void ad_mini2(DERIV_TYPE *y,DERIV_TYPE *x)
 {
   DERIV_TYPE ad_TempVarprp_1;
   zero_deriv(&ad_TempVarprp_1);
 /* int i; double j; y[i - 1] =(x[(int )j]); */
   int ad_i;
   DERIV_TYPE ad_j;
   DERIV_val(y[ad_i - 1]) = DERIV_val(x[(int )ad_j]);
   ADIC_SetDeriv(DERIV_TYPE_ref(x[(int
 )ad_j]),DERIV_TYPE_ref(ad_TempVarprp_1));
   ADIC_SetDeriv(DERIV_TYPE_ref(ad_TempVarprp_1),DERIV_TYPE_ref(y[ad_i -
 1]));
 }

 If type casting cannot be handled by XAIFBooster, then XAIFVistor should
 ensure that
 (int )ad_j becomes (int )(ad_j.val()) in the derivative code.

 This example is unlikely to be a problem very soon.

-- 
Ticket URL: <http://trac.mcs.anl.gov/projects/ADIC/ticket/49>
ADIC <http://trac.mcs.anl.gov/projects/ADIC>
ADIC: Automatic Differentiation for C and C++


More information about the Ad-dev mailing list