LCOV - code coverage report
Current view: top level - metalib_isl - isl_seq.c (source / functions) Hit Total Coverage
Test: 2018-10-31_point_maint_greina16.lcov Lines: 137 187 73.3 %
Date: 2018-11-01 11:27:00 Functions: 22 31 71.0 %

          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 >29763*10^7 : void isl_seq_clr(isl_int *p, unsigned len)
      15             : {
      16             :         int i;
      17 >75329*10^7 :         for (i = 0; i < len; ++i)
      18 >45566*10^7 :                 isl_int_set_si(p[i], 0);
      19 >29763*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 36373177604 : void isl_seq_neg(isl_int *dst, isl_int *src, unsigned len)
      36             : {
      37             :         int i;
      38 >18163*10^7 :         for (i = 0; i < len; ++i)
      39 >14526*10^7 :                 isl_int_neg(dst[i], src[i]);
      40 36373177604 : }
      41             : 
      42 >18562*10^7 : void isl_seq_cpy(isl_int *dst, isl_int *src, unsigned len)
      43             : {
      44             :         int i;
      45 >58313*10^7 :         for (i = 0; i < len; ++i)
      46 >39751*10^7 :                 isl_int_set(dst[i], src[i]);
      47 >18562*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           0 : void isl_seq_addmul(isl_int *dst, isl_int f, isl_int *src, unsigned len)
      57             : {
      58             :         int i;
      59           0 :         for (i = 0; i < len; ++i)
      60           0 :                 isl_int_addmul(dst[i], f, src[i]);
      61           0 : }
      62             : 
      63 24338100052 : void isl_seq_swp_or_cpy(isl_int *dst, isl_int *src, unsigned len)
      64             : {
      65             :         int i;
      66 >10684*10^7 :         for (i = 0; i < len; ++i)
      67 82509532529 :                 isl_int_swap_or_set(dst[i], src[i]);
      68 24338100052 : }
      69             : 
      70  1008963596 : void isl_seq_scale(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      71             : {
      72             :         int i;
      73  4687207021 :         for (i = 0; i < len; ++i)
      74  3678243425 :                 isl_int_mul(dst[i], src[i], m);
      75  1008963596 : }
      76             : 
      77 92176873712 : void isl_seq_scale_down(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      78             : {
      79             :         int i;
      80 >82239*10^7 :         for (i = 0; i < len; ++i)
      81 >73021*10^7 :                 isl_int_divexact(dst[i], src[i], m);
      82 92176873712 : }
      83             : 
      84     7706430 : void isl_seq_cdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len)
      85             : {
      86             :         int i;
      87    46052860 :         for (i = 0; i < len; ++i)
      88    38346430 :                 isl_int_cdiv_q(dst[i], src[i], m);
      89     7706430 : }
      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 >24278*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 >24278*10^7 :         if (dst == src1 && isl_int_is_one(m1)) {
     112 >20436*10^7 :                 if (isl_int_is_zero(m2))
     113 >34993*10^7 :                         return;
     114 >41084*10^7 :                 for (i = 0; i < len; ++i)
     115 >35205*10^7 :                         isl_int_addmul(src1[i], m2, src2[i]);
     116 58792606679 :                 return;
     117             :         }
     118             : 
     119 38423027554 :         isl_int_init(tmp);
     120 >33123*10^7 :         for (i = 0; i < len; ++i) {
     121 >29280*10^7 :                 isl_int_mul(tmp, m1, src1[i]);
     122 >29280*10^7 :                 isl_int_addmul(tmp, m2, src2[i]);
     123 >29280*10^7 :                 isl_int_set(dst[i], tmp);
     124             :         }
     125 38423027554 :         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 34136191532 : 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 34136191532 :         if (isl_int_is_zero(dst[pos]))
     139           0 :                 return;
     140             : 
     141 34136191532 :         isl_int_init(a);
     142 34136191532 :         isl_int_init(b);
     143             : 
     144 34136191532 :         isl_int_gcd(a, src[pos], dst[pos]);
     145 34136191532 :         isl_int_divexact(b, dst[pos], a);
     146 34136191532 :         if (isl_int_is_pos(src[pos]))
     147 34136191532 :                 isl_int_neg(b, b);
     148 34136191532 :         isl_int_divexact(a, src[pos], a);
     149 34136191532 :         isl_int_abs(a, a);
     150 34136191532 :         isl_seq_combine(dst, a, dst, b, src, len);
     151             : 
     152 34136191532 :         if (m)
     153           0 :                 isl_int_mul(*m, *m, a);
     154             : 
     155 34136191532 :         isl_int_clear(a);
     156 34136191532 :         isl_int_clear(b);
     157             : }
     158             : 
     159 10336233784 : int isl_seq_eq(isl_int *p1, isl_int *p2, unsigned len)
     160             : {
     161             :         int i;
     162 24382685682 :         for (i = 0; i < len; ++i)
     163 20754496060 :                 if (isl_int_ne(p1[i], p2[i]))
     164  6708044162 :                         return 0;
     165  3628189622 :         return 1;
     166             : }
     167             : 
     168  1112271468 : int isl_seq_cmp(isl_int *p1, isl_int *p2, unsigned len)
     169             : {
     170             :         int i;
     171             :         int cmp;
     172  5755589794 :         for (i = 0; i < len; ++i)
     173  5107458647 :                 if ((cmp = isl_int_cmp(p1[i], p2[i])) != 0)
     174   464140321 :                         return cmp;
     175   648131147 :         return 0;
     176             : }
     177             : 
     178   280803071 : int isl_seq_is_neg(isl_int *p1, isl_int *p2, unsigned len)
     179             : {
     180             :         int i;
     181             : 
     182   314242579 :         for (i = 0; i < len; ++i) {
     183   312773856 :                 if (isl_int_abs_ne(p1[i], p2[i]))
     184   266403579 :                         return 0;
     185    46370277 :                 if (isl_int_is_zero(p1[i]))
     186    17763969 :                         continue;
     187    28606308 :                 if (isl_int_eq(p1[i], p2[i]))
     188    12930769 :                         return 0;
     189             :         }
     190     1468723 :         return 1;
     191             : }
     192             : 
     193 >26533*10^7 : int isl_seq_first_non_zero(isl_int *p, unsigned len)
     194             : {
     195             :         int i;
     196             : 
     197 >42892*10^7 :         for (i = 0; i < len; ++i)
     198 >40876*10^7 :                 if (!isl_int_is_zero(p[i]))
     199 >24517*10^7 :                         return i;
     200 20163441930 :         return -1;
     201             : }
     202             : 
     203 65211804424 : int isl_seq_last_non_zero(isl_int *p, unsigned len)
     204             : {
     205             :         int i;
     206             : 
     207 67992788939 :         for (i = len - 1; i >= 0; --i)
     208  5536955151 :                 if (!isl_int_is_zero(p[i]))
     209  2755970636 :                         return i;
     210 62455833788 :         return -1;
     211             : }
     212             : 
     213     3417719 : void isl_seq_abs_max(isl_int *p, unsigned len, isl_int *max)
     214             : {
     215             :         int i;
     216             : 
     217     3417719 :         isl_int_set_si(*max, 0);
     218             : 
     219    27699643 :         for (i = 0; i < len; ++i)
     220    24281924 :                 if (isl_int_abs_gt(p[i], *max))
     221     4327564 :                         isl_int_abs(*max, p[i]);
     222     3417719 : }
     223             : 
     224 >22866*10^7 : int isl_seq_abs_min_non_zero(isl_int *p, unsigned len)
     225             : {
     226 >22866*10^7 :         int i, min = isl_seq_first_non_zero(p, len);
     227 >22866*10^7 :         if (min < 0)
     228  8016046593 :                 return -1;
     229 >13749*10^8 :         for (i = min + 1; i < len; ++i) {
     230 >11543*10^8 :                 if (isl_int_is_zero(p[i]))
     231 >54214*10^7 :                         continue;
     232 >61216*10^7 :                 if (isl_int_abs_lt(p[i], p[min]))
     233 >14416*10^7 :                         min = i;
     234             :         }
     235 >22064*10^7 :         return min;
     236             : }
     237             : 
     238 >21799*10^7 : void isl_seq_gcd(isl_int *p, unsigned len, isl_int *gcd)
     239             : {
     240 >21799*10^7 :         int i, min = isl_seq_abs_min_non_zero(p, len);
     241             : 
     242 >21799*10^7 :         if (min < 0) {
     243  7568725060 :                 isl_int_set_si(*gcd, 0);
     244  7568725060 :                 return;
     245             :         }
     246 >21042*10^7 :         isl_int_abs(*gcd, p[min]);
     247 >99262*10^7 :         for (i = 0; isl_int_cmp_si(*gcd, 1) > 0 && i < len; ++i) {
     248 >78219*10^7 :                 if (i == min)
     249 99999832498 :                         continue;
     250 >68219*10^7 :                 if (isl_int_is_zero(p[i]))
     251 >21709*10^7 :                         continue;
     252 >46510*10^7 :                 isl_int_gcd(*gcd, *gcd, p[i]);
     253             :         }
     254             : }
     255             : 
     256 >16841*10^7 : void isl_seq_normalize(struct isl_ctx *ctx, isl_int *p, unsigned len)
     257             : {
     258 >16841*10^7 :         if (len == 0)
     259           0 :                 return;
     260 >16841*10^7 :         isl_seq_gcd(p, len, &ctx->normalize_gcd);
     261 >33215*10^7 :         if (!isl_int_is_zero(ctx->normalize_gcd) &&
     262 >16373*10^7 :             !isl_int_is_one(ctx->normalize_gcd))
     263 88692340145 :                 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  2496447640 : void isl_seq_inner_product(isl_int *p1, isl_int *p2, unsigned len,
     280             :                            isl_int *prod)
     281             : {
     282             :         int i;
     283  2496447640 :         if (len == 0) {
     284           0 :                 isl_int_set_si(*prod, 0);
     285           0 :                 return;
     286             :         }
     287  2496447640 :         isl_int_mul(*prod, p1[0], p2[0]);
     288 16525403663 :         for (i = 1; i < len; ++i)
     289 14028956023 :                 isl_int_addmul(*prod, p1[i], p2[i]);
     290             : }
     291             : 
     292 16682947809 : uint32_t isl_seq_hash(isl_int *p, unsigned len, uint32_t hash)
     293             : {
     294             :         int i;
     295 76242515794 :         for (i = 0; i < len; ++i) {
     296 59559567985 :                 if (isl_int_is_zero(p[i]))
     297 25723375906 :                         continue;
     298 33836192079 :                 hash *= 16777619;
     299 33836192079 :                 hash ^= (i & 0xFF);
     300 33836192079 :                 hash = isl_int_hash(p[i], hash);
     301             :         }
     302 16682947809 :         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 16682947809 : uint32_t isl_seq_get_hash(isl_int *p, unsigned len)
     336             : {
     337 16682947809 :         uint32_t hash = isl_hash_init();
     338             : 
     339 16682947809 :         return isl_seq_hash(p, len, hash);
     340             : }
     341             : 
     342 12113955971 : uint32_t isl_seq_get_hash_bits(isl_int *p, unsigned len, unsigned bits)
     343             : {
     344             :         uint32_t hash;
     345             : 
     346 12113955971 :         hash = isl_seq_get_hash(p, len);
     347 12113955971 :         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