This file is indexed.

/usr/include/polymake/tropical/thomog.h is in libpolymake-dev-common 3.2r2-3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/* Copyright (c) 1997-2018
   Ewgenij Gawrilow, Michael Joswig (Technische Universitaet Berlin, Germany)
   http://www.polymake.org

   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the
   Free Software Foundation; either version 2, or (at your option) any
   later version: http://www.gnu.org/licenses/gpl.txt.

   This program 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 General Public License for more details.
--------------------------------------------------------------------------------
*/

#ifndef POLYMAKE_TROPICAL_THOMOG_H
#define POLYMAKE_TROPICAL_THOMOG_H

#include "polymake/Rational.h"
#include "polymake/Matrix.h"
#include "polymake/TropicalNumber.h"

namespace polymake{ namespace tropical {

	template <typename Coefficient, typename VType>
	Vector<Coefficient> thomog_vec(const GenericVector<VType, Coefficient> &affine, int chart=0, bool has_leading_coordinate = true) {
		if(affine.dim() <= 1) return Vector<Coefficient>(affine);
		if(chart < 0 || chart > (affine.dim()- (has_leading_coordinate? 1 : 0)))
			throw std::runtime_error("Invalid chart coordinate");
		Vector<Coefficient> proj(affine.dim()+1);
		proj.slice(~scalar2set(has_leading_coordinate? chart+1 : chart)) = affine;
		return proj;
	}

	template <typename Coefficient, typename MType>
	Matrix<Coefficient> thomog (const GenericMatrix<MType, Coefficient> &affine, int chart=0, bool has_leading_coordinate = true) {
		if(affine.rows() == 0) return Matrix<Coefficient>(0,affine.cols()+1);
		if(chart < 0 || chart > (affine.cols() - (has_leading_coordinate? 1 : 0))) {
			throw std::runtime_error("Invalid chart coordinate.");	
		}
		Matrix<Coefficient> proj(affine.rows(),affine.cols() + 1);
		proj.minor(All,~scalar2set(has_leading_coordinate? chart+1 : chart)) = affine;
		return proj;
	}

	//This does the converse of thomog, i.e. removes a coordinate by shifting
	// it to 0.
	template <typename Coefficient, typename MType>
	Matrix<Coefficient> tdehomog(const GenericMatrix<MType, Coefficient> &proj, int chart=0, bool has_leading_coordinate = true) {
		if(chart < 0 || chart > (proj.cols()- (has_leading_coordinate? 2 : 1))){
			throw std::runtime_error("Invalid chart coordinate");
		}
		Matrix<Coefficient> affine(proj);
		if (has_leading_coordinate) {
		  Matrix<Coefficient> sub(repeat_col(affine.col(chart+1),affine.cols()-1));
		  affine.minor(All,sequence(1,affine.cols()-1)) -= sub;
		}
		else  {
  		  Matrix<Coefficient> sub(repeat_col(affine.col(chart),affine.cols()));
		  affine -= sub;
		}				
		return affine.minor(All,~scalar2set(has_leading_coordinate? chart+1 : chart));
	}


	
	template <typename Coefficient, typename VType>
	Vector<Coefficient> tdehomog_vec(const GenericVector<VType, Coefficient> &proj, int chart=0, bool has_leading_coordinate = true) {
		if(proj.dim() <= 1) return Vector<Coefficient>();
		if(chart < 0 || chart > (proj.dim() - (has_leading_coordinate? 2 : 1))) 
			throw std::runtime_error("Invalid chart coordinate");
		
		Vector<Coefficient> affine(proj);
		if(has_leading_coordinate) {
		    Vector<Coefficient> subtr(zero_value<Coefficient>() | affine[chart+1] * ones_vector<Coefficient>(affine.dim()-1));
		    affine -= subtr;
		}
		else {
		    Vector<Coefficient> subtr(affine[chart] * ones_vector<Coefficient>(affine.dim()));
		    affine -= subtr;
		}
		return affine.slice(~scalar2set(has_leading_coordinate? chart+1 : chart));
	}

	/*
	 * @brief: scale the rows of a matrix so that
	 * the first non-null entry of each row is tropical one
	 */
	template <typename Addition, typename Scalar, typename MatrixTop>
	  Matrix<TropicalNumber<Addition, Scalar> > normalized_first(const GenericMatrix<MatrixTop, TropicalNumber<Addition, Scalar> >& homogeneous_points) {
	  typedef TropicalNumber<Addition,Scalar> TNumber;

	  Matrix<TNumber> result(homogeneous_points);
	  for(auto r : rows(result)) {
	    TNumber value;
	    for(auto entry : r) {
	      if (!is_zero(entry)) {value = entry; break;}
	    }
	    if (!is_zero(value)) r /= value;
	  }
	  return result;
	}

	/*
	 * @brief: scale the rows of a matrix so that
	 * the first non-null entry of each row is tropical one
	 */
	template <typename Addition, typename Scalar, typename VectorTop>
	  Vector<TropicalNumber<Addition, Scalar> > normalized_first(const GenericVector<VectorTop, TropicalNumber<Addition, Scalar> >& homogeneous_point) {
	  typedef TropicalNumber<Addition,Scalar> TNumber;

	  Vector<TNumber> result(homogeneous_point);
	  TNumber value;
	  for(auto entry : result) {
	    if (!is_zero(entry)) {value = entry; break;}
	  }
	  if (!is_zero(value)) result /= value;
	  return result;
	}

}}

#endif