View Javadoc
1   // ******************************************************************************
2   //
3   // Title:       Force Field X.
4   // Description: Force Field X - Software for Molecular Biophysics.
5   // Copyright:   Copyright (c) Michael J. Schnieders 2001-2025.
6   //
7   // This file is part of Force Field X.
8   //
9   // Force Field X is free software; you can redistribute it and/or modify it
10  // under the terms of the GNU General Public License version 3 as published by
11  // the Free Software Foundation.
12  //
13  // Force Field X is distributed in the hope that it will be useful, but WITHOUT
14  // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15  // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16  // details.
17  //
18  // You should have received a copy of the GNU General Public License along with
19  // Force Field X; if not, write to the Free Software Foundation, Inc., 59 Temple
20  // Place, Suite 330, Boston, MA 02111-1307 USA
21  //
22  // Linking this library statically or dynamically with other modules is making a
23  // combined work based on this library. Thus, the terms and conditions of the
24  // GNU General Public License cover the whole combination.
25  //
26  // As a special exception, the copyright holders of this library give you
27  // permission to link this library with independent modules to produce an
28  // executable, regardless of the license terms of these independent modules, and
29  // to copy and distribute the resulting executable under terms of your choice,
30  // provided that you also meet, for each linked independent module, the terms
31  // and conditions of the license of that module. An independent module is a
32  // module which is not derived from or based on this library. If you modify this
33  // library, you may extend this exception to your version of the library, but
34  // you are not obligated to do so. If you do not wish to do so, delete this
35  // exception statement from your version.
36  //
37  // ******************************************************************************
38  package ffx.numerics.clustering;
39  
40  /**
41   * Simple value object storing a distance and an optional weight used during
42   * linkage computations; comparable by distance and cloneable.
43   *
44   * @author Lars Behnke, 2013
45   * @author Michael J. Schnieders
46   * @since 1.0
47   */
48  public class Distance implements Comparable<Distance>, Cloneable {
49  
50    private Double distance;
51    private Double weight;
52  
53    /**
54     * Creates a Distance with value 0 and weight 1.
55     */
56    public Distance() {
57      this(0.0);
58    }
59  
60    /**
61     * Creates a Distance with the given value and unit weight.
62     *
63     * @param distance the distance value
64     */
65    public Distance(Double distance) {
66      this(distance, 1.0);
67    }
68  
69    /**
70     * Creates a Distance with the given value and weight.
71     *
72     * @param distance the distance value
73     * @param weight   the weight associated with this distance
74     */
75    public Distance(Double distance, Double weight) {
76      this.distance = distance;
77      this.weight = weight;
78    }
79  
80    /**
81     * Gets the distance value.
82     *
83     * @return the distance value (may be null)
84     */
85    public Double getDistance() {
86      return distance;
87    }
88  
89    /**
90     * Sets the distance value.
91     *
92     * @param distance the distance value to set
93     */
94    public void setDistance(Double distance) {
95      this.distance = distance;
96    }
97  
98    /**
99     * Gets the weight.
100    *
101    * @return the weight
102    */
103   public Double getWeight() {
104     return weight;
105   }
106 
107   /**
108    * Sets the weight.
109    *
110    * @param weight the weight to set
111    */
112   public void setWeight(Double weight) {
113     this.weight = weight;
114   }
115 
116   /**
117    * Checks whether the distance value is NaN or undefined.
118    *
119    * @return true if the distance is null or NaN; false otherwise
120    */
121   public boolean isNaN() {
122     return distance == null || distance.isNaN();
123   }
124 
125   /**
126    * Compares by distance value, with null other treated as greater (this &lt; other).
127    *
128    * @param distance the other Distance to compare to
129    * @return negative, zero, or positive per Comparable contract
130    */
131   @Override
132   public int compareTo(Distance distance) {
133     return distance == null ? 1 : getDistance().compareTo(distance.getDistance());
134   }
135 
136   /**
137    * Returns a string containing distance and weight values.
138    *
139    * @return formatted string representation
140    */
141   @Override
142   public String toString() {
143     return String.format("distance : %.2f, weight : %.2f", distance, weight);
144   }
145 
146   /**
147    * Creates a clone of this Distance.
148    *
149    * @return a clone of this Distance
150    */
151   @Override
152   public Distance clone() {
153     try {
154       Distance clone = (Distance) super.clone();
155       clone.distance = distance;
156       clone.weight = weight;
157       return clone;
158     } catch (CloneNotSupportedException e) {
159       throw new AssertionError();
160     }
161   }
162 }