anchor.diff:          let inline df(cp, ap, at) = -at
           let inline r(a) = Neg_DM(a)
           DM.Op_DM_DM (a, ff, fd, df, r)
  +
  +    static member Transpose(a:DM) =
  +        let inline ff(a) = NonBLAS.m_transpose(a)
  +        let inline fd(a) = DM.Transpose(a)
  +        let inline df(cp, ap, at) = DM.Transpose(at)
  +        let inline r(a) = Transpose_DM(a)
  +        DM.Op_DM_DM (a, ff, fd, df, r)
  +
  +    static member Sum(a:DM) =
  +        let inline ff(a) = NonBLAS.m_sum(a)
  +        let inline fd(a) = DM.Sum(a)
  +        let inline df(cp, ap, at) = DM.Sum(at)
  +        let inline r(a) = Sum_DM(a)
  +        DM.Op_DM_D (a, ff, fd, df, r)
   
       static member Solve (a:DM, b:DV) =
           let inline ff(a, b) = match OpenBLAS.mv_solve(a, b) with Some(x) -> x | _ -> ErrorMessages.invalidArgSolve()
  
positive.code: 
      static member (*) (a:DV, b:DM) =
          // TODO: reimplement faster
          b.Transpose() * a
  
      static member (*) (a:DM, b:D) =
          let inline ff(a, b) = OpenBLAS.m_scale(b, a)
  
negative.code:         let inline r_d_c(a, b) = AddSubMatrix_DM_DMCons(a)
          let inline r_c_d(a, b) = AddSubMatrix_DMCons_DM(i, j, b)
          DM.Op_DM_DM_DM (a, b, ff, fd, df_da, df_db, df_dab, r_d_d, r_d_c, r_c_d)
  
  
  and TraceOp =
      | Add_D_D                of D * D
  