/linbox-1.3.2/linbox/vector/vector-domain.inl

# · C++ Header · 2395 lines · 1884 code · 456 blank · 55 comment · 622 complexity · 630b650b08ed0a2cdf02ecf593829822 MD5 · raw file

  1. /* linbox/vector/vector-domain.inl
  2. * Copyright (C) 2001-2002 Bradford Hovinen
  3. *
  4. * Written by Bradford Hovinen <hovinen@cis.udel.edu>
  5. *
  6. * ------------------------------------
  7. * 2002-07-24 Bradford Hovinen <hovinen@cis.udel.edu>
  8. *
  9. * Added support for the new SparseParallel vector type; this involves quite a
  10. * few new specializations.
  11. *
  12. * ------------------------------------
  13. * Modified by Dmitriy Morozov <linbox@foxcub.org>
  14. *
  15. * Added the modifications for categories and vector traits that were designed
  16. * at the Rootbeer meeting. Added parametrization of VectorTags by VectorTraits.
  17. *
  18. * ------------------------------------
  19. * 2002-06-04 Bradford Hovinen <hovinen@cis.udel.edu>
  20. *
  21. * Updated function definitions according to the new policy set in
  22. * vector-domain.h This means the functions each take a parameter tag (or, for
  23. * dot product, tag1 and tag2) that allows specialization by vector type.
  24. * ------------------------------------
  25. *
  26. *
  27. * ========LICENCE========
  28. * This file is part of the library LinBox.
  29. *
  30. * LinBox is free software: you can redistribute it and/or modify
  31. * it under the terms of the GNU Lesser General Public
  32. * License as published by the Free Software Foundation; either
  33. * version 2.1 of the License, or (at your option) any later version.
  34. *
  35. * This library is distributed in the hope that it will be useful,
  36. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  37. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  38. * Lesser General Public License for more details.
  39. *
  40. * You should have received a copy of the GNU Lesser General Public
  41. * License along with this library; if not, write to the Free Software
  42. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  43. * ========LICENCE========
  44. *.
  45. */
  46. #ifndef __LINBOX_field_vector_domain_INL
  47. #define __LINBOX_field_vector_domain_INL
  48. #include <iostream>
  49. #include <cctype>
  50. namespace LinBox
  51. { /* VectorDomain */
  52. template <class Field>
  53. template <class Vector>
  54. std::ostream &VectorDomain<Field>::writeSpecialized (std::ostream &os, const Vector &x,
  55. VectorCategories::DenseVectorTag) const
  56. {
  57. typename Vector::const_iterator i;
  58. os << '[';
  59. for (i = x.begin (); i != x.end ();) {
  60. VectorDomainBase<Field>::_field.write (os, *i);
  61. if (++i != x.end ())
  62. os << ", ";
  63. }
  64. os << ']';
  65. return os;
  66. }
  67. template <class Field>
  68. template <class Vector>
  69. std::ostream &VectorDomain<Field>::writeSpecialized (std::ostream &os, const Vector &x,
  70. VectorCategories::SparseSequenceVectorTag) const
  71. {
  72. typename Vector::const_iterator i;
  73. size_t idx;
  74. os << '[';
  75. for (i = x.begin (), idx = 0; i != x.end ();) {
  76. while (idx++ < i->first)
  77. os << "0, ";
  78. VectorDomainBase<Field>::_field.write (os, i->second);
  79. if (++i != x.end ())
  80. os << ", ";
  81. }
  82. os << ']';
  83. return os;
  84. }
  85. template <class Field>
  86. template <class Vector>
  87. std::ostream &VectorDomain<Field>::writeSpecialized (std::ostream &os, const Vector &x,
  88. VectorCategories::SparseAssociativeVectorTag) const
  89. {
  90. typename Vector::const_iterator i;
  91. size_t idx;
  92. os << '[';
  93. for (i = x.begin (), idx = 0; i != x.end ();) {
  94. while (idx++ < i->first)
  95. os << "0, ";
  96. VectorDomainBase<Field>::_field.write (os, i->second);
  97. if (++i != x.end ())
  98. os << ", ";
  99. }
  100. os << ']';
  101. return os;
  102. }
  103. template <class Field>
  104. template <class Vector>
  105. std::ostream &VectorDomain<Field>::writeSpecialized (std::ostream &os, const Vector &x,
  106. VectorCategories::SparseParallelVectorTag) const
  107. {
  108. typename Vector::first_type::const_iterator i;
  109. typename Vector::second_type::const_iterator j;
  110. size_t idx;
  111. os << '[';
  112. for (i = x.first.begin (), j = x.second.begin (), idx = 0; i != x.first.end ();) {
  113. while (idx++ < *i)
  114. os << "0, ";
  115. VectorDomainBase<Field>::_field.write (os, *j);
  116. if (++i != x.first.end ())
  117. os << ", ";
  118. ++j;
  119. }
  120. os << ']';
  121. return os;
  122. }
  123. template <class Field>
  124. template <class Vector>
  125. std::istream &VectorDomain<Field>::readSpecialized (std::istream &is, Vector &x,
  126. VectorCategories::DenseVectorTag) const
  127. {
  128. typename Vector::iterator i;
  129. char c;
  130. bool seekrightbracket = false;
  131. i = x.begin ();
  132. do is >> c; while (is && isspace (c));
  133. if (c == '[') seekrightbracket = true;
  134. else is.unget ();
  135. while (i != x.end() && is) {
  136. do is >> c; while (!isdigit(c) && c != '-');
  137. is.unget ();
  138. VectorDomainBase<Field>::_field.read (is, *i++);
  139. //std::cerr << std::endl << "just read this: ";
  140. //VectorDomainBase<Field>::_field.write(cerr, *(i-1)) << " at index " << (i-x.begin());
  141. }
  142. if (seekrightbracket) do is >> c; while (is && c != ']');
  143. return is;
  144. }
  145. template <class Field>
  146. template <class Vector>
  147. std::istream &VectorDomain<Field>::readSpecialized (std::istream &is, Vector &x,
  148. VectorCategories::SparseSequenceVectorTag) const
  149. {
  150. typename Field::Element tmp;
  151. char c;
  152. int idx;
  153. do is >> c; while (is && isspace (c));
  154. if (isdigit (c))
  155. is.unget ();
  156. c = ','; x.clear (); idx = 0;
  157. while (is && c == ',') {
  158. do is >> c; while (is && isspace (c));
  159. is.unget ();
  160. VectorDomainBase<Field>::_field.read (is, tmp);
  161. if (!VectorDomainBase<Field>::_field.isZero (tmp))
  162. x.push_back (std::pair <size_t, typename Field::Element> (idx, tmp));
  163. is >> c;
  164. idx++;
  165. }
  166. return is;
  167. }
  168. template <class Field>
  169. template <class Vector>
  170. std::istream &VectorDomain<Field>::readSpecialized (std::istream &is, Vector &x,
  171. VectorCategories::SparseAssociativeVectorTag) const
  172. {
  173. typename Field::Element tmp;
  174. char c;
  175. int idx;
  176. do is >> c; while (is && isspace (c));
  177. if (isdigit (c))
  178. is.unget ();
  179. c = ','; x.clear (); idx = 0;
  180. while (is && c == ',') {
  181. do is >> c; while (is && isspace (c));
  182. is.unget ();
  183. VectorDomainBase<Field>::_field.read (is, tmp);
  184. if (!VectorDomainBase<Field>::_field.isZero (tmp))
  185. x[idx] = tmp;
  186. is >> c;
  187. idx++;
  188. }
  189. return is;
  190. }
  191. template <class Field>
  192. template <class Vector>
  193. std::istream &VectorDomain<Field>::readSpecialized (std::istream &is, Vector &x,
  194. VectorCategories::SparseParallelVectorTag) const
  195. {
  196. typename Field::Element tmp;
  197. char c;
  198. int idx;
  199. do is >> c; while (is && isspace (c));
  200. if (isdigit (c))
  201. is.unget ();
  202. c = ','; x.clear (); idx = 0;
  203. while (is && c == ',') {
  204. do is >> c; while (is && isspace (c));
  205. is.unget ();
  206. VectorDomainBase<Field>::_field.read (is, tmp);
  207. if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
  208. x.first.push_back (idx);
  209. x.second.push_back (tmp);
  210. }
  211. is >> c;
  212. idx++;
  213. }
  214. return is;
  215. }
  216. template <class Field>
  217. template <class Vector1, class Vector2>
  218. bool VectorDomain<Field>::areEqualSpecialized (const Vector1 &v1, const Vector2 &v2,
  219. VectorCategories::DenseVectorTag,
  220. VectorCategories::DenseVectorTag) const
  221. {
  222. typename Vector1::const_iterator i;
  223. typename Vector2::const_iterator j;
  224. if (v1.size () != v2.size ()) return false;
  225. for (i = v1.begin (), j = v2.begin (); i != v1.end (); i++, j++)
  226. if (!VectorDomainBase<Field>::_field.areEqual (*i, *j))
  227. return false;
  228. return true;
  229. }
  230. template <class Field>
  231. template <class Vector1, class Vector2>
  232. bool VectorDomain<Field>::areEqualSpecialized (const Vector1 &v1, const Vector2 &v2,
  233. VectorCategories::SparseSequenceVectorTag,
  234. VectorCategories::DenseVectorTag) const
  235. {
  236. typename Vector1::const_iterator i;
  237. typename Vector2::const_iterator j;
  238. size_t idx;
  239. for (i = v1.begin (), j = v2.begin (), idx = 0; i != v1.end () && j != v2.end (); j++, idx++) {
  240. if (i->first == idx) {
  241. if (!VectorDomainBase<Field>::_field.areEqual (i->second, *j))
  242. return false;
  243. i++;
  244. }
  245. else if (!VectorDomainBase<Field>::_field.isZero (*j))
  246. return false;
  247. }
  248. return true;
  249. }
  250. template <class Field>
  251. template <class Vector1, class Vector2>
  252. bool VectorDomain<Field>::areEqualSpecialized (const Vector1 &v1, const Vector2 &v2,
  253. VectorCategories::SparseAssociativeVectorTag,
  254. VectorCategories::DenseVectorTag) const
  255. {
  256. typename Vector1::const_iterator i;
  257. typename Vector2::const_iterator j;
  258. size_t idx;
  259. for (i = v1.begin (), j = v2.begin (), idx = 0; i != v1.end () && j != v2.end (); j++, idx++) {
  260. if (i->first == idx) {
  261. if (!VectorDomainBase<Field>::_field.areEqual (i->second, *j))
  262. return false;
  263. i++;
  264. }
  265. else if (!VectorDomainBase<Field>::_field.isZero (*j))
  266. return false;
  267. }
  268. return true;
  269. }
  270. template <class Field>
  271. template <class Vector1, class Vector2>
  272. bool VectorDomain<Field>::areEqualSpecialized (const Vector1 &v1, const Vector2 &v2,
  273. VectorCategories::SparseParallelVectorTag,
  274. VectorCategories::DenseVectorTag) const
  275. {
  276. typename Vector1::first_type::const_iterator i_idx;
  277. typename Vector1::second_type::const_iterator i_elt;
  278. typename Vector2::const_iterator j;
  279. size_t idx;
  280. for (i_idx = v1.first.begin (), i_elt = v1.second.begin (), j = v2.begin (), idx = 0;
  281. i_idx != v1.first.end () && j != v2.end ();
  282. j++, idx++)
  283. {
  284. if (*i_idx == idx) {
  285. if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, *j))
  286. return false;
  287. ++i_idx;
  288. ++i_elt;
  289. }
  290. else if (!VectorDomainBase<Field>::_field.isZero (*j))
  291. return false;
  292. }
  293. return true;
  294. }
  295. template <class Field>
  296. template <class Vector1, class Vector2>
  297. bool VectorDomain<Field>::areEqualSpecialized (const Vector1 &v1, const Vector2 &v2,
  298. VectorCategories::SparseSequenceVectorTag,
  299. VectorCategories::SparseSequenceVectorTag) const
  300. {
  301. typename Vector1::const_iterator i;
  302. typename Vector2::const_iterator j;
  303. for (i = v1.begin (), j = v2.begin (); i != v1.end () || j != v2.end ();) {
  304. while (i != v1.end () && (j == v2.end () || i->first < j->first)) {
  305. if (!VectorDomainBase<Field>::_field.isZero (i->second))
  306. return false;
  307. i++;
  308. }
  309. while (j != v2.end () && (i == v1.end () || j->first < i->first)) {
  310. if (!VectorDomainBase<Field>::_field.isZero (j->second))
  311. return false;
  312. j++;
  313. }
  314. if (i != v1.end () && j != v2.end () && i->first == j->first) {
  315. if (!VectorDomainBase<Field>::_field.areEqual (i->second, j->second))
  316. return false;
  317. i++; j++;
  318. }
  319. }
  320. return true;
  321. }
  322. template <class Field>
  323. template <class Vector1, class Vector2>
  324. bool VectorDomain<Field>::areEqualSpecialized (const Vector1 &v1, const Vector2 &v2,
  325. VectorCategories::SparseAssociativeVectorTag,
  326. VectorCategories::SparseSequenceVectorTag) const
  327. {
  328. typename Vector1::const_iterator i;
  329. typename Vector2::const_iterator j;
  330. for (i = v1.begin (), j = v2.begin (); i != v1.end () || j != v2.end ();) {
  331. while (i != v1.end () && (j == v2.end () || i->first < j->first)) {
  332. if (!VectorDomainBase<Field>::_field.isZero (i->second))
  333. return false;
  334. i++;
  335. }
  336. while (j != v2.end () && (i == v1.end () || j->first < i->first)) {
  337. if (!VectorDomainBase<Field>::_field.isZero (j->second))
  338. return false;
  339. j++;
  340. }
  341. if (i != v1.end () && j != v2.end () && i->first == j->first) {
  342. if (!VectorDomainBase<Field>::_field.areEqual (i->second, j->second))
  343. return false;
  344. i++; j++;
  345. }
  346. }
  347. return true;
  348. }
  349. template <class Field>
  350. template <class Vector1, class Vector2>
  351. bool VectorDomain<Field>::areEqualSpecialized (const Vector1 &v1, const Vector2 &v2,
  352. VectorCategories::SparseParallelVectorTag,
  353. VectorCategories::SparseSequenceVectorTag) const
  354. {
  355. typename Vector1::first_type::const_iterator i_idx;
  356. typename Vector1::second_type::const_iterator i_elt;
  357. typename Vector2::const_iterator j;
  358. for (i_idx = v1.first.begin (), i_elt = v1.second.begin (), j = v2.begin ();
  359. i_idx != v1.first.end () || j != v2.end ();)
  360. {
  361. while (i_idx != v1.first.end () && (j == v2.end () || *i_idx < j->first)) {
  362. if (!VectorDomainBase<Field>::_field.isZero (*i_elt))
  363. return false;
  364. i_idx++;
  365. i_elt++;
  366. }
  367. while (j != v2.end () && (i_idx == v1.first.end () || j->first < *i_idx)) {
  368. if (!VectorDomainBase<Field>::_field.isZero (j->second))
  369. return false;
  370. j++;
  371. }
  372. if (i_idx != v1.first.end () && j != v2.end () && *i_idx == j->first) {
  373. if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, j->second))
  374. return false;
  375. i_idx++; i_elt++; j++;
  376. }
  377. }
  378. return true;
  379. }
  380. template <class Field>
  381. template <class Vector1, class Vector2>
  382. bool VectorDomain<Field>::areEqualSpecialized (const Vector1 &v1, const Vector2 &v2,
  383. VectorCategories::SparseAssociativeVectorTag,
  384. VectorCategories::SparseAssociativeVectorTag) const
  385. {
  386. typename Vector1::const_iterator i;
  387. typename Vector2::const_iterator j;
  388. for (i = v1.begin (), j = v2.begin (); i != v1.end () || j != v2.end ();) {
  389. while (i != v1.end () && (j == v2.end () || i->first < j->first)) {
  390. if (!VectorDomainBase<Field>::_field.isZero (i->second))
  391. return false;
  392. i++;
  393. }
  394. while (j != v2.end () && (i == v1.end () || j->first < i->first)) {
  395. if (!VectorDomainBase<Field>::_field.isZero (j->second))
  396. return false;
  397. j++;
  398. }
  399. if (i != v1.end () && j != v2.end () && i->first == j->first) {
  400. if (!VectorDomainBase<Field>::_field.areEqual (i->second, j->second))
  401. return false;
  402. i++; j++;
  403. }
  404. }
  405. return true;
  406. }
  407. template <class Field>
  408. template <class Vector1, class Vector2>
  409. bool VectorDomain<Field>::areEqualSpecialized (const Vector1 &v1, const Vector2 &v2,
  410. VectorCategories::SparseParallelVectorTag,
  411. VectorCategories::SparseAssociativeVectorTag) const
  412. {
  413. typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
  414. typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
  415. typename Vector2::const_iterator j = v2.begin ();
  416. while (i_idx != v1.first.end () || j != v2.end ()) {
  417. while (i_idx != v1.first.end () && (j == v2.end () || *i_idx < j->first)) {
  418. if (!VectorDomainBase<Field>::_field.isZero (*i_elt))
  419. return false;
  420. i_idx++;
  421. i_elt++;
  422. }
  423. while (j != v2.end () && (i_idx == v1.first.end () || j->first < *i_idx)) {
  424. if (!VectorDomainBase<Field>::_field.isZero (j->second))
  425. return false;
  426. j++;
  427. }
  428. if (i_idx != v1.first.end () && j != v2.end () && *i_idx == j->first) {
  429. if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, j->second))
  430. return false;
  431. i_idx++; i_elt++; j++;
  432. }
  433. }
  434. return true;
  435. }
  436. template <class Field>
  437. template <class Vector1, class Vector2>
  438. bool VectorDomain<Field>::areEqualSpecialized (const Vector1 &v1, const Vector2 &v2,
  439. VectorCategories::SparseParallelVectorTag,
  440. VectorCategories::SparseParallelVectorTag) const
  441. {
  442. typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
  443. typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
  444. typename Vector2::first_type::const_iterator j_idx = v2.first.begin ();
  445. typename Vector2::second_type::const_iterator j_elt = v2.second.begin ();
  446. while (i_idx != v1.first.end () || j_idx != v2.first.end ()) {
  447. while (i_idx != v1.first.end () && (j_idx == v2.first.end () || *i_idx < *j_idx)) {
  448. if (!VectorDomainBase<Field>::_field.isZero (*i_elt))
  449. return false;
  450. i_idx++;
  451. i_elt++;
  452. }
  453. while (j_idx != v2.first.end () && (i_idx == v1.first.end () || *j_idx < *i_idx)) {
  454. if (!VectorDomainBase<Field>::_field.isZero (*j_elt))
  455. return false;
  456. j_idx++;
  457. j_elt++;
  458. }
  459. if (i_idx != v1.first.end () && j_idx != v2.first.end () && *i_idx == *j_idx) {
  460. if (!VectorDomainBase<Field>::_field.areEqual (*i_elt, *j_elt))
  461. return false;
  462. i_idx++; i_elt++; j_idx++; j_elt++;
  463. }
  464. }
  465. return true;
  466. }
  467. template <class Field>
  468. template <class Vector>
  469. bool VectorDomain<Field>::isZeroSpecialized (const Vector &v, VectorCategories::DenseVectorTag) const
  470. {
  471. typename Vector::const_iterator i;
  472. for (i = v.begin (); i != v.end (); i++)
  473. if (!VectorDomainBase<Field>::_field.isZero (*i))
  474. return false;
  475. return true;
  476. }
  477. template <class Field>
  478. template <class Vector>
  479. bool VectorDomain<Field>::isZeroSpecialized (const Vector &v, VectorCategories::SparseSequenceVectorTag) const
  480. {
  481. typename Vector::const_iterator i;
  482. for (i = v.begin (); i != v.end (); i++)
  483. if (!VectorDomainBase<Field>::_field.isZero (i->second))
  484. return false;
  485. return true;
  486. }
  487. template <class Field>
  488. template <class Vector>
  489. bool VectorDomain<Field>::isZeroSpecialized (const Vector &v, VectorCategories::SparseAssociativeVectorTag) const
  490. {
  491. typename Vector::const_iterator i;
  492. for (i = v.begin (); i != v.end (); i++)
  493. if (!VectorDomainBase<Field>::_field.isZero (i->second))
  494. return false;
  495. return true;
  496. }
  497. template <class Field>
  498. template <class Vector>
  499. bool VectorDomain<Field>::isZeroSpecialized (const Vector &v, VectorCategories::SparseParallelVectorTag) const
  500. {
  501. typename Vector::second_type::const_iterator i;
  502. for (i = v.second.begin (); i != v.second.end (); i++)
  503. if (!VectorDomainBase<Field>::_field.isZero (*i))
  504. return false;
  505. return true;
  506. }
  507. template <class Field>
  508. template <class Vector1, class Vector2>
  509. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  510. VectorCategories::SparseSequenceVectorTag,
  511. VectorCategories::DenseVectorTag) const
  512. {
  513. typename Vector2::const_iterator i;
  514. int idx;
  515. res.clear ();
  516. for (i = v.begin (), idx = 0; i != v.end (); i++, idx++)
  517. if (!VectorDomainBase<Field>::_field.isZero (*i))
  518. res.push_back (std::pair <size_t, typename Field::Element> (idx, *i));
  519. return res;
  520. }
  521. template <class Field>
  522. template <class Vector1, class Vector2>
  523. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  524. VectorCategories::SparseAssociativeVectorTag,
  525. VectorCategories::DenseVectorTag) const
  526. {
  527. typename Vector2::const_iterator i;
  528. int idx;
  529. res.clear ();
  530. for (i = v.begin (), idx = 0; i != v.end (); i++, idx++)
  531. if (!VectorDomainBase<Field>::_field.isZero (*i))
  532. res[idx] = *i;
  533. return res;
  534. }
  535. template <class Field>
  536. template <class Vector1, class Vector2>
  537. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  538. VectorCategories::SparseParallelVectorTag,
  539. VectorCategories::DenseVectorTag) const
  540. {
  541. typename Vector2::const_iterator i;
  542. int idx;
  543. res.first.clear ();
  544. res.second.clear ();
  545. for (i = v.begin (), idx = 0; i != v.end (); i++, idx++) {
  546. if (!VectorDomainBase<Field>::_field.isZero (*i)) {
  547. res.first.push_back (idx);
  548. res.second.push_back (*i);
  549. }
  550. }
  551. return res;
  552. }
  553. template <class Field>
  554. template <class Vector1, class Vector2>
  555. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  556. VectorCategories::DenseVectorTag,
  557. VectorCategories::SparseSequenceVectorTag) const
  558. {
  559. typename Vector1::iterator i;
  560. typename Vector2::const_iterator j;
  561. size_t idx;
  562. for (i = res.begin (), j = v.begin (), idx = 0; j != v.end (); i++, j++, idx++) {
  563. while (idx < j->first) {
  564. VectorDomainBase<Field>::_field.init (*i, 0);
  565. i++; idx++;
  566. }
  567. *i = j->second;
  568. }
  569. return res;
  570. }
  571. template <class Field>
  572. template <class Vector1, class Vector2>
  573. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  574. VectorCategories::SparseAssociativeVectorTag,
  575. VectorCategories::SparseSequenceVectorTag) const
  576. {
  577. typename Vector2::const_iterator i;
  578. res.clear ();
  579. for (i = v.begin (); i != v.end (); i++)
  580. res[i->first] = i->second;
  581. return res;
  582. }
  583. template <class Field>
  584. template <class Vector1, class Vector2>
  585. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  586. VectorCategories::SparseParallelVectorTag,
  587. VectorCategories::SparseSequenceVectorTag) const
  588. {
  589. typename Vector2::const_iterator i;
  590. res.first.clear ();
  591. res.second.clear ();
  592. for (i = v.begin (); i != v.end (); i++) {
  593. res.first.push_back (i->first);
  594. res.second.push_back (i->second);
  595. }
  596. return res;
  597. }
  598. template <class Field>
  599. template <class Vector1, class Vector2>
  600. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  601. VectorCategories::DenseVectorTag,
  602. VectorCategories::SparseAssociativeVectorTag) const
  603. {
  604. typename Vector1::iterator i;
  605. typename Vector2::const_iterator j;
  606. size_t idx;
  607. for (i = res.begin (), j = v.begin (), idx = 0; j != v.end (); i++, j++, idx++) {
  608. while (idx < j->first) {
  609. VectorDomainBase<Field>::_field.init (*i, 0);
  610. i++; idx++;
  611. }
  612. *i = j->second;
  613. }
  614. return res;
  615. }
  616. template <class Field>
  617. template <class Vector1, class Vector2>
  618. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  619. VectorCategories::SparseSequenceVectorTag,
  620. VectorCategories::SparseAssociativeVectorTag) const
  621. {
  622. typename Vector2::const_iterator i;
  623. res.clear ();
  624. for (i = v.begin (); i != v.end (); i++)
  625. res.push_back (*i);
  626. return res;
  627. }
  628. template <class Field>
  629. template <class Vector1, class Vector2>
  630. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  631. VectorCategories::SparseAssociativeVectorTag,
  632. VectorCategories::SparseAssociativeVectorTag) const
  633. {
  634. typename Vector2::const_iterator i;
  635. res.clear ();
  636. for (i = v.begin (); i != v.end (); i++)
  637. res[i->first] = i->second;
  638. return res;
  639. }
  640. template <class Field>
  641. template <class Vector1, class Vector2>
  642. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  643. VectorCategories::SparseParallelVectorTag,
  644. VectorCategories::SparseAssociativeVectorTag) const
  645. {
  646. typename Vector2::const_iterator i;
  647. res.first.clear ();
  648. res.second.clear ();
  649. for (i = v.begin (); i != v.end (); i++) {
  650. res.first.push_back (i->first);
  651. res.second.push_back (i->second);
  652. }
  653. return res;
  654. }
  655. template <class Field>
  656. template <class Vector1, class Vector2>
  657. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  658. VectorCategories::DenseVectorTag,
  659. VectorCategories::SparseParallelVectorTag) const
  660. {
  661. typename Vector1::iterator i = res.begin ();
  662. typename Vector2::first_type::const_iterator j_idx = v.first.begin ();
  663. typename Vector2::second_type::const_iterator j_elt = v.second.begin ();
  664. size_t idx = 0;
  665. while (j_idx != v.first.end ()) {
  666. while (idx < *j_idx) {
  667. VectorDomainBase<Field>::_field.init (*i, 0);
  668. ++i; ++idx;
  669. }
  670. *i = *j_elt;
  671. ++i; ++j_idx; ++j_elt; ++idx;
  672. }
  673. return res;
  674. }
  675. template <class Field>
  676. template <class Vector1, class Vector2>
  677. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  678. VectorCategories::SparseSequenceVectorTag,
  679. VectorCategories::SparseParallelVectorTag) const
  680. {
  681. typename Vector2::first_type::const_iterator i_idx = v.first.begin ();
  682. typename Vector2::second_type::const_iterator i_elt = v.second.begin ();
  683. res.clear ();
  684. for (; i_idx != v.first.end (); ++i_idx, ++i_elt)
  685. res.push_back (std::pair <size_t, typename Field::Element> (*i_idx, *i_elt));
  686. return res;
  687. }
  688. template <class Field>
  689. template <class Vector1, class Vector2>
  690. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  691. VectorCategories::SparseAssociativeVectorTag,
  692. VectorCategories::SparseParallelVectorTag) const
  693. {
  694. typename Vector2::first_type::const_iterator i_idx = v.first.begin ();
  695. typename Vector2::second_type::const_iterator i_elt = v.second.begin ();
  696. res.clear ();
  697. for (; i_idx != v.first.end (); i_idx++, i_elt++)
  698. res[*i_idx] = *i_elt;
  699. return res;
  700. }
  701. template <class Field>
  702. template <class Vector1, class Vector2>
  703. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v,
  704. VectorCategories::SparseParallelVectorTag,
  705. VectorCategories::SparseParallelVectorTag) const
  706. {
  707. res.first.resize (v.first.size ());
  708. std::copy (v.first.begin (), v.first.end (), res.first.begin ());
  709. res.second.resize (v.second.size ());
  710. std::copy (v.second.begin (), v.second.end (), res.second.begin ());
  711. return res;
  712. }
  713. template <class Field>
  714. template <class Vector1, class Vector2>
  715. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v, size_t i, size_t len,
  716. VectorCategories::DenseVectorTag) const
  717. {
  718. if (i == 0 && len == 0) {
  719. copy (res, v);
  720. }
  721. else {
  722. Vector1 res_part;
  723. copy (res_part, v);
  724. std::copy (res_part.begin (), (len == 0) ? res_part.end () : res_part.begin () + len, res.begin () + i);
  725. }
  726. return res;
  727. }
  728. template <class Field>
  729. template <class Vector1, class Vector2>
  730. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v, size_t i, size_t len,
  731. VectorCategories::SparseSequenceVectorTag) const
  732. {
  733. if (i == 0 && len == 0)
  734. return copy (res, v);
  735. typename Vector1::iterator r_begin, r_end, part_end, iter;
  736. Vector1 res_part;
  737. copy (res_part, v);
  738. if (len == 0)
  739. part_end = res_part.end ();
  740. else
  741. part_end = std::lower_bound (res_part.begin (), res_part.end (), len,
  742. VectorWrapper::CompareSparseEntries<Element> ());
  743. for (iter = res_part.begin (); iter != part_end; iter++)
  744. iter->first += i;
  745. r_begin = std::lower_bound (res.begin (), res.end (), i, VectorWrapper::CompareSparseEntries<Element> ());
  746. r_end = (len == 0) ? res.end () : std::lower_bound (r_begin, res.end (), i + len,
  747. VectorWrapper::CompareSparseEntries<Element> ());
  748. r_begin = res.erase (r_begin, r_end);
  749. res.insert (r_begin, res_part.begin (), part_end);
  750. return res;
  751. }
  752. template <class Field>
  753. template <class Vector1, class Vector2>
  754. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v, size_t i, size_t len,
  755. VectorCategories::SparseAssociativeVectorTag) const
  756. {
  757. if (i == 0 && len == 0)
  758. return copy (res, v);
  759. typename Vector1::iterator r_begin, r_end, part_end, iter;
  760. Vector1 res_part;
  761. copy (res_part, v);
  762. part_end = (len == 0) ? res_part.end () : res_part.find (len);
  763. r_begin = res.find (i);
  764. r_end = (len == 0) ? res.end () : res.find (i + len);
  765. res.erase (r_begin, r_end);
  766. for (iter = res_part.begin (); iter != part_end; iter++)
  767. res[iter->first + i] = iter->second;
  768. return res;
  769. }
  770. template <class Field>
  771. template <class Vector1, class Vector2>
  772. Vector1 &VectorDomain<Field>::copySpecialized (Vector1 &res, const Vector2 &v, size_t i, size_t len,
  773. VectorCategories::SparseParallelVectorTag) const
  774. {
  775. if (i == 0 && len == 0)
  776. return copy (res, v);
  777. typename Vector1::first_type::iterator r_idx_begin, r_idx_end, part_idx_end, iter;
  778. typename Vector1::second_type::iterator r_elt_begin, r_elt_end, part_elt_end;
  779. Vector1 res_part;
  780. copy (res_part, v);
  781. if (len == 0) {
  782. part_idx_end = res_part.first.end ();
  783. part_elt_end = res_part.second.end ();
  784. }
  785. else {
  786. part_idx_end = std::lower_bound (res_part.first.begin (), res_part.first.end (), len);
  787. part_elt_end = res_part.second.begin () + (part_idx_end - res_part.first.begin ());
  788. }
  789. for (iter = res_part.first.begin (); iter != part_idx_end; iter++)
  790. *iter += i;
  791. r_idx_begin = std::lower_bound (res.first.begin (), res.first.end (), i);
  792. r_elt_begin = res.second.begin () + (r_idx_begin - res.first.begin ());
  793. r_idx_end = (len == 0) ? res.first.end () : std::lower_bound (r_idx_begin, res.first.end (), i + len);
  794. r_idx_end = res.second.begin () + (r_idx_end - res.first.begin ());
  795. r_idx_begin = res.first.erase (r_idx_begin, r_idx_end);
  796. r_elt_begin = res.second.erase (r_elt_begin, r_elt_end);
  797. res.insert (r_idx_begin, res_part.first.begin (), part_idx_end);
  798. res.insert (r_elt_begin, res_part.second.begin (), part_elt_end);
  799. return res;
  800. }
  801. template <class Field>
  802. template <class Vector>
  803. Vector &VectorDomain<Field>::copySpecialized (Vector &res, const Vector &v, size_t i, size_t len,
  804. VectorCategories::DenseVectorTag) const
  805. {
  806. std::copy (v.begin (), (len == 0) ? v.end () : v.begin () + len, res.begin () + i);
  807. return res;
  808. }
  809. template <class Field>
  810. template <class Vector>
  811. Vector &VectorDomain<Field>::copySpecialized (Vector &res, const Vector &v, size_t i, size_t len,
  812. VectorCategories::SparseSequenceVectorTag) const
  813. {
  814. typename Vector::const_iterator v_end;
  815. typename Vector::iterator r_begin, r_end, iter;
  816. typename Vector::difference_type offset;
  817. if (len == 0)
  818. v_end = v.end ();
  819. else
  820. v_end = std::lower_bound (v.begin (), v.end (), len,
  821. VectorWrapper::CompareSparseEntries<Element> ());
  822. r_begin = std::lower_bound (res.begin (), res.end (), i, VectorWrapper::CompareSparseEntries<Element> ());
  823. r_end = (len == 0) ? res.end () : std::lower_bound (r_begin, res.end (), i + len,
  824. VectorWrapper::CompareSparseEntries<Element> ());
  825. r_begin = res.erase (r_begin, r_end);
  826. offset = r_begin - res.begin ();
  827. res.insert (r_begin, v.begin (), v_end);
  828. r_begin = res.begin () + offset;
  829. r_end = r_begin + (v_end - v.begin ());
  830. for (iter = r_begin; iter != r_end; iter++)
  831. iter->first += i;
  832. return res;
  833. }
  834. template <class Field>
  835. template <class Vector>
  836. Vector &VectorDomain<Field>::copySpecialized (Vector &res, const Vector &v, size_t i, size_t len,
  837. VectorCategories::SparseAssociativeVectorTag) const
  838. {
  839. typename Vector::const_iterator v_end;
  840. typename Vector::iterator r_begin, r_end, iter;
  841. v_end = (len == 0) ? v.end () : v.find (len);
  842. r_begin = res.find (i);
  843. r_end = (len == 0) ? res.end () : res.find (i + len);
  844. res.erase (r_begin, r_end);
  845. for (iter = v.begin (); iter != v_end; iter++)
  846. res[iter->first + i] = iter->second;
  847. return res;
  848. }
  849. template <class Field>
  850. template <class Vector>
  851. Vector &VectorDomain<Field>::copySpecialized (Vector &res, const Vector &v, size_t i, size_t len,
  852. VectorCategories::SparseParallelVectorTag) const
  853. {
  854. typename Vector::first_type::const_iterator v_idx_end;
  855. typename Vector::second_type::const_iterator v_elt_end;
  856. typename Vector::first_type::iterator r_idx_begin, r_idx_end, iter;
  857. typename Vector::second_type::iterator r_elt_begin, r_elt_end;
  858. typename Vector::first_type::difference_type offset;
  859. if (len == 0) {
  860. v_idx_end = v.first.end ();
  861. v_elt_end = v.second.end ();
  862. }
  863. else {
  864. v_idx_end = std::lower_bound (v.first.begin (), v.first.end (), len);
  865. v_elt_end = v.second.begin () + (v_idx_end - v.first.begin ());
  866. }
  867. r_idx_begin = std::lower_bound (res.first.begin (), res.first.end (), i);
  868. r_elt_begin = res.second.begin () + (r_idx_begin - res.first.begin ());
  869. r_idx_end = (len == 0) ? res.first.end () : std::lower_bound (r_idx_begin, res.first.end (), i + len);
  870. r_elt_end = res.second.begin () + (r_idx_end - res.first.begin ());
  871. r_idx_begin = res.first.erase (r_idx_begin, r_idx_end);
  872. r_elt_begin = res.second.erase (r_elt_begin, r_elt_end);
  873. offset = r_idx_begin - res.first.begin ();
  874. res.first.insert (r_idx_begin, v.first.begin (), v_idx_end);
  875. res.second.insert (r_elt_begin, v.second.begin (), v_elt_end);
  876. r_idx_begin = res.first.begin () + offset;
  877. r_idx_end = r_idx_begin + (v_idx_end - v.first.begin ());
  878. for (iter = r_idx_begin; iter != r_idx_end; iter++)
  879. *iter += i;
  880. return res;
  881. }
  882. template <class Field>
  883. template <class Vector1, class Vector2, class Vector3>
  884. Vector1 &VectorDomain<Field>::addSpecialized (Vector1 &res, const Vector2 &y, const Vector3 &x,
  885. VectorCategories::DenseVectorTag,
  886. VectorCategories::DenseVectorTag,
  887. VectorCategories::DenseVectorTag) const
  888. {
  889. typename Vector2::const_iterator i;
  890. typename Vector3::const_iterator j;
  891. typename Vector1::iterator k;
  892. linbox_check (y.size () == x.size ());
  893. linbox_check (res.size () == x.size ());
  894. for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); i++, j++, k++)
  895. VectorDomainBase<Field>::_field.add (*k, *i, *j);
  896. return res;
  897. }
  898. template <class Field>
  899. template <class Vector1, class Vector2, class Vector3>
  900. Vector1 &VectorDomain<Field>::addSpecialized (Vector1 &res, const Vector2 &y, const Vector3 &x,
  901. VectorCategories::SparseSequenceVectorTag,
  902. VectorCategories::SparseSequenceVectorTag,
  903. VectorCategories::SparseSequenceVectorTag) const
  904. {
  905. typename Vector2::const_iterator i;
  906. typename Vector3::const_iterator j;
  907. Element tmp;
  908. res.clear ();
  909. for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
  910. while (i != y.end () && i->first < j->first) {
  911. res.push_back (*i);
  912. i++;
  913. }
  914. if (i != y.end () && i->first == j->first) {
  915. VectorDomainBase<Field>::_field.add (tmp, i->second, j->second);
  916. if (!VectorDomainBase<Field>::_field.isZero (tmp))
  917. res.push_back (std::pair <size_t, Element> (j->first, tmp));
  918. i++;
  919. }
  920. else {
  921. res.push_back (*j);
  922. }
  923. }
  924. while (i != y.end ()) {
  925. res.push_back (*i);
  926. i++;
  927. }
  928. return res;
  929. }
  930. template <class Field>
  931. template <class Vector1, class Vector2, class Vector3>
  932. Vector1 &VectorDomain<Field>::addSpecialized (Vector1 &res, const Vector2 &y, const Vector3 &x,
  933. VectorCategories::SparseAssociativeVectorTag,
  934. VectorCategories::SparseAssociativeVectorTag,
  935. VectorCategories::SparseAssociativeVectorTag) const
  936. {
  937. typename Vector2::const_iterator i;
  938. typename Vector3::const_iterator j;
  939. Element tmp;
  940. res.clear ();
  941. for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
  942. while (i != y.end () && i->first < j->first) {
  943. res[i->first] = i->second;
  944. i++;
  945. }
  946. if (i != y.end () && i->first == j->first) {
  947. res[j->first] = VectorDomainBase<Field>::_field.add (tmp, i->second, j->second);
  948. i++;
  949. }
  950. else {
  951. res[j->first] = j->second;
  952. }
  953. }
  954. while (i != y.end ()) {
  955. res[i->first] = i->second;
  956. i++;
  957. }
  958. return res;
  959. }
  960. template <class Field>
  961. template <class Vector1, class Vector2, class Vector3>
  962. Vector1 &VectorDomain<Field>::addSpecialized (Vector1 &res, const Vector2 &y, const Vector3 &x,
  963. VectorCategories::SparseParallelVectorTag,
  964. VectorCategories::SparseParallelVectorTag,
  965. VectorCategories::SparseParallelVectorTag) const
  966. {
  967. typename Vector2::first_type::const_iterator i_idx = y.first.begin ();
  968. typename Vector3::first_type::const_iterator j_idx = x.first.begin ();
  969. typename Vector2::second_type::const_iterator i_elt = y.second.begin ();
  970. typename Vector3::second_type::const_iterator j_elt = x.second.begin ();
  971. Element tmp;
  972. res.first.clear ();
  973. res.second.clear ();
  974. for (; j_idx != x.first.end (); ++j_idx, ++j_elt) {
  975. while (i_idx != y.first.end () && *i_idx < *j_idx) {
  976. res.first.push_back (*i_idx);
  977. res.second.push_back (*i_elt);
  978. ++i_idx; ++i_elt;
  979. }
  980. if (i_idx != y.first.end () && *i_idx == *j_idx) {
  981. VectorDomainBase<Field>::_field.add (tmp, *i_elt, *j_elt);
  982. if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
  983. res.first.push_back (*j_idx);
  984. res.second.push_back (tmp);
  985. }
  986. ++i_idx; ++i_elt;
  987. }
  988. else {
  989. res.first.push_back (*j_idx);
  990. res.second.push_back (*j_elt);
  991. }
  992. }
  993. while (i_idx != y.first.end ()) {
  994. res.first.push_back (*i_idx);
  995. res.second.push_back (*i_elt);
  996. ++i_idx; ++i_elt;
  997. }
  998. return res;
  999. }
  1000. template <class Field>
  1001. template <class Vector1, class Vector2>
  1002. Vector1 &VectorDomain<Field>::addinSpecialized (Vector1 &y, const Vector2 &x,
  1003. VectorCategories::DenseVectorTag,
  1004. VectorCategories::DenseVectorTag) const
  1005. {
  1006. typename Vector1::iterator i;
  1007. typename Vector2::const_iterator j;
  1008. linbox_check (y.size () == x.size ());
  1009. for (i = y.begin (), j = x.begin (); i != y.end (); i++, j++)
  1010. VectorDomainBase<Field>::_field.addin (*i, *j);
  1011. return y;
  1012. }
  1013. template <class Field>
  1014. template <class Vector1, class Vector2>
  1015. Vector1 &VectorDomain<Field>::addinSpecialized (Vector1 &y, const Vector2 &x,
  1016. VectorCategories::SparseSequenceVectorTag,
  1017. VectorCategories::SparseSequenceVectorTag) const
  1018. {
  1019. Vector1 res;
  1020. add (res, y, x);
  1021. copy (y, res);
  1022. return y;
  1023. }
  1024. template <class Field>
  1025. template <class Vector1, class Vector2>
  1026. Vector1 &VectorDomain<Field>::addinSpecialized (Vector1 &y, const Vector2 &x,
  1027. VectorCategories::SparseAssociativeVectorTag,
  1028. VectorCategories::SparseAssociativeVectorTag) const
  1029. {
  1030. typename Vector1::iterator i;
  1031. typename Vector2::const_iterator j;
  1032. for (i = y.begin (), j = x.begin (); j != x.end (); j++) {
  1033. while (i != y.end () && i->first < j->first) i++;
  1034. if (i != y.end () && i->first == j->first)
  1035. VectorDomainBase<Field>::_field.addin (i->second, j->second);
  1036. else
  1037. y[j->first] = j->second;
  1038. }
  1039. return y;
  1040. }
  1041. template <class Field>
  1042. template <class Vector1, class Vector2>
  1043. Vector1 &VectorDomain<Field>::addinSpecialized (Vector1 &y, const Vector2 &x,
  1044. VectorCategories::SparseParallelVectorTag,
  1045. VectorCategories::SparseParallelVectorTag) const
  1046. {
  1047. Vector1 res;
  1048. add (res, y, x);
  1049. copy (y, res);
  1050. return y;
  1051. }
  1052. template <class Field>
  1053. template <class Vector1, class Vector2, class Vector3>
  1054. Vector1 &VectorDomain<Field>::subSpecialized (Vector1 &res, const Vector2 &y, const Vector3 &x,
  1055. VectorCategories::DenseVectorTag,
  1056. VectorCategories::DenseVectorTag,
  1057. VectorCategories::DenseVectorTag) const
  1058. {
  1059. typename Vector2::const_iterator i;
  1060. typename Vector3::const_iterator j;
  1061. typename Vector1::iterator k;
  1062. linbox_check (y.size () == x.size ());
  1063. linbox_check (res.size () == x.size ());
  1064. for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); i++, j++, k++)
  1065. VectorDomainBase<Field>::_field.sub (*k, *i, *j);
  1066. return res;
  1067. }
  1068. template <class Field>
  1069. template <class Vector1, class Vector2, class Vector3>
  1070. Vector1 &VectorDomain<Field>::subSpecialized (Vector1 &res, const Vector2 &y, const Vector3 &x,
  1071. VectorCategories::SparseSequenceVectorTag,
  1072. VectorCategories::SparseSequenceVectorTag,
  1073. VectorCategories::SparseSequenceVectorTag) const
  1074. {
  1075. typename Vector2::const_iterator i;
  1076. typename Vector3::const_iterator j;
  1077. Element tmp;
  1078. res.clear ();
  1079. for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
  1080. while (i != y.end () && i->first < j->first) {
  1081. res.push_back (*i);
  1082. i++;
  1083. }
  1084. if (i != y.end () && i->first == j->first) {
  1085. VectorDomainBase<Field>::_field.sub (tmp, i->second, j->second);
  1086. if (!VectorDomainBase<Field>::_field.isZero (tmp))
  1087. res.push_back (std::pair <size_t, Element> (j->first, tmp));
  1088. i++;
  1089. }
  1090. else {
  1091. res.push_back (std::pair <size_t, Element> (j->first, VectorDomainBase<Field>::_field.neg (tmp, j->second)));
  1092. }
  1093. }
  1094. while (i != y.end ()) {
  1095. res.push_back (*i);
  1096. i++;
  1097. }
  1098. return res;
  1099. }
  1100. template <class Field>
  1101. template <class Vector1, class Vector2, class Vector3>
  1102. Vector1 &VectorDomain<Field>::subSpecialized (Vector1 &res, const Vector2 &y, const Vector3 &x,
  1103. VectorCategories::SparseAssociativeVectorTag,
  1104. VectorCategories::SparseAssociativeVectorTag,
  1105. VectorCategories::SparseAssociativeVectorTag) const
  1106. {
  1107. typename Vector2::const_iterator i;
  1108. typename Vector3::const_iterator j;
  1109. Element tmp;
  1110. res.clear ();
  1111. for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
  1112. while (i != y.end () && i->first < j->first) {
  1113. res[i->first] = i->second;
  1114. i++;
  1115. }
  1116. if (i != y.end () && i->first == j->first) {
  1117. res[j->first] = VectorDomainBase<Field>::_field.sub (tmp, i->second, j->second);
  1118. i++;
  1119. }
  1120. else {
  1121. res[j->first] = VectorDomainBase<Field>::_field.neg (tmp, j->second);
  1122. }
  1123. }
  1124. while (i != y.end ()) {
  1125. res[i->first] = i->second;
  1126. i++;
  1127. }
  1128. return res;
  1129. }
  1130. template <class Field>
  1131. template <class Vector1, class Vector2, class Vector3>
  1132. Vector1 &VectorDomain<Field>::subSpecialized (Vector1 &res, const Vector2 &y, const Vector3 &x,
  1133. VectorCategories::SparseParallelVectorTag,
  1134. VectorCategories::SparseParallelVectorTag,
  1135. VectorCategories::SparseParallelVectorTag) const
  1136. {
  1137. typename Vector2::first_type::const_iterator i_idx = y.first.begin ();
  1138. typename Vector3::first_type::const_iterator j_idx = x.first.begin ();
  1139. typename Vector2::second_type::const_iterator i_elt = y.second.begin ();
  1140. typename Vector3::second_type::const_iterator j_elt = x.second.begin ();
  1141. Element tmp;
  1142. res.first.clear ();
  1143. res.second.clear ();
  1144. for (; j_idx != x.first.end (); ++j_idx, ++j_elt) {
  1145. while (i_idx != y.first.end () && *i_idx < *j_idx) {
  1146. res.first.push_back (*i_idx);
  1147. res.second.push_back (*i_elt);
  1148. ++i_idx; ++i_elt;
  1149. }
  1150. if (i_idx != y.first.end () && *i_idx == *j_idx) {
  1151. VectorDomainBase<Field>::_field.sub (tmp, *i_elt, *j_elt);
  1152. if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
  1153. res.first.push_back (*j_idx);
  1154. res.second.push_back (tmp);
  1155. }
  1156. ++i_idx; ++i_elt;
  1157. }
  1158. else {
  1159. res.first.push_back (*j_idx);
  1160. res.second.push_back (VectorDomainBase<Field>::_field.neg (tmp, *j_elt));
  1161. }
  1162. }
  1163. while (i_idx != y.first.end ()) {
  1164. res.first.push_back (*i_idx);
  1165. res.second.push_back (*i_elt);
  1166. ++i_idx; ++i_elt;
  1167. }
  1168. return res;
  1169. }
  1170. template <class Field>
  1171. template <class Vector1, class Vector2>
  1172. Vector1 &VectorDomain<Field>::subinSpecialized (Vector1 &y, const Vector2 &x,
  1173. VectorCategories::DenseVectorTag,
  1174. VectorCategories::DenseVectorTag) const
  1175. {
  1176. typename Vector1::iterator i;
  1177. typename Vector2::const_iterator j;
  1178. linbox_check (y.size () == x.size ());
  1179. for (i = y.begin (), j = x.begin (); i != y.end (); i++, j++)
  1180. VectorDomainBase<Field>::_field.subin (*i, *j);
  1181. return y;
  1182. }
  1183. template <class Field>
  1184. template <class Vector1, class Vector2>
  1185. Vector1 &VectorDomain<Field>::subinSpecialized (Vector1 &y, const Vector2 &x,
  1186. VectorCategories::SparseSequenceVectorTag,
  1187. VectorCategories::SparseSequenceVectorTag) const
  1188. {
  1189. Vector1 res;
  1190. sub (res, y, x);
  1191. copy (y, res);
  1192. return y;
  1193. }
  1194. template <class Field>
  1195. template <class Vector1, class Vector2>
  1196. Vector1 &VectorDomain<Field>::subinSpecialized (Vector1 &y, const Vector2 &x,
  1197. VectorCategories::SparseAssociativeVectorTag,
  1198. VectorCategories::SparseAssociativeVectorTag) const
  1199. {
  1200. typename Vector1::iterator i;
  1201. typename Vector2::const_iterator j;
  1202. Element tmp;
  1203. for (i = y.begin (), j = x.begin (); j != x.end (); j++) {
  1204. while (i != y.end () && i->first < j->first) i++;
  1205. if (i != y.end () && i->first == j->first)
  1206. VectorDomainBase<Field>::_field.subin (i->second, j->second);
  1207. else
  1208. y[j->first] = VectorDomainBase<Field>::_field.neg (tmp, j->second);
  1209. }
  1210. return y;
  1211. }
  1212. template <class Field>
  1213. template <class Vector1, class Vector2>
  1214. Vector1 &VectorDomain<Field>::subinSpecialized (Vector1 &y, const Vector2 &x,
  1215. VectorCategories::SparseParallelVectorTag,
  1216. VectorCategories::SparseParallelVectorTag) const
  1217. {
  1218. Vector1 res;
  1219. sub (res, y, x);
  1220. copy (y, res);
  1221. return y;
  1222. }
  1223. template <class Field>
  1224. template <class Vector1, class Vector2>
  1225. Vector1 &VectorDomain<Field>::negSpecialized (Vector1 &res, const Vector2 &x,
  1226. VectorCategories::DenseVectorTag,
  1227. VectorCategories::DenseVectorTag) const
  1228. {
  1229. typename Vector2::const_iterator j;
  1230. typename Vector1::iterator k;
  1231. linbox_check (res.size () == x.size ());
  1232. for (j = x.begin (), k = res.begin (); j != x.end (); ++j, ++k)
  1233. VectorDomainBase<Field>::_field.neg (*k, *j);
  1234. return res;
  1235. }
  1236. template <class Field>
  1237. template <class Vector1, class Vector2>
  1238. Vector1 &VectorDomain<Field>::negSpecialized (Vector1 &res, const Vector2 &x,
  1239. VectorCategories::SparseSequenceVectorTag,
  1240. VectorCategories::SparseSequenceVectorTag) const
  1241. {
  1242. typename Vector2::const_iterator j;
  1243. Element tmp;
  1244. res.clear ();
  1245. for (j = x.begin (); j != x.end (); ++j)
  1246. res.push_back (std::pair <size_t, Element> (j->first, VectorDomainBase<Field>::_field.neg (tmp, j->second)));
  1247. return res;
  1248. }
  1249. template <class Field>
  1250. template <class Vector1, class Vector2>
  1251. Vector1 &VectorDomain<Field>::negSpecialized (Vector1 &res, const Vector2 &x,
  1252. VectorCategories::SparseAssociativeVectorTag,
  1253. VectorCategories::SparseAssociativeVectorTag) const
  1254. {
  1255. typename Vector2::const_iterator j;
  1256. Element tmp;
  1257. res.clear ();
  1258. for (j = x.begin (); j != x.end (); ++j)
  1259. res[j->first] = VectorDomainBase<Field>::_field.neg (tmp, j->second);
  1260. return res;
  1261. }
  1262. template <class Field>
  1263. template <class Vector1, class Vector2>
  1264. Vector1 &VectorDomain<Field>::negSpecialized (Vector1 &res, const Vector2 &x,
  1265. VectorCategories::SparseParallelVectorTag,
  1266. VectorCategories::SparseParallelVectorTag) const
  1267. {
  1268. typename Vector2::second_type::const_iterator j;
  1269. Element tmp;
  1270. res.first.resize (x.first.size ());
  1271. res.second.clear ();
  1272. std::copy (x.first.begin (), x.first.end (), res.first.begin ());
  1273. for (j = x.second.begin (); j != x.second.end (); ++j)
  1274. res.second.push_back (VectorDomainBase<Field>::_field.neg (tmp, *j));
  1275. return res;
  1276. }
  1277. template <class Field>
  1278. template <class Vector>
  1279. Vector &VectorDomain<Field>::neginSpecialized (Vector &y,
  1280. VectorCategories::DenseVectorTag) const
  1281. {
  1282. typename Vector::iterator i;
  1283. for (i = y.begin (); i != y.end (); ++i)
  1284. VectorDomainBase<Field>::_field.negin (*i);
  1285. return y;
  1286. }
  1287. template <class Field>
  1288. template <class Vector>
  1289. Vector &VectorDomain<Field>::neginSpecialized (Vector &y,
  1290. VectorCategories::SparseSequenceVectorTag) const
  1291. {
  1292. typename Vector::iterator i;
  1293. for (i = y.begin (); i != y.end (); ++i)
  1294. VectorDomainBase<Field>::_field.negin (i->second);
  1295. return y;
  1296. }
  1297. template <class Field>
  1298. template <class Vector>
  1299. Vector &VectorDomain<Field>::neginSpecialized (Vector &y,
  1300. VectorCategories::SparseAssociativeVectorTag) const
  1301. {
  1302. typename Vector::iterator i;
  1303. for (i = y.begin (); i != y.end (); ++i)
  1304. VectorDomainBase<Field>::_field.negin (i->second);
  1305. return y;
  1306. }
  1307. template <class Field>
  1308. template <class Vector>
  1309. Vector &VectorDomain<Field>::neginSpecialized (Vector &y,
  1310. VectorCategories::SparseParallelVectorTag) const
  1311. {
  1312. typename Vector::second_type::iterator i;
  1313. for (i = y.second.begin (); i != y.second.end (); ++i)
  1314. VectorDomainBase<Field>::_field.negin (*i);
  1315. return y;
  1316. }
  1317. template <class Field>
  1318. template <class Vector1, class Vector2>
  1319. Vector1 &VectorDomain<Field>::mulSpecialized
  1320. (Vector1 &res,
  1321. const Vector2 &x,
  1322. const typename Field::Element &a,
  1323. VectorCategories::DenseVectorTag ) const
  1324. {
  1325. typename Vector2::const_iterator i;
  1326. typename Vector1::iterator j;
  1327. linbox_check (res.size () == x.size ());
  1328. for (i = x.begin (), j = res.begin (); i != x.end (); ++i, ++j)
  1329. VectorDomainBase<Field>::_field.mul (*j, *i, a);
  1330. return res;
  1331. }
  1332. template <class Field>
  1333. template <class Vector1, class Vector2>
  1334. Vector1 &VectorDomain<Field>::mulSpecialized
  1335. (Vector1 &res,
  1336. const Vector2 &x,
  1337. const typename Field::Element &a,
  1338. VectorCategories::SparseSequenceVectorTag ) const
  1339. {
  1340. typename Vector2::const_iterator i;
  1341. Element tmp;
  1342. res.clear ();
  1343. if (VectorDomainBase<Field>::_field.isZero (a))
  1344. return res;
  1345. for (i = x.begin (); i != x.end (); i++)
  1346. res.push_back (std::pair <size_t, Element> (i->first, VectorDomainBase<Field>::_field.mul (tmp, i->second, a)));
  1347. return res;
  1348. }
  1349. template <class Field>
  1350. template <class Vector1, class Vector2>
  1351. Vector1 &VectorDomain<Field>::mulSpecialized
  1352. (Vector1 &res,
  1353. const Vector2 &x,
  1354. const typename Field::Element &a,
  1355. VectorCategories::SparseAssociativeVectorTag ) const
  1356. {
  1357. typename Vector2::const_iterator i;
  1358. Element tmp;
  1359. res.clear ();
  1360. if (VectorDomainBase<Field>::_field.isZero (a))
  1361. return res;
  1362. for (i = x.begin (); i != x.end (); i++)
  1363. res[i->first] = VectorDomainBase<Field>::_field.mul (tmp, i->second, a);
  1364. return res;
  1365. }
  1366. template <class Field>
  1367. template <class Vector1, class Vector2>
  1368. Vector1 &VectorDomain<Field>::mulSpecialized
  1369. (Vector1 &res,
  1370. const Vector2 &x,
  1371. const typename Field::Element &a,
  1372. VectorCategories::SparseParallelVectorTag ) const
  1373. {
  1374. typename Vector2::first_type::const_iterator i_idx;
  1375. typename Vector2::second_type::const_iterator i_elt;
  1376. Element tmp;
  1377. res.first.clear ();
  1378. res.second.clear ();
  1379. if (VectorDomainBase<Field>::_field.isZero (a))
  1380. return res;
  1381. for (i_idx = x.first.begin (); i_idx != x.first.end (); ++i_idx)
  1382. res.first.push_back (*i_idx);
  1383. for (i_elt = x.second.begin (); i_elt != x.second.end (); ++i_elt)
  1384. res.second.push_back (VectorDomainBase<Field>::_field.mul (tmp, *i_elt, a));
  1385. return res;
  1386. }
  1387. template <class Field>
  1388. template <class Vector>
  1389. Vector &VectorDomain<Field>::mulinSpecialized
  1390. (Vector &x,
  1391. const typename Field::Element &a,
  1392. VectorCategories::DenseVectorTag ) const
  1393. {
  1394. typename Vector::iterator i;
  1395. for (i = x.begin (); i != x.end (); i++)
  1396. VectorDomainBase<Field>::_field.mulin (*i, a);
  1397. return x;
  1398. }
  1399. template <class Field>
  1400. template <class Vector>
  1401. Vector &VectorDomain<Field>::mulinSpecialized
  1402. (Vector &x,
  1403. const typename Field::Element &a,
  1404. VectorCategories::SparseSequenceVectorTag ) const
  1405. {
  1406. typename Vector::iterator i;
  1407. if (VectorDomainBase<Field>::_field.isZero (a)) {
  1408. x.clear ();
  1409. return x;
  1410. }
  1411. for (i = x.begin (); i != x.end (); i++)
  1412. VectorDomainBase<Field>::_field.mulin (i->second, a);
  1413. return x;
  1414. }
  1415. template <class Field>
  1416. template <class Vector>
  1417. Vector &VectorDomain<Field>::mulinSpecialized
  1418. (Vector &x,
  1419. const typename Field::Element &a,
  1420. VectorCategories::SparseAssociativeVectorTag ) const
  1421. {
  1422. typename Vector::iterator i;
  1423. if (VectorDomainBase<Field>::_field.isZero (a)) {
  1424. x.clear ();
  1425. return x;
  1426. }
  1427. for (i = x.begin (); i != x.end (); i++)
  1428. VectorDomainBase<Field>::_field.mulin (i->second, a);
  1429. return x;
  1430. }
  1431. template <class Field>
  1432. template <class Vector>
  1433. Vector &VectorDomain<Field>::mulinSpecialized
  1434. (Vector &x,
  1435. const typename Field::Element &a,
  1436. VectorCategories::SparseParallelVectorTag ) const
  1437. {
  1438. typename Vector::second_type::iterator i;
  1439. if (VectorDomainBase<Field>::_field.isZero (a)) {
  1440. x.first.clear ();
  1441. x.second.clear ();
  1442. return x;
  1443. }
  1444. for (i = x.second.begin (); i != x.second.end (); i++)
  1445. VectorDomainBase<Field>::_field.mulin (*i, a);
  1446. return x;
  1447. }
  1448. template <class Field>
  1449. template <class Vector1, class Vector2, class Vector3>
  1450. Vector1 &VectorDomain<Field>::axpySpecialized
  1451. (Vector1 &res,
  1452. const Vector2 &y,
  1453. const typename Field::Element &a,
  1454. const Vector3 &x,
  1455. VectorCategories::DenseVectorTag ) const
  1456. {
  1457. typename Vector2::const_iterator i;
  1458. typename Vector3::const_iterator j;
  1459. typename Vector1::iterator k;
  1460. linbox_check (y.size () == x.size ());
  1461. linbox_check (res.size () == x.size ());
  1462. for (i = y.begin (), j = x.begin (), k = res.begin (); i != y.end (); i++, j++, k++)
  1463. VectorDomainBase<Field>::_field.axpy (*k, a, *j, *i);
  1464. return res;
  1465. }
  1466. template <class Field>
  1467. template <class Vector1, class Vector2, class Vector3>
  1468. Vector1 &VectorDomain<Field>::axpySpecialized
  1469. (Vector1 &res,
  1470. const Vector2 &y,
  1471. const typename Field::Element &a,
  1472. const Vector3 &x,
  1473. VectorCategories::SparseSequenceVectorTag ) const
  1474. {
  1475. typename Vector2::const_iterator i;
  1476. typename Vector3::const_iterator j;
  1477. Element tmp;
  1478. res.clear ();
  1479. for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
  1480. while (i != y.end () && i->first < j->first) {
  1481. res.push_back (*i);
  1482. i++;
  1483. }
  1484. if (i != y.end () && i->first == j->first) {
  1485. VectorDomainBase<Field>::_field.axpy (tmp, a, j->second, i->second);
  1486. i++;
  1487. }
  1488. else
  1489. VectorDomainBase<Field>::_field.mul (tmp, a, j->second);
  1490. if (!VectorDomainBase<Field>::_field.isZero (tmp))
  1491. res.push_back (std::pair <size_t, Element> (j->first, tmp));
  1492. }
  1493. while (i != y.end ()) {
  1494. res.push_back (*i);
  1495. i++;
  1496. }
  1497. return res;
  1498. }
  1499. template <class Field>
  1500. template <class Vector1, class Vector2, class Vector3>
  1501. Vector1 &VectorDomain<Field>::axpySpecialized
  1502. (Vector1 &res,
  1503. const Vector2 &y,
  1504. const typename Field::Element &a,
  1505. const Vector3 &x,
  1506. VectorCategories::SparseAssociativeVectorTag ) const
  1507. {
  1508. typename Vector2::const_iterator i;
  1509. typename Vector3::const_iterator j;
  1510. res.clear ();
  1511. for (j = x.begin (), i = y.begin (); j != x.end (); j++) {
  1512. while (i != y.end () && i->first < j->first) {
  1513. res[i->first] = i->second;
  1514. i++;
  1515. }
  1516. if (i != y.end () && i->first == j->first) {
  1517. VectorDomainBase<Field>::_field.axpy (res[j->first], a, j->second, i->second);
  1518. i++;
  1519. }
  1520. else
  1521. VectorDomainBase<Field>::_field.mul (res[j->first], a, j->second);
  1522. }
  1523. while (i != y.end ()) {
  1524. res[i->first] = i->second;
  1525. i++;
  1526. }
  1527. return res;
  1528. }
  1529. template <class Field>
  1530. template <class Vector1, class Vector2, class Vector3>
  1531. Vector1 &VectorDomain<Field>::axpySpecialized
  1532. (Vector1 &res,
  1533. const Vector2 &y,
  1534. const typename Field::Element &a,
  1535. const Vector3 &x,
  1536. VectorCategories::SparseParallelVectorTag ) const
  1537. {
  1538. typename Vector2::first_type::const_iterator i_idx = y.first.begin ();
  1539. typename Vector3::first_type::const_iterator j_idx = x.first.begin ();
  1540. typename Vector2::second_type::const_iterator i_elt = y.second.begin ();
  1541. typename Vector3::second_type::const_iterator j_elt = x.second.begin ();
  1542. Element tmp;
  1543. res.first.clear ();
  1544. res.second.clear ();
  1545. for (; j_idx != x.first.end (); ++j_idx, ++j_elt) {
  1546. while (i_idx != y.first.end () && *i_idx < *j_idx) {
  1547. res.first.push_back (*i_idx);
  1548. res.second.push_back (*i_elt);
  1549. ++i_idx; ++i_elt;
  1550. }
  1551. if (i_idx != y.first.end () && *i_idx == *j_idx) {
  1552. VectorDomainBase<Field>::_field.axpy (tmp, a, *j_elt, *i_elt);
  1553. if (!VectorDomainBase<Field>::_field.isZero (tmp)) {
  1554. res.first.push_back (*j_idx);
  1555. res.second.push_back (tmp);
  1556. }
  1557. ++i_idx; ++i_elt;
  1558. }
  1559. else {
  1560. res.first.push_back (*j_idx);
  1561. res.second.push_back (VectorDomainBase<Field>::_field.mul (tmp, *j_elt, a));
  1562. }
  1563. }
  1564. while (i_idx != y.first.end ()) {
  1565. res.first.push_back (*i_idx);
  1566. res.second.push_back (*i_elt);
  1567. ++i_idx; ++i_elt;
  1568. }
  1569. return res;
  1570. }
  1571. template <class Field>
  1572. template <class Vector1, class Vector2>
  1573. Vector1 &VectorDomain<Field>::axpyinSpecialized
  1574. (Vector1 &y,
  1575. const typename Field::Element &a,
  1576. const Vector2 &x,
  1577. VectorCategories::DenseVectorTag,
  1578. VectorCategories::DenseVectorTag) const
  1579. {
  1580. typename Vector1::iterator i;
  1581. typename Vector2::const_iterator j;
  1582. linbox_check (y.size () == x.size ());
  1583. for (i = y.begin (), j = x.begin (); i != y.end (); ++i, ++j)
  1584. VectorDomainBase<Field>::_field.axpyin (*i, a, *j);
  1585. return y;
  1586. }
  1587. template <class Field>
  1588. template <class Vector1, class Vector2>
  1589. Vector1 &VectorDomain<Field>::axpyinSpecialized
  1590. (Vector1 &y,
  1591. const typename Field::Element &a,
  1592. const Vector2 &x,
  1593. VectorCategories::DenseVectorTag,
  1594. VectorCategories::SparseSequenceVectorTag) const
  1595. {
  1596. typename Vector2::const_iterator j;
  1597. for (j = x.begin (); j != x.end (); ++j)
  1598. VectorDomainBase<Field>::_field.axpyin (y[j->first], a, j->second);
  1599. return y;
  1600. }
  1601. template <class Field>
  1602. template <class Vector1, class Vector2>
  1603. Vector1 &VectorDomain<Field>::axpyinSpecialized
  1604. (Vector1 &y,
  1605. const typename Field::Element &a,
  1606. const Vector2 &x,
  1607. VectorCategories::DenseVectorTag,
  1608. VectorCategories::SparseAssociativeVectorTag) const
  1609. {
  1610. typename Vector2::const_iterator j;
  1611. for (j = x.begin (); j != x.end (); ++j)
  1612. VectorDomainBase<Field>::_field.axpyin (y[j->first], a, j->second);
  1613. return y;
  1614. }
  1615. template <class Field>
  1616. template <class Vector1, class Vector2>
  1617. Vector1 &VectorDomain<Field>::axpyinSpecialized
  1618. (Vector1 &y,
  1619. const typename Field::Element &a,
  1620. const Vector2 &x,
  1621. VectorCategories::DenseVectorTag,
  1622. VectorCategories::SparseParallelVectorTag) const
  1623. {
  1624. typename Vector2::first_type::const_iterator j_idx = x.first.begin ();
  1625. typename Vector2::second_type::const_iterator j_elt = x.second.begin ();
  1626. for (; j_idx != x.first.end (); ++j_idx, ++j_elt)
  1627. VectorDomainBase<Field>::_field.axpyin (y[*j_idx], a, *j_elt);
  1628. return y;
  1629. }
  1630. template <class Field>
  1631. template <class Vector1, class Vector2>
  1632. Vector1 &VectorDomain<Field>::axpyinSpecialized
  1633. (Vector1 &y,
  1634. const typename Field::Element &a,
  1635. const Vector2 &x,
  1636. VectorCategories::SparseSequenceVectorTag,
  1637. VectorCategories::SparseSequenceVectorTag) const
  1638. {
  1639. Vector1 res;
  1640. axpy (res, a, x, y);
  1641. copy (y, res);
  1642. return y;
  1643. }
  1644. template <class Field>
  1645. template <class Vector1, class Vector2>
  1646. Vector1 &VectorDomain<Field>::axpyinSpecialized
  1647. (Vector1 &y,
  1648. const typename Field::Element &a,
  1649. const Vector2 &x,
  1650. VectorCategories::SparseAssociativeVectorTag,
  1651. VectorCategories::SparseAssociativeVectorTag) const
  1652. {
  1653. typename Vector1::iterator i;
  1654. typename Vector2::const_iterator j;
  1655. Element tmp;
  1656. if (VectorDomainBase<Field>::_field.isZero (a)) {
  1657. y.clear ();
  1658. return y;
  1659. }
  1660. for (i = y.begin (), j = x.begin (); j != x.end (); j++) {
  1661. while (i != y.end () && i->first != j->first) i++;
  1662. if (i != y.end () && i->first == j->first)
  1663. VectorDomainBase<Field>::_field.axpyin (i->second, a, j->second);
  1664. else if (!VectorDomainBase<Field>::_field.isZero (j->second))
  1665. y[j->first] = VectorDomainBase<Field>::_field.mul (tmp, a, j->second);
  1666. }
  1667. return y;
  1668. }
  1669. template <class Field>
  1670. template <class Vector1, class Vector2>
  1671. Vector1 &VectorDomain<Field>::axpyinSpecialized
  1672. (Vector1 &y,
  1673. const typename Field::Element &a,
  1674. const Vector2 &x,
  1675. VectorCategories::SparseParallelVectorTag,
  1676. VectorCategories::SparseParallelVectorTag) const
  1677. {
  1678. Vector1 res;
  1679. axpy (res, a, x, y);
  1680. copy (y, res);
  1681. return y;
  1682. }
  1683. template <class Field>
  1684. template <class Vector1, class Vector2>
  1685. inline typename Field::Element &DotProductDomain<Field>::dotSpecializedDD
  1686. (Element &res,
  1687. const Vector1 &v1,
  1688. const Vector2 &v2) const
  1689. {
  1690. typename Vector1::const_iterator i;
  1691. typename Vector2::const_iterator j;
  1692. VectorDomainBase<Field>::accu.reset();
  1693. linbox_check (v1.size () == v2.size ());
  1694. for (i = v1.begin (), j = v2.begin (); i != v1.end (); i++, j++)
  1695. VectorDomainBase<Field>::accu.mulacc (*i, *j);
  1696. return VectorDomainBase<Field>::accu.get (res);
  1697. }
  1698. template <class Field>
  1699. template <class Vector1, class Vector2>
  1700. inline typename Field::Element &VectorDomain<Field>::dotSpecialized
  1701. (Element &res,
  1702. const Vector1 &v1,
  1703. const Vector2 &v2,
  1704. VectorCategories::SparseSequenceVectorTag ,
  1705. VectorCategories::DenseVectorTag ) const
  1706. {
  1707. typename Vector1::const_iterator i;
  1708. VectorDomainBase<Field>::accu.reset();
  1709. for (i = v1.begin (); i != v1.end (); i++)
  1710. VectorDomainBase<Field>::accu.mulacc (i->second, v2[i->first]);
  1711. return VectorDomainBase<Field>::accu.get (res);
  1712. }
  1713. template <class Field>
  1714. template <class Vector1, class Vector2>
  1715. inline typename Field::Element &VectorDomain<Field>::dotSpecialized
  1716. (Element &res,
  1717. const Vector1 &v1,
  1718. const Vector2 &v2,
  1719. VectorCategories::SparseAssociativeVectorTag ,
  1720. VectorCategories::DenseVectorTag ) const
  1721. {
  1722. typename Vector1::const_iterator i;
  1723. VectorDomainBase<Field>::accu.reset();
  1724. for (i = v1.begin (); i != v1.end (); i++)
  1725. VectorDomainBase<Field>::accu.mulacc (i->second, v2[i->first]);
  1726. return VectorDomainBase<Field>::accu.get (res);
  1727. }
  1728. template <class Field>
  1729. template <class Vector1, class Vector2>
  1730. inline typename Field::Element &DotProductDomain<Field>::dotSpecializedDSP
  1731. (Element &res,
  1732. const Vector1 &v1,
  1733. const Vector2 &v2) const
  1734. {
  1735. typename Vector1::first_type::const_iterator i_idx;
  1736. typename Vector1::second_type::const_iterator i_elt;
  1737. VectorDomainBase<Field>::accu.reset();
  1738. for (i_idx = v1.first.begin (), i_elt = v1.second.begin (); i_idx != v1.first.end (); ++i_idx, ++i_elt)
  1739. VectorDomainBase<Field>::accu.mulacc (*i_elt, v2[*i_idx]);
  1740. return VectorDomainBase<Field>::accu.get (res);
  1741. }
  1742. template <class Field>
  1743. template <class Vector1, class Vector2>
  1744. inline typename Field::Element &VectorDomain<Field>::dotSpecialized
  1745. (Element &res,
  1746. const Vector1 &v1,
  1747. const Vector2 &v2,
  1748. VectorCategories::SparseSequenceVectorTag ,
  1749. VectorCategories::SparseSequenceVectorTag ) const
  1750. {
  1751. typename Vector1::const_iterator i;
  1752. typename Vector2::const_iterator j;
  1753. VectorDomainBase<Field>::accu.reset();
  1754. for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); i++) {
  1755. while (j != v2.end () && j->first < i->first) j++;
  1756. if (j != v2.end () && j->first == i->first)
  1757. VectorDomainBase<Field>::accu.mulacc (i->second, j->second);
  1758. }
  1759. return VectorDomainBase<Field>::accu.get (res);
  1760. }
  1761. template <class Field>
  1762. template <class Vector1, class Vector2>
  1763. inline typename Field::Element &VectorDomain<Field>::dotSpecialized
  1764. (Element &res,
  1765. const Vector1 &v1,
  1766. const Vector2 &v2,
  1767. VectorCategories::SparseAssociativeVectorTag ,
  1768. VectorCategories::SparseSequenceVectorTag ) const
  1769. {
  1770. typename Vector1::const_iterator i;
  1771. typename Vector2::const_iterator j;
  1772. VectorDomainBase<Field>::accu.reset();
  1773. for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); i++) {
  1774. while (j != v2.end () && j->first < i->first) j++;
  1775. if (j != v2.end () && j->first == i->first)
  1776. VectorDomainBase<Field>::accu.mulacc (i->second, j->second);
  1777. }
  1778. return VectorDomainBase<Field>::accu.get (res);
  1779. }
  1780. template <class Field>
  1781. template <class Vector1, class Vector2>
  1782. inline typename Field::Element &VectorDomain<Field>::dotSpecialized
  1783. (Element &res,
  1784. const Vector1 &v1,
  1785. const Vector2 &v2,
  1786. VectorCategories::SparseParallelVectorTag ,
  1787. VectorCategories::SparseSequenceVectorTag ) const
  1788. {
  1789. typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
  1790. typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
  1791. typename Vector2::const_iterator j = v2.begin ();
  1792. VectorDomainBase<Field>::accu.reset();
  1793. for (; i_idx != v1.first.end () && j != v2.end (); ++i_idx, ++i_elt) {
  1794. while (j != v2.end () && j->first < *i_idx) j++;
  1795. if (j != v2.end () && j->first == *i_idx)
  1796. VectorDomainBase<Field>::accu.mulacc (*i_elt, j->second);
  1797. }
  1798. return VectorDomainBase<Field>::accu.get (res);
  1799. }
  1800. template <class Field>
  1801. template <class Vector1, class Vector2>
  1802. inline typename Field::Element &VectorDomain<Field>::dotSpecialized
  1803. (Element &res,
  1804. const Vector1 &v1,
  1805. const Vector2 &v2,
  1806. VectorCategories::SparseAssociativeVectorTag ,
  1807. VectorCategories::SparseAssociativeVectorTag ) const
  1808. {
  1809. typename Vector1::const_iterator i;
  1810. typename Vector2::const_iterator j;
  1811. VectorDomainBase<Field>::accu.reset();
  1812. for (i = v1.begin (), j = v2.begin (); i != v1.end () && j != v2.end (); i++) {
  1813. while (j != v2.end () && j->first < i->first) j++;
  1814. if (j != v2.end () && j->first == i->first)
  1815. VectorDomainBase<Field>::accu.mulacc (i->second, j->second);
  1816. }
  1817. return VectorDomainBase<Field>::accu.get (res);
  1818. }
  1819. template <class Field>
  1820. template <class Vector1, class Vector2>
  1821. inline typename Field::Element &VectorDomain<Field>::dotSpecialized
  1822. (Element &res,
  1823. const Vector1 &v1,
  1824. const Vector2 &v2,
  1825. VectorCategories::SparseParallelVectorTag ,
  1826. VectorCategories::SparseAssociativeVectorTag ) const
  1827. {
  1828. typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
  1829. typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
  1830. typename Vector2::const_iterator j = v2.begin ();
  1831. VectorDomainBase<Field>::accu.reset();
  1832. for (; i_idx != v1.first.end () && j != v2.end (); ++i_idx, ++i_elt) {
  1833. while (j != v2.end () && j->first < *i_idx) j++;
  1834. if (j != v2.end () && j->first == *i_idx)
  1835. VectorDomainBase<Field>::accu.mulacc (*i_elt, j->second);
  1836. }
  1837. return VectorDomainBase<Field>::accu.get (res);
  1838. }
  1839. template <class Field>
  1840. template <class Vector1, class Vector2>
  1841. inline typename Field::Element &VectorDomain<Field>::dotSpecialized
  1842. (Element &res,
  1843. const Vector1 &v1,
  1844. const Vector2 &v2,
  1845. VectorCategories::SparseParallelVectorTag ,
  1846. VectorCategories::SparseParallelVectorTag ) const
  1847. {
  1848. typename Vector1::first_type::const_iterator i_idx = v1.first.begin ();
  1849. typename Vector1::second_type::const_iterator i_elt = v1.second.begin ();
  1850. typename Vector2::first_type::const_iterator j_idx = v2.first.begin ();
  1851. typename Vector2::second_type::const_iterator j_elt = v2.second.begin ();
  1852. VectorDomainBase<Field>::accu.reset();
  1853. for (; i_idx != v1.first.end () && j_idx != v2.first.end (); ++i_idx, ++i_elt) {
  1854. while (j_idx != v2.first.end () && *j_idx < *i_idx) {
  1855. j_idx++; j_elt++;
  1856. }
  1857. if (j_idx != v2.first.end () && *j_idx == *i_idx)
  1858. VectorDomainBase<Field>::accu.mulacc (*i_elt, *j_elt);
  1859. }
  1860. return VectorDomainBase<Field>::accu.get (res);
  1861. }
  1862. template <class Field>
  1863. template <class Vector>
  1864. inline void VectorDomain<Field>::swapSpecialized
  1865. (Vector &v1, Vector &v2,
  1866. VectorCategories::DenseVectorTag) const
  1867. {
  1868. typename Vector::iterator j, k;
  1869. for (j = v1.begin (), k = v2.begin (); j != v1.end (); ++j, ++k)
  1870. std::swap (*j, *k);
  1871. }
  1872. template <class Field>
  1873. template <class Vector, class Iterator>
  1874. inline Vector &VectorDomain<Field>::permuteSpecialized
  1875. (Vector &v, Iterator P_start, Iterator P_end,
  1876. VectorCategories::DenseVectorTag) const
  1877. {
  1878. Iterator i;
  1879. for (i = P_start; i != P_end; ++i)
  1880. std::swap (v[i->first], v[i->second]);
  1881. return v;
  1882. }
  1883. template <class Field>
  1884. template <class _Vector, class Iterator>
  1885. inline _Vector &VectorDomain<Field>::permuteSpecialized
  1886. (_Vector &v, Iterator P_start, Iterator P_end,
  1887. VectorCategories::SparseSequenceVectorTag) const
  1888. {
  1889. unsigned int max = 0;
  1890. for (Iterator i = P_start; i != P_end; ++i)
  1891. max = std::max (max, std::max (i->first, i->second));
  1892. typename LinBox::Vector<Field>::Dense t (max + 1);
  1893. copy (t, v);
  1894. permute (t, P_start, P_end);
  1895. copy (v, t);
  1896. return v;
  1897. }
  1898. template <class Field>
  1899. template <class _Vector, class Iterator>
  1900. inline _Vector &VectorDomain<Field>::permuteSpecialized
  1901. (_Vector &v, Iterator P_start, Iterator P_end,
  1902. VectorCategories::SparseAssociativeVectorTag) const
  1903. {
  1904. unsigned int max = 0;
  1905. for (Iterator i = P_start; i != P_end; ++i)
  1906. max = std::max (max, std::max (i->first, i->second));
  1907. typename LinBox::Vector<Field>::Dense t (max + 1);
  1908. copy (t, v);
  1909. permute (t, P_start, P_end);
  1910. copy (v, t);
  1911. return v;
  1912. }
  1913. template <class Field>
  1914. template <class _Vector, class Iterator>
  1915. inline _Vector &VectorDomain<Field>::permuteSpecialized
  1916. (_Vector &v, Iterator P_start, Iterator P_end,
  1917. VectorCategories::SparseParallelVectorTag) const
  1918. {
  1919. unsigned int max = 0;
  1920. //z.w. Does it require max bigger the maximal index of v?
  1921. if (v. first. size() > 0)
  1922. max = (unsigned)(*std::max_element(v. first. begin(), v. first. end()));
  1923. for (Iterator i = P_start; i != P_end; ++i)
  1924. max = std::max (max, std::max (i->first, i->second));
  1925. typename LinBox::Vector<Field>::Dense t (max + 1);
  1926. copy (t, v);
  1927. permute (t, P_start, P_end);
  1928. copy (v, t);
  1929. return v;
  1930. }
  1931. } // namespace LinBox
  1932. #endif // __LINBOX_field_vector_domain_INL
  1933. // vim:sts=8:sw=8:ts=8:noet:sr:cino=>s,f0,{0,g0,(0,:0,t0,+0,=s
  1934. // Local Variables:
  1935. // mode: C++
  1936. // tab-width: 8
  1937. // indent-tabs-mode: nil
  1938. // c-basic-offset: 8
  1939. // End: