LCOV - code coverage report
Current view: top level - metalib_isl - isl_seq.c (source / functions) Hit Total Coverage
Test: project_test.lcov Lines: 156 187 83.4 %
Date: 2018-11-06 13:10:25 Functions: 26 31 83.9 %

          Line data    Source code
       1             : /*
       2             :  * Copyright 2008-2009 Katholieke Universiteit Leuven
       3             :  * Copyright 2011      INRIA Saclay
       4             :  *
       5             :  * Use of this software is governed by the MIT license
       6             :  *
       7             :  * Written by Sven Verdoolaege, K.U.Leuven, Departement
       8             :  * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
       9             :  */
      10             : 
      11             : #include <isl_ctx_private.h>
      12             : #include <isl_seq.h>
      13             : 
      14  1168107974 : void isl_seq_clr(isl_int *p, unsigned len)
      15             : {
      16             :         int i;
      17  2159289144 :         for (i = 0; i < len; ++i)
      18   991181170 :                 isl_int_set_si(p[i], 0);
      19  1168107974 : }
      20             : 
      21           0 : void isl_seq_set_si(isl_int *p, int v, unsigned len)
      22             : {
      23             :         int i;
      24           0 :         for (i = 0; i < len; ++i)
      25           0 :                 isl_int_set_si(p[i], v);
      26           0 : }
      27             : 
      28           0 : void isl_seq_set(isl_int *p, isl_int v, unsigned len)
      29             : {
      30             :         int i;
      31           0 :         for (i = 0; i < len; ++i)
      32           0 :                 isl_int_set(p[i], v);
      33           0 : }
      34             : 
      35   262474539 : void isl_seq_neg(isl_int *dst, isl_int *src, unsigned len)
      36             : {
      37             :         int i;
      38  1863120469 :         for (i = 0; i < len; ++i)
      39  1600645930 :                 isl_int_neg(dst[i], src[i]);
      40   262474539 : }
      41             : 
      42   993176412 : void isl_seq_cpy(isl_int *dst, isl_int *src, unsigned len)
      43             : {
      44             :         int i;
      45  4054319409 :         for (i = 0; i < len; ++i)
      46  3061142997 :                 isl_int_set(dst[i], src[i]);
      47   993176412 : }
      48             : 
      49       55116 : void isl_seq_submul(isl_int *dst, isl_int f, isl_int *src, unsigned len)
      50             : {
      51             :         int i;
      52      330308 :         for (i = 0; i < len; ++i)
      53      275192 :                 isl_int_submul(dst[i], f, src[i]);
      54       55116 : }
      55             : 
      56       19831 : void isl_seq_addmul(isl_int *dst, isl_int f, isl_int *src, unsigned len)
      57             : {
      58             :         int i;
      59      159141 :         for (i = 0; i < len; ++i)
      60      139310 :                 isl_int_addmul(dst[i], f, src[i]);
      61       19831 : }
      62             : 
      63    36813189 : void isl_seq_swp_or_cpy(isl_int *dst, isl_int *src, unsigned len)
      64             : {
      65             :         int i;
      66   295486772 :         for (i = 0; i < len; ++i)
      67   258673583 :                 isl_int_swap_or_set(dst[i], src[i]);
      68    36813189 : }
      69             : 
      70    13539959 : void isl_seq_scale(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      71             : {
      72             :         int i;
      73    48067117 :         for (i = 0; i < len; ++i)
      74    34527158 :                 isl_int_mul(dst[i], src[i], m);
      75    13539959 : }
      76             : 
      77   117625917 : void isl_seq_scale_down(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      78             : {
      79             :         int i;
      80  1039756665 :         for (i = 0; i < len; ++i)
      81   922130748 :                 isl_int_divexact(dst[i], src[i], m);
      82   117625917 : }
      83             : 
      84      177901 : void isl_seq_cdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      85             : {
      86             :         int i;
      87     1190872 :         for (i = 0; i < len; ++i)
      88     1012971 :                 isl_int_cdiv_q(dst[i], src[i], m);
      89      177901 : }
      90             : 
      91           0 : void isl_seq_fdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      92             : {
      93             :         int i;
      94           0 :         for (i = 0; i < len; ++i)
      95           0 :                 isl_int_fdiv_q(dst[i], src[i], m);
      96           0 : }
      97             : 
      98       31935 : void isl_seq_fdiv_r(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      99             : {
     100             :         int i;
     101      215070 :         for (i = 0; i < len; ++i)
     102      183135 :                 isl_int_fdiv_r(dst[i], src[i], m);
     103       31935 : }
     104             : 
     105   232145174 : void isl_seq_combine(isl_int *dst, isl_int m1, isl_int *src1,
     106             :                         isl_int m2, isl_int *src2, unsigned len)
     107             : {
     108             :         int i;
     109             :         isl_int tmp;
     110             : 
     111   232145174 :         if (dst == src1 && isl_int_is_one(m1)) {
     112   208849926 :                 if (isl_int_is_zero(m2))
     113   282712762 :                         return;
     114  1062164072 :                 for (i = 0; i < len; ++i)
     115   927176982 :                         isl_int_addmul(src1[i], m2, src2[i]);
     116   134987090 :                 return;
     117             :         }
     118             : 
     119    23295248 :         isl_int_init(tmp);
     120   184162070 :         for (i = 0; i < len; ++i) {
     121   160866822 :                 isl_int_mul(tmp, m1, src1[i]);
     122   160866822 :                 isl_int_addmul(tmp, m2, src2[i]);
     123   160866822 :                 isl_int_set(dst[i], tmp);
     124             :         }
     125    23295248 :         isl_int_clear(tmp);
     126             : }
     127             : 
     128             : /*
     129             :  * Let d = dst[pos] and s = src[pos]
     130             :  * dst is replaced by |s| dst - sgn(s)d src
     131             :  */
     132    76791000 : void isl_seq_elim(isl_int *dst, isl_int *src, unsigned pos, unsigned len,
     133             :                   isl_int *m)
     134             : {
     135             :         isl_int a;
     136             :         isl_int b;
     137             : 
     138    76791000 :         if (isl_int_is_zero(dst[pos]))
     139        1788 :                 return;
     140             : 
     141    76789212 :         isl_int_init(a);
     142    76789212 :         isl_int_init(b);
     143             : 
     144    76789212 :         isl_int_gcd(a, src[pos], dst[pos]);
     145    76789212 :         isl_int_divexact(b, dst[pos], a);
     146    76789212 :         if (isl_int_is_pos(src[pos]))
     147    76744008 :                 isl_int_neg(b, b);
     148    76789212 :         isl_int_divexact(a, src[pos], a);
     149    76789212 :         isl_int_abs(a, a);
     150    76789212 :         isl_seq_combine(dst, a, dst, b, src, len);
     151             : 
     152    76789212 :         if (m)
     153       84848 :                 isl_int_mul(*m, *m, a);
     154             : 
     155    76789212 :         isl_int_clear(a);
     156    76789212 :         isl_int_clear(b);
     157             : }
     158             : 
     159   205338850 : int isl_seq_eq(isl_int *p1, isl_int *p2, unsigned len)
     160             : {
     161             :         int i;
     162   482606891 :         for (i = 0; i < len; ++i)
     163   459829364 :                 if (isl_int_ne(p1[i], p2[i]))
     164   182561323 :                         return 0;
     165    22777527 :         return 1;
     166             : }
     167             : 
     168    60193053 : int isl_seq_cmp(isl_int *p1, isl_int *p2, unsigned len)
     169             : {
     170             :         int i;
     171             :         int cmp;
     172   252117980 :         for (i = 0; i < len; ++i)
     173   224682943 :                 if ((cmp = isl_int_cmp(p1[i], p2[i])) != 0)
     174    32758016 :                         return cmp;
     175    27435037 :         return 0;
     176             : }
     177             : 
     178      160405 : int isl_seq_is_neg(isl_int *p1, isl_int *p2, unsigned len)
     179             : {
     180             :         int i;
     181             : 
     182      693344 :         for (i = 0; i < len; ++i) {
     183      605990 :                 if (isl_int_abs_ne(p1[i], p2[i]))
     184       63564 :                         return 0;
     185      542426 :                 if (isl_int_is_zero(p1[i]))
     186      323128 :                         continue;
     187      219298 :                 if (isl_int_eq(p1[i], p2[i]))
     188        9487 :                         return 0;
     189             :         }
     190       87354 :         return 1;
     191             : }
     192             : 
     193   748687877 : int isl_seq_first_non_zero(isl_int *p, unsigned len)
     194             : {
     195             :         int i;
     196             : 
     197  1401653866 :         for (i = 0; i < len; ++i)
     198  1278041405 :                 if (!isl_int_is_zero(p[i]))
     199   625075416 :                         return i;
     200   123612461 :         return -1;
     201             : }
     202             : 
     203    47579147 : int isl_seq_last_non_zero(isl_int *p, unsigned len)
     204             : {
     205             :         int i;
     206             : 
     207    69632141 :         for (i = len - 1; i >= 0; --i)
     208    38635153 :                 if (!isl_int_is_zero(p[i]))
     209    16582159 :                         return i;
     210    30996988 :         return -1;
     211             : }
     212             : 
     213         725 : void isl_seq_abs_max(isl_int *p, unsigned len, isl_int *max)
     214             : {
     215             :         int i;
     216             : 
     217         725 :         isl_int_set_si(*max, 0);
     218             : 
     219        5746 :         for (i = 0; i < len; ++i)
     220        5021 :                 if (isl_int_abs_gt(p[i], *max))
     221         768 :                         isl_int_abs(*max, p[i]);
     222         725 : }
     223             : 
     224   619396463 : int isl_seq_abs_min_non_zero(isl_int *p, unsigned len)
     225             : {
     226   619396463 :         int i, min = isl_seq_first_non_zero(p, len);
     227   619396463 :         if (min < 0)
     228    27172690 :                 return -1;
     229  3748892258 :         for (i = min + 1; i < len; ++i) {
     230  3156668485 :                 if (isl_int_is_zero(p[i]))
     231  1641778179 :                         continue;
     232  1514890306 :                 if (isl_int_abs_lt(p[i], p[min]))
     233   230458809 :                         min = i;
     234             :         }
     235   592223773 :         return min;
     236             : }
     237             : 
     238   581130581 : void isl_seq_gcd(isl_int *p, unsigned len, isl_int *gcd)
     239             : {
     240   581130581 :         int i, min = isl_seq_abs_min_non_zero(p, len);
     241             : 
     242   581130581 :         if (min < 0) {
     243    13833413 :                 isl_int_set_si(*gcd, 0);
     244    13833413 :                 return;
     245             :         }
     246   567297168 :         isl_int_abs(*gcd, p[min]);
     247  1557397997 :         for (i = 0; isl_int_cmp_si(*gcd, 1) > 0 && i < len; ++i) {
     248   990100829 :                 if (i == min)
     249   129461963 :                         continue;
     250   860638866 :                 if (isl_int_is_zero(p[i]))
     251   396480292 :                         continue;
     252   464158574 :                 isl_int_gcd(*gcd, *gcd, p[i]);
     253             :         }
     254             : }
     255             : 
     256   350812636 : void isl_seq_normalize(struct isl_ctx *ctx, isl_int *p, unsigned len)
     257             : {
     258   350812636 :         if (len == 0)
     259           0 :                 return;
     260   350812636 :         isl_seq_gcd(p, len, &ctx->normalize_gcd);
     261   689383176 :         if (!isl_int_is_zero(ctx->normalize_gcd) &&
     262   338570540 :             !isl_int_is_one(ctx->normalize_gcd))
     263   115809965 :                 isl_seq_scale_down(p, p, ctx->normalize_gcd, len);
     264             : }
     265             : 
     266       33995 : void isl_seq_lcm(isl_int *p, unsigned len, isl_int *lcm)
     267             : {
     268             :         int i;
     269             : 
     270       33995 :         if (len == 0) {
     271           0 :                 isl_int_set_si(*lcm, 1);
     272           0 :                 return;
     273             :         }
     274       33995 :         isl_int_set(*lcm, p[0]);
     275       68230 :         for (i = 1; i < len; ++i)
     276       34235 :                 isl_int_lcm(*lcm, *lcm, p[i]);
     277             : }
     278             : 
     279   117356049 : void isl_seq_inner_product(isl_int *p1, isl_int *p2, unsigned len,
     280             :                            isl_int *prod)
     281             : {
     282             :         int i;
     283   117356049 :         if (len == 0) {
     284           0 :                 isl_int_set_si(*prod, 0);
     285           0 :                 return;
     286             :         }
     287   117356049 :         isl_int_mul(*prod, p1[0], p2[0]);
     288   873658458 :         for (i = 1; i < len; ++i)
     289   756302409 :                 isl_int_addmul(*prod, p1[i], p2[i]);
     290             : }
     291             : 
     292   342607477 : uint32_t isl_seq_hash(isl_int *p, unsigned len, uint32_t hash)
     293             : {
     294             :         int i;
     295  2493044454 :         for (i = 0; i < len; ++i) {
     296  2150436977 :                 if (isl_int_is_zero(p[i]))
     297  1286813599 :                         continue;
     298   863623378 :                 hash *= 16777619;
     299   863623378 :                 hash ^= (i & 0xFF);
     300   863623378 :                 hash = isl_int_hash(p[i], hash);
     301             :         }
     302   342607477 :         return hash;
     303             : }
     304             : 
     305             : /* Given two affine expressions "p" of length p_len (including the
     306             :  * denominator and the constant term) and "subs" of length subs_len,
     307             :  * plug in "subs" for the variable at position "pos".
     308             :  * The variables of "subs" and "p" are assumed to match up to subs_len,
     309             :  * but "p" may have additional variables.
     310             :  * "v" is an initialized isl_int that can be used internally.
     311             :  *
     312             :  * In particular, if "p" represents the expression
     313             :  *
     314             :  *      (a i + g)/m
     315             :  *
     316             :  * with i the variable at position "pos" and "subs" represents the expression
     317             :  *
     318             :  *      f/d
     319             :  *
     320             :  * then the result represents the expression
     321             :  *
     322             :  *      (a f + d g)/(m d)
     323             :  *
     324             :  */
     325           0 : void isl_seq_substitute(isl_int *p, int pos, isl_int *subs,
     326             :         int p_len, int subs_len, isl_int v)
     327             : {
     328           0 :         isl_int_set(v, p[1 + pos]);
     329           0 :         isl_int_set_si(p[1 + pos], 0);
     330           0 :         isl_seq_combine(p + 1, subs[0], p + 1, v, subs + 1, subs_len - 1);
     331           0 :         isl_seq_scale(p + subs_len, p + subs_len, subs[0], p_len - subs_len);
     332           0 :         isl_int_mul(p[0], p[0], subs[0]);
     333           0 : }
     334             : 
     335   342607477 : uint32_t isl_seq_get_hash(isl_int *p, unsigned len)
     336             : {
     337   342607477 :         uint32_t hash = isl_hash_init();
     338             : 
     339   342607477 :         return isl_seq_hash(p, len, hash);
     340             : }
     341             : 
     342   342607125 : uint32_t isl_seq_get_hash_bits(isl_int *p, unsigned len, unsigned bits)
     343             : {
     344             :         uint32_t hash;
     345             : 
     346   342607125 :         hash = isl_seq_get_hash(p, len);
     347   342607125 :         return isl_hash_bits(hash, bits);
     348             : }
     349             : 
     350           0 : void isl_seq_dump(isl_int *p, unsigned len)
     351             : {
     352             :         int i;
     353             : 
     354           0 :         for (i = 0; i < len; ++i) {
     355           0 :                 if (i)
     356           0 :                         fprintf(stderr, " ");
     357           0 :                 isl_int_print(stderr, p[i], 0);
     358             :         }
     359           0 :         fprintf(stderr, "\n");
     360           0 : }

Generated by: LCOV version 1.12