Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SemiDynamicSparseNumberArray #53

Merged
merged 1 commit into from
Aug 22, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,18 @@ include_HEADERS += numerics/include/metaphysicl/sparsenumberarray.h
include_HEADERS += numerics/include/metaphysicl/sparsenumberstruct.h
include_HEADERS += numerics/include/metaphysicl/sparsenumberutils.h
include_HEADERS += numerics/include/metaphysicl/sparsenumbervector.h
include_HEADERS += numerics/include/metaphysicl/dualsemidynamicsparsenumberarray.h
include_HEADERS += numerics/include/metaphysicl/dualsemidynamicsparsenumberarray_decl.h
include_HEADERS += numerics/include/metaphysicl/semidynamicsparsenumberarray.h
include_HEADERS += numerics/include/metaphysicl/semidynamicsparsenumberarray_decl.h

# utilities
include_HEADERS += utilities/include/metaphysicl/metaphysicl_asserts.h
include_HEADERS += utilities/include/metaphysicl/metaphysicl_cast.h
include_HEADERS += utilities/include/metaphysicl/metaphysicl_exceptions.h
include_HEADERS += utilities/include/metaphysicl/metaprogramming.h
include_HEADERS += utilities/include/metaphysicl/testable.h
include_HEADERS += utilities/include/metaphysicl/dynamic_std_array_wrapper.h

# Needs to be builddir since this is generated by configure
include_HEADERS += $(top_builddir)/src/utilities/include/metaphysicl/metaphysicl_version.h
Expand Down
124 changes: 124 additions & 0 deletions src/numerics/include/metaphysicl/dualsemidynamicsparsenumberarray.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
//-----------------------------------------------------------------------bl-
//--------------------------------------------------------------------------
//
// MetaPhysicL - A metaprogramming library for physics calculations
//
// Copyright (C) 2013 The PECOS Development Team
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the Version 2.1 GNU Lesser General
// Public License as published by the Free Software Foundation.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc. 51 Franklin Street, Fifth Floor,
// Boston, MA 02110-1301 USA
//
//-----------------------------------------------------------------------el-
//
// $Id: core.h 37197 2013-02-21 05:49:09Z roystgnr $
//
//--------------------------------------------------------------------------

#ifndef METAPHYSICL_DUALSEMIDYNAMICSPARSENUMBERARRAY_H
#define METAPHYSICL_DUALSEMIDYNAMICSPARSENUMBERARRAY_H

#include "metaphysicl/dualsemidynamicsparsenumberarray_decl.h"

#include "metaphysicl/dualnumber.h"
#include "metaphysicl/semidynamicsparsenumberarray.h"

namespace MetaPhysicL
{

template <typename T, typename I, typename N>
inline typename DerivativeType<SemiDynamicSparseNumberArray<T, I, N>>::type
derivative(const SemiDynamicSparseNumberArray<T, I, N> & a, unsigned int derivativeindex)
{
std::size_t index_size = a.size();

typename DerivativeType<SemiDynamicSparseNumberArray<T, I, N>>::type returnval;
returnval.nude_indices() = a.nude_indices();
returnval.nude_data().resize(index_size);

for (unsigned int i = 0; i != index_size; ++i)
returnval.raw_at(i) = derivative(a.raw_at(i), derivativeindex);
return returnval;
}

template <typename T, typename I, typename N>
inline typename DerivativesType<SemiDynamicSparseNumberArray<T, I, N>>::type
derivatives(const SemiDynamicSparseNumberArray<T, I, N> & a)
{
std::size_t index_size = a.size();

typename DerivativesType<SemiDynamicSparseNumberArray<T, I, N>>::type returnval;

returnval.nude_indices() = a.nude_indices();
returnval.nude_data().resize(index_size);

for (unsigned int i = 0; i != index_size; ++i)
returnval.raw_at(i) = derivatives(a.raw_at(i));
return returnval;
}

template <typename T, typename I, typename N, unsigned int derivativeindex>
typename DerivativeType<SemiDynamicSparseNumberArray<T, I, N>>::type
DerivativeOf<SemiDynamicSparseNumberArray<T, I, N>, derivativeindex>::derivative(
const SemiDynamicSparseNumberArray<T, I, N> & a)
{
std::size_t index_size = a.size();

typename DerivativeType<SemiDynamicSparseNumberArray<T, I, N>>::type returnval;

returnval.nude_indices() = a.nude_indices();
returnval.nude_data().resize(index_size);

for (unsigned int i = 0; i != index_size; ++i)
returnval.raw_at(i) = DerivativeOf<T, derivativeindex>::derivative(a.raw_at(i));
return returnval;
}

// For a vector of values a[i] each of which has a defined gradient,
// the divergence is the sum of derivative_wrt_xi(a[i])

// For a tensor of values, we take the divergence with respect to the
// first index.
template <typename T, typename I, typename N>
inline typename DerivativeType<T>::type
divergence(const SemiDynamicSparseNumberArray<T, I, N> & /*a*/)
{
typename DerivativeType<T>::type returnval = 0;

// FIXME
metaphysicl_not_implemented();

return returnval;
}

// For a vector of values, the gradient is going to be a tensor
template <typename T, typename I, typename N>
inline SemiDynamicSparseNumberArray<typename T::derivatives_type, I, N>
gradient(const SemiDynamicSparseNumberArray<T, I, N> & a)
{
static const unsigned int index_size = a.size();

SemiDynamicSparseNumberArray<typename T::derivatives_type, I, N> returnval;

returnval.nude_indices() = a.nude_indices();
returnval.nude_data().resize(index_size);

for (unsigned int i = 0; i != index_size; ++i)
returnval.raw_at(i) = gradient(a.raw_at(i));

return returnval;
}

} // namespace MetaPhysicL

