Path: blob/devel/elmergrid/src/metis-5.1.0/GKlib/gk_mkblas.h
3206 views
/*!1\file gk_mkblas.h2\brief Templates for BLAS-like routines34\date Started 3/28/075\author George6\version\verbatim $Id: gk_mkblas.h 10711 2011-08-31 22:23:04Z karypis $ \endverbatim7*/89#ifndef _GK_MKBLAS_H_10#define _GK_MKBLAS_H_111213#define GK_MKBLAS(PRFX, TYPE, OUTTYPE) \14/*************************************************************************/\15/*! The macro for gk_?incset()-class of routines */\16/*************************************************************************/\17TYPE *PRFX ## incset(size_t n, TYPE baseval, TYPE *x)\18{\19size_t i;\20\21for (i=0; i<n; i++)\22x[i] = baseval+i;\23\24return x;\25}\26\27/*************************************************************************/\28/*! The macro for gk_?max()-class of routines */\29/*************************************************************************/\30TYPE PRFX ## max(size_t n, TYPE *x)\31{\32size_t i, max=0; \33\34if (n <= 0) return (TYPE) 0;\35\36for (i=1; i<n; i++)\37max = (x[i] > x[max] ? i : max);\38\39return x[max];\40}\41\42\43/*************************************************************************/\44/*! The macro for gk_?min()-class of routines */\45/*************************************************************************/\46TYPE PRFX ## min(size_t n, TYPE *x)\47{\48size_t i, min=0;\49\50if (n <= 0) return (TYPE) 0;\51\52for (i=1; i<n; i++)\53min = (x[i] < x[min] ? i : min);\54\55return x[min];\56}\57\58\59/*************************************************************************/\60/*! The macro for gk_?argmax()-class of routines */\61/*************************************************************************/\62size_t PRFX ## argmax(size_t n, TYPE *x)\63{\64size_t i, max=0;\65\66for (i=1; i<n; i++)\67max = (x[i] > x[max] ? i : max);\68\69return max;\70}\71\72\73/*************************************************************************/\74/*! The macro for gk_?argmin()-class of routines */\75/*************************************************************************/\76size_t PRFX ## argmin(size_t n, TYPE *x)\77{\78size_t i, min=0;\79\80for (i=1; i<n; i++)\81min = (x[i] < x[min] ? i : min);\82\83return min;\84}\85\86\87/*************************************************************************/\88/*! The macro for gk_?argmax_n()-class of routines */\89/*************************************************************************/\90size_t PRFX ## argmax_n(size_t n, TYPE *x, size_t k)\91{\92size_t i, max_n;\93PRFX ## kv_t *cand;\94\95cand = PRFX ## kvmalloc(n, "GK_ARGMAX_N: cand");\96\97for (i=0; i<n; i++) {\98cand[i].val = i;\99cand[i].key = x[i];\100}\101PRFX ## kvsortd(n, cand);\102\103max_n = cand[k-1].val;\104\105gk_free((void *)&cand, LTERM);\106\107return max_n;\108}\109\110\111/*************************************************************************/\112/*! The macro for gk_?sum()-class of routines */\113/**************************************************************************/\114OUTTYPE PRFX ## sum(size_t n, TYPE *x, size_t incx)\115{\116size_t i;\117OUTTYPE sum = 0;\118\119for (i=0; i<n; i++, x+=incx)\120sum += (*x);\121\122return sum;\123}\124\125\126/*************************************************************************/\127/*! The macro for gk_?scale()-class of routines */\128/**************************************************************************/\129TYPE *PRFX ## scale(size_t n, TYPE alpha, TYPE *x, size_t incx)\130{\131size_t i;\132\133for (i=0; i<n; i++, x+=incx)\134(*x) *= alpha;\135\136return x;\137}\138\139\140/*************************************************************************/\141/*! The macro for gk_?norm2()-class of routines */\142/**************************************************************************/\143OUTTYPE PRFX ## norm2(size_t n, TYPE *x, size_t incx)\144{\145size_t i;\146OUTTYPE partial = 0;\147\148for (i=0; i<n; i++, x+=incx)\149partial += (*x) * (*x);\150\151return (partial > 0 ? (OUTTYPE)sqrt((double)partial) : (OUTTYPE)0);\152}\153\154\155/*************************************************************************/\156/*! The macro for gk_?dot()-class of routines */\157/**************************************************************************/\158OUTTYPE PRFX ## dot(size_t n, TYPE *x, size_t incx, TYPE *y, size_t incy)\159{\160size_t i;\161OUTTYPE partial = 0.0;\162\163for (i=0; i<n; i++, x+=incx, y+=incy)\164partial += (*x) * (*y);\165\166return partial;\167}\168\169\170/*************************************************************************/\171/*! The macro for gk_?axpy()-class of routines */\172/**************************************************************************/\173TYPE *PRFX ## axpy(size_t n, TYPE alpha, TYPE *x, size_t incx, TYPE *y, size_t incy)\174{\175size_t i;\176TYPE *y_in = y;\177\178for (i=0; i<n; i++, x+=incx, y+=incy)\179*y += alpha*(*x);\180\181return y_in;\182}\183184185186#define GK_MKBLAS_PROTO(PRFX, TYPE, OUTTYPE) \187TYPE *PRFX ## incset(size_t n, TYPE baseval, TYPE *x);\188TYPE PRFX ## max(size_t n, TYPE *x);\189TYPE PRFX ## min(size_t n, TYPE *x);\190size_t PRFX ## argmax(size_t n, TYPE *x);\191size_t PRFX ## argmin(size_t n, TYPE *x);\192size_t PRFX ## argmax_n(size_t n, TYPE *x, size_t k);\193OUTTYPE PRFX ## sum(size_t n, TYPE *x, size_t incx);\194TYPE *PRFX ## scale(size_t n, TYPE alpha, TYPE *x, size_t incx);\195OUTTYPE PRFX ## norm2(size_t n, TYPE *x, size_t incx);\196OUTTYPE PRFX ## dot(size_t n, TYPE *x, size_t incx, TYPE *y, size_t incy);\197TYPE *PRFX ## axpy(size_t n, TYPE alpha, TYPE *x, size_t incx, TYPE *y, size_t incy);\198199200#endif201202203