// Path: src/main/java/org/latna/msw/MetricElement.java
// public abstract class MetricElement {
//     private final List<MetricElement> friends;
// 
//     public MetricElement() {
//         friends = Collections.synchronizedList(new ArrayList());
//     }
//     
//     /**
//      * Calculate metric between current object and another.
//      * @param gme any element for whose metric can be calculated. Any element from domain set. 
//      * @return distance value
//      */
//     public abstract double calcDistance(MetricElement gme);
// 
//     public synchronized List<MetricElement> getAllFriends() {
//         return friends;
//     }
// 
//     public List<MetricElement> getAllFriendsOfAllFriends() {
//         HashSet <MetricElement> hs=new HashSet();
//         hs.add(this);
//         for(int i=0;i<friends.size();i++){
//             hs.add(friends.get(i));
//             for(int j=0;j<friends.get(i).getAllFriends().size();j++)
//                 hs.add(friends.get(i).getAllFriends().get(j));
//         }
//         return new ArrayList(hs);
//     }
// 
//     public MetricElement getClosestElemet(MetricElement q) {
//         double min=this.calcDistance(q);
//         int nummin=-1;
//         for(int i=0;i<friends.size();i++){
//             double temp=friends.get(i).calcDistance(q);
//             if(temp<min){
//                 nummin=i;
//                 min=temp;
//             }
// 
//         }
//         if(nummin==-1)
//             return this;
//         else
//             return friends.get(nummin);
//     }
// 
//     public SearchResult getClosestElemetSearchResult(MetricElement q) {
//         SearchResult s;
//         TreeSet <EvaluatedElement> set = new TreeSet();
//         for(int i=0;i<friends.size();i++){
//             double temp=friends.get(i).calcDistance(q);
// 
//             set.add(new EvaluatedElement(temp, friends.get(i)));
// 
//         }
//         return new SearchResult(set, null);
//     }
// 
//     public synchronized void addFriend(MetricElement e) {
//         if(!friends.contains(e))
//             friends.add(e);
//     }
// 
//     public synchronized void removeFriend(MetricElement e) {
//         if(friends.contains(e))
//             friends.remove(e);
//     }
// 
//     public synchronized void removeAllFriends() {
//         friends.clear();
//     }
// 
// }
// 
// Path: src/main/java/org/latna/msw/MetricElementFactory.java
// public interface MetricElementFactory {
//     /**
//      * 
//      * @return List of Metric elements
//      */
//     public List <MetricElement> getElements();
//     /**
//      * Distinct implementation can have many configuration which may be incompatible 
//      * among themselves, therefore we use String to pass configuration to the factory
//      * @param param configuration string for the factory
//      */
//     public void setParameterString(String param);
// }


import org.latna.msw.MetricElement;
import org.latna.msw.MetricElementFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
package org.latna.msw.integervector;


/**
 *
 * @author aponom
 */
public class IntegerVectorFactory implements MetricElementFactory {
    
    private int dimension; 
    private int n; //number of elements
// Path: src/main/java/org/latna/msw/MetricElement.java
// public abstract class MetricElement {
//     private final List<MetricElement> friends;
// 
//     public MetricElement() {
//         friends = Collections.synchronizedList(new ArrayList());
//     }
//     
//     /**
//      * Calculate metric between current object and another.
//      * @param gme any element for whose metric can be calculated. Any element from domain set. 
//      * @return distance value
//      */
//     public abstract double calcDistance(MetricElement gme);
// 
//     public synchronized List<MetricElement> getAllFriends() {
//         return friends;
//     }
// 
//     public List<MetricElement> getAllFriendsOfAllFriends() {
//         HashSet <MetricElement> hs=new HashSet();
//         hs.add(this);
//         for(int i=0;i<friends.size();i++){
//             hs.add(friends.get(i));
//             for(int j=0;j<friends.get(i).getAllFriends().size();j++)
//                 hs.add(friends.get(i).getAllFriends().get(j));
//         }
//         return new ArrayList(hs);
//     }
// 
//     public MetricElement getClosestElemet(MetricElement q) {
//         double min=this.calcDistance(q);
//         int nummin=-1;
//         for(int i=0;i<friends.size();i++){
//             double temp=friends.get(i).calcDistance(q);
//             if(temp<min){
//                 nummin=i;
//                 min=temp;
//             }
// 
//         }
//         if(nummin==-1)
//             return this;
//         else
//             return friends.get(nummin);
//     }
// 
//     public SearchResult getClosestElemetSearchResult(MetricElement q) {
//         SearchResult s;
//         TreeSet <EvaluatedElement> set = new TreeSet();
//         for(int i=0;i<friends.size();i++){
//             double temp=friends.get(i).calcDistance(q);
// 
//             set.add(new EvaluatedElement(temp, friends.get(i)));
// 
//         }
//         return new SearchResult(set, null);
//     }
// 
//     public synchronized void addFriend(MetricElement e) {
//         if(!friends.contains(e))
//             friends.add(e);
//     }
// 
//     public synchronized void removeFriend(MetricElement e) {
//         if(friends.contains(e))
//             friends.remove(e);
//     }
// 
//     public synchronized void removeAllFriends() {
//         friends.clear();
//     }
// 
// }
// 
// Path: src/main/java/org/latna/msw/MetricElementFactory.java
// public interface MetricElementFactory {
//     /**
//      * 
//      * @return List of Metric elements
//      */
//     public List <MetricElement> getElements();
//     /**
//      * Distinct implementation can have many configuration which may be incompatible 
//      * among themselves, therefore we use String to pass configuration to the factory
//      * @param param configuration string for the factory
//      */
//     public void setParameterString(String param);
// }


// Path: src/main/java/org/latna/msw/integervector/IntegerVectorFactory.java
import org.latna.msw.MetricElement;
import org.latna.msw.MetricElementFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

package org.latna.msw.integervector;


/**
 *
 * @author aponom
 */
public class IntegerVectorFactory implements MetricElementFactory {
    
    private int dimension; 
    private int n; //number of elements
    private List <MetricElement> allElements;