/* * Automatically Tuned Linear Algebra Software v3.10.2 * (C) Copyright 1999 R. Clint Whaley * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions, and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the ATLAS group or the names of its contributers may * not be used to endorse or promote products derived from this * software without specific written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ #ifdef TCPLX static int ATL_potrf2(const int N, TYPE *A, const int lda) { int j, k; static const TYPE one[2] = {ATL_rone, ATL_rzero}; static const TYPE none[2] = {ATL_rnone, ATL_rzero}; const size_t lda2 = lda+lda; TYPE Ajj, *Ac=A, *An=A+lda2; for (k=j=0; j != N; j++, k += 2) { Ajj = Ac[k] - llt_dot(k, Ac, 1, Ac, 1); Ac[k+1] = ATL_rzero; if (Ajj > ATL_rzero) { Ac[k] = Ajj = sqrt(Ajj); if (j != N-1) { llt_scal(j, ATL_rnone, Ac+1, 2); cblas_gemv(CblasColMajor, CblasTrans, j, N-j-1, none, An, lda, Ac, 1, one, An+k, lda); llt_scal(j, ATL_rnone, Ac+1, 2); llt_rscal(N-j-1, ATL_rone/Ajj, An+k, lda); Ac = An; An += lda2; } } else { Ac[k] = Ajj; return(j+1); } } return(0); } #else /* real version */ static int ATL_potrf2(const int N, TYPE *A, const int lda) { int j; TYPE Ajj, *Ac=A, *An=A+lda; for (j=0; j != N; j++) { Ajj = Ac[j] - cblas_dot(j, Ac, 1, Ac, 1); if (Ajj > ATL_rzero) { Ac[j] = Ajj = sqrt(Ajj); if (j != N-1) { cblas_gemv(CblasColMajor, CblasTrans, j, N-j-1, ATL_rnone, An, lda, Ac, 1, ATL_rone, An+j, lda); cblas_scal(N-j-1, ATL_rone/Ajj, An+j, lda); Ac = An; An += lda; } } else { Ac[j] = Ajj; return(j+1); } } return(0); }
/* * Automatically Tuned Linear Algebra Software v3.11.28 * (C) Copyright 1999 R. Clint Whaley * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions, and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the ATLAS group or the names of its contributers may * not be used to endorse or promote products derived from this * software without specific written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ static int ATL_potrf2(const int N, TYPE *A, const int lda) { #ifdef TREAL TYPE Ajj, *Ac=A; const int N_1 = N-1; int j; for (j=0; j != N_1; j++, Ac += lda) { Ajj = Ac[j] - cblas_dot(j, A+j, lda, A+j, lda); if (Ajj > ATL_rzero) { Ac[j] = Ajj = sqrt(Ajj); cblas_gemv(CblasColMajor, CblasNoTrans, N-j-1, j, ATL_rnone, A+j+1, lda, A+j, lda, ATL_rone, Ac+j+1, 1); cblas_scal(N-j-1, ATL_rone/Ajj, Ac+j+1, 1); } else { Ac[j] = Ajj; return(j+1); } } Ajj = Ac[j] - cblas_dot(j, A+j, lda, A+j, lda); if (Ajj > ATL_rzero) Ac[j] = Ajj = sqrt(Ajj); else { Ac[j] = Ajj; return(N); } #else TYPE Ajj, *Ac=A; TYPE one[2] = {ATL_rone, ATL_rzero}; TYPE none[2] = {ATL_rnone, ATL_rzero}; const int N_1 = N-1, lda2 = lda<<1; int j, j2; for (j2=j=0; j != N_1; j++, j2 += 2, Ac += lda2) { Ajj = Ac[j2]; cblas_dotc_sub(j, A+j2, lda, A+j2, lda, Ac+j2); Ajj -= Ac[j2]; if (Ajj > ATL_rzero) { Ac[j2] = Ajj = sqrt(Ajj); llt_scal(j, ATL_rnone, A+j2+1, lda2); cblas_gemv(CblasColMajor, CblasNoTrans, N-j-1, j, none, A+j2+2, lda, A+j2, lda, one, Ac+j2+2, 1); llt_scal(j, ATL_rnone, A+j2+1, lda2); llt_scal((N-j-1)<<1, ATL_rone/Ajj, Ac+j2+2, 1); } else { Ac[j2] = Ajj; return(j+1); } } Ajj = Ac[j2]; cblas_dotc_sub(j, A+j2, lda, A+j2, lda, Ac+j2); Ajj -= Ac[j2]; if (Ajj > ATL_rzero) Ac[j2] = sqrt(Ajj); else { Ac[j2] = Ajj; return(N); } #endif return(0); }
template <typename IndexType, typename ValueType> void proj_to_lp_cpu(csr_matrix<IndexType, ValueType> &inputSet, ValueType * minNormVector, IndexType inSetDim, IndexType vectorDim, ValueType tollerance) { ValueType lpShift = (ValueType) 10; //Установим начальное смещение, оно должно быть очень большим //переместим наш политоп в соответствии с этим смещением, это будет означать //что мы переместили начало координат в эту точку, что соответствует тому что мы отнимим //от вектора b из уравнения Ax <=b следующую величину b + t * A * c (с = [1]) ValueType* vshift = (ValueType *) malloc(inSetDim * sizeof (ValueType)); ValueType* t_C = (ValueType *) malloc((vectorDim - 1) * sizeof (ValueType)); for (IndexType i = 0; i < vectorDim - 1; i++) { t_C[i] = -lpShift; } IndexType maxApprIters = 10; ValueType *x_s = new_host_array<ValueType > (vectorDim); ValueType *delta_x = new_host_array<ValueType > (vectorDim); ValueType* v_t = new_host_array<ValueType > (vectorDim); //- 1); //(ValueType *) malloc((vectorDim -1) * sizeof (ValueType)); IndexType *kvec = new_host_array<IndexType>(2 * inputSet.num_cols + 1 ); IndexType *kvec_old = new_host_array<IndexType>(2 * inputSet.num_cols + 1 ); IndexType *basisVecInx = new_host_array<IndexType>(2 * inputSet.num_cols + 1); IndexType baselen = 0; for (IndexType i = 0; i < 2 * inputSet.num_cols + 1; i++) { kvec[i] = 0; kvec_old[i] = 0; } //Начальный x_s это ноль cblas_scal(vectorDim, 0.0, x_s, 1); for (IndexType apprIt = 0; apprIt < maxApprIters; apprIt++) { //Получаем новое B cblas_copy(vectorDim - 1, t_C, 1, v_t, 1); cblas_axpy(vectorDim - 1, -1.0, x_s, 1, v_t, 1); //std::cout << "Vector V_t\n"; //printMatrixCPU(vectorDim - 1, 1, v_t); cblas_copy(vectorDim, x_s, 1, delta_x, 1); inputSet.num_rows--; spmv_csr_t_serial_host(inputSet, v_t, vshift); inputSet.num_rows++; //printMatrixCPU(inSetDim, 1, vshift); incValsInLstMtxRowVec(inputSet, inputSet.num_rows - 1, vshift); std::cout << "Input set on iteration\n"; //print_csr_matrix(inputSet); //getProjectionOnConus(inputSet, minNormVector, inSetDim, vectorDim, tollerance); csr_matrix<IndexType, ValueType> inSetCopy = getCsrMtxCopy(inputSet); if(apprIt > 0){ memcpy(kvec_old, kvec, (2 * inputSet.num_cols + 1) * sizeof (IndexType)); } //print_csr_matrix(inSetCopy); //projOnFixedSimplex(inSetCopy, minNormVector, kvec, basisVecInx, baselen, tollerance ); getMinNormElemOutRepr(in_a_csc, minNormVector, 0.0001, kvec, basisVecInx, baselen, numberOfEqConstr); delete_host_matrix(inSetCopy); IndexType kvec_razn = 0; if(apprIt > 0){ for (IndexType i = 0; i < 2 * inputSet.num_cols + 1; i++) { if(kvec[i] == kvec_old[i] && kvec[i] == 1){ kvec_razn++; } } } std::cout << "KVEC RAZN is = " << kvec_razn <<"\n"; std::cout << "baselen is = " << baselen <<"\n"; cblas_axpy(vectorDim, -1.0, v_t, 1, minNormVector, 1); //std::cout << "Min norm vector on iteration\n"; //printMatrixCPU(vectorDim, 1, minNormVector); decValsInLstMtxRowVec(inputSet, inputSet.num_rows - 1, vshift); cblas_copy(vectorDim, minNormVector, 1, x_s, 1); cblas_axpy(vectorDim, -1.0, x_s, 1, delta_x, 1); ValueType z_summ = 0.0; for (IndexType i = 0; i < vectorDim - 1; i++) { z_summ += minNormVector[i]; } std::cout << "Summ of elements " << z_summ << " on "<< apprIt <<" iteration\n"; ValueType dist = cblas_dot(vectorDim - 1, delta_x, 1, delta_x, 1); if (dist < tollerance * tollerance) { std::cout << "iterations count :" << apprIt << "\n"; break; } } //cblas_axpy(vectorDim, -1.0, v_t, 1, minNormVector, 1); ValueType dist = cblas_dot(vectorDim - 1, minNormVector, 1, minNormVector, 1); std::cout << "Min Vector Lengh = " << sqrt(dist) << "\n"; ValueType z_summ = 0.0; IndexType nonzer_summ = 0; for (IndexType i = 0; i < vectorDim - 1; i++) { z_summ += minNormVector[i]; if (minNormVector[i] != 0.0) { nonzer_summ++; } } std::cout << "Summ of elements " << z_summ << " \n"; std::cout << "Count of nonzerros " << nonzer_summ << " \n"; //printMatrixToFileForOctave(vectorDim, 1, minNormVector); ValueType* b_contr = new_host_array<ValueType > (inSetDim); inputSet.num_rows--; spmv_csr_t_serial_host(inputSet, minNormVector, b_contr); inputSet.num_rows++; //printMatrixCPU(inSetDim, 1, b_contr); IndexType b_begin = inputSet.Ap[vectorDim - 1]; IndexType b_end = inputSet.Ap[vectorDim]; IndexType inconsCount = 0; for (IndexType i = b_begin; i < b_end; i++) { IndexType j = inputSet.Aj[i]; if (b_contr[j] > inputSet.Ax[i] + tollerance * tollerance) { //std::cout << "b_contr " << b_contr[j] << " Ax " << inputSet.Ax[i] << " \n"; ValueType razn = b_contr[j] - inputSet.Ax[i]; //printf("bcontr[%i] %e Ax %e razn %e\n", j ,b_contr[j], inputSet.Ax[i], razn); inconsCount++; } } std::cout << "Inconsistent X count: " << inconsCount << " \n"; }