#endif // METAPHYSICL_DUALSEMIDYNAMICSPARSENUMBERARRAY_H
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
//-----------------------------------------------------------------------bl-
//--------------------------------------------------------------------------
//
// MetaPhysicL - A metaprogramming library for physics calculations
//
// Copyright (C) 2013 The PECOS Development Team
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the Version 2.1 GNU Lesser General
// Public License as published by the Free Software Foundation.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc. 51 Franklin Street, Fifth Floor,
// Boston, MA 02110-1301 USA
//
//-----------------------------------------------------------------------el-

#ifndef METAPHYSICL_DUALSEMIDYNAMICSPARSENUMBERARRAY_DECL_H
#define METAPHYSICL_DUALSEMIDYNAMICSPARSENUMBERARRAY_DECL_H

#include "metaphysicl/dualnumber_decl.h"
#include "metaphysicl/semidynamicsparsenumberarray_decl.h"

namespace MetaPhysicL
{

template <typename T, typename I, typename N>
struct DerivativeType<SemiDynamicSparseNumberArray<T, I, N>>
{
typedef SemiDynamicSparseNumberArray<typename DerivativeType<T>::type, I, N> type;
};

template <typename T, typename I, typename N>
struct DerivativesType<SemiDynamicSparseNumberArray<T, I, N>>
{
typedef SemiDynamicSparseNumberArray<typename DerivativesType<T>::type, I, N> type;
};

template <typename T, typename I, typename N>
inline typename DerivativeType<SemiDynamicSparseNumberArray<T, I, N>>::type
derivative(const SemiDynamicSparseNumberArray<T, I, N> & a, unsigned int derivativeindex);

template <typename T, typename I, typename N>
inline typename DerivativesType<SemiDynamicSparseNumberArray<T, I, N>>::type
derivatives(const SemiDynamicSparseNumberArray<T, I, N> & a);

template <typename T, typename I, typename N, unsigned int derivativeindex>
struct DerivativeOf<SemiDynamicSparseNumberArray<T, I, N>, derivativeindex>
{
static typename DerivativeType<SemiDynamicSparseNumberArray<T, I, N>>::type
derivative(const SemiDynamicSparseNumberArray<T, I, N> & a);
};

// For a vector of values a[i] each of which has a defined gradient,
// the divergence is the sum of derivative_wrt_xi(a[i])

// For a tensor of values, we take the divergence with respect to the
// first index.
template <typename T, typename I, typename N>
inline typename DerivativeType<T>::type divergence(const SemiDynamicSparseNumberArray<T, I, N> & a);

// For a vector of values, the gradient is going to be a tensor
template <typename T, typename I, typename N>
inline SemiDynamicSparseNumberArray<typename T::derivatives_type, I, N>
gradient(const SemiDynamicSparseNumberArray<T, I, N> & a);

// DualNumber is subordinate to SemiDynamicSparseNumberArray

#define DualSemiDynamicSparseNumberArray_comparisons(templatename) \
template <typename T, typename T2, typename D, typename I, typename N, bool reverseorder> \
struct templatename<SemiDynamicSparseNumberArray<T2, I, N>, DualNumber<T, D>, reverseorder> \
{ \
typedef SemiDynamicSparseNumberArray< \
typename Symmetric##templatename<T2, DualNumber<T, D>, reverseorder>::supertype, \
I, \
N> \
supertype; \
}

DualSemiDynamicSparseNumberArray_comparisons(CompareTypes);
DualSemiDynamicSparseNumberArray_comparisons(PlusType);
DualSemiDynamicSparseNumberArray_comparisons(MinusType);
DualSemiDynamicSparseNumberArray_comparisons(MultipliesType);
DualSemiDynamicSparseNumberArray_comparisons(DividesType);
DualSemiDynamicSparseNumberArray_comparisons(AndType);
DualSemiDynamicSparseNumberArray_comparisons(OrType);

} // namespace MetaPhysicL

