/*************************************************************************** * Copyright (c) 2023 Ondsel, Inc. * * * * This file is part of OndselSolver. * * * * See LICENSE file for details about copyright. * ***************************************************************************/ #pragma once #include #include #include "FullVector.h" namespace MbD { template class FullColumn; using FColDsptr = std::shared_ptr>; template using FColsptr = std::shared_ptr>; template class FullRow; template using FRowsptr = std::shared_ptr>; class Symbolic; template class FullColumn : public FullVector { public: FullColumn() : FullVector() {} FullColumn(std::vector vec) : FullVector(vec) {} FullColumn(int count) : FullVector(count) {} FullColumn(int count, const T& value) : FullVector(count, value) {} FullColumn(typename std::vector::iterator begin, typename std::vector::iterator end) : FullVector(begin, end) {} FullColumn(std::initializer_list list) : FullVector{ list } {} FColsptr plusFullColumn(FColsptr fullCol); FColsptr minusFullColumn(FColsptr fullCol); FColsptr times(T a); FColsptr negated(); void atiputFullColumn(int i, FColsptr fullCol); void atiplusFullColumn(int i, FColsptr fullCol); void equalSelfPlusFullColumnAt(FColsptr fullCol, int i); void atiminusFullColumn(int i, FColsptr fullCol); void equalFullColumnAt(FColsptr fullCol, int i); FColsptr copy(); FRowsptr transpose(); void atiplusFullColumntimes(int i, FColsptr fullCol, T factor); T transposeTimesFullColumn(const FColsptr fullCol); void equalSelfPlusFullColumntimes(FColsptr fullCol, T factor); FColsptr cross(FColsptr fullCol); FColsptr simplified(); std::ostream& printOn(std::ostream& s) const override; }; template inline FColsptr FullColumn::plusFullColumn(FColsptr fullCol) { int n = (int) this->size(); auto answer = std::make_shared>(n); for (int i = 0; i < n; i++) { answer->at(i) = this->at(i) + fullCol->at(i); } return answer; } template inline FColsptr FullColumn::minusFullColumn(FColsptr fullCol) { int n = (int) this->size(); auto answer = std::make_shared>(n); for (int i = 0; i < n; i++) { answer->at(i) = this->at(i) - fullCol->at(i); } return answer; } template<> inline FColDsptr FullColumn::times(double a) { int n = (int)this->size(); auto answer = std::make_shared>(n); for (int i = 0; i < n; i++) { answer->at(i) = this->at(i) * a; } return answer; } template inline FColsptr FullColumn::times(T a) { assert(false); } template inline FColsptr FullColumn::negated() { return this->times(-1.0); } template inline void FullColumn::atiputFullColumn(int i, FColsptr fullCol) { for (int ii = 0; ii < fullCol->size(); ii++) { this->at(i + ii) = fullCol->at(ii); } } template inline void FullColumn::atiplusFullColumn(int i, FColsptr fullCol) { for (int ii = 0; ii < fullCol->size(); ii++) { this->at(i + ii) += fullCol->at(ii); } } template inline void FullColumn::equalSelfPlusFullColumnAt(FColsptr fullCol, int ii) { //self is subcolumn of fullCol for (int i = 0; i < this->size(); i++) { this->at(i) += fullCol->at(ii + i); } } template inline void FullColumn::atiminusFullColumn(int i1, FColsptr fullCol) { for (int ii = 0; ii < fullCol->size(); ii++) { int i = i1 + ii; this->at(i) -= fullCol->at(ii); } } template inline void FullColumn::equalFullColumnAt(FColsptr fullCol, int i) { this->equalArrayAt(fullCol, i); //for (int ii = 0; ii < this->size(); ii++) //{ // this->at(ii) = fullCol->at(i + ii); //} } template<> inline FColDsptr FullColumn::copy() { auto n = (int) this->size(); auto answer = std::make_shared>(n); for (int i = 0; i < n; i++) { answer->at(i) = this->at(i); } return answer; } template inline FRowsptr FullColumn::transpose() { return std::make_shared>(*this); } template inline void FullColumn::atiplusFullColumntimes(int i1, FColsptr fullCol, T factor) { for (int ii = 0; ii < fullCol->size(); ii++) { int i = i1 + ii; this->at(i) += fullCol->at(ii) * factor; } } template inline T FullColumn::transposeTimesFullColumn(const FColsptr fullCol) { return this->dot(fullCol); } template inline void FullColumn::equalSelfPlusFullColumntimes(FColsptr fullCol, T factor) { this->equalSelfPlusFullVectortimes(fullCol, factor); } template inline FColsptr FullColumn::cross(FColsptr fullCol) { auto a0 = this->at(0); auto a1 = this->at(1); auto a2 = this->at(2); auto b0 = fullCol->at(0); auto b1 = fullCol->at(1); auto b2 = fullCol->at(2); auto answer = std::make_shared>(3); answer->atiput(0, a1 * b2 - (a2 * b1)); answer->atiput(1, a2 * b0 - (a0 * b2)); answer->atiput(2, a0 * b1 - (a1 * b0)); return answer; } //template<> //inline std::shared_ptr> FullColumn::simplified() //{ // auto n = this->size(); // auto answer = std::make_shared>(n); // for (int i = 0; i < n; i++) // { // auto func = this->at(i); // answer->at(i) = func->simplified(func); // } // return answer; //} template inline FColsptr FullColumn::simplified() { assert(false); return FColsptr(); } template inline std::ostream& FullColumn::printOn(std::ostream& s) const { s << "FullCol{"; s << this->at(0); for (int i = 1; i < this->size(); i++) { s << ", " << this->at(i); } s << "}"; return s; } }