LCOV - code coverage report
Current view: top level - metalib_isl - isl_seq.c (source / functions) Hit Total Coverage
Test: 2018-10-31_cons_maint_greina.lcov Lines: 143 187 76.5 %
Date: 2018-11-01 11:19:43 Functions: 23 31 74.2 %

          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 >50896*10^7 : void isl_seq_clr(isl_int *p, unsigned len)
      15             : {
      16             :         int i;
      17 >85175*10^7 :         for (i = 0; i < len; ++i)
      18 >34278*10^7 :                 isl_int_set_si(p[i], 0);
      19 >50896*10^7 : }
      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 >10105*10^7 : void isl_seq_neg(isl_int *dst, isl_int *src, unsigned len)
      36             : {
      37             :         int i;
      38 >63855*10^7 :         for (i = 0; i < len; ++i)
      39 >53750*10^7 :                 isl_int_neg(dst[i], src[i]);
      40 >10105*10^7 : }
      41             : 
      42 >43423*10^7 : void isl_seq_cpy(isl_int *dst, isl_int *src, unsigned len)
      43             : {
      44             :         int i;
      45 >16613*10^8 :         for (i = 0; i < len; ++i)
      46 >12271*10^8 :                 isl_int_set(dst[i], src[i]);
      47 >43423*10^7 : }
      48             : 
      49           0 : void isl_seq_submul(isl_int *dst, isl_int f, isl_int *src, unsigned len)
      50             : {
      51             :         int i;
      52           0 :         for (i = 0; i < len; ++i)
      53           0 :                 isl_int_submul(dst[i], f, src[i]);
      54           0 : }
      55             : 
      56    16156233 : void isl_seq_addmul(isl_int *dst, isl_int f, isl_int *src, unsigned len)
      57             : {
      58             :         int i;
      59    99483634 :         for (i = 0; i < len; ++i)
      60    83327401 :                 isl_int_addmul(dst[i], f, src[i]);
      61    16156233 : }
      62             : 
      63 10316586624 : void isl_seq_swp_or_cpy(isl_int *dst, isl_int *src, unsigned len)
      64             : {
      65             :         int i;
      66 73943706704 :         for (i = 0; i < len; ++i)
      67 63627120080 :                 isl_int_swap_or_set(dst[i], src[i]);
      68 10316586624 : }
      69             : 
      70  3454537840 : void isl_seq_scale(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      71             : {
      72             :         int i;
      73 10991918374 :         for (i = 0; i < len; ++i)
      74  7537380534 :                 isl_int_mul(dst[i], src[i], m);
      75  3454537840 : }
      76             : 
      77 34227921239 : void isl_seq_scale_down(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      78             : {
      79             :         int i;
      80 >27755*10^7 :         for (i = 0; i < len; ++i)
      81 >24332*10^7 :                 isl_int_divexact(dst[i], src[i], m);
      82 34227921239 : }
      83             : 
      84    13085528 : void isl_seq_cdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      85             : {
      86             :         int i;
      87    80338531 :         for (i = 0; i < len; ++i)
      88    67253003 :                 isl_int_cdiv_q(dst[i], src[i], m);
      89    13085528 : }
      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           0 : void isl_seq_fdiv_r(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      99             : {
     100             :         int i;
     101           0 :         for (i = 0; i < len; ++i)
     102           0 :                 isl_int_fdiv_r(dst[i], src[i], m);
     103           0 : }
     104             : 
     105 >15012*10^7 : 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 >15012*10^7 :         if (dst == src1 && isl_int_is_one(m1)) {
     112 >13830*10^7 :                 if (isl_int_is_zero(m2))
     113 >20178*10^7 :                         return;
     114 >55438*10^7 :                 for (i = 0; i < len; ++i)
     115 >47955*10^7 :                         isl_int_addmul(src1[i], m2, src2[i]);
     116 74829136867 :                 return;
     117             :         }
     118             : 
     119 11814247685 :         isl_int_init(tmp);
     120 88233133156 :         for (i = 0; i < len; ++i) {
     121 76418885471 :                 isl_int_mul(tmp, m1, src1[i]);
     122 76418885471 :                 isl_int_addmul(tmp, m2, src2[i]);
     123 76418885471 :                 isl_int_set(dst[i], tmp);
     124             :         }
     125 11814247685 :         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 36511379561 : 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 36511379561 :         if (isl_int_is_zero(dst[pos]))
     139     1658421 :                 return;
     140             : 
     141 36509721140 :         isl_int_init(a);
     142 36509721140 :         isl_int_init(b);
     143             : 
     144 36509721140 :         isl_int_gcd(a, src[pos], dst[pos]);
     145 36509721140 :         isl_int_divexact(b, dst[pos], a);
     146 36509721140 :         if (isl_int_is_pos(src[pos]))
     147 36509721140 :                 isl_int_neg(b, b);
     148 36509721140 :         isl_int_divexact(a, src[pos], a);
     149 36509721140 :         isl_int_abs(a, a);
     150 36509721140 :         isl_seq_combine(dst, a, dst, b, src, len);
     151             : 
     152 36509721140 :         if (m)
     153      685520 :                 isl_int_mul(*m, *m, a);
     154             : 
     155 36509721140 :         isl_int_clear(a);
     156 36509721140 :         isl_int_clear(b);
     157             : }
     158             : 
     159 84363996451 : int isl_seq_eq(isl_int *p1, isl_int *p2, unsigned len)
     160             : {
     161             :         int i;
     162 >19349*10^7 :         for (i = 0; i < len; ++i)
     163 >18151*10^7 :                 if (isl_int_ne(p1[i], p2[i]))
     164 72383249301 :                         return 0;
     165 11980747150 :         return 1;
     166             : }
     167             : 
     168  4479323966 : int isl_seq_cmp(isl_int *p1, isl_int *p2, unsigned len)
     169             : {
     170             :         int i;
     171             :         int cmp;
     172 22497869028 :         for (i = 0; i < len; ++i)
     173 20327688299 :                 if ((cmp = isl_int_cmp(p1[i], p2[i])) != 0)
     174  2309143237 :                         return cmp;
     175  2170180729 :         return 0;
     176             : }
     177             : 
     178      383992 : int isl_seq_is_neg(isl_int *p1, isl_int *p2, unsigned len)
     179             : {
     180             :         int i;
     181             : 
     182     1130167 :         for (i = 0; i < len; ++i) {
     183     1066888 :                 if (isl_int_abs_ne(p1[i], p2[i]))
     184      275518 :                         return 0;
     185      791370 :                 if (isl_int_is_zero(p1[i]))
     186      529705 :                         continue;
     187      261665 :                 if (isl_int_eq(p1[i], p2[i]))
     188       45195 :                         return 0;
     189             :         }
     190       63279 :         return 1;
     191             : }
     192             : 
     193 >28015*10^7 : int isl_seq_first_non_zero(isl_int *p, unsigned len)
     194             : {
     195             :         int i;
     196             : 
     197 >50063*10^7 :         for (i = 0; i < len; ++i)
     198 >45598*10^7 :                 if (!isl_int_is_zero(p[i]))
     199 >23550*10^7 :                         return i;
     200 44642459356 :         return -1;
     201             : }
     202             : 
     203 20143659031 : int isl_seq_last_non_zero(isl_int *p, unsigned len)
     204             : {
     205             :         int i;
     206             : 
     207 27011309555 :         for (i = len - 1; i >= 0; --i)
     208 12138229402 :                 if (!isl_int_is_zero(p[i]))
     209  5270578878 :                         return i;
     210 14873080153 :         return -1;
     211             : }
     212             : 
     213      960957 : void isl_seq_abs_max(isl_int *p, unsigned len, isl_int *max)
     214             : {
     215             :         int i;
     216             : 
     217      960957 :         isl_int_set_si(*max, 0);
     218             : 
     219     6621431 :         for (i = 0; i < len; ++i)
     220     5660474 :                 if (isl_int_abs_gt(p[i], *max))
     221     1115456 :                         isl_int_abs(*max, p[i]);
     222      960957 : }
     223             : 
     224 >23896*10^7 : int isl_seq_abs_min_non_zero(isl_int *p, unsigned len)
     225             : {
     226 >23896*10^7 :         int i, min = isl_seq_first_non_zero(p, len);
     227 >23896*10^7 :         if (min < 0)
     228 12275875595 :                 return -1;
     229 >12610*10^8 :         for (i = min + 1; i < len; ++i) {
     230 >10343*10^8 :                 if (isl_int_is_zero(p[i]))
     231 >53295*10^7 :                         continue;
     232 >50143*10^7 :                 if (isl_int_abs_lt(p[i], p[min]))
     233 66968998088 :                         min = i;
     234             :         }
     235 >22669*10^7 :         return min;
     236             : }
     237             : 
     238 >22519*10^7 : void isl_seq_gcd(isl_int *p, unsigned len, isl_int *gcd)
     239             : {
     240 >22519*10^7 :         int i, min = isl_seq_abs_min_non_zero(p, len);
     241             : 
     242 >22519*10^7 :         if (min < 0) {
     243  6493314538 :                 isl_int_set_si(*gcd, 0);
     244  6493314538 :                 return;
     245             :         }
     246 >21869*10^7 :         isl_int_abs(*gcd, p[min]);
     247 >48166*10^7 :         for (i = 0; isl_int_cmp_si(*gcd, 1) > 0 && i < len; ++i) {
     248 >26296*10^7 :                 if (i == min)
     249 37981905597 :                         continue;
     250 >22498*10^7 :                 if (isl_int_is_zero(p[i]))
     251 >10303*10^7 :                         continue;
     252 >12195*10^7 :                 isl_int_gcd(*gcd, *gcd, p[i]);
     253             :         }
     254             : }
     255             : 
     256 >12825*10^7 : void isl_seq_normalize(struct isl_ctx *ctx, isl_int *p, unsigned len)
     257             : {
     258 >12825*10^7 :         if (len == 0)
     259           0 :                 return;
     260 >12825*10^7 :         isl_seq_gcd(p, len, &ctx->normalize_gcd);
     261 >25081*10^7 :         if (!isl_int_is_zero(ctx->normalize_gcd) &&
     262 >12256*10^7 :             !isl_int_is_one(ctx->normalize_gcd))
     263 33915614540 :                 isl_seq_scale_down(p, p, ctx->normalize_gcd, len);
     264             : }
     265             : 
     266           0 : void isl_seq_lcm(isl_int *p, unsigned len, isl_int *lcm)
     267             : {
     268             :         int i;
     269             : 
     270           0 :         if (len == 0) {
     271           0 :                 isl_int_set_si(*lcm, 1);
     272           0 :                 return;
     273             :         }
     274           0 :         isl_int_set(*lcm, p[0]);
     275           0 :         for (i = 1; i < len; ++i)
     276           0 :                 isl_int_lcm(*lcm, *lcm, p[i]);
     277             : }
     278             : 
     279 55011085967 : void isl_seq_inner_product(isl_int *p1, isl_int *p2, unsigned len,
     280             :                            isl_int *prod)
     281             : {
     282             :         int i;
     283 55011085967 :         if (len == 0) {
     284           0 :                 isl_int_set_si(*prod, 0);
     285           0 :                 return;
     286             :         }
     287 55011085967 :         isl_int_mul(*prod, p1[0], p2[0]);
     288 >35897*10^7 :         for (i = 1; i < len; ++i)
     289 >30396*10^7 :                 isl_int_addmul(*prod, p1[i], p2[i]);
     290             : }
     291             : 
     292 >13562*10^7 : uint32_t isl_seq_hash(isl_int *p, unsigned len, uint32_t hash)
     293             : {
     294             :         int i;
     295 >86509*10^7 :         for (i = 0; i < len; ++i) {
     296 >72946*10^7 :                 if (isl_int_is_zero(p[i]))
     297 >42046*10^7 :                         continue;
     298 >30900*10^7 :                 hash *= 16777619;
     299 >30900*10^7 :                 hash ^= (i & 0xFF);
     300 >30900*10^7 :                 hash = isl_int_hash(p[i], hash);
     301             :         }
     302 >13562*10^7 :         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 >13562*10^7 : uint32_t isl_seq_get_hash(isl_int *p, unsigned len)
     336             : {
     337 >13562*10^7 :         uint32_t hash = isl_hash_init();
     338             : 
     339 >13562*10^7 :         return isl_seq_hash(p, len, hash);
     340             : }
     341             : 
     342 >13562*10^7 : uint32_t isl_seq_get_hash_bits(isl_int *p, unsigned len, unsigned bits)
     343             : {
     344             :         uint32_t hash;
     345             : 
     346 >13562*10^7 :         hash = isl_seq_get_hash(p, len);
     347 >13562*10^7 :         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