#endif // METAPHYSICL_DUALSEMIDYNAMICSPARSENUMBERARRAY_DECL_H
10 changes: 8 additions & 2 deletions src/numerics/include/metaphysicl/dynamicsparsenumberarray.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,14 @@ DynamicSparseNumberArray<T,I>::DynamicSparseNumberArray(const T2& val) {
template <typename T, typename I>
template <typename T2, typename I2>
inline
DynamicSparseNumberArray<T,I>::DynamicSparseNumberArray(DynamicSparseNumberArray<T2, I2> src) :
DynamicSparseNumberBase<T,I,MetaPhysicL::DynamicSparseNumberArray>(src) {}
DynamicSparseNumberArray<T,I>::DynamicSparseNumberArray(const DynamicSparseNumberArray<T2, I2> & src) :
DynamicSparseNumberBase<std::vector<T>,std::vector<I>,MetaPhysicL::DynamicSparseNumberArray,T,I>(src) {}

template <typename T, typename I>
template <typename T2, typename I2>
inline
DynamicSparseNumberArray<T,I>::DynamicSparseNumberArray(DynamicSparseNumberArray<T2, I2> && src) :
DynamicSparseNumberBase<std::vector<T>,std::vector<I>,MetaPhysicL::DynamicSparseNumberArray,T,I>(src) {}


template <typename T, typename I>
Expand Down
14 changes: 10 additions & 4 deletions src/numerics/include/metaphysicl/dynamicsparsenumberarray_decl.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
#ifndef METAPHYSICL_DYNAMICSPARSENUMBERARRAY_DECL_H
#define METAPHYSICL_DYNAMICSPARSENUMBERARRAY_DECL_H

#include <vector>

#include "metaphysicl/dynamicsparsenumberbase_decl.h"

namespace MetaPhysicL {
Expand Down Expand Up @@ -69,13 +71,14 @@ struct SumType<DynamicSparseNumberArray<S, I> > {

template <typename T, typename I>
class DynamicSparseNumberArray :
public DynamicSparseNumberBase<T,I,DynamicSparseNumberArray>,
public DynamicSparseNumberBase<std::vector<T>,std::vector<I>,
DynamicSparseNumberArray,T,I>,
public safe_bool<DynamicSparseNumberArray<T,I> >
{
public:
template <typename T2>
template <typename T2, typename I2 = I>
struct rebind {
typedef DynamicSparseNumberArray<T2, I> other;
typedef DynamicSparseNumberArray<T2, I2> other;
};

DynamicSparseNumberArray();
Expand All @@ -100,7 +103,10 @@ class DynamicSparseNumberArray :
#endif

template <typename T2, typename I2>
DynamicSparseNumberArray(DynamicSparseNumberArray<T2, I2> src);
DynamicSparseNumberArray(const DynamicSparseNumberArray<T2, I2> & src);

template <typename T2, typename I2>
DynamicSparseNumberArray(DynamicSparseNumberArray<T2, I2> && src);

template <typename T2, typename I2>
DynamicSparseNumberArray
Expand Down
Loading