change linkage behavior of contract indices... should be save now
This commit is contained in:
parent
dc436af07d
commit
2a7dd9aa83
6 changed files with 48 additions and 6 deletions
|
@ -15,7 +15,7 @@ include_directories(src)
|
||||||
|
|
||||||
add_executable(utest src/unit_test.cc)
|
add_executable(utest src/unit_test.cc)
|
||||||
target_link_libraries(utest ${GTEST_BOTH_LIBRARIES})
|
target_link_libraries(utest ${GTEST_BOTH_LIBRARIES})
|
||||||
add_test(AllTests utest)
|
add_test(NAME utest COMMAND utest)
|
||||||
|
|
||||||
#install(TARGETS testm DESTINATION install)
|
#install(TARGETS testm DESTINATION install)
|
||||||
|
|
||||||
|
|
|
@ -439,6 +439,25 @@ namespace MultiArrayTools
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, class Range>
|
||||||
|
template <class... NameTypes>
|
||||||
|
ConstMultiArrayOperationRoot<T,Range> MutableMultiArrayBase<T,Range>::operator()(const NameTypes&... str) const
|
||||||
|
{
|
||||||
|
return ConstMultiArrayOperationRoot<T,Range>(*this, Name("master", str...));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, class Range>
|
||||||
|
template <class NameType>
|
||||||
|
ConstMultiArrayOperationRoot<T,Range> MutableMultiArrayBase<T,Range>::operator()(const NameType& name, bool master) const
|
||||||
|
{
|
||||||
|
//CHECK;
|
||||||
|
if(master){
|
||||||
|
return ConstMultiArrayOperationRoot<T,Range>(*this, name);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return operator()(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*******************
|
/*******************
|
||||||
* MultiArray *
|
* MultiArray *
|
||||||
|
|
|
@ -186,6 +186,12 @@ namespace MultiArrayTools
|
||||||
template <class NameType>
|
template <class NameType>
|
||||||
MultiArrayOperationRoot<T,Range> operator()(const NameType& name, bool master);
|
MultiArrayOperationRoot<T,Range> operator()(const NameType& name, bool master);
|
||||||
|
|
||||||
|
template <class... NameTypes>
|
||||||
|
ConstMultiArrayOperationRoot<T,Range> operator()(const NameTypes&... str) const;
|
||||||
|
|
||||||
|
template <class NameType>
|
||||||
|
ConstMultiArrayOperationRoot<T,Range> operator()(const NameType& name, bool master) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, class Range>
|
template <typename T, class Range>
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace MultiArrayTools
|
||||||
{
|
{
|
||||||
return *mIibPtr;
|
return *mIibPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void MultiArrayOperationBase<T>::freeIndex() const
|
void MultiArrayOperationBase<T>::freeIndex() const
|
||||||
{
|
{
|
||||||
|
@ -306,6 +306,7 @@ namespace MultiArrayTools
|
||||||
template <typename T, class Range>
|
template <typename T, class Range>
|
||||||
void MultiArrayOperationRoot<T,Range>::linkIndicesTo(IndefinitIndexBase* target) const
|
void MultiArrayOperationRoot<T,Range>::linkIndicesTo(IndefinitIndexBase* target) const
|
||||||
{
|
{
|
||||||
|
MAOB::mIibPtr = &mIndex;
|
||||||
MAOB::mIibPtr->linkTo(target);
|
MAOB::mIibPtr->linkTo(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -553,6 +554,7 @@ namespace MultiArrayTools
|
||||||
template <typename T, class Range>
|
template <typename T, class Range>
|
||||||
void ConstMultiArrayOperationRoot<T,Range>::linkIndicesTo(IndefinitIndexBase* target) const
|
void ConstMultiArrayOperationRoot<T,Range>::linkIndicesTo(IndefinitIndexBase* target) const
|
||||||
{
|
{
|
||||||
|
MAOB::mIibPtr = &mIndex;
|
||||||
MAOB::mIibPtr->linkTo(target);
|
MAOB::mIibPtr->linkTo(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -798,7 +800,8 @@ namespace MultiArrayTools
|
||||||
{
|
{
|
||||||
mBeginIndex.setPos(0);
|
mBeginIndex.setPos(0);
|
||||||
mEndIndex.setPos(mRunIndex.max());
|
mEndIndex.setPos(mRunIndex.max());
|
||||||
linkIndicesTo(&mRunIndex);
|
// DON'T link here !!
|
||||||
|
//linkIndicesTo(&mRunIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class ContractOperation, class Range, class... MAOps>
|
template <typename T, class ContractOperation, class Range, class... MAOps>
|
||||||
|
@ -815,7 +818,8 @@ namespace MultiArrayTools
|
||||||
{
|
{
|
||||||
mBeginIndex.setPos(begin);
|
mBeginIndex.setPos(begin);
|
||||||
mEndIndex.setPos(end);
|
mEndIndex.setPos(end);
|
||||||
linkIndicesTo(&mRunIndex);
|
// DON'T link here !!
|
||||||
|
//linkIndicesTo(&mRunIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -897,10 +901,19 @@ namespace MultiArrayTools
|
||||||
{
|
{
|
||||||
return LinkedIndexGetter<sizeof...(MAOps)-1>::getLinked(mArgs, name, nullptr);
|
return LinkedIndexGetter<sizeof...(MAOps)-1>::getLinked(mArgs, name, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, class ContractOperation, class Range, class... MAOps>
|
||||||
|
void MultiArrayContraction<T,ContractOperation,Range,MAOps...>::setInternalLinks() const
|
||||||
|
{
|
||||||
|
linkIndicesTo(&mRunIndex);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T, class ContractOperation, class Range, class... MAOps>
|
template <typename T, class ContractOperation, class Range, class... MAOps>
|
||||||
void MultiArrayContraction<T,ContractOperation,Range,MAOps...>::linkIndicesTo(IndefinitIndexBase* target) const
|
void MultiArrayContraction<T,ContractOperation,Range,MAOps...>::linkIndicesTo(IndefinitIndexBase* target) const
|
||||||
{
|
{
|
||||||
|
if(target != &mRunIndex){
|
||||||
|
setInternalLinks();
|
||||||
|
}
|
||||||
TupleIndicesLinker<sizeof...(MAOps)-1>::linkTupleIndicesTo(mArgs, target);
|
TupleIndicesLinker<sizeof...(MAOps)-1>::linkTupleIndicesTo(mArgs, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,8 @@ namespace MultiArrayTools
|
||||||
|
|
||||||
virtual const T& get() const = 0;
|
virtual const T& get() const = 0;
|
||||||
|
|
||||||
|
virtual void setInternalLinks() const {}
|
||||||
|
|
||||||
virtual void freeIndex() const;
|
virtual void freeIndex() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -285,7 +287,7 @@ namespace MultiArrayTools
|
||||||
auto operator/(const MAOp2& sec) -> decltype(operator()(std::divides<T>(), sec));
|
auto operator/(const MAOp2& sec) -> decltype(operator()(std::divides<T>(), sec));
|
||||||
|
|
||||||
virtual size_t argNum() const override;
|
virtual size_t argNum() const override;
|
||||||
|
|
||||||
virtual IndefinitIndexBase* getLinked(const std::string& name) const override;
|
virtual IndefinitIndexBase* getLinked(const std::string& name) const override;
|
||||||
virtual void linkIndicesTo(IndefinitIndexBase* target) const override;
|
virtual void linkIndicesTo(IndefinitIndexBase* target) const override;
|
||||||
|
|
||||||
|
@ -344,6 +346,8 @@ namespace MultiArrayTools
|
||||||
|
|
||||||
template <class MAOp2>
|
template <class MAOp2>
|
||||||
auto operator/(const MAOp2& sec) -> decltype(operator()(std::divides<T>(), sec));
|
auto operator/(const MAOp2& sec) -> decltype(operator()(std::divides<T>(), sec));
|
||||||
|
|
||||||
|
virtual void setInternalLinks() const override;
|
||||||
|
|
||||||
virtual size_t argNum() const override;
|
virtual size_t argNum() const override;
|
||||||
|
|
||||||
|
|
|
@ -194,7 +194,7 @@ namespace MultiArrayTools
|
||||||
#ifdef LORENTZ_DIMENSION
|
#ifdef LORENTZ_DIMENSION
|
||||||
return LORENTZ_DIMENSION;
|
return LORENTZ_DIMENSION;
|
||||||
#else
|
#else
|
||||||
return 1; // 4
|
return 4; // 4
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue