Commit Graph

1684 Commits

Author SHA1 Message Date
Jitse Niesen
86df74c765 RealSchur: reduce scope of temporary variables in hqr2(). 2010-04-06 15:26:09 +01:00
Jitse Niesen
dad50338b8 RealSchur: Use PlanarRotation in "found two real eigenvalues" branch. 2010-04-06 15:12:21 +01:00
Jitse Niesen
d88d1cfa62 Merge. 2010-04-02 21:33:34 +01:00
Jitse Niesen
79e1ce6093 RealSchur and EigenSolver: some straightforward renames. 2010-04-02 21:05:32 +01:00
Jitse Niesen
a16a36ecf2 Add tests for real and complex Schur; extend test for Hessenberg.
Make a minor correction to the ComplexSchur class.
2010-04-02 14:32:20 +01:00
Hauke Heibel
9d6afdeb22 ei_psqrt fix for zero input 2010-04-01 15:10:52 +02:00
Jitse Niesen
3a14a13533 Split computation of real Schur form in EigenSolver to its own class.
This is done with the minimal amount of work, so the result is very rough.
2010-04-01 12:32:56 +01:00
Jitse Niesen
8cfa672fe0 Use HessenbergDecomposition in EigenSolver. 2010-03-31 21:50:18 +01:00
Jitse Niesen
1b3f7f2fee Extend documentation and add examples for EigenSolver class. 2010-03-31 11:59:11 +01:00
Benoit Jacob
338ec0390f let the cast functor use the new ei_cast() 2010-03-30 14:51:47 -04:00
Benoit Jacob
16e416b8d7 generalize the idea of the previous commit to all kinds of casts, see this forum thread:
http://forum.kde.org/viewtopic.php?f=74&t=86914
this  is important to allow users to support custom types that don't have the needed conversion operators.
2010-03-30 14:47:45 -04:00
Benoit Jacob
9e0d8697c7 add ei_cast_to_int, we are indeed somethings (e.g. in IO.h) casting scalars to int and the only way to allow users to extend that to their own scalar types that don't have int cast operators, was to allow them specialize ei_cast_to_int_impl. 2010-03-30 14:16:54 -04:00
Benoit Jacob
8f99ae5ea4 move the computation of the number of significant digits to a templated helper struct, that can be specialized to custom types if needed. Should address this request:
http://forum.kde.org/viewtopic.php?f=74&t=86914
2010-03-30 11:38:09 -04:00
Jitse Niesen
e6300efb5c Extend documentation for HessenbergDecomposition. 2010-03-28 17:33:56 +01:00
Thomas Capricelli
0a5c2d8a54 fix misc warnings, more importantly when NDEBUG is defined, assert() is a
nop.
2010-03-27 18:58:29 +01:00
Jitse Niesen
c68098b9be Clean up ComplexSchur::compute() . 2010-03-24 14:10:33 +00:00
Jitse Niesen
37e17938e9 Extend documentation of ComplexSchur and add examples. 2010-03-23 12:49:09 +00:00
Jitse Niesen
525d6b655f Merge. 2010-03-21 21:59:00 +00:00
Jitse Niesen
8e5d2b6fc4 Rename Complex in ComplexSchur and ComplexEigenSolver to ComplexScalar
for consistency with the RealScalar type; correct ComplexEigenSolver
docs to take non-diagonalizable matrices into account; refactor
ComplexEigenSolver::compute().
2010-03-21 21:57:34 +00:00
Benoit Jacob
1803db6e84 merge 2010-03-21 11:28:31 -04:00
Benoit Jacob
92da574ec2 * allow matrix dimensions to be 0 (also at compile time) and provide a specialization
of ei_matrix_array for size 0
* adapt many xprs to have the right storage order, now that it matters
* add static assert on expressions to check that vector xprs
  have the righ storage order
* adapt ei_plain_matrix_type_(column|row)_major
* implement assignment of selfadjointview to matrix
  (was before failing to compile) and add nestedExpression() methods
