comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/linear/OpenMapRealVector.OpenMapEntry.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> package org.apache.commons.math.linear;<a name="line.17"></a>
21 <FONT color="green">018</FONT> <a name="line.18"></a>
22 <FONT color="green">019</FONT> import java.io.Serializable;<a name="line.19"></a>
23 <FONT color="green">020</FONT> <a name="line.20"></a>
24 <FONT color="green">021</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.util.OpenIntToDoubleHashMap;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.util.OpenIntToDoubleHashMap.Iterator;<a name="line.23"></a>
27 <FONT color="green">024</FONT> <a name="line.24"></a>
28 <FONT color="green">025</FONT> /**<a name="line.25"></a>
29 <FONT color="green">026</FONT> * This class implements the {@link RealVector} interface with a {@link OpenIntToDoubleHashMap} backing store.<a name="line.26"></a>
30 <FONT color="green">027</FONT> * @version $Revision: 925812 $ $Date: 2010-03-21 11:49:31 -0400 (Sun, 21 Mar 2010) $<a name="line.27"></a>
31 <FONT color="green">028</FONT> * @since 2.0<a name="line.28"></a>
32 <FONT color="green">029</FONT> */<a name="line.29"></a>
33 <FONT color="green">030</FONT> public class OpenMapRealVector extends AbstractRealVector implements SparseRealVector, Serializable {<a name="line.30"></a>
34 <FONT color="green">031</FONT> <a name="line.31"></a>
35 <FONT color="green">032</FONT> /** Default Tolerance for having a value considered zero. */<a name="line.32"></a>
36 <FONT color="green">033</FONT> public static final double DEFAULT_ZERO_TOLERANCE = 1.0e-12;<a name="line.33"></a>
37 <FONT color="green">034</FONT> <a name="line.34"></a>
38 <FONT color="green">035</FONT> /** Serializable version identifier. */<a name="line.35"></a>
39 <FONT color="green">036</FONT> private static final long serialVersionUID = 8772222695580707260L;<a name="line.36"></a>
40 <FONT color="green">037</FONT> <a name="line.37"></a>
41 <FONT color="green">038</FONT> /** Entries of the vector. */<a name="line.38"></a>
42 <FONT color="green">039</FONT> private final OpenIntToDoubleHashMap entries;<a name="line.39"></a>
43 <FONT color="green">040</FONT> <a name="line.40"></a>
44 <FONT color="green">041</FONT> /** Dimension of the vector. */<a name="line.41"></a>
45 <FONT color="green">042</FONT> private final int virtualSize;<a name="line.42"></a>
46 <FONT color="green">043</FONT> <a name="line.43"></a>
47 <FONT color="green">044</FONT> /** Tolerance for having a value considered zero. */<a name="line.44"></a>
48 <FONT color="green">045</FONT> private double epsilon;<a name="line.45"></a>
49 <FONT color="green">046</FONT> <a name="line.46"></a>
50 <FONT color="green">047</FONT> /**<a name="line.47"></a>
51 <FONT color="green">048</FONT> * Build a 0-length vector.<a name="line.48"></a>
52 <FONT color="green">049</FONT> * &lt;p&gt;Zero-length vectors may be used to initialized construction of vectors<a name="line.49"></a>
53 <FONT color="green">050</FONT> * by data gathering. We start with zero-length and use either the {@link<a name="line.50"></a>
54 <FONT color="green">051</FONT> * #OpenMapRealVector(OpenMapRealVector, int)} constructor<a name="line.51"></a>
55 <FONT color="green">052</FONT> * or one of the &lt;code&gt;append&lt;/code&gt; method ({@link #append(double)}, {@link<a name="line.52"></a>
56 <FONT color="green">053</FONT> * #append(double[])}, {@link #append(RealVector)}) to gather data<a name="line.53"></a>
57 <FONT color="green">054</FONT> * into this vector.&lt;/p&gt;<a name="line.54"></a>
58 <FONT color="green">055</FONT> */<a name="line.55"></a>
59 <FONT color="green">056</FONT> public OpenMapRealVector() {<a name="line.56"></a>
60 <FONT color="green">057</FONT> this(0, DEFAULT_ZERO_TOLERANCE);<a name="line.57"></a>
61 <FONT color="green">058</FONT> }<a name="line.58"></a>
62 <FONT color="green">059</FONT> <a name="line.59"></a>
63 <FONT color="green">060</FONT> /**<a name="line.60"></a>
64 <FONT color="green">061</FONT> * Construct a (dimension)-length vector of zeros.<a name="line.61"></a>
65 <FONT color="green">062</FONT> * @param dimension size of the vector<a name="line.62"></a>
66 <FONT color="green">063</FONT> */<a name="line.63"></a>
67 <FONT color="green">064</FONT> public OpenMapRealVector(int dimension) {<a name="line.64"></a>
68 <FONT color="green">065</FONT> this(dimension, DEFAULT_ZERO_TOLERANCE);<a name="line.65"></a>
69 <FONT color="green">066</FONT> }<a name="line.66"></a>
70 <FONT color="green">067</FONT> <a name="line.67"></a>
71 <FONT color="green">068</FONT> /**<a name="line.68"></a>
72 <FONT color="green">069</FONT> * Construct a (dimension)-length vector of zeros, specifying zero tolerance.<a name="line.69"></a>
73 <FONT color="green">070</FONT> * @param dimension Size of the vector<a name="line.70"></a>
74 <FONT color="green">071</FONT> * @param epsilon The tolerance for having a value considered zero<a name="line.71"></a>
75 <FONT color="green">072</FONT> */<a name="line.72"></a>
76 <FONT color="green">073</FONT> public OpenMapRealVector(int dimension, double epsilon) {<a name="line.73"></a>
77 <FONT color="green">074</FONT> virtualSize = dimension;<a name="line.74"></a>
78 <FONT color="green">075</FONT> entries = new OpenIntToDoubleHashMap(0.0);<a name="line.75"></a>
79 <FONT color="green">076</FONT> this.epsilon = epsilon;<a name="line.76"></a>
80 <FONT color="green">077</FONT> }<a name="line.77"></a>
81 <FONT color="green">078</FONT> <a name="line.78"></a>
82 <FONT color="green">079</FONT> /**<a name="line.79"></a>
83 <FONT color="green">080</FONT> * Build a resized vector, for use with append.<a name="line.80"></a>
84 <FONT color="green">081</FONT> * @param v The original vector<a name="line.81"></a>
85 <FONT color="green">082</FONT> * @param resize The amount to resize it<a name="line.82"></a>
86 <FONT color="green">083</FONT> */<a name="line.83"></a>
87 <FONT color="green">084</FONT> protected OpenMapRealVector(OpenMapRealVector v, int resize) {<a name="line.84"></a>
88 <FONT color="green">085</FONT> virtualSize = v.getDimension() + resize;<a name="line.85"></a>
89 <FONT color="green">086</FONT> entries = new OpenIntToDoubleHashMap(v.entries);<a name="line.86"></a>
90 <FONT color="green">087</FONT> epsilon = v.epsilon;<a name="line.87"></a>
91 <FONT color="green">088</FONT> }<a name="line.88"></a>
92 <FONT color="green">089</FONT> <a name="line.89"></a>
93 <FONT color="green">090</FONT> /**<a name="line.90"></a>
94 <FONT color="green">091</FONT> * Build a vector with known the sparseness (for advanced use only).<a name="line.91"></a>
95 <FONT color="green">092</FONT> * @param dimension The size of the vector<a name="line.92"></a>
96 <FONT color="green">093</FONT> * @param expectedSize The expected number of non-zero entries<a name="line.93"></a>
97 <FONT color="green">094</FONT> */<a name="line.94"></a>
98 <FONT color="green">095</FONT> public OpenMapRealVector(int dimension, int expectedSize) {<a name="line.95"></a>
99 <FONT color="green">096</FONT> this(dimension, expectedSize, DEFAULT_ZERO_TOLERANCE);<a name="line.96"></a>
100 <FONT color="green">097</FONT> }<a name="line.97"></a>
101 <FONT color="green">098</FONT> <a name="line.98"></a>
102 <FONT color="green">099</FONT> /**<a name="line.99"></a>
103 <FONT color="green">100</FONT> * Build a vector with known the sparseness and zero tolerance setting (for advanced use only).<a name="line.100"></a>
104 <FONT color="green">101</FONT> * @param dimension The size of the vector<a name="line.101"></a>
105 <FONT color="green">102</FONT> * @param expectedSize The expected number of non-zero entries<a name="line.102"></a>
106 <FONT color="green">103</FONT> * @param epsilon The tolerance for having a value considered zero<a name="line.103"></a>
107 <FONT color="green">104</FONT> */<a name="line.104"></a>
108 <FONT color="green">105</FONT> public OpenMapRealVector(int dimension, int expectedSize, double epsilon) {<a name="line.105"></a>
109 <FONT color="green">106</FONT> virtualSize = dimension;<a name="line.106"></a>
110 <FONT color="green">107</FONT> entries = new OpenIntToDoubleHashMap(expectedSize, 0.0);<a name="line.107"></a>
111 <FONT color="green">108</FONT> this.epsilon = epsilon;<a name="line.108"></a>
112 <FONT color="green">109</FONT> }<a name="line.109"></a>
113 <FONT color="green">110</FONT> <a name="line.110"></a>
114 <FONT color="green">111</FONT> /**<a name="line.111"></a>
115 <FONT color="green">112</FONT> * Create from a double array.<a name="line.112"></a>
116 <FONT color="green">113</FONT> * Only non-zero entries will be stored<a name="line.113"></a>
117 <FONT color="green">114</FONT> * @param values The set of values to create from<a name="line.114"></a>
118 <FONT color="green">115</FONT> */<a name="line.115"></a>
119 <FONT color="green">116</FONT> public OpenMapRealVector(double[] values) {<a name="line.116"></a>
120 <FONT color="green">117</FONT> this(values, DEFAULT_ZERO_TOLERANCE);<a name="line.117"></a>
121 <FONT color="green">118</FONT> }<a name="line.118"></a>
122 <FONT color="green">119</FONT> <a name="line.119"></a>
123 <FONT color="green">120</FONT> /**<a name="line.120"></a>
124 <FONT color="green">121</FONT> * Create from a double array, specifying zero tolerance.<a name="line.121"></a>
125 <FONT color="green">122</FONT> * Only non-zero entries will be stored<a name="line.122"></a>
126 <FONT color="green">123</FONT> * @param values The set of values to create from<a name="line.123"></a>
127 <FONT color="green">124</FONT> * @param epsilon The tolerance for having a value considered zero<a name="line.124"></a>
128 <FONT color="green">125</FONT> */<a name="line.125"></a>
129 <FONT color="green">126</FONT> public OpenMapRealVector(double[] values, double epsilon) {<a name="line.126"></a>
130 <FONT color="green">127</FONT> virtualSize = values.length;<a name="line.127"></a>
131 <FONT color="green">128</FONT> entries = new OpenIntToDoubleHashMap(0.0);<a name="line.128"></a>
132 <FONT color="green">129</FONT> this.epsilon = epsilon;<a name="line.129"></a>
133 <FONT color="green">130</FONT> for (int key = 0; key &lt; values.length; key++) {<a name="line.130"></a>
134 <FONT color="green">131</FONT> double value = values[key];<a name="line.131"></a>
135 <FONT color="green">132</FONT> if (!isDefaultValue(value)) {<a name="line.132"></a>
136 <FONT color="green">133</FONT> entries.put(key, value);<a name="line.133"></a>
137 <FONT color="green">134</FONT> }<a name="line.134"></a>
138 <FONT color="green">135</FONT> }<a name="line.135"></a>
139 <FONT color="green">136</FONT> }<a name="line.136"></a>
140 <FONT color="green">137</FONT> <a name="line.137"></a>
141 <FONT color="green">138</FONT> /**<a name="line.138"></a>
142 <FONT color="green">139</FONT> * Create from a Double array.<a name="line.139"></a>
143 <FONT color="green">140</FONT> * Only non-zero entries will be stored<a name="line.140"></a>
144 <FONT color="green">141</FONT> * @param values The set of values to create from<a name="line.141"></a>
145 <FONT color="green">142</FONT> */<a name="line.142"></a>
146 <FONT color="green">143</FONT> public OpenMapRealVector(Double[] values) {<a name="line.143"></a>
147 <FONT color="green">144</FONT> this(values, DEFAULT_ZERO_TOLERANCE);<a name="line.144"></a>
148 <FONT color="green">145</FONT> }<a name="line.145"></a>
149 <FONT color="green">146</FONT> <a name="line.146"></a>
150 <FONT color="green">147</FONT> /**<a name="line.147"></a>
151 <FONT color="green">148</FONT> * Create from a Double array.<a name="line.148"></a>
152 <FONT color="green">149</FONT> * Only non-zero entries will be stored<a name="line.149"></a>
153 <FONT color="green">150</FONT> * @param values The set of values to create from<a name="line.150"></a>
154 <FONT color="green">151</FONT> * @param epsilon The tolerance for having a value considered zero<a name="line.151"></a>
155 <FONT color="green">152</FONT> */<a name="line.152"></a>
156 <FONT color="green">153</FONT> public OpenMapRealVector(Double[] values, double epsilon) {<a name="line.153"></a>
157 <FONT color="green">154</FONT> virtualSize = values.length;<a name="line.154"></a>
158 <FONT color="green">155</FONT> entries = new OpenIntToDoubleHashMap(0.0);<a name="line.155"></a>
159 <FONT color="green">156</FONT> this.epsilon = epsilon;<a name="line.156"></a>
160 <FONT color="green">157</FONT> for (int key = 0; key &lt; values.length; key++) {<a name="line.157"></a>
161 <FONT color="green">158</FONT> double value = values[key].doubleValue();<a name="line.158"></a>
162 <FONT color="green">159</FONT> if (!isDefaultValue(value)) {<a name="line.159"></a>
163 <FONT color="green">160</FONT> entries.put(key, value);<a name="line.160"></a>
164 <FONT color="green">161</FONT> }<a name="line.161"></a>
165 <FONT color="green">162</FONT> }<a name="line.162"></a>
166 <FONT color="green">163</FONT> }<a name="line.163"></a>
167 <FONT color="green">164</FONT> <a name="line.164"></a>
168 <FONT color="green">165</FONT> /**<a name="line.165"></a>
169 <FONT color="green">166</FONT> * Copy constructor.<a name="line.166"></a>
170 <FONT color="green">167</FONT> * @param v The instance to copy from<a name="line.167"></a>
171 <FONT color="green">168</FONT> */<a name="line.168"></a>
172 <FONT color="green">169</FONT> public OpenMapRealVector(OpenMapRealVector v) {<a name="line.169"></a>
173 <FONT color="green">170</FONT> virtualSize = v.getDimension();<a name="line.170"></a>
174 <FONT color="green">171</FONT> entries = new OpenIntToDoubleHashMap(v.getEntries());<a name="line.171"></a>
175 <FONT color="green">172</FONT> epsilon = v.epsilon;<a name="line.172"></a>
176 <FONT color="green">173</FONT> }<a name="line.173"></a>
177 <FONT color="green">174</FONT> <a name="line.174"></a>
178 <FONT color="green">175</FONT> /**<a name="line.175"></a>
179 <FONT color="green">176</FONT> * Generic copy constructor.<a name="line.176"></a>
180 <FONT color="green">177</FONT> * @param v The instance to copy from<a name="line.177"></a>
181 <FONT color="green">178</FONT> */<a name="line.178"></a>
182 <FONT color="green">179</FONT> public OpenMapRealVector(RealVector v) {<a name="line.179"></a>
183 <FONT color="green">180</FONT> virtualSize = v.getDimension();<a name="line.180"></a>
184 <FONT color="green">181</FONT> entries = new OpenIntToDoubleHashMap(0.0);<a name="line.181"></a>
185 <FONT color="green">182</FONT> epsilon = DEFAULT_ZERO_TOLERANCE;<a name="line.182"></a>
186 <FONT color="green">183</FONT> for (int key = 0; key &lt; virtualSize; key++) {<a name="line.183"></a>
187 <FONT color="green">184</FONT> double value = v.getEntry(key);<a name="line.184"></a>
188 <FONT color="green">185</FONT> if (!isDefaultValue(value)) {<a name="line.185"></a>
189 <FONT color="green">186</FONT> entries.put(key, value);<a name="line.186"></a>
190 <FONT color="green">187</FONT> }<a name="line.187"></a>
191 <FONT color="green">188</FONT> }<a name="line.188"></a>
192 <FONT color="green">189</FONT> }<a name="line.189"></a>
193 <FONT color="green">190</FONT> <a name="line.190"></a>
194 <FONT color="green">191</FONT> /**<a name="line.191"></a>
195 <FONT color="green">192</FONT> * Get the entries of this instance.<a name="line.192"></a>
196 <FONT color="green">193</FONT> * @return entries of this instance<a name="line.193"></a>
197 <FONT color="green">194</FONT> */<a name="line.194"></a>
198 <FONT color="green">195</FONT> private OpenIntToDoubleHashMap getEntries() {<a name="line.195"></a>
199 <FONT color="green">196</FONT> return entries;<a name="line.196"></a>
200 <FONT color="green">197</FONT> }<a name="line.197"></a>
201 <FONT color="green">198</FONT> <a name="line.198"></a>
202 <FONT color="green">199</FONT> /**<a name="line.199"></a>
203 <FONT color="green">200</FONT> * Determine if this value is within epsilon of zero.<a name="line.200"></a>
204 <FONT color="green">201</FONT> * @param value The value to test<a name="line.201"></a>
205 <FONT color="green">202</FONT> * @return &lt;code&gt;true&lt;/code&gt; if this value is within epsilon to zero, &lt;code&gt;false&lt;/code&gt; otherwise<a name="line.202"></a>
206 <FONT color="green">203</FONT> * @since 2.1<a name="line.203"></a>
207 <FONT color="green">204</FONT> */<a name="line.204"></a>
208 <FONT color="green">205</FONT> protected boolean isDefaultValue(double value) {<a name="line.205"></a>
209 <FONT color="green">206</FONT> return Math.abs(value) &lt; epsilon;<a name="line.206"></a>
210 <FONT color="green">207</FONT> }<a name="line.207"></a>
211 <FONT color="green">208</FONT> <a name="line.208"></a>
212 <FONT color="green">209</FONT> /** {@inheritDoc} */<a name="line.209"></a>
213 <FONT color="green">210</FONT> @Override<a name="line.210"></a>
214 <FONT color="green">211</FONT> public RealVector add(RealVector v) throws IllegalArgumentException {<a name="line.211"></a>
215 <FONT color="green">212</FONT> checkVectorDimensions(v.getDimension());<a name="line.212"></a>
216 <FONT color="green">213</FONT> if (v instanceof OpenMapRealVector) {<a name="line.213"></a>
217 <FONT color="green">214</FONT> return add((OpenMapRealVector) v);<a name="line.214"></a>
218 <FONT color="green">215</FONT> } else {<a name="line.215"></a>
219 <FONT color="green">216</FONT> return super.add(v);<a name="line.216"></a>
220 <FONT color="green">217</FONT> }<a name="line.217"></a>
221 <FONT color="green">218</FONT> }<a name="line.218"></a>
222 <FONT color="green">219</FONT> <a name="line.219"></a>
223 <FONT color="green">220</FONT> /**<a name="line.220"></a>
224 <FONT color="green">221</FONT> * Optimized method to add two OpenMapRealVectors. Copies the larger vector, iterates over the smaller.<a name="line.221"></a>
225 <FONT color="green">222</FONT> * @param v Vector to add with<a name="line.222"></a>
226 <FONT color="green">223</FONT> * @return The sum of &lt;code&gt;this&lt;/code&gt; with &lt;code&gt;v&lt;/code&gt;<a name="line.223"></a>
227 <FONT color="green">224</FONT> * @throws IllegalArgumentException If the dimensions don't match<a name="line.224"></a>
228 <FONT color="green">225</FONT> */<a name="line.225"></a>
229 <FONT color="green">226</FONT> public OpenMapRealVector add(OpenMapRealVector v) throws IllegalArgumentException{<a name="line.226"></a>
230 <FONT color="green">227</FONT> checkVectorDimensions(v.getDimension());<a name="line.227"></a>
231 <FONT color="green">228</FONT> boolean copyThis = entries.size() &gt; v.entries.size();<a name="line.228"></a>
232 <FONT color="green">229</FONT> OpenMapRealVector res = copyThis ? this.copy() : v.copy();<a name="line.229"></a>
233 <FONT color="green">230</FONT> Iterator iter = copyThis ? v.entries.iterator() : entries.iterator();<a name="line.230"></a>
234 <FONT color="green">231</FONT> OpenIntToDoubleHashMap randomAccess = copyThis ? entries : v.entries;<a name="line.231"></a>
235 <FONT color="green">232</FONT> while (iter.hasNext()) {<a name="line.232"></a>
236 <FONT color="green">233</FONT> iter.advance();<a name="line.233"></a>
237 <FONT color="green">234</FONT> int key = iter.key();<a name="line.234"></a>
238 <FONT color="green">235</FONT> if (randomAccess.containsKey(key)) {<a name="line.235"></a>
239 <FONT color="green">236</FONT> res.setEntry(key, randomAccess.get(key) + iter.value());<a name="line.236"></a>
240 <FONT color="green">237</FONT> } else {<a name="line.237"></a>
241 <FONT color="green">238</FONT> res.setEntry(key, iter.value());<a name="line.238"></a>
242 <FONT color="green">239</FONT> }<a name="line.239"></a>
243 <FONT color="green">240</FONT> }<a name="line.240"></a>
244 <FONT color="green">241</FONT> return res;<a name="line.241"></a>
245 <FONT color="green">242</FONT> }<a name="line.242"></a>
246 <FONT color="green">243</FONT> <a name="line.243"></a>
247 <FONT color="green">244</FONT> /**<a name="line.244"></a>
248 <FONT color="green">245</FONT> * Optimized method to append a OpenMapRealVector.<a name="line.245"></a>
249 <FONT color="green">246</FONT> * @param v vector to append<a name="line.246"></a>
250 <FONT color="green">247</FONT> * @return The result of appending &lt;code&gt;v&lt;/code&gt; to self<a name="line.247"></a>
251 <FONT color="green">248</FONT> */<a name="line.248"></a>
252 <FONT color="green">249</FONT> public OpenMapRealVector append(OpenMapRealVector v) {<a name="line.249"></a>
253 <FONT color="green">250</FONT> OpenMapRealVector res = new OpenMapRealVector(this, v.getDimension());<a name="line.250"></a>
254 <FONT color="green">251</FONT> Iterator iter = v.entries.iterator();<a name="line.251"></a>
255 <FONT color="green">252</FONT> while (iter.hasNext()) {<a name="line.252"></a>
256 <FONT color="green">253</FONT> iter.advance();<a name="line.253"></a>
257 <FONT color="green">254</FONT> res.setEntry(iter.key() + virtualSize, iter.value());<a name="line.254"></a>
258 <FONT color="green">255</FONT> }<a name="line.255"></a>
259 <FONT color="green">256</FONT> return res;<a name="line.256"></a>
260 <FONT color="green">257</FONT> }<a name="line.257"></a>
261 <FONT color="green">258</FONT> <a name="line.258"></a>
262 <FONT color="green">259</FONT> /** {@inheritDoc} */<a name="line.259"></a>
263 <FONT color="green">260</FONT> public OpenMapRealVector append(RealVector v) {<a name="line.260"></a>
264 <FONT color="green">261</FONT> if (v instanceof OpenMapRealVector) {<a name="line.261"></a>
265 <FONT color="green">262</FONT> return append((OpenMapRealVector) v);<a name="line.262"></a>
266 <FONT color="green">263</FONT> }<a name="line.263"></a>
267 <FONT color="green">264</FONT> return append(v.getData());<a name="line.264"></a>
268 <FONT color="green">265</FONT> }<a name="line.265"></a>
269 <FONT color="green">266</FONT> <a name="line.266"></a>
270 <FONT color="green">267</FONT> /** {@inheritDoc} */<a name="line.267"></a>
271 <FONT color="green">268</FONT> public OpenMapRealVector append(double d) {<a name="line.268"></a>
272 <FONT color="green">269</FONT> OpenMapRealVector res = new OpenMapRealVector(this, 1);<a name="line.269"></a>
273 <FONT color="green">270</FONT> res.setEntry(virtualSize, d);<a name="line.270"></a>
274 <FONT color="green">271</FONT> return res;<a name="line.271"></a>
275 <FONT color="green">272</FONT> }<a name="line.272"></a>
276 <FONT color="green">273</FONT> <a name="line.273"></a>
277 <FONT color="green">274</FONT> /** {@inheritDoc} */<a name="line.274"></a>
278 <FONT color="green">275</FONT> public OpenMapRealVector append(double[] a) {<a name="line.275"></a>
279 <FONT color="green">276</FONT> OpenMapRealVector res = new OpenMapRealVector(this, a.length);<a name="line.276"></a>
280 <FONT color="green">277</FONT> for (int i = 0; i &lt; a.length; i++) {<a name="line.277"></a>
281 <FONT color="green">278</FONT> res.setEntry(i + virtualSize, a[i]);<a name="line.278"></a>
282 <FONT color="green">279</FONT> }<a name="line.279"></a>
283 <FONT color="green">280</FONT> return res;<a name="line.280"></a>
284 <FONT color="green">281</FONT> }<a name="line.281"></a>
285 <FONT color="green">282</FONT> <a name="line.282"></a>
286 <FONT color="green">283</FONT> /**<a name="line.283"></a>
287 <FONT color="green">284</FONT> * {@inheritDoc}<a name="line.284"></a>
288 <FONT color="green">285</FONT> * @since 2.1<a name="line.285"></a>
289 <FONT color="green">286</FONT> */<a name="line.286"></a>
290 <FONT color="green">287</FONT> @Override<a name="line.287"></a>
291 <FONT color="green">288</FONT> public OpenMapRealVector copy() {<a name="line.288"></a>
292 <FONT color="green">289</FONT> return new OpenMapRealVector(this);<a name="line.289"></a>
293 <FONT color="green">290</FONT> }<a name="line.290"></a>
294 <FONT color="green">291</FONT> <a name="line.291"></a>
295 <FONT color="green">292</FONT> /**<a name="line.292"></a>
296 <FONT color="green">293</FONT> * Optimized method to compute the dot product with an OpenMapRealVector.<a name="line.293"></a>
297 <FONT color="green">294</FONT> * Iterates over the smaller of the two.<a name="line.294"></a>
298 <FONT color="green">295</FONT> * @param v The vector to compute the dot product with<a name="line.295"></a>
299 <FONT color="green">296</FONT> * @return The dot product of &lt;code&gt;this&lt;/code&gt; and &lt;code&gt;v&lt;/code&gt;<a name="line.296"></a>
300 <FONT color="green">297</FONT> * @throws IllegalArgumentException If the dimensions don't match<a name="line.297"></a>
301 <FONT color="green">298</FONT> */<a name="line.298"></a>
302 <FONT color="green">299</FONT> public double dotProduct(OpenMapRealVector v) throws IllegalArgumentException {<a name="line.299"></a>
303 <FONT color="green">300</FONT> checkVectorDimensions(v.getDimension());<a name="line.300"></a>
304 <FONT color="green">301</FONT> boolean thisIsSmaller = entries.size() &lt; v.entries.size();<a name="line.301"></a>
305 <FONT color="green">302</FONT> Iterator iter = thisIsSmaller ? entries.iterator() : v.entries.iterator();<a name="line.302"></a>
306 <FONT color="green">303</FONT> OpenIntToDoubleHashMap larger = thisIsSmaller ? v.entries : entries;<a name="line.303"></a>
307 <FONT color="green">304</FONT> double d = 0;<a name="line.304"></a>
308 <FONT color="green">305</FONT> while(iter.hasNext()) {<a name="line.305"></a>
309 <FONT color="green">306</FONT> iter.advance();<a name="line.306"></a>
310 <FONT color="green">307</FONT> d += iter.value() * larger.get(iter.key());<a name="line.307"></a>
311 <FONT color="green">308</FONT> }<a name="line.308"></a>
312 <FONT color="green">309</FONT> return d;<a name="line.309"></a>
313 <FONT color="green">310</FONT> }<a name="line.310"></a>
314 <FONT color="green">311</FONT> <a name="line.311"></a>
315 <FONT color="green">312</FONT> /** {@inheritDoc} */<a name="line.312"></a>
316 <FONT color="green">313</FONT> @Override<a name="line.313"></a>
317 <FONT color="green">314</FONT> public double dotProduct(RealVector v) throws IllegalArgumentException {<a name="line.314"></a>
318 <FONT color="green">315</FONT> if(v instanceof OpenMapRealVector) {<a name="line.315"></a>
319 <FONT color="green">316</FONT> return dotProduct((OpenMapRealVector)v);<a name="line.316"></a>
320 <FONT color="green">317</FONT> } else {<a name="line.317"></a>
321 <FONT color="green">318</FONT> return super.dotProduct(v);<a name="line.318"></a>
322 <FONT color="green">319</FONT> }<a name="line.319"></a>
323 <FONT color="green">320</FONT> }<a name="line.320"></a>
324 <FONT color="green">321</FONT> <a name="line.321"></a>
325 <FONT color="green">322</FONT> /** {@inheritDoc} */<a name="line.322"></a>
326 <FONT color="green">323</FONT> public OpenMapRealVector ebeDivide(RealVector v) throws IllegalArgumentException {<a name="line.323"></a>
327 <FONT color="green">324</FONT> checkVectorDimensions(v.getDimension());<a name="line.324"></a>
328 <FONT color="green">325</FONT> OpenMapRealVector res = new OpenMapRealVector(this);<a name="line.325"></a>
329 <FONT color="green">326</FONT> Iterator iter = res.entries.iterator();<a name="line.326"></a>
330 <FONT color="green">327</FONT> while (iter.hasNext()) {<a name="line.327"></a>
331 <FONT color="green">328</FONT> iter.advance();<a name="line.328"></a>
332 <FONT color="green">329</FONT> res.setEntry(iter.key(), iter.value() / v.getEntry(iter.key()));<a name="line.329"></a>
333 <FONT color="green">330</FONT> }<a name="line.330"></a>
334 <FONT color="green">331</FONT> return res;<a name="line.331"></a>
335 <FONT color="green">332</FONT> }<a name="line.332"></a>
336 <FONT color="green">333</FONT> <a name="line.333"></a>
337 <FONT color="green">334</FONT> /** {@inheritDoc} */<a name="line.334"></a>
338 <FONT color="green">335</FONT> @Override<a name="line.335"></a>
339 <FONT color="green">336</FONT> public OpenMapRealVector ebeDivide(double[] v) throws IllegalArgumentException {<a name="line.336"></a>
340 <FONT color="green">337</FONT> checkVectorDimensions(v.length);<a name="line.337"></a>
341 <FONT color="green">338</FONT> OpenMapRealVector res = new OpenMapRealVector(this);<a name="line.338"></a>
342 <FONT color="green">339</FONT> Iterator iter = res.entries.iterator();<a name="line.339"></a>
343 <FONT color="green">340</FONT> while (iter.hasNext()) {<a name="line.340"></a>
344 <FONT color="green">341</FONT> iter.advance();<a name="line.341"></a>
345 <FONT color="green">342</FONT> res.setEntry(iter.key(), iter.value() / v[iter.key()]);<a name="line.342"></a>
346 <FONT color="green">343</FONT> }<a name="line.343"></a>
347 <FONT color="green">344</FONT> return res;<a name="line.344"></a>
348 <FONT color="green">345</FONT> }<a name="line.345"></a>
349 <FONT color="green">346</FONT> <a name="line.346"></a>
350 <FONT color="green">347</FONT> /** {@inheritDoc} */<a name="line.347"></a>
351 <FONT color="green">348</FONT> public OpenMapRealVector ebeMultiply(RealVector v) throws IllegalArgumentException {<a name="line.348"></a>
352 <FONT color="green">349</FONT> checkVectorDimensions(v.getDimension());<a name="line.349"></a>
353 <FONT color="green">350</FONT> OpenMapRealVector res = new OpenMapRealVector(this);<a name="line.350"></a>
354 <FONT color="green">351</FONT> Iterator iter = res.entries.iterator();<a name="line.351"></a>
355 <FONT color="green">352</FONT> while (iter.hasNext()) {<a name="line.352"></a>
356 <FONT color="green">353</FONT> iter.advance();<a name="line.353"></a>
357 <FONT color="green">354</FONT> res.setEntry(iter.key(), iter.value() * v.getEntry(iter.key()));<a name="line.354"></a>
358 <FONT color="green">355</FONT> }<a name="line.355"></a>
359 <FONT color="green">356</FONT> return res;<a name="line.356"></a>
360 <FONT color="green">357</FONT> }<a name="line.357"></a>
361 <FONT color="green">358</FONT> <a name="line.358"></a>
362 <FONT color="green">359</FONT> /** {@inheritDoc} */<a name="line.359"></a>
363 <FONT color="green">360</FONT> @Override<a name="line.360"></a>
364 <FONT color="green">361</FONT> public OpenMapRealVector ebeMultiply(double[] v) throws IllegalArgumentException {<a name="line.361"></a>
365 <FONT color="green">362</FONT> checkVectorDimensions(v.length);<a name="line.362"></a>
366 <FONT color="green">363</FONT> OpenMapRealVector res = new OpenMapRealVector(this);<a name="line.363"></a>
367 <FONT color="green">364</FONT> Iterator iter = res.entries.iterator();<a name="line.364"></a>
368 <FONT color="green">365</FONT> while (iter.hasNext()) {<a name="line.365"></a>
369 <FONT color="green">366</FONT> iter.advance();<a name="line.366"></a>
370 <FONT color="green">367</FONT> res.setEntry(iter.key(), iter.value() * v[iter.key()]);<a name="line.367"></a>
371 <FONT color="green">368</FONT> }<a name="line.368"></a>
372 <FONT color="green">369</FONT> return res;<a name="line.369"></a>
373 <FONT color="green">370</FONT> }<a name="line.370"></a>
374 <FONT color="green">371</FONT> <a name="line.371"></a>
375 <FONT color="green">372</FONT> /** {@inheritDoc} */<a name="line.372"></a>
376 <FONT color="green">373</FONT> public OpenMapRealVector getSubVector(int index, int n) throws MatrixIndexException {<a name="line.373"></a>
377 <FONT color="green">374</FONT> checkIndex(index);<a name="line.374"></a>
378 <FONT color="green">375</FONT> checkIndex(index + n - 1);<a name="line.375"></a>
379 <FONT color="green">376</FONT> OpenMapRealVector res = new OpenMapRealVector(n);<a name="line.376"></a>
380 <FONT color="green">377</FONT> int end = index + n;<a name="line.377"></a>
381 <FONT color="green">378</FONT> Iterator iter = entries.iterator();<a name="line.378"></a>
382 <FONT color="green">379</FONT> while (iter.hasNext()) {<a name="line.379"></a>
383 <FONT color="green">380</FONT> iter.advance();<a name="line.380"></a>
384 <FONT color="green">381</FONT> int key = iter.key();<a name="line.381"></a>
385 <FONT color="green">382</FONT> if (key &gt;= index &amp;&amp; key &lt; end) {<a name="line.382"></a>
386 <FONT color="green">383</FONT> res.setEntry(key - index, iter.value());<a name="line.383"></a>
387 <FONT color="green">384</FONT> }<a name="line.384"></a>
388 <FONT color="green">385</FONT> }<a name="line.385"></a>
389 <FONT color="green">386</FONT> return res;<a name="line.386"></a>
390 <FONT color="green">387</FONT> }<a name="line.387"></a>
391 <FONT color="green">388</FONT> <a name="line.388"></a>
392 <FONT color="green">389</FONT> /** {@inheritDoc} */<a name="line.389"></a>
393 <FONT color="green">390</FONT> @Override<a name="line.390"></a>
394 <FONT color="green">391</FONT> public double[] getData() {<a name="line.391"></a>
395 <FONT color="green">392</FONT> double[] res = new double[virtualSize];<a name="line.392"></a>
396 <FONT color="green">393</FONT> Iterator iter = entries.iterator();<a name="line.393"></a>
397 <FONT color="green">394</FONT> while (iter.hasNext()) {<a name="line.394"></a>
398 <FONT color="green">395</FONT> iter.advance();<a name="line.395"></a>
399 <FONT color="green">396</FONT> res[iter.key()] = iter.value();<a name="line.396"></a>
400 <FONT color="green">397</FONT> }<a name="line.397"></a>
401 <FONT color="green">398</FONT> return res;<a name="line.398"></a>
402 <FONT color="green">399</FONT> }<a name="line.399"></a>
403 <FONT color="green">400</FONT> <a name="line.400"></a>
404 <FONT color="green">401</FONT> /** {@inheritDoc} */<a name="line.401"></a>
405 <FONT color="green">402</FONT> public int getDimension() {<a name="line.402"></a>
406 <FONT color="green">403</FONT> return virtualSize;<a name="line.403"></a>
407 <FONT color="green">404</FONT> }<a name="line.404"></a>
408 <FONT color="green">405</FONT> <a name="line.405"></a>
409 <FONT color="green">406</FONT> /**<a name="line.406"></a>
410 <FONT color="green">407</FONT> * Optimized method to compute distance.<a name="line.407"></a>
411 <FONT color="green">408</FONT> * @param v The vector to compute distance to<a name="line.408"></a>
412 <FONT color="green">409</FONT> * @return The distance from &lt;code&gt;this&lt;/code&gt; and &lt;code&gt;v&lt;/code&gt;<a name="line.409"></a>
413 <FONT color="green">410</FONT> * @throws IllegalArgumentException If the dimensions don't match<a name="line.410"></a>
414 <FONT color="green">411</FONT> */<a name="line.411"></a>
415 <FONT color="green">412</FONT> public double getDistance(OpenMapRealVector v) throws IllegalArgumentException {<a name="line.412"></a>
416 <FONT color="green">413</FONT> Iterator iter = entries.iterator();<a name="line.413"></a>
417 <FONT color="green">414</FONT> double res = 0;<a name="line.414"></a>
418 <FONT color="green">415</FONT> while (iter.hasNext()) {<a name="line.415"></a>
419 <FONT color="green">416</FONT> iter.advance();<a name="line.416"></a>
420 <FONT color="green">417</FONT> int key = iter.key();<a name="line.417"></a>
421 <FONT color="green">418</FONT> double delta;<a name="line.418"></a>
422 <FONT color="green">419</FONT> delta = iter.value() - v.getEntry(key);<a name="line.419"></a>
423 <FONT color="green">420</FONT> res += delta * delta;<a name="line.420"></a>
424 <FONT color="green">421</FONT> }<a name="line.421"></a>
425 <FONT color="green">422</FONT> iter = v.getEntries().iterator();<a name="line.422"></a>
426 <FONT color="green">423</FONT> while (iter.hasNext()) {<a name="line.423"></a>
427 <FONT color="green">424</FONT> iter.advance();<a name="line.424"></a>
428 <FONT color="green">425</FONT> int key = iter.key();<a name="line.425"></a>
429 <FONT color="green">426</FONT> if (!entries.containsKey(key)) {<a name="line.426"></a>
430 <FONT color="green">427</FONT> final double value = iter.value();<a name="line.427"></a>
431 <FONT color="green">428</FONT> res += value * value;<a name="line.428"></a>
432 <FONT color="green">429</FONT> }<a name="line.429"></a>
433 <FONT color="green">430</FONT> }<a name="line.430"></a>
434 <FONT color="green">431</FONT> return Math.sqrt(res);<a name="line.431"></a>
435 <FONT color="green">432</FONT> }<a name="line.432"></a>
436 <FONT color="green">433</FONT> <a name="line.433"></a>
437 <FONT color="green">434</FONT> /** {@inheritDoc} */<a name="line.434"></a>
438 <FONT color="green">435</FONT> @Override<a name="line.435"></a>
439 <FONT color="green">436</FONT> public double getDistance(RealVector v) throws IllegalArgumentException {<a name="line.436"></a>
440 <FONT color="green">437</FONT> checkVectorDimensions(v.getDimension());<a name="line.437"></a>
441 <FONT color="green">438</FONT> if (v instanceof OpenMapRealVector) {<a name="line.438"></a>
442 <FONT color="green">439</FONT> return getDistance((OpenMapRealVector) v);<a name="line.439"></a>
443 <FONT color="green">440</FONT> }<a name="line.440"></a>
444 <FONT color="green">441</FONT> return getDistance(v.getData());<a name="line.441"></a>
445 <FONT color="green">442</FONT> }<a name="line.442"></a>
446 <FONT color="green">443</FONT> <a name="line.443"></a>
447 <FONT color="green">444</FONT> /** {@inheritDoc} */<a name="line.444"></a>
448 <FONT color="green">445</FONT> @Override<a name="line.445"></a>
449 <FONT color="green">446</FONT> public double getDistance(double[] v) throws IllegalArgumentException {<a name="line.446"></a>
450 <FONT color="green">447</FONT> checkVectorDimensions(v.length);<a name="line.447"></a>
451 <FONT color="green">448</FONT> double res = 0;<a name="line.448"></a>
452 <FONT color="green">449</FONT> for (int i = 0; i &lt; v.length; i++) {<a name="line.449"></a>
453 <FONT color="green">450</FONT> double delta = entries.get(i) - v[i];<a name="line.450"></a>
454 <FONT color="green">451</FONT> res += delta * delta;<a name="line.451"></a>
455 <FONT color="green">452</FONT> }<a name="line.452"></a>
456 <FONT color="green">453</FONT> return Math.sqrt(res);<a name="line.453"></a>
457 <FONT color="green">454</FONT> }<a name="line.454"></a>
458 <FONT color="green">455</FONT> <a name="line.455"></a>
459 <FONT color="green">456</FONT> /** {@inheritDoc} */<a name="line.456"></a>
460 <FONT color="green">457</FONT> public double getEntry(int index) throws MatrixIndexException {<a name="line.457"></a>
461 <FONT color="green">458</FONT> checkIndex(index);<a name="line.458"></a>
462 <FONT color="green">459</FONT> return entries.get(index);<a name="line.459"></a>
463 <FONT color="green">460</FONT> }<a name="line.460"></a>
464 <FONT color="green">461</FONT> <a name="line.461"></a>
465 <FONT color="green">462</FONT> /**<a name="line.462"></a>
466 <FONT color="green">463</FONT> * Distance between two vectors.<a name="line.463"></a>
467 <FONT color="green">464</FONT> * &lt;p&gt;This method computes the distance consistent with<a name="line.464"></a>
468 <FONT color="green">465</FONT> * L&lt;sub&gt;1&lt;/sub&gt; norm, i.e. the sum of the absolute values of<a name="line.465"></a>
469 <FONT color="green">466</FONT> * elements differences.&lt;/p&gt;<a name="line.466"></a>
470 <FONT color="green">467</FONT> * @param v vector to which distance is requested<a name="line.467"></a>
471 <FONT color="green">468</FONT> * @return distance between two vectors.<a name="line.468"></a>
472 <FONT color="green">469</FONT> */<a name="line.469"></a>
473 <FONT color="green">470</FONT> public double getL1Distance(OpenMapRealVector v) {<a name="line.470"></a>
474 <FONT color="green">471</FONT> double max = 0;<a name="line.471"></a>
475 <FONT color="green">472</FONT> Iterator iter = entries.iterator();<a name="line.472"></a>
476 <FONT color="green">473</FONT> while (iter.hasNext()) {<a name="line.473"></a>
477 <FONT color="green">474</FONT> iter.advance();<a name="line.474"></a>
478 <FONT color="green">475</FONT> double delta = Math.abs(iter.value() - v.getEntry(iter.key()));<a name="line.475"></a>
479 <FONT color="green">476</FONT> max += delta;<a name="line.476"></a>
480 <FONT color="green">477</FONT> }<a name="line.477"></a>
481 <FONT color="green">478</FONT> iter = v.getEntries().iterator();<a name="line.478"></a>
482 <FONT color="green">479</FONT> while (iter.hasNext()) {<a name="line.479"></a>
483 <FONT color="green">480</FONT> iter.advance();<a name="line.480"></a>
484 <FONT color="green">481</FONT> int key = iter.key();<a name="line.481"></a>
485 <FONT color="green">482</FONT> if (!entries.containsKey(key)) {<a name="line.482"></a>
486 <FONT color="green">483</FONT> double delta = Math.abs(iter.value());<a name="line.483"></a>
487 <FONT color="green">484</FONT> max += Math.abs(delta);<a name="line.484"></a>
488 <FONT color="green">485</FONT> }<a name="line.485"></a>
489 <FONT color="green">486</FONT> }<a name="line.486"></a>
490 <FONT color="green">487</FONT> return max;<a name="line.487"></a>
491 <FONT color="green">488</FONT> }<a name="line.488"></a>
492 <FONT color="green">489</FONT> <a name="line.489"></a>
493 <FONT color="green">490</FONT> /** {@inheritDoc} */<a name="line.490"></a>
494 <FONT color="green">491</FONT> @Override<a name="line.491"></a>
495 <FONT color="green">492</FONT> public double getL1Distance(RealVector v) throws IllegalArgumentException {<a name="line.492"></a>
496 <FONT color="green">493</FONT> checkVectorDimensions(v.getDimension());<a name="line.493"></a>
497 <FONT color="green">494</FONT> if (v instanceof OpenMapRealVector) {<a name="line.494"></a>
498 <FONT color="green">495</FONT> return getL1Distance((OpenMapRealVector) v);<a name="line.495"></a>
499 <FONT color="green">496</FONT> }<a name="line.496"></a>
500 <FONT color="green">497</FONT> return getL1Distance(v.getData());<a name="line.497"></a>
501 <FONT color="green">498</FONT> }<a name="line.498"></a>
502 <FONT color="green">499</FONT> <a name="line.499"></a>
503 <FONT color="green">500</FONT> /** {@inheritDoc} */<a name="line.500"></a>
504 <FONT color="green">501</FONT> @Override<a name="line.501"></a>
505 <FONT color="green">502</FONT> public double getL1Distance(double[] v) throws IllegalArgumentException {<a name="line.502"></a>
506 <FONT color="green">503</FONT> checkVectorDimensions(v.length);<a name="line.503"></a>
507 <FONT color="green">504</FONT> double max = 0;<a name="line.504"></a>
508 <FONT color="green">505</FONT> for (int i = 0; i &lt; v.length; i++) {<a name="line.505"></a>
509 <FONT color="green">506</FONT> double delta = Math.abs(getEntry(i) - v[i]);<a name="line.506"></a>
510 <FONT color="green">507</FONT> max += delta;<a name="line.507"></a>
511 <FONT color="green">508</FONT> }<a name="line.508"></a>
512 <FONT color="green">509</FONT> return max;<a name="line.509"></a>
513 <FONT color="green">510</FONT> }<a name="line.510"></a>
514 <FONT color="green">511</FONT> <a name="line.511"></a>
515 <FONT color="green">512</FONT> /**<a name="line.512"></a>
516 <FONT color="green">513</FONT> * Optimized method to compute LInfDistance.<a name="line.513"></a>
517 <FONT color="green">514</FONT> * @param v The vector to compute from<a name="line.514"></a>
518 <FONT color="green">515</FONT> * @return the LInfDistance<a name="line.515"></a>
519 <FONT color="green">516</FONT> */<a name="line.516"></a>
520 <FONT color="green">517</FONT> private double getLInfDistance(OpenMapRealVector v) {<a name="line.517"></a>
521 <FONT color="green">518</FONT> double max = 0;<a name="line.518"></a>
522 <FONT color="green">519</FONT> Iterator iter = entries.iterator();<a name="line.519"></a>
523 <FONT color="green">520</FONT> while (iter.hasNext()) {<a name="line.520"></a>
524 <FONT color="green">521</FONT> iter.advance();<a name="line.521"></a>
525 <FONT color="green">522</FONT> double delta = Math.abs(iter.value() - v.getEntry(iter.key()));<a name="line.522"></a>
526 <FONT color="green">523</FONT> if (delta &gt; max) {<a name="line.523"></a>
527 <FONT color="green">524</FONT> max = delta;<a name="line.524"></a>
528 <FONT color="green">525</FONT> }<a name="line.525"></a>
529 <FONT color="green">526</FONT> }<a name="line.526"></a>
530 <FONT color="green">527</FONT> iter = v.getEntries().iterator();<a name="line.527"></a>
531 <FONT color="green">528</FONT> while (iter.hasNext()) {<a name="line.528"></a>
532 <FONT color="green">529</FONT> iter.advance();<a name="line.529"></a>
533 <FONT color="green">530</FONT> int key = iter.key();<a name="line.530"></a>
534 <FONT color="green">531</FONT> if (!entries.containsKey(key)) {<a name="line.531"></a>
535 <FONT color="green">532</FONT> if (iter.value() &gt; max) {<a name="line.532"></a>
536 <FONT color="green">533</FONT> max = iter.value();<a name="line.533"></a>
537 <FONT color="green">534</FONT> }<a name="line.534"></a>
538 <FONT color="green">535</FONT> }<a name="line.535"></a>
539 <FONT color="green">536</FONT> }<a name="line.536"></a>
540 <FONT color="green">537</FONT> return max;<a name="line.537"></a>
541 <FONT color="green">538</FONT> }<a name="line.538"></a>
542 <FONT color="green">539</FONT> <a name="line.539"></a>
543 <FONT color="green">540</FONT> /** {@inheritDoc} */<a name="line.540"></a>
544 <FONT color="green">541</FONT> @Override<a name="line.541"></a>
545 <FONT color="green">542</FONT> public double getLInfDistance(RealVector v) throws IllegalArgumentException {<a name="line.542"></a>
546 <FONT color="green">543</FONT> checkVectorDimensions(v.getDimension());<a name="line.543"></a>
547 <FONT color="green">544</FONT> if (v instanceof OpenMapRealVector) {<a name="line.544"></a>
548 <FONT color="green">545</FONT> return getLInfDistance((OpenMapRealVector) v);<a name="line.545"></a>
549 <FONT color="green">546</FONT> }<a name="line.546"></a>
550 <FONT color="green">547</FONT> return getLInfDistance(v.getData());<a name="line.547"></a>
551 <FONT color="green">548</FONT> }<a name="line.548"></a>
552 <FONT color="green">549</FONT> <a name="line.549"></a>
553 <FONT color="green">550</FONT> /** {@inheritDoc} */<a name="line.550"></a>
554 <FONT color="green">551</FONT> @Override<a name="line.551"></a>
555 <FONT color="green">552</FONT> public double getLInfDistance(double[] v) throws IllegalArgumentException {<a name="line.552"></a>
556 <FONT color="green">553</FONT> checkVectorDimensions(v.length);<a name="line.553"></a>
557 <FONT color="green">554</FONT> double max = 0;<a name="line.554"></a>
558 <FONT color="green">555</FONT> for (int i = 0; i &lt; v.length; i++) {<a name="line.555"></a>
559 <FONT color="green">556</FONT> double delta = Math.abs(getEntry(i) - v[i]);<a name="line.556"></a>
560 <FONT color="green">557</FONT> if (delta &gt; max) {<a name="line.557"></a>
561 <FONT color="green">558</FONT> max = delta;<a name="line.558"></a>
562 <FONT color="green">559</FONT> }<a name="line.559"></a>
563 <FONT color="green">560</FONT> }<a name="line.560"></a>
564 <FONT color="green">561</FONT> return max;<a name="line.561"></a>
565 <FONT color="green">562</FONT> }<a name="line.562"></a>
566 <FONT color="green">563</FONT> <a name="line.563"></a>
567 <FONT color="green">564</FONT> /** {@inheritDoc} */<a name="line.564"></a>
568 <FONT color="green">565</FONT> public boolean isInfinite() {<a name="line.565"></a>
569 <FONT color="green">566</FONT> boolean infiniteFound = false;<a name="line.566"></a>
570 <FONT color="green">567</FONT> Iterator iter = entries.iterator();<a name="line.567"></a>
571 <FONT color="green">568</FONT> while (iter.hasNext()) {<a name="line.568"></a>
572 <FONT color="green">569</FONT> iter.advance();<a name="line.569"></a>
573 <FONT color="green">570</FONT> final double value = iter.value();<a name="line.570"></a>
574 <FONT color="green">571</FONT> if (Double.isNaN(value)) {<a name="line.571"></a>
575 <FONT color="green">572</FONT> return false;<a name="line.572"></a>
576 <FONT color="green">573</FONT> }<a name="line.573"></a>
577 <FONT color="green">574</FONT> if (Double.isInfinite(value)) {<a name="line.574"></a>
578 <FONT color="green">575</FONT> infiniteFound = true;<a name="line.575"></a>
579 <FONT color="green">576</FONT> }<a name="line.576"></a>
580 <FONT color="green">577</FONT> }<a name="line.577"></a>
581 <FONT color="green">578</FONT> return infiniteFound;<a name="line.578"></a>
582 <FONT color="green">579</FONT> }<a name="line.579"></a>
583 <FONT color="green">580</FONT> <a name="line.580"></a>
584 <FONT color="green">581</FONT> /** {@inheritDoc} */<a name="line.581"></a>
585 <FONT color="green">582</FONT> public boolean isNaN() {<a name="line.582"></a>
586 <FONT color="green">583</FONT> Iterator iter = entries.iterator();<a name="line.583"></a>
587 <FONT color="green">584</FONT> while (iter.hasNext()) {<a name="line.584"></a>
588 <FONT color="green">585</FONT> iter.advance();<a name="line.585"></a>
589 <FONT color="green">586</FONT> if (Double.isNaN(iter.value())) {<a name="line.586"></a>
590 <FONT color="green">587</FONT> return true;<a name="line.587"></a>
591 <FONT color="green">588</FONT> }<a name="line.588"></a>
592 <FONT color="green">589</FONT> }<a name="line.589"></a>
593 <FONT color="green">590</FONT> return false;<a name="line.590"></a>
594 <FONT color="green">591</FONT> }<a name="line.591"></a>
595 <FONT color="green">592</FONT> <a name="line.592"></a>
596 <FONT color="green">593</FONT> /** {@inheritDoc} */<a name="line.593"></a>
597 <FONT color="green">594</FONT> @Override<a name="line.594"></a>
598 <FONT color="green">595</FONT> public OpenMapRealVector mapAdd(double d) {<a name="line.595"></a>
599 <FONT color="green">596</FONT> return copy().mapAddToSelf(d);<a name="line.596"></a>
600 <FONT color="green">597</FONT> }<a name="line.597"></a>
601 <FONT color="green">598</FONT> <a name="line.598"></a>
602 <FONT color="green">599</FONT> /** {@inheritDoc} */<a name="line.599"></a>
603 <FONT color="green">600</FONT> @Override<a name="line.600"></a>
604 <FONT color="green">601</FONT> public OpenMapRealVector mapAddToSelf(double d) {<a name="line.601"></a>
605 <FONT color="green">602</FONT> for (int i = 0; i &lt; virtualSize; i++) {<a name="line.602"></a>
606 <FONT color="green">603</FONT> setEntry(i, getEntry(i) + d);<a name="line.603"></a>
607 <FONT color="green">604</FONT> }<a name="line.604"></a>
608 <FONT color="green">605</FONT> return this;<a name="line.605"></a>
609 <FONT color="green">606</FONT> }<a name="line.606"></a>
610 <FONT color="green">607</FONT> <a name="line.607"></a>
611 <FONT color="green">608</FONT> /** {@inheritDoc} */<a name="line.608"></a>
612 <FONT color="green">609</FONT> @Override<a name="line.609"></a>
613 <FONT color="green">610</FONT> public RealMatrix outerProduct(double[] v) throws IllegalArgumentException {<a name="line.610"></a>
614 <FONT color="green">611</FONT> checkVectorDimensions(v.length);<a name="line.611"></a>
615 <FONT color="green">612</FONT> RealMatrix res = new OpenMapRealMatrix(virtualSize, virtualSize);<a name="line.612"></a>
616 <FONT color="green">613</FONT> Iterator iter = entries.iterator();<a name="line.613"></a>
617 <FONT color="green">614</FONT> while (iter.hasNext()) {<a name="line.614"></a>
618 <FONT color="green">615</FONT> iter.advance();<a name="line.615"></a>
619 <FONT color="green">616</FONT> int row = iter.key();<a name="line.616"></a>
620 <FONT color="green">617</FONT> double value = iter.value();<a name="line.617"></a>
621 <FONT color="green">618</FONT> for (int col = 0; col &lt; virtualSize; col++) {<a name="line.618"></a>
622 <FONT color="green">619</FONT> res.setEntry(row, col, value * v[col]);<a name="line.619"></a>
623 <FONT color="green">620</FONT> }<a name="line.620"></a>
624 <FONT color="green">621</FONT> }<a name="line.621"></a>
625 <FONT color="green">622</FONT> return res;<a name="line.622"></a>
626 <FONT color="green">623</FONT> }<a name="line.623"></a>
627 <FONT color="green">624</FONT> <a name="line.624"></a>
628 <FONT color="green">625</FONT> /** {@inheritDoc} */<a name="line.625"></a>
629 <FONT color="green">626</FONT> public RealVector projection(RealVector v) throws IllegalArgumentException {<a name="line.626"></a>
630 <FONT color="green">627</FONT> checkVectorDimensions(v.getDimension());<a name="line.627"></a>
631 <FONT color="green">628</FONT> return v.mapMultiply(dotProduct(v) / v.dotProduct(v));<a name="line.628"></a>
632 <FONT color="green">629</FONT> }<a name="line.629"></a>
633 <FONT color="green">630</FONT> <a name="line.630"></a>
634 <FONT color="green">631</FONT> /** {@inheritDoc} */<a name="line.631"></a>
635 <FONT color="green">632</FONT> @Override<a name="line.632"></a>
636 <FONT color="green">633</FONT> public OpenMapRealVector projection(double[] v) throws IllegalArgumentException {<a name="line.633"></a>
637 <FONT color="green">634</FONT> checkVectorDimensions(v.length);<a name="line.634"></a>
638 <FONT color="green">635</FONT> return (OpenMapRealVector) projection(new OpenMapRealVector(v));<a name="line.635"></a>
639 <FONT color="green">636</FONT> }<a name="line.636"></a>
640 <FONT color="green">637</FONT> <a name="line.637"></a>
641 <FONT color="green">638</FONT> /** {@inheritDoc} */<a name="line.638"></a>
642 <FONT color="green">639</FONT> public void setEntry(int index, double value) throws MatrixIndexException {<a name="line.639"></a>
643 <FONT color="green">640</FONT> checkIndex(index);<a name="line.640"></a>
644 <FONT color="green">641</FONT> if (!isDefaultValue(value)) {<a name="line.641"></a>
645 <FONT color="green">642</FONT> entries.put(index, value);<a name="line.642"></a>
646 <FONT color="green">643</FONT> } else if (entries.containsKey(index)) {<a name="line.643"></a>
647 <FONT color="green">644</FONT> entries.remove(index);<a name="line.644"></a>
648 <FONT color="green">645</FONT> }<a name="line.645"></a>
649 <FONT color="green">646</FONT> }<a name="line.646"></a>
650 <FONT color="green">647</FONT> <a name="line.647"></a>
651 <FONT color="green">648</FONT> /** {@inheritDoc} */<a name="line.648"></a>
652 <FONT color="green">649</FONT> @Override<a name="line.649"></a>
653 <FONT color="green">650</FONT> public void setSubVector(int index, RealVector v) throws MatrixIndexException {<a name="line.650"></a>
654 <FONT color="green">651</FONT> checkIndex(index);<a name="line.651"></a>
655 <FONT color="green">652</FONT> checkIndex(index + v.getDimension() - 1);<a name="line.652"></a>
656 <FONT color="green">653</FONT> setSubVector(index, v.getData());<a name="line.653"></a>
657 <FONT color="green">654</FONT> }<a name="line.654"></a>
658 <FONT color="green">655</FONT> <a name="line.655"></a>
659 <FONT color="green">656</FONT> /** {@inheritDoc} */<a name="line.656"></a>
660 <FONT color="green">657</FONT> @Override<a name="line.657"></a>
661 <FONT color="green">658</FONT> public void setSubVector(int index, double[] v) throws MatrixIndexException {<a name="line.658"></a>
662 <FONT color="green">659</FONT> checkIndex(index);<a name="line.659"></a>
663 <FONT color="green">660</FONT> checkIndex(index + v.length - 1);<a name="line.660"></a>
664 <FONT color="green">661</FONT> for (int i = 0; i &lt; v.length; i++) {<a name="line.661"></a>
665 <FONT color="green">662</FONT> setEntry(i + index, v[i]);<a name="line.662"></a>
666 <FONT color="green">663</FONT> }<a name="line.663"></a>
667 <FONT color="green">664</FONT> }<a name="line.664"></a>
668 <FONT color="green">665</FONT> <a name="line.665"></a>
669 <FONT color="green">666</FONT> /** {@inheritDoc} */<a name="line.666"></a>
670 <FONT color="green">667</FONT> @Override<a name="line.667"></a>
671 <FONT color="green">668</FONT> public void set(double value) {<a name="line.668"></a>
672 <FONT color="green">669</FONT> for (int i = 0; i &lt; virtualSize; i++) {<a name="line.669"></a>
673 <FONT color="green">670</FONT> setEntry(i, value);<a name="line.670"></a>
674 <FONT color="green">671</FONT> }<a name="line.671"></a>
675 <FONT color="green">672</FONT> }<a name="line.672"></a>
676 <FONT color="green">673</FONT> <a name="line.673"></a>
677 <FONT color="green">674</FONT> /**<a name="line.674"></a>
678 <FONT color="green">675</FONT> * Optimized method to subtract OpenMapRealVectors.<a name="line.675"></a>
679 <FONT color="green">676</FONT> * @param v The vector to subtract from &lt;code&gt;this&lt;/code&gt;<a name="line.676"></a>
680 <FONT color="green">677</FONT> * @return The difference of &lt;code&gt;this&lt;/code&gt; and &lt;code&gt;v&lt;/code&gt;<a name="line.677"></a>
681 <FONT color="green">678</FONT> * @throws IllegalArgumentException If the dimensions don't match<a name="line.678"></a>
682 <FONT color="green">679</FONT> */<a name="line.679"></a>
683 <FONT color="green">680</FONT> public OpenMapRealVector subtract(OpenMapRealVector v) throws IllegalArgumentException{<a name="line.680"></a>
684 <FONT color="green">681</FONT> checkVectorDimensions(v.getDimension());<a name="line.681"></a>
685 <FONT color="green">682</FONT> OpenMapRealVector res = copy();<a name="line.682"></a>
686 <FONT color="green">683</FONT> Iterator iter = v.getEntries().iterator();<a name="line.683"></a>
687 <FONT color="green">684</FONT> while (iter.hasNext()) {<a name="line.684"></a>
688 <FONT color="green">685</FONT> iter.advance();<a name="line.685"></a>
689 <FONT color="green">686</FONT> int key = iter.key();<a name="line.686"></a>
690 <FONT color="green">687</FONT> if (entries.containsKey(key)) {<a name="line.687"></a>
691 <FONT color="green">688</FONT> res.setEntry(key, entries.get(key) - iter.value());<a name="line.688"></a>
692 <FONT color="green">689</FONT> } else {<a name="line.689"></a>
693 <FONT color="green">690</FONT> res.setEntry(key, -iter.value());<a name="line.690"></a>
694 <FONT color="green">691</FONT> }<a name="line.691"></a>
695 <FONT color="green">692</FONT> }<a name="line.692"></a>
696 <FONT color="green">693</FONT> return res;<a name="line.693"></a>
697 <FONT color="green">694</FONT> }<a name="line.694"></a>
698 <FONT color="green">695</FONT> <a name="line.695"></a>
699 <FONT color="green">696</FONT> /** {@inheritDoc} */<a name="line.696"></a>
700 <FONT color="green">697</FONT> @Override<a name="line.697"></a>
701 <FONT color="green">698</FONT> public OpenMapRealVector subtract(RealVector v) throws IllegalArgumentException {<a name="line.698"></a>
702 <FONT color="green">699</FONT> checkVectorDimensions(v.getDimension());<a name="line.699"></a>
703 <FONT color="green">700</FONT> if (v instanceof OpenMapRealVector) {<a name="line.700"></a>
704 <FONT color="green">701</FONT> return subtract((OpenMapRealVector) v);<a name="line.701"></a>
705 <FONT color="green">702</FONT> }<a name="line.702"></a>
706 <FONT color="green">703</FONT> return subtract(v.getData());<a name="line.703"></a>
707 <FONT color="green">704</FONT> }<a name="line.704"></a>
708 <FONT color="green">705</FONT> <a name="line.705"></a>
709 <FONT color="green">706</FONT> /** {@inheritDoc} */<a name="line.706"></a>
710 <FONT color="green">707</FONT> @Override<a name="line.707"></a>
711 <FONT color="green">708</FONT> public OpenMapRealVector subtract(double[] v) throws IllegalArgumentException {<a name="line.708"></a>
712 <FONT color="green">709</FONT> checkVectorDimensions(v.length);<a name="line.709"></a>
713 <FONT color="green">710</FONT> OpenMapRealVector res = new OpenMapRealVector(this);<a name="line.710"></a>
714 <FONT color="green">711</FONT> for (int i = 0; i &lt; v.length; i++) {<a name="line.711"></a>
715 <FONT color="green">712</FONT> if (entries.containsKey(i)) {<a name="line.712"></a>
716 <FONT color="green">713</FONT> res.setEntry(i, entries.get(i) - v[i]);<a name="line.713"></a>
717 <FONT color="green">714</FONT> } else {<a name="line.714"></a>
718 <FONT color="green">715</FONT> res.setEntry(i, -v[i]);<a name="line.715"></a>
719 <FONT color="green">716</FONT> }<a name="line.716"></a>
720 <FONT color="green">717</FONT> }<a name="line.717"></a>
721 <FONT color="green">718</FONT> return res;<a name="line.718"></a>
722 <FONT color="green">719</FONT> }<a name="line.719"></a>
723 <FONT color="green">720</FONT> <a name="line.720"></a>
724 <FONT color="green">721</FONT> <a name="line.721"></a>
725 <FONT color="green">722</FONT> /** {@inheritDoc} */<a name="line.722"></a>
726 <FONT color="green">723</FONT> @Override<a name="line.723"></a>
727 <FONT color="green">724</FONT> public OpenMapRealVector unitVector() {<a name="line.724"></a>
728 <FONT color="green">725</FONT> OpenMapRealVector res = copy();<a name="line.725"></a>
729 <FONT color="green">726</FONT> res.unitize();<a name="line.726"></a>
730 <FONT color="green">727</FONT> return res;<a name="line.727"></a>
731 <FONT color="green">728</FONT> }<a name="line.728"></a>
732 <FONT color="green">729</FONT> <a name="line.729"></a>
733 <FONT color="green">730</FONT> /** {@inheritDoc} */<a name="line.730"></a>
734 <FONT color="green">731</FONT> @Override<a name="line.731"></a>
735 <FONT color="green">732</FONT> public void unitize() {<a name="line.732"></a>
736 <FONT color="green">733</FONT> double norm = getNorm();<a name="line.733"></a>
737 <FONT color="green">734</FONT> if (isDefaultValue(norm)) {<a name="line.734"></a>
738 <FONT color="green">735</FONT> throw MathRuntimeException.createArithmeticException("cannot normalize a zero norm vector");<a name="line.735"></a>
739 <FONT color="green">736</FONT> }<a name="line.736"></a>
740 <FONT color="green">737</FONT> Iterator iter = entries.iterator();<a name="line.737"></a>
741 <FONT color="green">738</FONT> while (iter.hasNext()) {<a name="line.738"></a>
742 <FONT color="green">739</FONT> iter.advance();<a name="line.739"></a>
743 <FONT color="green">740</FONT> entries.put(iter.key(), iter.value() / norm);<a name="line.740"></a>
744 <FONT color="green">741</FONT> }<a name="line.741"></a>
745 <FONT color="green">742</FONT> <a name="line.742"></a>
746 <FONT color="green">743</FONT> }<a name="line.743"></a>
747 <FONT color="green">744</FONT> <a name="line.744"></a>
748 <FONT color="green">745</FONT> <a name="line.745"></a>
749 <FONT color="green">746</FONT> /** {@inheritDoc} */<a name="line.746"></a>
750 <FONT color="green">747</FONT> @Override<a name="line.747"></a>
751 <FONT color="green">748</FONT> public double[] toArray() {<a name="line.748"></a>
752 <FONT color="green">749</FONT> return getData();<a name="line.749"></a>
753 <FONT color="green">750</FONT> }<a name="line.750"></a>
754 <FONT color="green">751</FONT> <a name="line.751"></a>
755 <FONT color="green">752</FONT> /** {@inheritDoc}<a name="line.752"></a>
756 <FONT color="green">753</FONT> * &lt;p&gt; Implementation Note: This works on exact values, and as a result<a name="line.753"></a>
757 <FONT color="green">754</FONT> * it is possible for {@code a.subtract(b)} to be the zero vector, while<a name="line.754"></a>
758 <FONT color="green">755</FONT> * {@code a.hashCode() != b.hashCode()}.&lt;/p&gt;<a name="line.755"></a>
759 <FONT color="green">756</FONT> */<a name="line.756"></a>
760 <FONT color="green">757</FONT> @Override<a name="line.757"></a>
761 <FONT color="green">758</FONT> public int hashCode() {<a name="line.758"></a>
762 <FONT color="green">759</FONT> final int prime = 31;<a name="line.759"></a>
763 <FONT color="green">760</FONT> int result = 1;<a name="line.760"></a>
764 <FONT color="green">761</FONT> long temp;<a name="line.761"></a>
765 <FONT color="green">762</FONT> temp = Double.doubleToLongBits(epsilon);<a name="line.762"></a>
766 <FONT color="green">763</FONT> result = prime * result + (int) (temp ^ (temp &gt;&gt;&gt; 32));<a name="line.763"></a>
767 <FONT color="green">764</FONT> result = prime * result + virtualSize;<a name="line.764"></a>
768 <FONT color="green">765</FONT> Iterator iter = entries.iterator();<a name="line.765"></a>
769 <FONT color="green">766</FONT> while (iter.hasNext()) {<a name="line.766"></a>
770 <FONT color="green">767</FONT> iter.advance();<a name="line.767"></a>
771 <FONT color="green">768</FONT> temp = Double.doubleToLongBits(iter.value());<a name="line.768"></a>
772 <FONT color="green">769</FONT> result = prime * result + (int) (temp ^ (temp &gt;&gt;32));<a name="line.769"></a>
773 <FONT color="green">770</FONT> }<a name="line.770"></a>
774 <FONT color="green">771</FONT> return result;<a name="line.771"></a>
775 <FONT color="green">772</FONT> }<a name="line.772"></a>
776 <FONT color="green">773</FONT> <a name="line.773"></a>
777 <FONT color="green">774</FONT> /**<a name="line.774"></a>
778 <FONT color="green">775</FONT> * &lt;p&gt; Implementation Note: This performs an exact comparison, and as a result<a name="line.775"></a>
779 <FONT color="green">776</FONT> * it is possible for {@code a.subtract(b}} to be the zero vector, while<a name="line.776"></a>
780 <FONT color="green">777</FONT> * {@code a.equals(b) == false}.&lt;/p&gt;<a name="line.777"></a>
781 <FONT color="green">778</FONT> * {@inheritDoc}<a name="line.778"></a>
782 <FONT color="green">779</FONT> */<a name="line.779"></a>
783 <FONT color="green">780</FONT> @Override<a name="line.780"></a>
784 <FONT color="green">781</FONT> public boolean equals(Object obj) {<a name="line.781"></a>
785 <FONT color="green">782</FONT> if (this == obj) {<a name="line.782"></a>
786 <FONT color="green">783</FONT> return true;<a name="line.783"></a>
787 <FONT color="green">784</FONT> }<a name="line.784"></a>
788 <FONT color="green">785</FONT> if (!(obj instanceof OpenMapRealVector)) {<a name="line.785"></a>
789 <FONT color="green">786</FONT> return false;<a name="line.786"></a>
790 <FONT color="green">787</FONT> }<a name="line.787"></a>
791 <FONT color="green">788</FONT> OpenMapRealVector other = (OpenMapRealVector) obj;<a name="line.788"></a>
792 <FONT color="green">789</FONT> if (virtualSize != other.virtualSize) {<a name="line.789"></a>
793 <FONT color="green">790</FONT> return false;<a name="line.790"></a>
794 <FONT color="green">791</FONT> }<a name="line.791"></a>
795 <FONT color="green">792</FONT> if (Double.doubleToLongBits(epsilon) !=<a name="line.792"></a>
796 <FONT color="green">793</FONT> Double.doubleToLongBits(other.epsilon)) {<a name="line.793"></a>
797 <FONT color="green">794</FONT> return false;<a name="line.794"></a>
798 <FONT color="green">795</FONT> }<a name="line.795"></a>
799 <FONT color="green">796</FONT> Iterator iter = entries.iterator();<a name="line.796"></a>
800 <FONT color="green">797</FONT> while (iter.hasNext()) {<a name="line.797"></a>
801 <FONT color="green">798</FONT> iter.advance();<a name="line.798"></a>
802 <FONT color="green">799</FONT> double test = other.getEntry(iter.key());<a name="line.799"></a>
803 <FONT color="green">800</FONT> if (Double.doubleToLongBits(test) != Double.doubleToLongBits(iter.value())) {<a name="line.800"></a>
804 <FONT color="green">801</FONT> return false;<a name="line.801"></a>
805 <FONT color="green">802</FONT> }<a name="line.802"></a>
806 <FONT color="green">803</FONT> }<a name="line.803"></a>
807 <FONT color="green">804</FONT> iter = other.getEntries().iterator();<a name="line.804"></a>
808 <FONT color="green">805</FONT> while (iter.hasNext()) {<a name="line.805"></a>
809 <FONT color="green">806</FONT> iter.advance();<a name="line.806"></a>
810 <FONT color="green">807</FONT> double test = iter.value();<a name="line.807"></a>
811 <FONT color="green">808</FONT> if (Double.doubleToLongBits(test) != Double.doubleToLongBits(getEntry(iter.key()))) {<a name="line.808"></a>
812 <FONT color="green">809</FONT> return false;<a name="line.809"></a>
813 <FONT color="green">810</FONT> }<a name="line.810"></a>
814 <FONT color="green">811</FONT> }<a name="line.811"></a>
815 <FONT color="green">812</FONT> return true;<a name="line.812"></a>
816 <FONT color="green">813</FONT> }<a name="line.813"></a>
817 <FONT color="green">814</FONT> <a name="line.814"></a>
818 <FONT color="green">815</FONT> /**<a name="line.815"></a>
819 <FONT color="green">816</FONT> *<a name="line.816"></a>
820 <FONT color="green">817</FONT> * @return the percentage of none zero elements as a decimal percent.<a name="line.817"></a>
821 <FONT color="green">818</FONT> */<a name="line.818"></a>
822 <FONT color="green">819</FONT> public double getSparcity() {<a name="line.819"></a>
823 <FONT color="green">820</FONT> return (double)entries.size()/(double)getDimension();<a name="line.820"></a>
824 <FONT color="green">821</FONT> }<a name="line.821"></a>
825 <FONT color="green">822</FONT> <a name="line.822"></a>
826 <FONT color="green">823</FONT> /** {@inheritDoc} */<a name="line.823"></a>
827 <FONT color="green">824</FONT> @Override<a name="line.824"></a>
828 <FONT color="green">825</FONT> public java.util.Iterator&lt;Entry&gt; sparseIterator() {<a name="line.825"></a>
829 <FONT color="green">826</FONT> return new OpenMapSparseIterator();<a name="line.826"></a>
830 <FONT color="green">827</FONT> }<a name="line.827"></a>
831 <FONT color="green">828</FONT> <a name="line.828"></a>
832 <FONT color="green">829</FONT> /**<a name="line.829"></a>
833 <FONT color="green">830</FONT> * Implementation of &lt;code&gt;Entry&lt;/code&gt; optimized for OpenMap.<a name="line.830"></a>
834 <FONT color="green">831</FONT> * &lt;p&gt;This implementation does not allow arbitrary calls to &lt;code&gt;setIndex&lt;/code&gt;<a name="line.831"></a>
835 <FONT color="green">832</FONT> * since the order that entries are returned is undefined.<a name="line.832"></a>
836 <FONT color="green">833</FONT> */<a name="line.833"></a>
837 <FONT color="green">834</FONT> protected class OpenMapEntry extends Entry {<a name="line.834"></a>
838 <FONT color="green">835</FONT> <a name="line.835"></a>
839 <FONT color="green">836</FONT> /** Iterator pointing to the entry. */<a name="line.836"></a>
840 <FONT color="green">837</FONT> private final Iterator iter;<a name="line.837"></a>
841 <FONT color="green">838</FONT> <a name="line.838"></a>
842 <FONT color="green">839</FONT> /** Build an entry from an iterator point to an element.<a name="line.839"></a>
843 <FONT color="green">840</FONT> * @param iter iterator pointing to the entry<a name="line.840"></a>
844 <FONT color="green">841</FONT> */<a name="line.841"></a>
845 <FONT color="green">842</FONT> protected OpenMapEntry(Iterator iter) {<a name="line.842"></a>
846 <FONT color="green">843</FONT> this.iter = iter;<a name="line.843"></a>
847 <FONT color="green">844</FONT> }<a name="line.844"></a>
848 <FONT color="green">845</FONT> <a name="line.845"></a>
849 <FONT color="green">846</FONT> /** {@inheritDoc} */<a name="line.846"></a>
850 <FONT color="green">847</FONT> @Override<a name="line.847"></a>
851 <FONT color="green">848</FONT> public double getValue() {<a name="line.848"></a>
852 <FONT color="green">849</FONT> return iter.value();<a name="line.849"></a>
853 <FONT color="green">850</FONT> }<a name="line.850"></a>
854 <FONT color="green">851</FONT> <a name="line.851"></a>
855 <FONT color="green">852</FONT> /** {@inheritDoc} */<a name="line.852"></a>
856 <FONT color="green">853</FONT> @Override<a name="line.853"></a>
857 <FONT color="green">854</FONT> public void setValue(double value) {<a name="line.854"></a>
858 <FONT color="green">855</FONT> entries.put(iter.key(), value);<a name="line.855"></a>
859 <FONT color="green">856</FONT> }<a name="line.856"></a>
860 <FONT color="green">857</FONT> <a name="line.857"></a>
861 <FONT color="green">858</FONT> /** {@inheritDoc} */<a name="line.858"></a>
862 <FONT color="green">859</FONT> @Override<a name="line.859"></a>
863 <FONT color="green">860</FONT> public int getIndex() {<a name="line.860"></a>
864 <FONT color="green">861</FONT> return iter.key();<a name="line.861"></a>
865 <FONT color="green">862</FONT> }<a name="line.862"></a>
866 <FONT color="green">863</FONT> <a name="line.863"></a>
867 <FONT color="green">864</FONT> }<a name="line.864"></a>
868 <FONT color="green">865</FONT> <a name="line.865"></a>
869 <FONT color="green">866</FONT> /**<a name="line.866"></a>
870 <FONT color="green">867</FONT> * Iterator class to do iteration over just the non-zero elements.<a name="line.867"></a>
871 <FONT color="green">868</FONT> * &lt;p&gt;This implementation is fail-fast, so cannot be used to modify any zero element.<a name="line.868"></a>
872 <FONT color="green">869</FONT> *<a name="line.869"></a>
873 <FONT color="green">870</FONT> */<a name="line.870"></a>
874 <FONT color="green">871</FONT> protected class OpenMapSparseIterator implements java.util.Iterator&lt;Entry&gt; {<a name="line.871"></a>
875 <FONT color="green">872</FONT> <a name="line.872"></a>
876 <FONT color="green">873</FONT> /** Underlying iterator. */<a name="line.873"></a>
877 <FONT color="green">874</FONT> private final Iterator iter;<a name="line.874"></a>
878 <FONT color="green">875</FONT> <a name="line.875"></a>
879 <FONT color="green">876</FONT> /** Current entry. */<a name="line.876"></a>
880 <FONT color="green">877</FONT> private final Entry current;<a name="line.877"></a>
881 <FONT color="green">878</FONT> <a name="line.878"></a>
882 <FONT color="green">879</FONT> /** Simple constructor. */<a name="line.879"></a>
883 <FONT color="green">880</FONT> protected OpenMapSparseIterator() {<a name="line.880"></a>
884 <FONT color="green">881</FONT> iter = entries.iterator();<a name="line.881"></a>
885 <FONT color="green">882</FONT> current = new OpenMapEntry(iter);<a name="line.882"></a>
886 <FONT color="green">883</FONT> }<a name="line.883"></a>
887 <FONT color="green">884</FONT> <a name="line.884"></a>
888 <FONT color="green">885</FONT> /** {@inheritDoc} */<a name="line.885"></a>
889 <FONT color="green">886</FONT> public boolean hasNext() {<a name="line.886"></a>
890 <FONT color="green">887</FONT> return iter.hasNext();<a name="line.887"></a>
891 <FONT color="green">888</FONT> }<a name="line.888"></a>
892 <FONT color="green">889</FONT> <a name="line.889"></a>
893 <FONT color="green">890</FONT> /** {@inheritDoc} */<a name="line.890"></a>
894 <FONT color="green">891</FONT> public Entry next() {<a name="line.891"></a>
895 <FONT color="green">892</FONT> iter.advance();<a name="line.892"></a>
896 <FONT color="green">893</FONT> return current;<a name="line.893"></a>
897 <FONT color="green">894</FONT> }<a name="line.894"></a>
898 <FONT color="green">895</FONT> <a name="line.895"></a>
899 <FONT color="green">896</FONT> /** {@inheritDoc} */<a name="line.896"></a>
900 <FONT color="green">897</FONT> public void remove() {<a name="line.897"></a>
901 <FONT color="green">898</FONT> throw new UnsupportedOperationException("Not supported");<a name="line.898"></a>
902 <FONT color="green">899</FONT> }<a name="line.899"></a>
903 <FONT color="green">900</FONT> <a name="line.900"></a>
904 <FONT color="green">901</FONT> }<a name="line.901"></a>
905 <FONT color="green">902</FONT> }<a name="line.902"></a>
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966 </PRE>
967 </BODY>
968 </HTML>