Changeset fe9a47 in git
- Timestamp:
- Jul 6, 2017, 3:26:55 PM (7 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- b7e650aa28103f9685a9dd9313ce231b375f1ac5
- Parents:
- f0fba1c6553d60f8414803dce6e04c16b8750b0e
- git-author:
- bendooru <bendooru@users.noreply.github.com>2017-07-06 15:26:55+02:00
- git-committer:
- bendooru <bendooru@users.noreply.github.com>2017-07-07 23:07:00+02:00
- Location:
- Singular/dyn_modules/interval
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/dyn_modules/interval/interval.cc
rf0fba1c rfe9a47 12 12 /* interval */ 13 13 14 interval::interval( )15 { 16 lower = n Init(0);17 upper = n Init(0);18 R = currRing;14 interval::interval(ring r = currRing) 15 { 16 lower = n_Init(0, r->cf); 17 upper = n_Init(0, r->cf); 18 R = r; 19 19 R->ref++; 20 20 } 21 21 22 interval::interval(number a) 23 { 22 interval::interval(number a, ring r = currRing) 23 { 24 // dangerous: check if a is in coefs r->cf 24 25 lower = a; 25 upper = n Copy(a);26 R = currRing;26 upper = n_Copy(a, r->cf); 27 R = r; 27 28 R->ref++; 28 29 } 29 30 30 interval::interval(number a, number b )31 interval::interval(number a, number b, ring r = currRing) 31 32 { 32 33 lower = a; 33 34 upper = b; 34 R = currRing;35 R = r; 35 36 R->ref++; 36 37 } … … 38 39 interval::interval(interval *I) 39 40 { 40 lower = n Copy(I->lower);41 upper = n Copy(I->upper);41 lower = n_Copy(I->lower, I->R->cf); 42 upper = n_Copy(I->upper, I->R->cf); 42 43 R = I->R; 43 44 R->ref++; … … 46 47 interval::~interval() 47 48 { 48 n Delete(&lower);49 n Delete(&upper);49 n_Delete(&lower, R->cf); 50 n_Delete(&upper, R->cf); 50 51 R->ref--; 52 } 53 54 interval& interval::setRing(ring r) 55 { 56 if (R != r) 57 { 58 if (R->cf != r->cf) 59 { 60 nMapFunc fun = n_SetMap(R->cf, r->cf); 61 number lo = fun(lower, R->cf, r->cf), 62 up = fun(upper, R->cf, r->cf); 63 n_Delete(&lower, R->cf); 64 n_Delete(&upper, R->cf); 65 lower = lo; 66 upper = up; 67 } 68 R->ref--; 69 r->ref++; 70 R = r; 71 } 72 73 return *this; 51 74 } 52 75 … … 133 156 interval* i = (interval*) d; 134 157 135 // use n Write since nothing better (?) exists158 // use n_Write since nothing better (?) exists 136 159 StringSetS("["); 137 n Write(i->lower);160 n_Write(i->lower, i->R->cf); 138 161 StringAppendS(", "); 139 n Write(i->upper);162 n_Write(i->upper, i->R->cf); 140 163 StringAppendS("]"); 141 164 … … 170 193 */ 171 194 172 number n1, n2; 173 174 if (args->Typ() == INT_CMD) 175 { 176 n1 = nInit((int)(long) args->Data()); 177 } 178 else if (args->Typ() == NUMBER_CMD) 179 { 180 n1 = (number) args->CopyD(); 181 } 182 else if (args->Typ() == intervalID) 183 { 184 interval *I = (interval*) args->Data(); 185 n1 = nCopy(I->lower); 186 n2 = nCopy(I->upper); 195 if (args->Typ() == intervalID) 196 { 197 RES = new interval((interval*) args->CopyD()); 187 198 } 188 199 else 189 200 { 190 WerrorS("Input not supported: first argument not int or number"); 191 return TRUE; 192 } 193 194 // check if second argument exists 195 if (args->Typ() == intervalID) 196 { 197 RES = new interval(n1, n2); 198 } 199 else if (args->next == NULL) 200 { 201 RES = new interval(n1); 202 } 203 else 204 { 205 if (args->next->Typ() == INT_CMD) 206 { 207 n2 = nInit((int)(long) args->next->Data()); 208 } 209 else if (args->next->Typ() == NUMBER_CMD) 210 { 211 n2 = (number) args->next->CopyD(); 201 number n1, n2; 202 203 if (args->Typ() == INT_CMD) 204 { 205 n1 = nInit((int)(long) args->Data()); 206 } 207 else if (args->Typ() == NUMBER_CMD) 208 { 209 n1 = (number) args->CopyD(); 212 210 } 213 211 else 214 212 { 215 WerrorS("Input not supported: secondargument not int or number");213 WerrorS("Input not supported: first argument not int or number"); 216 214 return TRUE; 217 215 } 218 216 219 RES = new interval(n1, n2); 217 // check if second argument exists 218 if (args->Typ() == intervalID) 219 { 220 RES = new interval(n1, n2); 221 } 222 else if (args->next == NULL) 223 { 224 RES = new interval(n1); 225 } 226 else 227 { 228 if (args->next->Typ() == INT_CMD) 229 { 230 n2 = nInit((int)(long) args->next->Data()); 231 } 232 else if (args->next->Typ() == NUMBER_CMD) 233 { 234 n2 = (number) args->next->CopyD(); 235 } 236 else 237 { 238 WerrorS("Input not supported: second argument not int or number"); 239 return TRUE; 240 } 241 242 RES = new interval(n1, n2); 243 } 220 244 } 221 245 … … 246 270 interval *I = (interval*) arg->Data(); 247 271 result->rtyp = NUMBER_CMD; 248 result->data = (void*) n Sub(I->upper, I->lower);272 result->data = (void*) n_Sub(I->upper, I->lower, I->R->cf); 249 273 arg->CleanUp(); 250 274 return FALSE; … … 259 283 static interval* intervalScalarMultiply(number a, interval *I) 260 284 { 285 // must assume a is in ring I->R 261 286 number lo, up; 262 287 if (nGreaterZero(a)) 263 288 { 264 lo = n Mult(a, I->lower);265 up = n Mult(a, I->upper);289 lo = n_Mult(a, I->lower, I->R->cf); 290 up = n_Mult(a, I->upper, I->R->cf); 266 291 } 267 292 else 268 293 { 269 lo = n Mult(a, I->upper);270 up = n Mult(a, I->lower);271 } 272 273 n Normalize(lo);274 n Normalize(up);275 276 return new interval(lo, up );294 lo = n_Mult(a, I->upper, I->R->cf); 295 up = n_Mult(a, I->lower, I->R->cf); 296 } 297 298 n_Normalize(lo, I->R->cf); 299 n_Normalize(up, I->R->cf); 300 301 return new interval(lo, up, I->R); 277 302 } 278 303 … … 281 306 number lo, up; 282 307 number nums[4]; 283 nums[0] = n Mult(I->lower, J->lower);284 nums[1] = n Mult(I->lower, J->upper);285 nums[2] = n Mult(I->upper, J->lower);286 nums[3] = n Mult(I->upper, J->upper);308 nums[0] = n_Mult(I->lower, J->lower, I->R->cf); 309 nums[1] = n_Mult(I->lower, J->upper, I->R->cf); 310 nums[2] = n_Mult(I->upper, J->lower, I->R->cf); 311 nums[3] = n_Mult(I->upper, J->upper, I->R->cf); 287 312 288 313 int i, imax = 0, imin = 0; 289 314 for (i = 1; i < 4; i++) 290 315 { 291 if (n Greater(nums[i], nums[imax]))316 if (n_Greater(nums[i], nums[imax], I->R->cf)) 292 317 { 293 318 imax = i; 294 319 } 295 if (n Greater(nums[imin], nums[i]))320 if (n_Greater(nums[imin], nums[i], I->R->cf)) 296 321 { 297 322 imin = i; … … 299 324 } 300 325 301 lo = n Copy(nums[imin]);302 up = n Copy(nums[imax]);326 lo = n_Copy(nums[imin], I->R->cf); 327 up = n_Copy(nums[imax], I->R->cf); 303 328 304 329 // delete products 305 330 for (i = 0; i < 4; i++) 306 331 { 307 nDelete(&nums[i]); 308 } 309 310 nNormalize(lo); 311 nNormalize(up); 332 n_Delete(&nums[i], I->R->cf); 333 } 334 335 n_Normalize(lo, I->R->cf); 336 n_Normalize(up, I->R->cf); 337 338 return new interval(lo, up, I->R); 339 } 340 341 static interval* intervalAdd(interval *I, interval *J) 342 { 343 number lo = n_Add(I->lower, J->lower, I->R->cf), 344 up = n_Add(I->upper, J->upper, I->R->cf); 345 346 n_Normalize(lo, I->R->cf); 347 n_Normalize(up, I->R->cf); 312 348 313 349 return new interval(lo, up); 314 350 } 315 351 316 static interval* intervalAdd(interval *I, interval *J)317 {318 number lo = nAdd(I->lower, J->lower),319 up = nAdd(I->upper, J->upper);320 321 nNormalize(lo);322 nNormalize(up);323 324 return new interval(lo, up);325 }326 327 352 static interval* intervalSubtract(interval *I, interval *J) 328 353 { 329 number lo = n Sub(I->lower, J->upper),330 up = n Sub(I->upper, J->lower);331 332 n Normalize(lo);333 n Normalize(up);334 335 return new interval(lo, up );354 number lo = n_Sub(I->lower, J->upper, I->R->cf), 355 up = n_Sub(I->upper, J->lower, I->R->cf); 356 357 n_Normalize(lo, I->R->cf); 358 n_Normalize(up, I->R->cf); 359 360 return new interval(lo, up, I->R); 336 361 } 337 362 338 363 static bool intervalEqual(interval *I, interval *J) 339 364 { 340 return nEqual(I->lower, J->lower) && nEqual(I->upper, J->upper); 365 assume(I->R == J->R); 366 return n_Equal(I->lower, J->lower, I->R->cf) 367 && n_Equal(I->upper, J->upper, I->R->cf); 341 368 } 342 369 … … 344 371 static bool intervalContainsZero(interval *I) 345 372 { 346 number n = n Mult(I->lower, I->upper);347 bool result = !n GreaterZero(n);373 number n = n_Mult(I->lower, I->upper, I->R->cf); 374 bool result = !n_GreaterZero(n, I->R->cf); 348 375 // delete helper number 349 n Delete(&n);376 n_Delete(&n, I->R->cf); 350 377 351 378 return result; … … 356 383 if (p == 0) 357 384 { 358 return new interval(n Init(1));385 return new interval(n_Init(1,I->R->cf), I->R); 359 386 } 360 387 … … 362 389 number lo, up; 363 390 364 n Power(I->lower, p, &lo);365 n Power(I->upper, p, &up);391 n_Power(I->lower, p, &lo, I->R->cf); 392 n_Power(I->upper, p, &up, I->R->cf); 366 393 367 394 // should work now 368 395 if (p % 2 == 1) 369 396 { 370 return new interval(lo, up );397 return new interval(lo, up, I->R); 371 398 } 372 399 else … … 374 401 // perform pointer swap if necessary 375 402 number tmp; 376 if (n Greater(lo, up))403 if (n_Greater(lo, up, I->R->cf)) 377 404 { 378 405 tmp = up; … … 383 410 if (intervalContainsZero(I)) 384 411 { 385 n Delete(&lo);386 lo = n Init(0);387 } 388 return new interval(lo, up );412 n_Delete(&lo, I->R->cf); 413 lo = n_Init(0, I->R->cf); 414 } 415 return new interval(lo, up, I->R); 389 416 } 390 417 } … … 428 455 I1 = (interval*) i1->Data(); 429 456 I2 = (interval*) i2->Data(); 457 if (I1->R != I2->R) 458 { 459 WerrorS("adding intervals defined in different rings not supported"); 460 return TRUE; 461 } 430 462 431 463 RES = intervalAdd(I1, I2); … … 442 474 I1 = (interval*) i1->Data(); 443 475 I2 = (interval*) i2->Data(); 476 if (I1->R != I2->R) 477 { 478 WerrorS("subtracting intervals defined in different rings not supported"); 479 return TRUE; 480 } 444 481 445 482 RES = intervalSubtract(I1, I2); … … 454 491 I1 = (interval*) i1->Data(); 455 492 I2 = (interval*) i2->Data(); 493 if (I1->R != I2->R) 494 { 495 WerrorS("multiplying intervals defined in different rings not supported"); 496 return TRUE; 497 } 456 498 457 499 RES = intervalMultiply(I1, I2); … … 503 545 504 546 // make sure I2 is invertible 505 if (intervalContainsZero(I2))547 if (intervalContainsZero(I2)) 506 548 { 507 549 WerrorS("second interval contains zero"); … … 510 552 511 553 number invlo, invup; 512 invlo = n Invers(I2->lower);513 invup = n Invers(I2->upper);554 invlo = n_Invers(I2->lower, I2->R->cf); 555 invup = n_Invers(I2->upper, I2->R->cf); 514 556 515 557 // inverse interval 516 interval *I2inv = new interval(invup, invlo );558 interval *I2inv = new interval(invup, invlo, I2->R); 517 559 518 560 if (i1->Typ() == intervalID) 519 561 { 520 562 interval *I1 = (interval*) i1->Data(); 563 if (I1->R != I2->R) 564 { 565 WerrorS("dividing intervals from different rings not supported"); 566 delete I2inv; 567 return TRUE; 568 } 521 569 RES = intervalMultiply(I1, I2inv); 522 570 } … … 815 863 // make sure rings of boxes and their intervals are consistent 816 864 // this is important for serialization 817 if (RES->R != RES->intervals[i]->R) 818 { 819 if (RES->R->cf != RES->intervals[i]->R->cf) 820 { 821 WerrorS("Passing interval to ring with different coefficient field"); 822 delete RES; 823 args->CleanUp(); 824 return TRUE; 825 } 826 827 RES->intervals[i]->R->ref--; 828 RES->R->ref++; 829 RES->intervals[i]->R = RES->R; 830 } 865 RES->intervals[i]->setRing(RES->R); 831 866 } 832 867 } … … 909 944 { 910 945 WerrorS("second argument not box"); 911 } 912 if (result->Data() != NULL) 913 { 914 delete (box*) result->Data(); 946 return TRUE; 915 947 } 916 948 … … 918 950 // maybe try to skip this initialisation 919 951 // copying def of box() results in segfault? 952 if (B1->R != B2->R) 953 { 954 WerrorS("subtracting boxes from different rings not supported"); 955 return TRUE; 956 } 920 957 RES = new box(); 921 958 int i; … … 1117 1154 1118 1155 RES->setInterval(i-1, new interval(I)); 1119 1120 // same as above, ensure ring consistency 1121 if (RES->R != RES->intervals[i-1]->R) 1122 { 1123 if (RES->R->cf != RES->intervals[i-1]->R->cf) 1124 { 1125 WerrorS("Passing interval to ring with different coefficient field"); 1126 delete RES; 1127 args->CleanUp(); 1128 return TRUE; 1129 } 1130 1131 RES->intervals[i]->R->ref--; 1132 RES->R->ref++; 1133 RES->intervals[i]->R = RES->R; 1134 } 1156 // ensure consistency 1157 RES->intervals[i-1]->setRing(RES->R); 1135 1158 1136 1159 result->rtyp = boxID; -
Singular/dyn_modules/interval/interval.h
rf0fba1c rfe9a47 10 10 ring R; 11 11 12 interval( );13 interval(number );14 interval(number, number );12 interval(ring); 13 interval(number, ring); 14 interval(number, number, ring); 15 15 interval(interval*); 16 16 ~interval(); 17 18 interval& setRing(ring); 17 19 }; 18 20
Note: See TracChangeset
for help on using the changeset viewer.