* expand product_symm test
* in ei_gemv_selector, use the PlainObject type instead of a custom Matrix<...> type
* fix VectorBlock and Block mistakes
2010-03-21 11:28:03 -04:00
Gael Guennebaud
8b093dd2df oops, fix symv (innerStride instead of outerStride) 2010-03-20 20:51:44 +01:00
Jitse Niesen
d91ffffc37 Allow ComplexEigenSolver and ComplexSchur to work with real matrices.
Add a test which covers this case.
2010-03-20 17:04:40 +00:00
Hauke Heibel
fbdf16d425 Added x()/y() and z() access functions to translations. 2010-03-19 20:11:40 +01:00
Jitse Niesen
d3e271c47e Extend documentation and add examples for ComplexEigenSolver. 2010-03-19 18:23:36 +00:00
Benoit Jacob
547269da35 fix the flags and matrix options, to always have the right RowMajor bit in the vector case 2010-03-19 02:12:23 -04:00
Benoit Jacob
9dba86df0b merge 2010-03-18 20:11:38 -04:00
Benoit Jacob
089bd89512 compile with gcc 4.5 2010-03-18 20:10:24 -04:00
Jitse Niesen
0ee10f7da4 Document member functions and types of ComplexEigenSolver. 2010-03-18 13:42:17 +00:00
Jitse Niesen
04a4e22c58 API change: ei_matrix_exponential(A) --> A.exp(), etc
As discussed on mailing list; see
http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2010/02/msg00190.html
2010-03-16 17:26:55 +00:00
Gael Guennebaud
d536fef1bb fix and extend replicate optimization, and add the packet method though it is currently disabled 2010-03-15 10:39:00 +01:00
Hauke Heibel
d68b85744f Replaced strong with weak inlines in CwiseUnaryOp. 2010-03-14 13:01:10 +01:00
Hauke Heibel
6d08f71a2d Removed strong inlines which cannot always be inlined. 2010-03-14 12:09:29 +01:00
Hauke Heibel
0e5a232dae Ups - again a missing typename. 2010-03-14 11:58:44 +01:00
Hauke Heibel
fc20e6fd55 Try to avoid modulo operations in Replicate if possible. 2010-03-13 14:33:39 +01:00
Hauke Heibel
b9644f3323 Propagate fixed size dimensions if available (on MSVC it leads >2.5x speedup for some reductions). 2010-03-13 13:15:27 +01:00
Benoit Jacob
3e08c22028 attempt to fix #101 2010-03-11 12:41:46 -05:00
Hauke Heibel
2a82b162d7 Nest expression within MatrixWrapper by value. 2010-03-10 17:13:07 +01:00
Hauke Heibel
b20b393a4e Enable resizing of Arrays. 2010-03-10 17:12:45 +01:00
Hauke Heibel
dd9ff1b9a6 Fix MSVC warnings. 2010-03-09 09:04:21 +01:00
Benoit Jacob
74a7c5caee implement the idea that row-vectors have the RowMajorBit and col-vectors don't. 2010-03-09 00:16:07 -05:00
Adolfo Rodriguez Tsouroukdissian
5a36f4a8d1 Propagate all five matrix template parameters to members and temporaries of decomposition classes. One particular advantage of this is that decomposing matrices with max sizes known at compile time will not allocate.
NOTE: The ComplexEigenSolver class currently _does_ allocate (line 135 of Eigenvalues/ComplexEigenSolver.h), but the reason appears to be in the implementation of matrix-matrix products, and not in the decomposition itself.
The nomalloc unit test has been extended to verify that decompositions do not allocate when max sizes are specified. There are currently two workarounds to prevent the test from failing (see comments in test/nomalloc.cpp), both of which are related to matrix products that allocate on the stack.
2010-03-08 19:31:27 +01:00
Gael Guennebaud
898762529e update the product selection logic to use the Max* sizes 2010-03-08 22:55:58 +01:00
Gael Guennebaud
9a3b00c040 add missing cmake directives for arch/Default 2010-03-08 22:15:35 +01:00
Benoit Jacob
89343a38af * Fix #97 : Householder operations on 1x1 matrices
* Fix VectorBlock on 1x1 "vectors"
* remove useless makeTrivialHouseholder function
2010-03-08 12:37:04 -05:00
Benoit Jacob
4293a4d1af * let a = foo() work when a is a row-vector xpr and foo() returns a ReturnByValue col-vector
* remove a few useless resize() in evalTo() implementations
2010-03-08 10:34:59 -05:00
Hauke Heibel
9fe040ad29 Reintroduced the if-clause for MSVC ei_ploadu via _loadu_. 2010-03-07 14:05:26 +01:00
Gael Guennebaud
3130b7a722 bugcount--, this time trmm 2010-03-06 22:57:50 +01:00
Gael Guennebaud
1958b7eccc stride() => inner/outerStride() 2010-03-06 22:39:15 +01:00
Gael Guennebaud
4402034678 pff I introduced much too many bugs latey, count-- 2010-03-06 22:24:50 +01:00
Gael Guennebaud
61ce1de048 fix symm 2010-03-06 22:15:59 +01:00
Gael Guennebaud
a7d199bf9a fix trsolve 2010-03-06 21:37:14 +01:00
Gael Guennebaud
6f0b96dcf4 fix issue #100 (fix syrk) 2010-03-06 21:16:43 +01:00
Gael Guennebaud
271fc84e47 bugfix in gebp for 32bits x86 2010-03-06 20:52:20 +01:00
Benoit Jacob
c4f8afdf49 #undef minor at the right place 2010-03-06 14:44:57 -05:00
Benoit Jacob
7e2afe7e95 remove the __ARM_NEON__ check there since Konstantinos said he removed it but apparently didn't commit :) 2010-03-06 12:11:08 -05:00
Benoit Jacob
bf0a21a695 * disable static alignment on QCC
* remove obsolete #error
2010-03-06 09:28:58 -05:00
Benoit Jacob
2bd31d3fbc * include Macros.h much earlier: since it takes care of the alignment platform detection, it is needed before we do the vectorization stuff in Eigen/Core !!
* kill EIGEN_DONT_ALIGN_HEAP option (one should use EIGEN_DONT_ALIGN)
* rename EIGEN_DONT_ALIGN_STACK to EIGEN_DONT_ALIGN_STATICALLY. hope it's a better name.
2010-03-06 09:05:15 -05:00
Benoit Jacob
f03d95348d introduce EIGEN_DONT_ALIGN_STACK (disables alignment attributes) and EIGEN_DONT_ALIGN_HEAP (disables aligned malloc)...
you can still use EIGEN_DONT_ALIGN to do both at once.
2010-03-06 02:17:37 -05:00
Gael Guennebaud
afd7ee759b fix copy pasted comment 2010-03-05 21:35:11 +01:00
Konstantinos Margaritis
273b236f72 Altivec brought up to date. Most tests pass and performance is better than before too! 2010-03-05 22:28:49 +02:00
Gael Guennebaud
f2a246c225 add a small program to bench all combinations of small products 2010-03-05 17:16:19 +01:00
Gael Guennebaud
5f172cd01f add a FIXME 2010-03-05 10:45:29 +01:00
Gael Guennebaud
48d0595c29 * dynamically adjust the number of threads
* disbale parallelisation if we already are in a parallel session
2010-03-05 10:44:31 +01:00
Gael Guennebaud
62ac021606 fix openmp version for scalar types different than float 2010-03-05 10:16:25 +01:00
Gael Guennebaud
d13b877014 remove the 1D and 2D parallelizer, keep only the GEMM specialized one 2010-03-05 10:04:17 +01:00
Gael Guennebaud
24ef5fedcd minor cleaning 2010-03-05 09:57:04 +01:00
Gael Guennebaud
279ad44509 merge 2010-03-05 09:46:58 +01:00
Gael Guennebaud
620bd28480 enable posix_memalign for QNX 2010-03-05 09:44:21 +01:00
Gael Guennebaud
7e2683dc39 merge 2010-03-04 18:59:56 +01:00
Gael Guennebaud
0964810fba merge 2010-03-04 18:59:03 +01:00
Gael Guennebaud
ea8cad5151 make the number of registers easier to configure per architectures 2010-03-04 18:58:12 +01:00
Gael Guennebaud
cefd9b8888 merge with default branch 2010-03-04 18:47:52 +01:00
Hauke Heibel
1723068694 Moved x()/y()/z() and w() access functions to DenseBase; they are now available for Arrays as well. 2010-03-04 18:33:51 +01:00
Gael Guennebaud
8ed1ef4469 add a minor FIXME 2010-03-04 18:30:28 +01:00
Benoit Jacob
68d94d914e integer division is vectorizable on no SIMD platform, not just SSE. 2010-03-04 09:03:06 -05:00
Konstantinos Margaritis
710bc073a7 arm_neon.h is a standard header file, fixed 2010-03-03 12:15:34 -06:00
Benoit Jacob
6c89fd4df0 minor cleanup 2010-03-03 13:16:21 -05:00
Gael Guennebaud
7dd81aad74 factorize default performance related settings to a single file
included after the architecture specific files such that they
can be adapted by each platform.
2010-03-03 18:47:58 +01:00
Konstantinos Margaritis
112c550b4a Added initial NEON support, most tests pass however we had to use some hackish workarounds
as gcc on ARM (both CodeSourcery 4.4.1 used and experimental 4.5) fail to
ensure proper alignment with __attribute__((aligned(16))). This has to be
fixed upstream to remove the workarounds.
2010-03-03 11:25:41 -06:00
Benoit Jacob
45d19afb18 cleanup/simplification in computation of matrix flags 2010-03-03 09:58:43 -05:00
Benoit Jacob
7dbe806711 merge 2010-03-03 09:55:46 -05:00
Benoit Jacob
6a92168915 Backed out changeset 2f3d685e0c
This was implementing deep changes that after discussion on the mailing list seem to need further discussion/thinking.
2010-03-03 09:54:50 -05:00
Hauke Heibel
aa6570c3a3 Added a missing inline hints.
Removed a useless Nested temporary.
2010-03-03 15:24:58 +01:00
Gael Guennebaud
2f3d685e0c a matrix (or array) does not always have the LinearAccessBit!
=> fixes in outerStride and matrix flags
2010-03-02 15:31:39 +01:00
Gael Guennebaud
7fd6458fec selfadjoint: do not reference the imaginary part of the diagonal 2010-03-02 12:43:55 +01:00
Hauke Heibel
32823caa62 Adapted the comment and removed it from the public dox. 2010-03-03 07:52:19 +01:00
Gael Guennebaud
3295c1c3e6 product selector: the symmetric case 2010-03-02 23:18:13 +01:00
Hauke Heibel
afad108b5f Added a comment to prevent placing an EIGEN_STRONG_INLINE where it makes no sense. 2010-03-02 19:36:21 +01:00
Eamon Nerbonne
3efb3cc828 Changed product type selector to fix perf regression. 2010-03-02 12:08:49 +01:00
Gael Guennebaud
c7828ac45c add missing implementation of uniform scaling products 2010-03-02 17:38:40 +01:00
Hauke Heibel
3cc9e3f5bb Fixes a compilation issue for MSVC. 2010-03-01 19:56:24 +01:00
Gael Guennebaud
65eba35f98 rm useless omp shared directive 2010-03-01 13:34:44 +01:00
Gael Guennebaud
1710c07f63 remove Qt's atomic dependency, I don't know what I was doing wrong... 2010-03-01 13:09:47 +01:00
Gael Guennebaud
31aa17e4ef GEMM: move the first packing of A' before the packing of B' 2010-03-01 11:10:30 +01:00
Gael Guennebaud
aeff3ff391 make Aron's idea work using Qt's atomic implementation for the synchronisation 2010-03-01 10:57:32 +01:00
Benoit Jacob
f1f3c30ddc remove the hack to make the static assertion on types actually show up.
indeed, now that we use the meta selector for transposing as needed, the static asserts work very well.
2010-02-28 11:10:13 -05:00
Benoit Jacob
07023b94d8 forgot defined(...) 2010-02-28 10:11:28 -05:00
Benoit Jacob
9334ed4444 on 64-bit systems, glibc's malloc returns 16-byte aligned ptrs, and we now take advantage of that. 2010-02-28 10:10:53 -05:00
Benoit Jacob
a480e7e60f * fix ei_handmade_aligned_realloc (was calling realloc on wrong ptr)
* add missing std::  (at least for QNX compatibility)
* add big comments to "structure" the file
2010-02-28 09:10:41 -05:00
Hauke Heibel
ff8c2149c1 Added a generic reallocation implementation based on ei_aligned_malloc/_free.
Rewrote ei_handmade_aligned_realloc such that it is now using std::realloc.
Reorganized functions in Memory.h for better readability.
Add missing <cerrno> include to Core (it's now required in Memory.h).
2010-02-28 14:32:57 +01:00
Hauke Heibel
40bd69fbaa Hide some internal stuff from the docs. 2010-02-28 12:56:37 +01:00
Benoit Jacob
1d9c18a8f3 comment out cerr's 2010-02-28 00:53:06 -05:00
Benoit Jacob
27f5250258 Only include <iosfwd> unless either EIGEN_DEBUG_ASSIGN is defined or we're in eigen2 support mode 2010-02-27 19:04:22 -05:00
Benoit Jacob
e84f7e07e9 add ei_posix_memalign_realloc 2010-02-27 18:57:07 -05:00
Benoit Jacob
22fabb8940 add missing inline keyword, thanks to Eamon. 2010-02-27 17:51:48 -05:00
Hauke Heibel
6c9eb36222 Added support for realloc based conservative resizing. 2010-02-27 17:25:07 +01:00
Hauke Heibel
78b2c7e16e Fixed a typo. 2010-02-27 17:24:42 +01:00
Benoit Jacob
3f393490ad dot: handle the rowvector.dot(colvector) case where one needs to transpose. 2010-02-27 11:19:14 -05:00
Benoit Jacob
d9f6380499 Remove the dot product's separate implementation and use cwiseProduct.sum instead.
Also take special care to get nicely working static  assertions.
2010-02-27 10:03:27 -05:00
Benoit Jacob
2c9a91812e merge 2010-02-26 21:47:54 -05:00
Benoit Jacob
814e40c72a let redux use the new ByOuterInner accessors 2010-02-26 21:46:43 -05:00
Benoit Jacob
4927841cba Document Map and Stride, add examples. 2010-02-26 21:29:04 -05:00
Benoit Jacob
b1f666d007 Fix Map-with-Stride and cover it by new unit tests. 2010-02-26 20:12:51 -05:00
Gael Guennebaud
6924bf2e99 implement Aron's idea of interleaving the packing with the first computations 2010-02-26 15:58:22 +01:00
nerbonne
c72a5074e6 Fixed perf problems for vector subtraction: inlining wasn't always happening when necessary. 2010-02-26 15:46:43 +01:00
Benoit Jacob
32115bff1e * add VERIFY_IS_EQUAL, should compile faster and it's natural when no arithmetic is involved.
* rename 'submatrices' test to 'block'
* add block-inside-of-block tests
* remove old cruft
* split diagonal() tests into separate file
2010-02-26 09:03:13 -05:00
Gael Guennebaud
8d4a0e6753 fix compilation without openmp 2010-02-26 14:57:22 +01:00
Gael Guennebaud
3ac2b96a2f implement a smarter parallelization strategy for gemm avoiding multiple
paking of the same data
2010-02-26 12:32:00 +01:00
Jitse Niesen
d86f5339b2 ComplexSchur: fix bug introduced in my previous commit.
The value of c is actually used a few lines later.
2010-02-26 09:47:17 +00:00
Benoit Jacob
f56ac04c34 DenseBase::IsRowMajor now takes the special case of vectors into account. 2010-02-25 21:24:42 -05:00
Benoit Jacob
b1c6c215a4 merge 2010-02-25 21:07:30 -05:00
Benoit Jacob
769641bc58 * Implement the ByOuterInner accessors
* use them (big simplification in Assign.h)
* axe (Inner|Outer)StrideAtCompileTime that were just introduced
* ei_int_if_dynamic now asserts that the size is the expected one: adapt to that in Block.h
* add rowStride() / colStride() in DenseBase
* implement innerStride() / outerStride() everywhere needed
2010-02-25 21:01:52 -05:00
Jitse Niesen
90e4a605ef ComplexSchur: compute shift more stably, introduce exceptional shifts.
Both the new computation of  the eigenvalues of a 2x2 block and the
exceptional shifts are taken from EISPACK routine COMQR.
2010-02-25 22:33:38 +00:00
Gael Guennebaud
53bae6b3f8 update matrix product selection rules for 1xSmallxLarge and the transposed case 2010-02-25 21:59:25 +01:00
Gael Guennebaud
959a1b5d63 detect and implement inplace permutations 2010-02-25 16:30:58 +01:00
Gael Guennebaud
d9ca0c0d36 optimize inverse permutations 2010-02-25 15:31:15 +01:00
Benoit Jacob
77c922bf05 * move the 's': InstructionsSet ---> InstructionSets
* proper capitalization: SSE, AltiVec
2010-02-25 06:43:45 -05:00
Thomas Capricelli
50a5ac3c4b oops, fix typo 2010-02-25 05:31:22 +01:00
Thomas Capricelli
00bc535b66 provide a static method to describe which SIMD instructions are used 2010-02-24 21:52:08 +01:00
Thomas Capricelli
0f3d69b65e Provide "eigen" defines to decide which instruction set is used
(sse3, ssse3 and sse4), independantly from the compiler.
Only those defines should be used in other places, and the user can
rely on those to know which sets are used.
2010-02-24 21:43:30 +01:00
Gael Guennebaud
7c98c04412 add reconstructedMatrix() to LLT, and LUs
=> they show that some improvements have still to be done
   for permutations, tr*tr, trapezoidal matrices
2010-02-24 19:16:10 +01:00
Gael Guennebaud
f7aa9873ca * fix LDLT's default ctor use
* add a reconstructedMatrix() function to LDLT for debug purpose
2010-02-24 10:40:16 +01:00
Benoit Jacob
60325b8330 actually, this is not even meant to be a termination criterion. so the proper fix is this. 2010-02-23 16:10:26 -05:00
Benoit Jacob
3d066f4bc7 LDLT:
* fix bug thanks to Ben Goodrich: we were terminating at the wrong place, leaving some matrix coefficients with wrong values.
* don't use Higham's formula here: we're not trying to be rank-revealing.
2010-02-23 16:05:37 -05:00
Benoit Jacob
d92df336ad Further LU test improvements. I'm not aware of any test failures anymore, not even with huge numbers of repetitions.
Finally the createRandomMatrixOfRank() function is renamed to createRandomPIMatrixOfRank, where PI stands for 'partial isometry', that is, a matrix whose singular values are 0 or 1.
2010-02-23 15:40:24 -05:00
Gael Guennebaud
a1e1103328 add a 2D parallelizer 2010-02-23 21:40:15 +01:00
Gael Guennebaud
022e2f5ef4 fix typo 2010-02-23 18:24:15 +01:00
Benoit Jacob
7dc75380c1 * FullPivLU: replace "remaining==0" termination condition (from Golub) by a fuzzy compare
(fixes lu test failures when testing solve())
* LU test: set appropriate threshold and limit the number of times that a specially tricky test
  is run. (fixes lu test failures when testing rank()).
* Tests: rename createRandomMatrixOfRank to createRandomProjectionOfRank
2010-02-23 09:04:59 -05:00
Hauke Heibel
1fd8d7b96a Attempt to fix PGI compilation issue. 2010-02-23 11:35:51 +01:00
Gael Guennebaud
d2b0eadf52 fully adapt the gebp kernel and optimize it for CPU with only 8 registers
(transplanted from 2ed88ebbf1995be90b8d0c25ff10248c8f56d023)
2010-02-22 16:35:05 +01:00
Gael Guennebaud
51a4b929a1 implement an even lower level version of the gebp kernel for MSVC (it seems to be faster with gcc as well)
(transplanted from 9a5643551fe068497f84a81cd8986febf1918382)
2010-02-22 15:18:29 +01:00
Gael Guennebaud
eb905500b6 significant speedup in the matrix-matrix products 2010-02-23 13:06:49 +01:00
Gael Guennebaud
fc4a85ecd5 fully adapt the gebp kernel and optimize it for CPU with only 8 registers 2010-02-22 16:35:05 +01:00
Gael Guennebaud
e00f1fd125 implement an even lower level version of the gebp kernel for MSVC (it seems to be faster with gcc as well) 2010-02-22 15:18:29 +01:00
Gael Guennebaud
3e62fafce8 clean a bit the parallelizer 2010-02-22 11:08:37 +01:00
Gael Guennebaud
b20935be9b add initial openmp support for matrix-matrix products
=> x1.9 speedup on my core2 duo
2010-02-22 09:40:34 +01:00
Thomas Capricelli
1a70f3b48d fix compilation 2010-02-21 19:30:11 +01:00
Hauke Heibel
a901bed33a Added IsRowMajor enum to DenseBase. 2010-02-21 18:26:14 +01:00
Hauke Heibel
f079f52b58 merge 2010-02-21 15:25:28 +01:00