Interior-point-optimisation  1.0-1
Interior-pointoptimisationlibrary
Array.hpp
Go to the documentation of this file.
1 /*
2  * $Id: Array.hpp 187 2014-10-22 09:25:23Z jdl3 $
3  * Copyright (C) 2013. 2014 John D Lamb
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or (at
8  * your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 
20 #ifndef IPO_ARRAY_HPP
21 #define IPO_ARRAY_HPP
22 
23 #include<vector>
24 #include<algorithm>
25 #include<ccgsl/vector.hpp>
26 #include"Variable.hpp"
27 
28 namespace ipo {
29 
45  class Array : public detail::Var {
46  public:
50  typedef std::vector<Variable>::value_type value_type;
54  typedef std::vector<Variable>::allocator_type allocator_type;
58  typedef std::vector<Variable>::size_type size_type;
62  typedef std::vector<Variable>::difference_type difference_type;
66  typedef std::vector<Variable>::reference reference;
70  typedef std::vector<Variable>::const_reference const_reference;
74  typedef std::vector<Variable>::pointer pointer;
78  typedef std::vector<Variable>::const_pointer const_pointer;
82  typedef std::vector<Variable>::iterator iterator;
86  typedef std::vector<Variable>::const_iterator const_iterator;
90  typedef std::vector<Variable>::reverse_iterator reverse_iterator;
94  typedef std::vector<Variable>::const_reverse_iterator const_reverse_iterator;
101  Array( detail::ModelBase& model, allocator_type const& alloc = allocator_type(),
102  char const* const name = nullptr );
108  Array( detail::ModelBase& model, std::string const& name );
116  Array( detail::ModelBase& model, size_t const size, char const* const name = nullptr );
124  Array( detail::ModelBase& model, size_t const size, std::string const& name );
134  Array( detail::ModelBase& model, size_t const size, value_type const& val,
135  allocator_type const& alloc, std::string const& name );
145  Array( detail::ModelBase& model, size_t const size, value_type const& val,
146  allocator_type const& alloc = allocator_type(), char const* const name = 0 );
155  Array( detail::ModelBase& model, size_t const size, value_type const& val,
156  std::string const& name );
165  Array( detail::ModelBase& model, size_t const size, value_type const& val,
166  char const * const name );
171  Array( Array const& array );
177  Array( Array const& array, allocator_type const& alloc );
182  Array( Array&& array ) : Var { model }, dataArray { std::move( array.dataArray ) }{}
190  Array( detail::ModelBase& model, std::initializer_list<Variable> init,
191  std::vector<Variable>::allocator_type const& alloc
192  = std::vector<Variable>::allocator_type(),
193  char const* const name = 0 );
201  Array( detail::ModelBase& model, std::initializer_list<Variable> init,
202  std::vector<Variable>::allocator_type const& alloc,
203  std::string const& name );
210  Array( detail::ModelBase& model, std::initializer_list<Variable> init,
211  char const* const name = 0 );
218  Array( detail::ModelBase& model, std::initializer_list<Variable> init,
219  std::string const& name );
225  Array& operator=( Array&& array );
231  Array& operator=( Array& array );
236  std::string getName() const;
241  void setName( std::string const& name );
246  void setName( char* const name );
247  // container concept/vector stuff
253  void assign( size_type count, value_type const& value );
259  template<typename InputIterator>
260  void assign( InputIterator first, InputIterator last ){
261  dataArray->array.assign( first, last );
262  if( not dataArray->testModelMatch( *getModel() ) )
263  throw IPOE( "iop::Array::assign: at least one variable discarded because it is "
264  "not owned by model that owns array." );
265  model.notify();
266  }
271  void assign( std::initializer_list<Variable> init );
276  allocator_type get_allocator() const { return dataArray->array.get_allocator(); }
282  reference at( size_type pos ){ model.notify(); return dataArray->array.at( pos ); }
288  const_reference at( size_type pos ) const { return dataArray->array.at( pos ); }
294  reference operator[]( size_type pos ){ model.notify(); return dataArray->array[pos]; }
300  const_reference operator[]( size_type pos ) const { return dataArray->array[pos]; }
305  reference front(){ model.notify(); return dataArray->array.front(); }
310  const_reference front() const { return dataArray->array.front(); }
315  reference back(){ model.notify(); return dataArray->array.back(); }
320  const_reference back() const { return dataArray->array.back(); }
325  pointer data(){ model.notify(); return dataArray->array.data(); }
330  const_pointer data() const { return dataArray->array.data(); }
335  iterator begin(){ model.notify(); return dataArray->array.begin(); }
340  const_iterator begin() const { return dataArray->array.begin(); }
345  const_iterator cbegin() const { model.notify(); return dataArray->array.cbegin(); }
350  iterator end(){ model.notify(); return dataArray->array.end(); }
355  const_iterator end() const { return dataArray->array.end(); }
360  const_iterator cend() const { model.notify(); return dataArray->array.cend(); }
365  reverse_iterator rbegin(){ model.notify(); return dataArray->array.rbegin(); }
370  const_reverse_iterator rbegin() const { return dataArray->array.rbegin(); }
375  const_reverse_iterator crbegin() const { return dataArray->array.crbegin(); }
380  reverse_iterator rend(){ model.notify(); return dataArray->array.rend(); }
385  const_reverse_iterator rend() const { return dataArray->array.rend(); }
390  const_reverse_iterator crend() const { return dataArray->array.crend(); }
395  bool empty() const { return dataArray->array.empty(); }
400  size_type size() const { return dataArray->array.size(); }
405  size_type max_size() const { return dataArray->array.max_size(); }
410  void reserve( size_type size ){ dataArray->array.reserve( size ); }
415  size_type capacity() const { return dataArray->array.capacity(); }
419  void shrink_to_fit(){ dataArray->array.shrink_to_fit(); }
423  void clear(){ dataArray->array.clear(); model.notify(); }
430  iterator insert( iterator pos, value_type const& value );
437  iterator insert( iterator pos, value_type&& value );
444  void insert( iterator pos, size_type count, const value_type& value );
451  template<typename InputIterator>
452  void insert( iterator pos, InputIterator first, InputIterator last ){
453  dataArray->array.insert( pos, first, last );
454  if( not dataArray->testModelMatch( *getModel() ) )
455  throw IPOE( "iop::Array::insert: at least one variable discarded because it is "
456  "not owned by model that owns array." );
457  model.notify();
458  }
464  void insert( iterator pos, std::initializer_list<Variable> ilist );
471  template<class... Args>
472  iterator emplace( const_iterator pos, Args&&... args ){
473  model.notify();
474  iterator i = dataArray->array.emplace( pos, args... );
475  if( i->getModel() != getModel() ){
476  dataArray->array.erase( i );
477  throw IPOE( "iop::Array::emplace: variable not inserted because it is "
478  "not owned by model that owns array." );
479  }
480  return i;
481  }
487  iterator erase( iterator pos ){ model.notify(); return dataArray->array.erase( pos ); }
494  iterator erase( iterator first, iterator last ){
495  model.notify(); return dataArray->array.erase( first, last ); }
500  void push_back( value_type const& value );
505  void push_back( value_type&& value );
510  template<typename... Args>
511  void emplace_back( Args&&... args ){
512  dataArray->array.emplace_back( args... );
513  if( back().getModel() != getModel() ){
514  dataArray->array.erase( --dataArray->array.end() );
515  throw IPOE( "iop::Array::emplace: variable not inserted because it is "
516  "not owned by model that owns array." );
517  }
518  model.notify();
519  }
523  void pop_back(){ dataArray->array.pop_back(); model.notify(); }
528  void resize( size_type count ){ dataArray->array.resize( count, Variable { model } );
529  model.notify(); }
535  void resize( size_type count, const value_type& value);
540  void swap( Array& array );
545  bool contains( Variable const& variable ) const;
551  void setValue( gsl::vector const& vector );
556  gsl::vector getValue() const;
563  virtual void summary( std::ostream& ostream = std::cout,
564  std::string const& prefix = "" ) const override;
565  private:
569  struct Data {
576  Data( detail::ModelBase& model, std::vector<Variable>::allocator_type alloc,
577  std::string const& name );
584  Data( detail::ModelBase& model, size_t const size, std::string const name );
593  Data( detail::ModelBase& model, size_t const size,
594  std::vector<Variable>::value_type const& val,
595  std::vector<Variable>::allocator_type alloc, std::string const& name );
601  Data( detail::ModelBase& model, Data const& dataArray );
608  Data( detail::ModelBase& model, Data const& dataArray,
609  std::vector<Variable>::allocator_type const& alloc );
614  Data( Data&& dataArray ) : name { std::move( dataArray.name ) },
615  array { std::move( dataArray.array ) }{}
623  Data( detail::ModelBase& model, std::initializer_list<Variable> init,
624  std::vector<Variable>::allocator_type const& alloc
625  = std::vector<Variable>::allocator_type(),
626  char const* const name = 0 );
634  Data( detail::ModelBase& model, std::initializer_list<Variable> init,
635  std::vector<Variable>::allocator_type const& alloc,
636  std::string const name );
643  Data( detail::ModelBase& model, std::initializer_list<Variable> init,
644  char const* const name = 0 );
651  Data( detail::ModelBase& model, std::initializer_list<Variable> init,
652  std::string const& name );
659  bool testModelMatch( detail::ModelBase const& model );
663  std::string name;
667  std::vector<Variable> array;
668  };
672  std::shared_ptr<Data> dataArray;
673  // friend declarations
674  friend bool ipo::operator==( Array const&, Array const& );
675  friend bool ipo::operator!=( Array const&, Array const& );
676  friend bool ipo::operator<( Array const&, Array const& );
677  friend bool ipo::operator<=( Array const&, Array const& );
678  friend bool ipo::operator>( Array const&, Array const& );
679  friend bool ipo::operator>=( Array const&, Array const& );
680  };
681 
688  inline bool operator==( Array const& lhs, Array const& rhs ){
689  return lhs.dataArray->array == rhs.dataArray->array; }
696  inline bool operator!=( Array const& lhs, Array const& rhs ){
697  return lhs.dataArray->array != rhs.dataArray->array; }
704  inline bool operator<( Array const& lhs, Array const& rhs ){
705  return lhs.dataArray->array < rhs.dataArray->array; }
712  inline bool operator<=( Array const& lhs, Array const& rhs ){
713  return lhs.dataArray->array <= rhs.dataArray->array; }
720  inline bool operator>( Array const& lhs, Array const& rhs ){
721  return lhs.dataArray->array > rhs.dataArray->array; }
728  inline bool operator>=( Array const& lhs, Array const& rhs ){
729  return lhs.dataArray->array >= rhs.dataArray->array; }
730 
736  inline void swap( Array& first, Array& second ){
737  first.swap( second ); }
738 
739 }
740 
741 #endif
const_reverse_iterator rend() const
Get reverse iterator to end of range.
Definition: Array.hpp:385
bool operator>=(Array const &lhs, Array const &rhs)
Compare two Array objects.
Definition: Array.hpp:728
const_reference front() const
Get reference to first Variable.
Definition: Array.hpp:310
void setName(std::string const &name)
Set name of variable.
Definition: Array.cc:222
Var(ModelBase &model)
Constructor needs a model so that variable can only be attached to one model.
Definition: Var.cc:28
void insert(iterator pos, InputIterator first, InputIterator last)
Insert count copies of value before position given by iterator pos.
Definition: Array.hpp:452
std::vector< Variable >::pointer pointer
Pointer type.
Definition: Array.hpp:74
bool operator!=(Array const &lhs, Array const &rhs)
Compare two Array objects.
Definition: Array.hpp:696
std::string name
The name of the array.
Definition: Array.hpp:663
const_reverse_iterator crend() const
Get reverse iterator to end of range.
Definition: Array.hpp:390
std::vector< Variable >::iterator iterator
Iterator type.
Definition: Array.hpp:82
bool operator<(Array const &lhs, Array const &rhs)
Compare two Array objects.
Definition: Array.hpp:704
std::vector< Variable >::reverse_iterator reverse_iterator
Reverse iterator type.
Definition: Array.hpp:90
reference operator[](size_type pos)
Get reference to Variable at position pos.
Definition: Array.hpp:294
std::vector< Variable >::const_pointer const_pointer
Const pointer type.
Definition: Array.hpp:78
void swap(Array &array)
Swap contents of container with those of another.
Definition: Array.cc:232
void push_back(value_type const &value)
Insert value at end of array.
Definition: Array.cc:323
iterator erase(iterator first, iterator last)
Erase elements in range [first, last).
Definition: Array.hpp:494
reference back()
Get reference to last Variable.
Definition: Array.hpp:315
const_reference operator[](size_type pos) const
Get reference to Variable at position pos.
Definition: Array.hpp:300
iterator emplace(const_iterator pos, Args &&...args)
Insert new value construted in-place before pos.
Definition: Array.hpp:472
void setValue(gsl::vector const &vector)
Set the value of this from a gsl::vector.
Definition: Array.cc:355
std::vector< Variable >::reference reference
Reference type.
Definition: Array.hpp:66
const_iterator begin() const
Get iterator to beginning of range.
Definition: Array.hpp:340
bool empty() const
Check if array is empty.
Definition: Array.hpp:395
std::vector< Variable >::const_iterator const_iterator
Const iterator type.
Definition: Array.hpp:86
ModelBase & model
A Model to attach this to.
Definition: Var.hpp:101
std::vector< Variable > array
The array.
Definition: Array.hpp:667
iterator end()
Get iterator to end of range.
Definition: Array.hpp:350
Data(detail::ModelBase &model, std::vector< Variable >::allocator_type alloc, std::string const &name)
Constructor.
Definition: Array.cc:28
std::vector< Variable >::const_reverse_iterator const_reverse_iterator
Const reverse iterator type.
Definition: Array.hpp:94
bool contains(Variable const &variable) const
Check whether or not array contains variable.
Definition: Array.cc:350
size_type size() const
Get size of array.
Definition: Array.hpp:400
const_reverse_iterator rbegin() const
Get reverse iterator to beginning of range.
Definition: Array.hpp:370
void assign(size_type count, value_type const &value)
Assign values.
Definition: Array.cc:269
iterator erase(iterator pos)
Erase element specified by pos.
Definition: Array.hpp:487
std::shared_ptr< Data > dataArray
The Variable dataArray as a shared pointer.
Definition: Array.hpp:672
#define IPOE(message)
Macro to allow file and line names in exceptions.
std::vector< Variable >::difference_type difference_type
Difference type.
Definition: Array.hpp:62
const_reverse_iterator crbegin() const
Get reverse iterator to beginning of range.
Definition: Array.hpp:375
Abstract base class for model.
Definition: Var.hpp:39
reverse_iterator rbegin()
Get reverse iterator to beginning of range.
Definition: Array.hpp:365
Array & operator=(Array &&array)
Move assignment operator.
Definition: Array.cc:241
void shrink_to_fit()
Free unused memory.
Definition: Array.hpp:419
reverse_iterator rend()
Get reverse iterator to end of range.
Definition: Array.hpp:380
bool operator<=(Array const &lhs, Array const &rhs)
Compare two Array objects.
Definition: Array.hpp:712
const_iterator cbegin() const
Get iterator to beginning of range.
Definition: Array.hpp:345
void swap(Array &first, Array &second)
Swap contents of container with those of another.
Definition: Array.hpp:736
Array(detail::ModelBase &model, allocator_type const &alloc=allocator_type(), char const *const name=nullptr)
Default constructor.
Definition: Array.cc:113
size_type max_size() const
Get maximum size of array.
Definition: Array.hpp:405
const_iterator cend() const
Get iterator to end of range.
Definition: Array.hpp:360
pointer data()
Get direct access to data.
Definition: Array.hpp:325
const_iterator end() const
Get iterator to end of range.
Definition: Array.hpp:355
Array(Array &&array)
Move constructor.
Definition: Array.hpp:182
gsl::vector getValue() const
Create a gsl::vector containing the values of this in order.
Definition: Array.cc:364
virtual void summary(std::ostream &ostream=std::cout, std::string const &prefix="") const override
Create a summary of this Array object.
Definition: Array.cc:372
This class represents a variable.
Definition: Variable.hpp:36
std::string getName() const
Get name of variable.
Definition: Array.cc:217
const_reference back() const
Get reference to last Variable.
Definition: Array.hpp:320
void clear()
Clear array.
Definition: Array.hpp:423
size_type capacity() const
Get capacity of array.
Definition: Array.hpp:415
std::vector< Variable >::value_type value_type
Value type.
Definition: Array.hpp:50
This class represents an array of Variable objects.
Definition: Array.hpp:45
allocator_type get_allocator() const
Get allocator.
Definition: Array.hpp:276
Struct to contain Array dataArray.
Definition: Array.hpp:569
const_pointer data() const
Get direct access to data.
Definition: Array.hpp:330
void resize(size_type count)
Resize array.
Definition: Array.hpp:528
data name
Definition: Variable.cc:37
void assign(InputIterator first, InputIterator last)
Assign values.
Definition: Array.hpp:260
iterator insert(iterator pos, value_type const &value)
Insert value before position given by iterator pos.
Definition: Array.cc:287
ModelBase const *const getModel() const
Get pointer to model.
Definition: Var.hpp:88
Abstract base class for Variable and Array;.
Definition: Var.hpp:49
const_reference at(size_type pos) const
Get reference to Variable at position pos.
Definition: Array.hpp:288
reference at(size_type pos)
Get reference to Variable at position pos.
Definition: Array.hpp:282
void emplace_back(Args &&...args)
Insert value at end of array.
Definition: Array.hpp:511
bool operator==(Array const &lhs, Array const &rhs)
Compare two Array objects.
Definition: Array.hpp:688
std::vector< Variable >::const_reference const_reference
Const reference type.
Definition: Array.hpp:70
std::vector< Variable >::size_type size_type
Size type.
Definition: Array.hpp:58
void pop_back()
Remove last element of array.
Definition: Array.hpp:523
Data(Data &&dataArray)
Move constructor.
Definition: Array.hpp:614
iterator begin()
Get iterator to beginning of range.
Definition: Array.hpp:335
std::vector< Variable >::allocator_type allocator_type
Allocator type.
Definition: Array.hpp:54
reference front()
Get reference to first Variable.
Definition: Array.hpp:305
bool testModelMatch(detail::ModelBase const &model)
Test model match and remove any Vraiable objects that fail.
Definition: Array.cc:257
This namespace holds all the interior-point optimisation classes.
Definition: Array.hpp:28
bool operator>(Array const &lhs, Array const &rhs)
Compare two Array objects.
Definition: Array.hpp:720
void reserve(size_type size)
Reserve capacity.
Definition: Array.hpp:410