001/* 002 * Copyright 2006 - 2013 003 * Stefan Balev <stefan.balev@graphstream-project.org> 004 * Julien Baudry <julien.baudry@graphstream-project.org> 005 * Antoine Dutot <antoine.dutot@graphstream-project.org> 006 * Yoann Pigné <yoann.pigne@graphstream-project.org> 007 * Guilhelm Savin <guilhelm.savin@graphstream-project.org> 008 * 009 * This file is part of GraphStream <http://graphstream-project.org>. 010 * 011 * GraphStream is a library whose purpose is to handle static or dynamic 012 * graph, create them from scratch, file or any source and display them. 013 * 014 * This program is free software distributed under the terms of two licenses, the 015 * CeCILL-C license that fits European law, and the GNU Lesser General Public 016 * License. You can use, modify and/ or redistribute the software under the terms 017 * of the CeCILL-C license as circulated by CEA, CNRS and INRIA at the following 018 * URL <http://www.cecill.info> or under the terms of the GNU LGPL as published by 019 * the Free Software Foundation, either version 3 of the License, or (at your 020 * option) any later version. 021 * 022 * This program is distributed in the hope that it will be useful, but WITHOUT ANY 023 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 024 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 025 * 026 * You should have received a copy of the GNU Lesser General Public License 027 * along with this program. If not, see <http://www.gnu.org/licenses/>. 028 * 029 * The fact that you are presently reading this means that you have had 030 * knowledge of the CeCILL-C and LGPL licenses and that you accept their terms. 031 */ 032package org.graphstream.algorithm.networksimplex; 033 034/** 035 * This class is used to present numbers of the form a + bM, where M is 036 * "big enough". A helper class for the network simplex method 037 * 038 * @author Stefan Balev 039 * 040 */ 041class BigMNumber { 042 protected long small; 043 protected long big; 044 045 public BigMNumber() { 046 set(0, 0); 047 } 048 049 public BigMNumber(long small) { 050 set(small, 0); 051 } 052 053 public void set(long small, long big) { 054 this.small = small; 055 this.big = big; 056 } 057 058 public void set(BigMNumber b) { 059 set(b.small, b.big); 060 } 061 062 public void set(long small) { 063 set(small, 0); 064 } 065 066 public void plus(BigMNumber b) { 067 small += b.small; 068 big += b.big; 069 } 070 071 public void minus(BigMNumber b) { 072 small -= b.small; 073 big -= b.big; 074 } 075 076 public void minus() { 077 small = -small; 078 big = -big; 079 } 080 081 public void plusTimes(int multiplier, BigMNumber b) { 082 small += multiplier * b.small; 083 big += multiplier * b.big; 084 } 085 086 public boolean isNegative() { 087 return big < 0 || (big == 0 && small < 0); 088 } 089 090 public boolean isInfinite() { 091 return big != 0; 092 } 093 094 public int compareTo(BigMNumber b) { 095 if (big < b.big) 096 return -1; 097 if (big > b.big) 098 return 1; 099 if (small < b.small) 100 return -1; 101 if (small > b.small) 102 return 1; 103 return 0; 104 } 105 106 public long getSmall() { 107 return small; 108 } 109 110 @Override 111 public String toString() { 112 if (big == 0) 113 return small + ""; 114 String r = ""; 115 if (small != 0) { 116 r += small; 117 if (big > 0) 118 r += "+"; 119 } 120 if (big == -1) 121 r += "-"; 122 else if (big != 1) 123 r+= big; 124 r += "M"; 125 return r; 126 } 127 128}