Show
Ignore:
Timestamp:
04/30/08 16:05:32 (4 years ago)
Author:
Don Clugston
Message:

Added prod(). Use .ptr to get raw data, so it works with Bill Baxter's ArrayView?.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/blade/BladeRank.d

    r172 r187  
    2727        else if (s[i]==')') --paren; 
    2828        if (paren==0 && s[i]==']') { 
    29             if (startIndex && hasSliced) return true;    
     29            if (startIndex && hasSliced) return true; 
    3030            numbrack--; 
    31             if (s[i-1]=='[') { startIndex=false; }  
     31            if (s[i-1]=='[') { startIndex=false; } 
    3232        } 
    3333        if (paren==0 && s[i]=='[') { 
     
    3636            numbrack++; 
    3737        } 
    38         if (paren==0 && numbrack==1 && s[i]==',') {            
     38        if (paren==0 && numbrack==1 && s[i]==',') { 
    3939            if (hasSliced && startIndex) return true; 
    4040            if (maybeSlice) hasSliced = true; 
     
    8383enum RankError : int { 
    8484    UnsupportedOperation = -1, 
    85     RankIncrement = -2,  
     85    RankIncrement = -2, 
    8686    AttemptToIndexAScalar = -3, 
    8787    NonScalarIndex = -4, 
    8888    NonScalarSlice = -5, 
    8989    DotDotExpected = -6, 
    90     CommaExpected = -7,  
     90    CommaExpected = -7, 
    9191    RankMismatch = -8, 
    9292    RankMismatchConcatenation = -9, 
     
    132132            auto rrank = doVisit(this_, args[1]); 
    133133            if (rrank<0) return rrank; // propagate errors 
    134             if (lrank!=1 || rrank!=1) return RankError.RankMismatchDotProduct;        
     134            if (lrank!=1 || rrank!=1) return RankError.RankMismatchDotProduct; 
    135135            return 0; 
    136136        case "sum": 
     137        case "prod": 
    137138            auto lrank = doVisit(this_,args[0]); 
    138139            if (lrank<0) return lrank; // propagate errors 
     
    146147            assert(0, "BLADE ICE: Unsupported function:" ~ func); 
    147148            return 0; 
    148         }         
     149        } 
    149150    } 
    150151    ReturnType onVisitPrefix(This this_, char [] op, char [] expr) { 
     
    159160        return RankError.RankIncrement; 
    160161    } 
    161     // Includes multi-dimensional slicing and indexing.     
     162    // Includes multi-dimensional slicing and indexing. 
    162163    ReturnType onVisitIndex(This this_, char [] base, char [][2][] slices) { 
    163164        int totrank = doVisit(this_, base); 
    164165        for(int i=0; i<slices.length; ++i) { 
    165166            int r = doVisit(this_,slices[i][0]); 
    166             if (r!=0) return (r<0)? r :RankError.NonScalarIndex;  
     167            if (r!=0) return (r<0)? r :RankError.NonScalarIndex; 
    167168            if (slices[i][1]==""){ 
    168169                --totrank; 
    169170            } else { 
    170171                r = doVisit(this_,slices[i][1]); 
    171                 if (r!=0) return (r<0)?r:RankError.NonScalarSlice;  
     172                if (r!=0) return (r<0)?r:RankError.NonScalarSlice; 
    172173            } 
    173174        } 
     
    186187        } 
    187188        if (op=="~") { // concatentating scalars and vectors, or vectors and matrices, is permitted 
    188             if (lrank==rrank || lrank==(rrank+1) || rrank==(lrank+1))  
     189            if (lrank==rrank || lrank==(rrank+1) || rrank==(lrank+1)) 
    189190                return (lrank>rrank)? lrank: rrank; 
    190191            else return RankError.RankMismatchConcatenation; 
     
    211212} 
    212213 
    213 unittest {     
     214unittest { 
    214215    assert(exprRank("(A[B..C])[C]", "300")==2); 
    215216    assert(exprRank("A+=(A[B..C])", "300")==3); 
    216      
    217     assert(exprRank("A+(B*C)", "000")==0);     
     217 
     218    assert(exprRank("A+(B*C)", "000")==0); 
    218219    assert(exprRank("A=(B*C)", "202")==2); 
    219220    assert(exprRank("B*=(C*A)", "010")==1); 
     
    221222    assert(exprRank("D+=((A+C)*B)", "2022")==2); 
    222223    assert(exprRank("D+=((A&C)*B)", "0101")==1); 
    223      
     224 
    224225    assert(exprRank("C~=(((A[B])[B])~C)", "302")==2); 
    225226    assert(exprRank("((D[E])[E])+(-((C[B])[B..E]))", "202300")==1); 
    226227 
    227228    assert(exprRank("A+((((++B)+D)--)*C)", "1010")==1); 
    228      
     229 
    229230    assert(exprRank("C+=(A[B])", "302")==2); 
    230231    assert(exprRank("dot(A)", "1")==RankError.CommaExpected); 
    231232    assert(exprRank("dot(A,B)", "10")==RankError.RankMismatchDotProduct); 
    232      
    233     assert(exprRank("dot(B,(A*(dot(B,B))))", "11")==0);     
    234      
     233 
     234    assert(exprRank("dot(B,(A*(dot(B,B))))", "11")==0); 
     235 
     236    assert(exprRank("prod(A*B)", "10")==0); 
     237 
    235238    assert(exprRank("A[B,B,B]", "60")==3); 
    236239    assert(exprRank("A[B,B,C,B]", "600")==2); 
    237240    assert(exprRank("A+=(B[C..$])", "110")==1); 
    238241    assert(exprRank("A+=(B[C,D..$])", "2300")==2); 
    239      
     242 
    240243    // bug fixes: 
    241244    assert(exprRank("(A[B..$,C])+=D", "2001")==1);