1
1
package de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski;
3
import java.util.BitSet;
5
import de.lmu.ifi.dbs.elki.data.SparseNumberVector;
6
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
8
4
This file is part of ELKI:
9
5
Environment for Developing KDD-Applications Supported by Index-Structures
26
22
You should have received a copy of the GNU Affero General Public License
27
23
along with this program. If not, see <http://www.gnu.org/licenses/>.
25
import de.lmu.ifi.dbs.elki.data.SparseNumberVector;
26
import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
31
29
* Maximum distance function. Optimized for sparse vectors.
52
50
public double doubleDistance(SparseNumberVector<?> v1, SparseNumberVector<?> v2) {
53
51
// Get the bit masks
54
BitSet b1 = v1.getNotNullMask();
55
BitSet b2 = v2.getNotNullMask();
57
int i1 = b1.nextSetBit(0);
58
int i2 = b2.nextSetBit(0);
64
// Both vectors have a value.
65
double val = Math.abs(v1.doubleValue(i1) - v2.doubleValue(i2));
66
accu = Math.max(accu, val);
67
i1 = b1.nextSetBit(i1 + 1);
68
i2 = b2.nextSetBit(i2 + 1);
69
} else if (i2 < 0 || (i1 < i2 && i1 >= 0)) {
53
int i1 = v1.iter(), i2 = v2.iter();
54
while(v1.iterValid(i1) && v2.iterValid(i2)) {
55
final int d1 = v1.iterDim(i1), d2 = v2.iterDim(i2);
71
double val = Math.abs(v1.doubleValue(i1));
72
accu = Math.max(accu, val);
73
i1 = b1.nextSetBit(i1 + 1);
58
final double val = Math.abs(v1.iterDoubleValue(i1));
62
i1 = v1.iterAdvance(i1);
76
double val = Math.abs(v2.doubleValue(i2));
77
accu = Math.max(accu, val);
78
i2 = b2.nextSetBit(i2 + 1);
66
final double val = Math.abs(v2.iterDoubleValue(i2));
70
i2 = v2.iterAdvance(i2);
73
// Both vectors have a value.
74
final double val = Math.abs(v1.iterDoubleValue(i1) - v2.iterDoubleValue(i2));
78
i1 = v1.iterAdvance(i1);
79
i2 = v2.iterAdvance(i2);
82
while(v1.iterValid(i1)) {
84
final double val = Math.abs(v1.iterDoubleValue(i1));
88
i1 = v1.iterAdvance(i1);
90
while(v2.iterValid(i2)) {
92
final double val = Math.abs(v2.iterDoubleValue(i2));
96
i2 = v2.iterAdvance(i2);
85
102
public double doubleNorm(SparseNumberVector<?> v1) {
88
BitSet b1 = v1.getNotNullMask();
90
for(int i = b1.nextSetBit(0); i >= 0; i = b1.nextSetBit(i + 1)) {
91
sqrDist = Math.max(sqrDist, Math.abs(v1.doubleValue(i)));
104
for(int it = v1.iter(); v1.iterValid(it); it = v1.iterAdvance(it)) {
105
final double val = Math.abs(v1.iterDoubleValue(it));