You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@samoa.apache.org by gd...@apache.org on 2015/06/18 13:26:09 UTC
[28/41] incubator-samoa git commit: SAMOA-9: Change namespace to
apache.org. Fix #26
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/AbstractClassOption.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/AbstractClassOption.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/AbstractClassOption.java
deleted file mode 100644
index 11ecad3..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/AbstractClassOption.java
+++ /dev/null
@@ -1,252 +0,0 @@
-package com.yahoo.labs.samoa.moa.options;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.io.File;
-import com.github.javacliparser.AbstractOption;
-import com.github.javacliparser.SerializeUtils;
-import com.yahoo.labs.samoa.moa.core.ObjectRepository;
-import com.yahoo.labs.samoa.moa.tasks.Task;
-import com.yahoo.labs.samoa.moa.tasks.TaskMonitor;
-
-/**
- * Abstract class option.
- *
- * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
- * @version $Revision$
- */
-public abstract class AbstractClassOption extends AbstractOption {
-
- private static final long serialVersionUID = 1L;
-
- /** The prefix text to use to indicate file. */
- public static final String FILE_PREFIX_STRING = "file:";
-
- /** The prefix text to use to indicate inmem. */
- public static final String INMEM_PREFIX_STRING = "inmem:";
-
- /** The current object */
- protected Object currentValue;
-
- /** The class type */
- protected Class<?> requiredType;
-
- /** The default command line interface text. */
- protected String defaultCLIString;
-
- /** The null text. */
- protected String nullString;
-
- /**
- * Creates a new instance of an abstract option given its class name, command line interface text, its purpose, its
- * class type and its default command line interface text.
- *
- * @param name
- * the name of this option
- * @param cliChar
- * the command line interface text
- * @param purpose
- * the text describing the purpose of this option
- * @param requiredType
- * the class type
- * @param defaultCLIString
- * the default command line interface text
- */
- public AbstractClassOption(String name, char cliChar, String purpose,
- Class<?> requiredType, String defaultCLIString) {
- this(name, cliChar, purpose, requiredType, defaultCLIString, null);
- }
-
- /**
- * Creates a new instance of an abstract option given its class name, command line interface text, its purpose, its
- * class type, default command line interface text, and its null text.
- *
- * @param name
- * the name of this option
- * @param cliChar
- * the command line interface text
- * @param purpose
- * the text describing the purpose of this option
- * @param requiredType
- * the class type
- * @param defaultCLIString
- * the default command line interface text
- * @param nullString
- * the null text
- */
- public AbstractClassOption(String name, char cliChar, String purpose,
- Class<?> requiredType, String defaultCLIString, String nullString) {
- super(name, cliChar, purpose);
- this.requiredType = requiredType;
- this.defaultCLIString = defaultCLIString;
- this.nullString = nullString;
- resetToDefault();
- }
-
- /**
- * Sets current object.
- *
- * @param obj
- * the object to set as current.
- */
- public void setCurrentObject(Object obj) {
- if (((obj == null) && (this.nullString != null))
- || this.requiredType.isInstance(obj)
- || (obj instanceof String)
- || (obj instanceof File)
- || ((obj instanceof Task) && this.requiredType.isAssignableFrom(((Task) obj).getTaskResultType()))) {
- this.currentValue = obj;
- } else {
- throw new IllegalArgumentException("Object not of required type.");
- }
- }
-
- /**
- * Returns the current object.
- *
- * @return the current object
- */
- public Object getPreMaterializedObject() {
- return this.currentValue;
- }
-
- /**
- * Gets the class type of this option.
- *
- * @return the class type of this option
- */
- public Class<?> getRequiredType() {
- return this.requiredType;
- }
-
- /**
- * Gets the null string of this option.
- *
- * @return the null string of this option
- */
- public String getNullString() {
- return this.nullString;
- }
-
- /**
- * Gets a materialized object of this option.
- *
- * @param monitor
- * the task monitor to use
- * @param repository
- * the object repository to use
- * @return the materialized object
- */
- public Object materializeObject(TaskMonitor monitor,
- ObjectRepository repository) {
- if ((this.currentValue == null)
- || this.requiredType.isInstance(this.currentValue)) {
- return this.currentValue;
- } else if (this.currentValue instanceof String) {
- if (repository != null) {
- Object inmemObj = repository.getObjectNamed((String) this.currentValue);
- if (inmemObj == null) {
- throw new RuntimeException("No object named "
- + this.currentValue + " found in repository.");
- }
- return inmemObj;
- }
- throw new RuntimeException("No object repository available.");
- } else if (this.currentValue instanceof Task) {
- Task task = (Task) this.currentValue;
- Object result = task.doTask(monitor, repository);
- return result;
- } else if (this.currentValue instanceof File) {
- File inputFile = (File) this.currentValue;
- Object result = null;
- try {
- result = SerializeUtils.readFromFile(inputFile);
- } catch (Exception ex) {
- throw new RuntimeException("Problem loading "
- + this.requiredType.getName() + " object from file '"
- + inputFile.getName() + "':\n" + ex.getMessage(), ex);
- }
- return result;
- } else {
- throw new RuntimeException(
- "Could not materialize object of required type "
- + this.requiredType.getName() + ", found "
- + this.currentValue.getClass().getName()
- + " instead.");
- }
- }
-
- @Override
- public String getDefaultCLIString() {
- return this.defaultCLIString;
- }
-
- /**
- * Gets the command line interface text of the class.
- *
- * @param aClass
- * the class
- * @param requiredType
- * the class type
- * @return the command line interface text of the class
- */
- public static String classToCLIString(Class<?> aClass, Class<?> requiredType) {
- String className = aClass.getName();
- String packageName = requiredType.getPackage().getName();
- if (className.startsWith(packageName)) {
- // cut off package name
- className = className.substring(packageName.length() + 1, className.length());
- } else if (Task.class.isAssignableFrom(aClass)) {
- packageName = Task.class.getPackage().getName();
- if (className.startsWith(packageName)) {
- // cut off task package name
- className = className.substring(packageName.length() + 1,
- className.length());
- }
- }
- return className;
- }
-
- @Override
- public abstract String getValueAsCLIString();
-
- @Override
- public abstract void setValueViaCLIString(String s);
-
- // @Override
- // public abstract JComponent getEditComponent();
-
- /**
- * Gets the class name without its package name prefix.
- *
- * @param className
- * the name of the class
- * @param expectedType
- * the type of the class
- * @return the class name without its package name prefix
- */
- public static String stripPackagePrefix(String className, Class<?> expectedType) {
- if (className.startsWith(expectedType.getPackage().getName())) {
- return className.substring(expectedType.getPackage().getName().length() + 1);
- }
- return className;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/AbstractOptionHandler.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/AbstractOptionHandler.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/AbstractOptionHandler.java
deleted file mode 100644
index 761de50..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/AbstractOptionHandler.java
+++ /dev/null
@@ -1,166 +0,0 @@
-package com.yahoo.labs.samoa.moa.options;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import com.github.javacliparser.Options;
-import com.yahoo.labs.samoa.moa.AbstractMOAObject;
-import com.yahoo.labs.samoa.moa.core.ObjectRepository;
-import com.yahoo.labs.samoa.moa.tasks.NullMonitor;
-import com.yahoo.labs.samoa.moa.tasks.TaskMonitor;
-
-/**
- * Abstract Option Handler. All classes that have options in MOA extend this class.
- *
- * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
- * @version $Revision: 7 $
- */
-public abstract class AbstractOptionHandler extends AbstractMOAObject implements
- OptionHandler {
-
- private static final long serialVersionUID = 1L;
-
- /** Options to handle */
- // protected Options options;
-
- /** Dictionary with option texts and objects */
- // protected Map<String, Object> classOptionNamesToPreparedObjects;
-
- @Override
- public String getPurposeString() {
- return "Anonymous object: purpose undocumented.";
- }
-
- @Override
- public Options getOptions() {
- /*
- * if (this.options == null) { this.options = new Options(); if
- * (this.config== null) { this.config = new OptionsHandler(this, "");
- * this.config.prepareForUse(); } Option[] myOptions =
- * this.config.discoverOptionsViaReflection(); for (Option option :
- * myOptions) { this.options.addOption(option); } } return this.options;
- */
- if (this.config == null) {
- this.config = new OptionsHandler(this, "");
- // this.config.prepareForUse(monitor, repository);
- }
- return this.config.getOptions();
- }
-
- @Override
- public void prepareForUse() {
- prepareForUse(new NullMonitor(), null);
- }
-
- protected OptionsHandler config;
-
- @Override
- public void prepareForUse(TaskMonitor monitor, ObjectRepository repository) {
- // prepareClassOptions(monitor, repository);
- if (this.config == null) {
- this.config = new OptionsHandler(this, "");
- this.config.prepareForUse(monitor, repository);
- }
- prepareForUseImpl(monitor, repository);
- }
-
- /**
- * This method describes the implementation of how to prepare this object for use. All classes that extends this class
- * have to implement <code>prepareForUseImpl</code> and not <code>prepareForUse</code> since
- * <code>prepareForUse</code> calls <code>prepareForUseImpl</code>.
- *
- * @param monitor
- * the TaskMonitor to use
- * @param repository
- * the ObjectRepository to use
- */
- protected abstract void prepareForUseImpl(TaskMonitor monitor,
- ObjectRepository repository);
-
- @Override
- public String getCLICreationString(Class<?> expectedType) {
- return ClassOption.stripPackagePrefix(this.getClass().getName(),
- expectedType)
- + " " + getOptions().getAsCLIString();
- }
-
- @Override
- public OptionHandler copy() {
- return (OptionHandler) super.copy();
- }
-
- /**
- * Gets the options of this class via reflection.
- *
- * @return an array of options
- */
- /*
- * protected Option[] discoverOptionsViaReflection() { Class<? extends
- * AbstractOptionHandler> c = this.getClass(); Field[] fields = c.getFields();
- * List<Option> optList = new LinkedList<Option>(); for (Field field : fields)
- * { String fName = field.getName(); Class<?> fType = field.getType(); if
- * (fType.getName().endsWith("Option")) { if
- * (Option.class.isAssignableFrom(fType)) { Option oVal = null; try {
- * field.setAccessible(true); oVal = (Option) field.get(this); } catch
- * (IllegalAccessException ignored) { // cannot access this field } if (oVal
- * != null) { optList.add(oVal); } } } } return optList.toArray(new
- * Option[optList.size()]); }
- */
-
- /**
- * Prepares the options of this class.
- *
- * @param monitor
- * the TaskMonitor to use
- * @param repository
- * the ObjectRepository to use
- */
- protected void prepareClassOptions(TaskMonitor monitor,
- ObjectRepository repository) {
- this.config.prepareClassOptions(monitor, repository);
- }/*
- * this.classOptionNamesToPreparedObjects = null; Option[] optionArray =
- * getOptions().getOptionArray(); for (Option option : optionArray) { if
- * (option instanceof ClassOption) { ClassOption classOption = (ClassOption)
- * option; monitor.setCurrentActivity("Materializing option " +
- * classOption.getName() + "...", -1.0); Object optionObj =
- * classOption.materializeObject(monitor, repository); if
- * (monitor.taskShouldAbort()) { return; } if (optionObj instanceof
- * OptionHandler) { monitor.setCurrentActivity("Preparing option " +
- * classOption.getName() + "...", -1.0); ((OptionHandler)
- * optionObj).prepareForUse(monitor, repository); if
- * (monitor.taskShouldAbort()) { return; } } if
- * (this.classOptionNamesToPreparedObjects == null) {
- * this.classOptionNamesToPreparedObjects = new HashMap<String, Object>(); }
- * this.classOptionNamesToPreparedObjects.put(option.getName(), optionObj); }
- * } }
- */
-
- /**
- * Gets a prepared option of this class.
- *
- * @param opt
- * the class option to get
- * @return an option stored in the dictionary
- */
- protected Object getPreparedClassOption(ClassOption opt) {
- return this.config.getPreparedClassOption(opt);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/ClassOption.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/ClassOption.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/ClassOption.java
deleted file mode 100644
index 1c047be..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/ClassOption.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package com.yahoo.labs.samoa.moa.options;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.io.File;
-import com.github.javacliparser.Option;
-import com.github.javacliparser.Options;
-import com.yahoo.labs.samoa.moa.options.OptionHandler;
-import com.yahoo.labs.samoa.moa.tasks.Task;
-
-/**
- * Class option.
- *
- * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
- * @version $Revision: 7 $
- */
-public class ClassOption extends AbstractClassOption {
-
- private static final long serialVersionUID = 1L;
-
- public ClassOption(String name, char cliChar, String purpose,
- Class<?> requiredType, String defaultCLIString) {
- super(name, cliChar, purpose, requiredType, defaultCLIString);
- }
-
- public ClassOption(String name, char cliChar, String purpose,
- Class<?> requiredType, String defaultCLIString, String nullString) {
- super(name, cliChar, purpose, requiredType, defaultCLIString, nullString);
- }
-
- @Override
- public String getValueAsCLIString() {
- if ((this.currentValue == null) && (this.nullString != null)) {
- return this.nullString;
- }
- return objectToCLIString(this.currentValue, this.requiredType);
- }
-
- @Override
- public void setValueViaCLIString(String s) {
- if ((this.nullString != null)
- && ((s == null) || (s.length() == 0) || s.equals(this.nullString))) {
- this.currentValue = null;
- } else {
- try {
- this.currentValue = cliStringToObject(s, this.requiredType,
- null);
- } catch (Exception e) {
- throw new IllegalArgumentException("Problems with option: " + getName(), e);
- }
- }
- }
-
- public static String objectToCLIString(Object obj, Class<?> requiredType) {
- if (obj == null) {
- return "";
- }
- if (obj instanceof File) {
- return (FILE_PREFIX_STRING + ((File) obj).getPath());
- }
- if (obj instanceof String) {
- return (INMEM_PREFIX_STRING + obj);
- }
- String className = classToCLIString(obj.getClass(), requiredType);
- if (obj instanceof OptionHandler) {
- String subOptions = ((OptionHandler) obj).getOptions().getAsCLIString();
- if (subOptions.length() > 0) {
- return (className + " " + subOptions);
- }
- }
- return className;
- }
-
- public static Object cliStringToObject(String cliString,
- Class<?> requiredType, Option[] externalOptions) throws Exception {
- if (cliString.startsWith(FILE_PREFIX_STRING)) {
- return new File(cliString.substring(FILE_PREFIX_STRING.length()));
- }
- if (cliString.startsWith(INMEM_PREFIX_STRING)) {
- return cliString.substring(INMEM_PREFIX_STRING.length());
- }
- cliString = cliString.trim();
- int firstSpaceIndex = cliString.indexOf(' ', 0);
- String className;
- String classOptions;
- if (firstSpaceIndex > 0) {
- className = cliString.substring(0, firstSpaceIndex);
- classOptions = cliString.substring(firstSpaceIndex + 1, cliString.length());
- classOptions = classOptions.trim();
- } else {
- className = cliString;
- classOptions = "";
- }
- Class<?> classObject;
- try {
- classObject = Class.forName(className);
- } catch (Throwable t1) {
- try {
- // try prepending default package
- classObject = Class.forName(requiredType.getPackage().getName()
- + "." + className);
- } catch (Throwable t2) {
- try {
- // try prepending task package
- classObject = Class.forName(Task.class.getPackage().getName()
- + "." + className);
- } catch (Throwable t3) {
- throw new Exception("Class not found: " + className);
- }
- }
- }
- Object classInstance;
- try {
- classInstance = classObject.newInstance();
- } catch (Exception ex) {
- throw new Exception("Problem creating instance of class: "
- + className, ex);
- }
- if (requiredType.isInstance(classInstance)
- || ((classInstance instanceof Task) && requiredType
- .isAssignableFrom(((Task) classInstance).getTaskResultType()))) {
- Options options = new Options();
- if (externalOptions != null) {
- for (Option option : externalOptions) {
- options.addOption(option);
- }
- }
- if (classInstance instanceof OptionHandler) {
- Option[] objectOptions = ((OptionHandler) classInstance).getOptions().getOptionArray();
- for (Option option : objectOptions) {
- options.addOption(option);
- }
- }
- try {
- options.setViaCLIString(classOptions);
- } catch (Exception ex) {
- throw new Exception("Problem with options to '"
- + className
- + "'."
- + "\n\nValid options for "
- + className
- + ":\n"
- + ((OptionHandler) classInstance).getOptions().getHelpString(), ex);
- } finally {
- options.removeAllOptions(); // clean up listener refs
- }
- } else {
- throw new Exception("Class named '" + className
- + "' is not an instance of " + requiredType.getName() + ".");
- }
- return classInstance;
- }
-
- // @Override
- // public JComponent getEditComponent() {
- // return new ClassOptionEditComponent(this);
- // }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/OptionHandler.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/OptionHandler.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/OptionHandler.java
deleted file mode 100644
index c325ec3..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/OptionHandler.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.yahoo.labs.samoa.moa.options;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import com.github.javacliparser.Configurable;
-import com.github.javacliparser.Options;
-import com.yahoo.labs.samoa.moa.MOAObject;
-import com.yahoo.labs.samoa.moa.core.ObjectRepository;
-import com.yahoo.labs.samoa.moa.tasks.TaskMonitor;
-
-/**
- * Interface representing an object that handles options or parameters.
- *
- * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
- * @version $Revision: 7 $
- */
-public interface OptionHandler extends MOAObject, Configurable {
-
- /**
- * Gets the purpose of this object
- *
- * @return the string with the purpose of this object
- */
- public String getPurposeString();
-
- /**
- * Gets the options of this object
- *
- * @return the options of this object
- */
- public Options getOptions();
-
- /**
- * This method prepares this object for use.
- *
- */
- public void prepareForUse();
-
- /**
- * This method prepares this object for use.
- *
- * @param monitor
- * the TaskMonitor to use
- * @param repository
- * the ObjectRepository to use
- */
- public void prepareForUse(TaskMonitor monitor, ObjectRepository repository);
-
- /**
- * This method produces a copy of this object.
- *
- * @return a copy of this object
- */
- @Override
- public OptionHandler copy();
-
- /**
- * Gets the Command Line Interface text to create the object
- *
- * @return the Command Line Interface text to create the object
- */
- public String getCLICreationString(Class<?> expectedType);
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/OptionsHandler.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/OptionsHandler.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/OptionsHandler.java
deleted file mode 100644
index a57cbad..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/options/OptionsHandler.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package com.yahoo.labs.samoa.moa.options;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.util.HashMap;
-import com.github.javacliparser.JavaCLIParser;
-import com.github.javacliparser.Option;
-import com.yahoo.labs.samoa.moa.core.ObjectRepository;
-import com.yahoo.labs.samoa.moa.tasks.NullMonitor;
-import com.yahoo.labs.samoa.moa.tasks.TaskMonitor;
-
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-/**
- *
- * @author abifet
- */
-public class OptionsHandler extends JavaCLIParser {
-
- // public Object handler;
-
- public OptionsHandler(Object c, String cliString) {
- super(c, cliString);
- // this.handler = c;
- // this.prepareForUse();
- /*
- * int firstSpaceIndex = cliString.indexOf(' ', 0); String classOptions;
- * String className; if (firstSpaceIndex > 0) { className =
- * cliString.substring(0, firstSpaceIndex); classOptions =
- * cliString.substring(firstSpaceIndex + 1, cliString.length());
- * classOptions = classOptions.trim(); } else { className = cliString;
- * classOptions = ""; }
- */
- // options.setViaCLIString(cliString);
- }
-
- // private static final long serialVersionUID = 1L;
-
- /** Options to handle */
- // protected Options options;
-
- /** Dictionary with option texts and objects */
- // protected Map<String, Object> classOptionNamesToPreparedObjects;
-
- /*
- * public String getPurposeString() { return
- * "Anonymous object: purpose undocumented."; }
- *
- * public Options getOptions() { if (this.options == null) { this.options =
- * new Options(); Option[] myOptions = discoverOptionsViaReflection(); for
- * (Option option : myOptions) { this.options.addOption(option); } } return
- * this.options; }
- */
-
- public void prepareForUse() {
- prepareForUse(new NullMonitor(), null);
- }
-
- public void prepareForUse(TaskMonitor monitor, ObjectRepository repository) {
- prepareClassOptions(monitor, repository);
- // prepareForUseImpl(monitor, repository);
- }
-
- /**
- * This method describes the implementation of how to prepare this object for use. All classes that extends this class
- * have to implement <code>prepareForUseImpl</code> and not <code>prepareForUse</code> since
- * <code>prepareForUse</code> calls <code>prepareForUseImpl</code>.
- *
- * @param monitor
- * the TaskMonitor to use
- * @param repository
- * the ObjectRepository to use
- */
- // protected abstract void prepareForUseImpl(TaskMonitor monitor,
- // ObjectRepository repository);
-
- /*
- * public String getCLICreationString(Class<?> expectedType) { return
- * ClassOption.stripPackagePrefix(this.getClass().getName(), expectedType) +
- * " " + getOptions().getAsCLIString(); }
- */
-
- /**
- * Gets the options of this class via reflection.
- *
- * @return an array of options
- */
- /*
- * public Option[] discoverOptionsViaReflection() { //Class<? extends
- * AbstractOptionHandler> c = this.getClass(); Class c =
- * this.handler.getClass(); Field[] fields = c.getFields(); List<Option>
- * optList = new LinkedList<Option>(); for (Field field : fields) { String
- * fName = field.getName(); Class<?> fType = field.getType(); if
- * (fType.getName().endsWith("Option")) { if
- * (Option.class.isAssignableFrom(fType)) { Option oVal = null; try {
- * field.setAccessible(true); oVal = (Option) field.get(this.handler); } catch
- * (IllegalAccessException ignored) { // cannot access this field } if (oVal
- * != null) { optList.add(oVal); } } } } return optList.toArray(new
- * Option[optList.size()]); }
- */
-
- /**
- * Prepares the options of this class.
- *
- * @param monitor
- * the TaskMonitor to use
- * @param repository
- * the ObjectRepository to use
- */
- public void prepareClassOptions(TaskMonitor monitor,
- ObjectRepository repository) {
- this.classOptionNamesToPreparedObjects = null;
- Option[] optionArray = getOptions().getOptionArray();
- for (Option option : optionArray) {
- if (option instanceof ClassOption) {
- ClassOption classOption = (ClassOption) option;
- monitor.setCurrentActivity("Materializing option "
- + classOption.getName() + "...", -1.0);
- Object optionObj = classOption.materializeObject(monitor,
- repository);
- if (monitor.taskShouldAbort()) {
- return;
- }
- if (optionObj instanceof OptionHandler) {
- monitor.setCurrentActivity("Preparing option "
- + classOption.getName() + "...", -1.0);
- ((OptionHandler) optionObj).prepareForUse(monitor,
- repository);
- if (monitor.taskShouldAbort()) {
- return;
- }
- }
- if (this.classOptionNamesToPreparedObjects == null) {
- this.classOptionNamesToPreparedObjects = new HashMap<String, Object>();
- }
- this.classOptionNamesToPreparedObjects.put(option.getName(),
- optionObj);
- }
- }
- }
-
- /**
- * Gets a prepared option of this class.
- *
- * @param opt
- * the class option to get
- * @return an option stored in the dictionary
- */
- public Object getPreparedClassOption(ClassOption opt) {
- if (this.classOptionNamesToPreparedObjects == null) {
- this.prepareForUse();
- }
- return this.classOptionNamesToPreparedObjects.get(opt.getName());
- }
-
- // @Override
- // public void getDescription(StringBuilder sb, int i) {
- // throw new UnsupportedOperationException("Not supported yet.");
- // }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/ArffFileStream.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/ArffFileStream.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/ArffFileStream.java
deleted file mode 100644
index 7dd0975..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/ArffFileStream.java
+++ /dev/null
@@ -1,199 +0,0 @@
-package com.yahoo.labs.samoa.moa.streams;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-import com.github.javacliparser.FileOption;
-import com.github.javacliparser.IntOption;
-import com.yahoo.labs.samoa.instances.Instances;
-import com.yahoo.labs.samoa.instances.InstancesHeader;
-import com.yahoo.labs.samoa.moa.core.InputStreamProgressMonitor;
-import com.yahoo.labs.samoa.moa.core.InstanceExample;
-import com.yahoo.labs.samoa.moa.core.ObjectRepository;
-import com.yahoo.labs.samoa.moa.options.AbstractOptionHandler;
-import com.yahoo.labs.samoa.moa.tasks.TaskMonitor;
-
-/**
- * Stream reader of ARFF files.
- *
- * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
- * @version $Revision: 7 $
- */
-public class ArffFileStream extends AbstractOptionHandler implements InstanceStream {
-
- @Override
- public String getPurposeString() {
- return "A stream read from an ARFF file.";
- }
-
- private static final long serialVersionUID = 1L;
-
- public FileOption arffFileOption = new FileOption("arffFile", 'f',
- "ARFF file to load.", null, "arff", false);
-
- public IntOption classIndexOption = new IntOption(
- "classIndex",
- 'c',
- "Class index of data. 0 for none or -1 for last attribute in file.",
- -1, -1, Integer.MAX_VALUE);
-
- protected Instances instances;
-
- transient protected Reader fileReader;
-
- protected boolean hitEndOfFile;
-
- protected InstanceExample lastInstanceRead;
-
- protected int numInstancesRead;
-
- transient protected InputStreamProgressMonitor fileProgressMonitor;
-
- protected boolean hasStarted;
-
- public ArffFileStream() {
- }
-
- public ArffFileStream(String arffFileName, int classIndex) {
- this.arffFileOption.setValue(arffFileName);
- this.classIndexOption.setValue(classIndex);
- this.hasStarted = false;
- restart();
- }
-
- @Override
- public void prepareForUseImpl(TaskMonitor monitor,
- ObjectRepository repository) {
- // restart();
- this.hasStarted = false;
- this.lastInstanceRead = null;
- }
-
- @Override
- public InstancesHeader getHeader() {
- return new InstancesHeader(this.instances);
- }
-
- @Override
- public long estimatedRemainingInstances() {
- double progressFraction = this.fileProgressMonitor.getProgressFraction();
- if ((progressFraction > 0.0) && (this.numInstancesRead > 0)) {
- return (long) ((this.numInstancesRead / progressFraction) - this.numInstancesRead);
- }
- return -1;
- }
-
- @Override
- public boolean hasMoreInstances() {
- return !this.hitEndOfFile;
- }
-
- @Override
- public InstanceExample nextInstance() {
- if (this.lastInstanceRead == null) {
- readNextInstanceFromFile();
- }
- InstanceExample prevInstance = this.lastInstanceRead;
- this.hitEndOfFile = !readNextInstanceFromFile();
- return prevInstance;
- }
-
- @Override
- public boolean isRestartable() {
- return true;
- }
-
- @Override
- public void restart() {
- try {
- reset();
- // this.hitEndOfFile = !readNextInstanceFromFile();
- } catch (IOException ioe) {
- throw new RuntimeException("ArffFileStream restart failed.", ioe);
- }
- }
-
- protected boolean readNextInstanceFromFile() {
- boolean ret;
- if (!this.hasStarted) {
- try {
- reset();
- ret = getNextInstanceFromFile();
- this.hitEndOfFile = !ret;
- } catch (IOException ioe) {
- throw new RuntimeException("ArffFileStream restart failed.", ioe);
- }
- this.hasStarted = true;
- } else {
- ret = getNextInstanceFromFile();
- }
- return ret;
- }
-
- @Override
- public void getDescription(StringBuilder sb, int indent) {
- // TODO Auto-generated method stub
- }
-
- private void reset() throws IOException {
- if (this.fileReader != null) {
- this.fileReader.close();
- }
- InputStream fileStream = new FileInputStream(this.arffFileOption.getFile());
- this.fileProgressMonitor = new InputStreamProgressMonitor(
- fileStream);
- this.fileReader = new BufferedReader(new InputStreamReader(
- this.fileProgressMonitor));
- this.instances = new Instances(this.fileReader, 1, this.classIndexOption.getValue());
- if (this.classIndexOption.getValue() < 0) {
- this.instances.setClassIndex(this.instances.numAttributes() - 1);
- } else if (this.classIndexOption.getValue() > 0) {
- this.instances.setClassIndex(this.classIndexOption.getValue() - 1);
- }
- this.numInstancesRead = 0;
- this.lastInstanceRead = null;
- }
-
- private boolean getNextInstanceFromFile() throws RuntimeException {
- try {
- if (this.instances.readInstance(this.fileReader)) {
- this.lastInstanceRead = new InstanceExample(this.instances.instance(0));
- this.instances.delete(); // keep instances clean
- this.numInstancesRead++;
- return true;
- }
- if (this.fileReader != null) {
- this.fileReader.close();
- this.fileReader = null;
- }
- return false;
- } catch (IOException ioe) {
- throw new RuntimeException(
- "ArffFileStream failed to read instance from stream.", ioe);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/ExampleStream.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/ExampleStream.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/ExampleStream.java
deleted file mode 100644
index fa120b5..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/ExampleStream.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.yahoo.labs.samoa.moa.streams;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import com.yahoo.labs.samoa.instances.InstancesHeader;
-import com.yahoo.labs.samoa.moa.MOAObject;
-import com.yahoo.labs.samoa.moa.core.Example;
-
-/**
- * Interface representing a data stream of examples.
- *
- * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
- * @version $Revision: 7 $
- */
-public interface ExampleStream<E extends Example> extends MOAObject {
-
- /**
- * Gets the header of this stream. This is useful to know attributes and classes. InstancesHeader is an extension of
- * weka.Instances.
- *
- * @return the header of this stream
- */
- public InstancesHeader getHeader();
-
- /**
- * Gets the estimated number of remaining instances in this stream
- *
- * @return the estimated number of instances to get from this stream
- */
- public long estimatedRemainingInstances();
-
- /**
- * Gets whether this stream has more instances to output. This is useful when reading streams from files.
- *
- * @return true if this stream has more instances to output
- */
- public boolean hasMoreInstances();
-
- /**
- * Gets the next example from this stream.
- *
- * @return the next example of this stream
- */
- public E nextInstance();
-
- /**
- * Gets whether this stream can restart.
- *
- * @return true if this stream can restart
- */
- public boolean isRestartable();
-
- /**
- * Restarts this stream. It must be similar to starting a new stream from scratch.
- *
- */
- public void restart();
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/InstanceStream.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/InstanceStream.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/InstanceStream.java
deleted file mode 100644
index 7b77c13..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/InstanceStream.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.yahoo.labs.samoa.moa.streams;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import com.yahoo.labs.samoa.moa.core.Example;
-import com.yahoo.labs.samoa.instances.Instance;
-
-/**
- * Interface representing a data stream of instances.
- *
- * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
- * @version $Revision: 7 $
- */
-public interface InstanceStream extends ExampleStream<Example<Instance>> {
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusterEvent.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusterEvent.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusterEvent.java
deleted file mode 100644
index ac0dc8c..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusterEvent.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.yahoo.labs.samoa.moa.streams.clustering;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.util.EventObject;
-
-public class ClusterEvent extends EventObject {
-
- private String type;
- private String message;
- private long timestamp;
-
- public ClusterEvent(Object source, long timestamp, String type, String message) {
- super(source);
- this.type = type;
- this.message = message;
- this.timestamp = timestamp;
- }
-
- public String getMessage() {
- return message;
- }
-
- public long getTimestamp() {
- return timestamp;
- }
-
- public String getType() {
- return type;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusterEventListener.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusterEventListener.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusterEventListener.java
deleted file mode 100644
index 311339a..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusterEventListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.yahoo.labs.samoa.moa.streams.clustering;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.util.EventListener;
-
-public interface ClusterEventListener extends EventListener {
-
- public void changeCluster(ClusterEvent e);
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusteringStream.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusteringStream.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusteringStream.java
deleted file mode 100644
index ee53e6e..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/ClusteringStream.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.yahoo.labs.samoa.moa.streams.clustering;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import com.yahoo.labs.samoa.moa.options.AbstractOptionHandler;
-import com.github.javacliparser.FloatOption;
-import com.github.javacliparser.IntOption;
-import com.yahoo.labs.samoa.moa.streams.InstanceStream;
-
-public abstract class ClusteringStream extends AbstractOptionHandler implements InstanceStream {
- public IntOption decayHorizonOption = new IntOption("decayHorizon", 'h',
- "Decay horizon", 1000, 0, Integer.MAX_VALUE);
-
- public FloatOption decayThresholdOption = new FloatOption("decayThreshold", 't',
- "Decay horizon threshold", 0.01, 0, 1);
-
- public IntOption evaluationFrequencyOption = new IntOption("evaluationFrequency", 'e',
- "Evaluation frequency", 1000, 0, Integer.MAX_VALUE);
-
- public IntOption numAttsOption = new IntOption("numAtts", 'a',
- "The number of attributes to generate.", 2, 0, Integer.MAX_VALUE);
-
- public int getDecayHorizon() {
- return decayHorizonOption.getValue();
- }
-
- public double getDecayThreshold() {
- return decayThresholdOption.getValue();
- }
-
- public int getEvaluationFrequency() {
- return evaluationFrequencyOption.getValue();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-samoa/blob/9b178f63/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/RandomRBFGeneratorEvents.java
----------------------------------------------------------------------
diff --git a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/RandomRBFGeneratorEvents.java b/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/RandomRBFGeneratorEvents.java
deleted file mode 100644
index d1eba95..0000000
--- a/samoa-api/src/main/java/com/yahoo/labs/samoa/moa/streams/clustering/RandomRBFGeneratorEvents.java
+++ /dev/null
@@ -1,967 +0,0 @@
-package com.yahoo.labs.samoa.moa.streams.clustering;
-
-/*
- * #%L
- * SAMOA
- * %%
- * Copyright (C) 2014 - 2015 Apache Software Foundation
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * #L%
- */
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.LinkedList;
-import java.util.Random;
-import java.util.Vector;
-
-import com.yahoo.labs.samoa.moa.cluster.Clustering;
-import com.yahoo.labs.samoa.moa.cluster.SphereCluster;
-import com.yahoo.labs.samoa.moa.core.AutoExpandVector;
-import com.yahoo.labs.samoa.moa.core.InstanceExample;
-import com.yahoo.labs.samoa.instances.InstancesHeader;
-import com.yahoo.labs.samoa.moa.core.ObjectRepository;
-import com.yahoo.labs.samoa.moa.core.DataPoint;
-import com.github.javacliparser.FlagOption;
-import com.github.javacliparser.FloatOption;
-import com.github.javacliparser.IntOption;
-import com.yahoo.labs.samoa.moa.streams.InstanceStream;
-import com.yahoo.labs.samoa.moa.tasks.TaskMonitor;
-import com.yahoo.labs.samoa.instances.Attribute;
-import com.yahoo.labs.samoa.instances.DenseInstance;
-import com.yahoo.labs.samoa.moa.core.FastVector;
-import com.yahoo.labs.samoa.instances.Instance;
-import com.yahoo.labs.samoa.instances.Instances;
-
-public class RandomRBFGeneratorEvents extends ClusteringStream {
- private transient Vector listeners;
-
- private static final long serialVersionUID = 1L;
-
- public IntOption modelRandomSeedOption = new IntOption("modelRandomSeed",
- 'm', "Seed for random generation of model.", 1);
-
- public IntOption instanceRandomSeedOption = new IntOption(
- "instanceRandomSeed", 'i',
- "Seed for random generation of instances.", 5);
-
- public IntOption numClusterOption = new IntOption("numCluster", 'K',
- "The average number of centroids in the model.", 5, 1, Integer.MAX_VALUE);
-
- public IntOption numClusterRangeOption = new IntOption("numClusterRange", 'k',
- "Deviation of the number of centroids in the model.", 3, 0, Integer.MAX_VALUE);
-
- public FloatOption kernelRadiiOption = new FloatOption("kernelRadius", 'R',
- "The average radii of the centroids in the model.", 0.07, 0, 1);
-
- public FloatOption kernelRadiiRangeOption = new FloatOption("kernelRadiusRange", 'r',
- "Deviation of average radii of the centroids in the model.", 0, 0, 1);
-
- public FloatOption densityRangeOption = new FloatOption("densityRange", 'd',
- "Offset of the average weight a cluster has. Value of 0 means all cluster " +
- "contain the same amount of points.", 0, 0, 1);
-
- public IntOption speedOption = new IntOption("speed", 'V',
- "Kernels move a predefined distance of 0.01 every X points", 500, 1, Integer.MAX_VALUE);
-
- public IntOption speedRangeOption = new IntOption("speedRange", 'v',
- "Speed/Velocity point offset", 0, 0, Integer.MAX_VALUE);
-
- public FloatOption noiseLevelOption = new FloatOption("noiseLevel", 'N',
- "Noise level", 0.1, 0, 1);
-
- public FlagOption noiseInClusterOption = new FlagOption("noiseInCluster", 'n',
- "Allow noise to be placed within a cluster");
-
- public IntOption eventFrequencyOption = new IntOption("eventFrequency", 'E',
- "Event frequency. Enable at least one of the events below and set numClusterRange!", 30000, 0, Integer.MAX_VALUE);
-
- public FlagOption eventMergeSplitOption = new FlagOption("eventMergeSplitOption", 'M',
- "Enable merging and splitting of clusters. Set eventFrequency and numClusterRange!");
-
- public FlagOption eventDeleteCreateOption = new FlagOption("eventDeleteCreate", 'C',
- "Enable emering and disapperaing of clusters. Set eventFrequency and numClusterRange!");
-
- private double merge_threshold = 0.7;
- private int kernelMovePointFrequency = 10;
- private double maxDistanceMoveThresholdByStep = 0.01;
- private int maxOverlapFitRuns = 50;
- private double eventFrequencyRange = 0;
-
- private boolean debug = false;
-
- private AutoExpandVector<GeneratorCluster> kernels;
- protected Random instanceRandom;
- protected InstancesHeader streamHeader;
- private int numGeneratedInstances;
- private int numActiveKernels;
- private int nextEventCounter;
- private int nextEventChoice = -1;
- private int clusterIdCounter;
- private GeneratorCluster mergeClusterA;
- private GeneratorCluster mergeClusterB;
- private boolean mergeKernelsOverlapping = false;
-
- private class GeneratorCluster implements Serializable {
- // TODO: points is redundant to microclusterpoints, we need to come
- // up with a good strategy that microclusters get updated and
- // rebuild if needed. Idea: Sort microclusterpoints by timestamp and let
- // microclusterdecay hold the timestamp for when the last point in a
- // microcluster gets kicked, then we rebuild... or maybe not... could be
- // same as searching for point to be kicked. more likely is we rebuild
- // fewer times then insert.
-
- private static final long serialVersionUID = -6301649898961112942L;
-
- SphereCluster generator;
- int kill = -1;
- boolean merging = false;
- double[] moveVector;
- int totalMovementSteps;
- int currentMovementSteps;
- boolean isSplitting = false;
-
- LinkedList<DataPoint> points = new LinkedList<DataPoint>();
- ArrayList<SphereCluster> microClusters = new ArrayList<SphereCluster>();
- ArrayList<ArrayList<DataPoint>> microClustersPoints = new ArrayList();
- ArrayList<Integer> microClustersDecay = new ArrayList();
-
- public GeneratorCluster(int label) {
- boolean outofbounds = true;
- int tryCounter = 0;
- while (outofbounds && tryCounter < maxOverlapFitRuns) {
- tryCounter++;
- outofbounds = false;
- double[] center = new double[numAttsOption.getValue()];
- double radius = kernelRadiiOption.getValue() + (instanceRandom.nextBoolean() ? -1 : 1)
- * kernelRadiiRangeOption.getValue() * instanceRandom.nextDouble();
- while (radius <= 0) {
- radius = kernelRadiiOption.getValue() + (instanceRandom.nextBoolean() ? -1 : 1)
- * kernelRadiiRangeOption.getValue() * instanceRandom.nextDouble();
- }
- for (int j = 0; j < numAttsOption.getValue(); j++) {
- center[j] = instanceRandom.nextDouble();
- if (center[j] - radius < 0 || center[j] + radius > 1) {
- outofbounds = true;
- break;
- }
- }
- generator = new SphereCluster(center, radius);
- }
- if (tryCounter < maxOverlapFitRuns) {
- generator.setId(label);
- double avgWeight = 1.0 / numClusterOption.getValue();
- double weight = avgWeight + (instanceRandom.nextBoolean() ? -1 : 1) * avgWeight * densityRangeOption.getValue()
- * instanceRandom.nextDouble();
- generator.setWeight(weight);
- setDesitnation(null);
- }
- else {
- generator = null;
- kill = 0;
- System.out.println("Tried " + maxOverlapFitRuns + " times to create kernel. Reduce average radii.");
- }
- }
-
- public GeneratorCluster(int label, SphereCluster cluster) {
- this.generator = cluster;
- cluster.setId(label);
- setDesitnation(null);
- }
-
- public int getWorkID() {
- for (int c = 0; c < kernels.size(); c++) {
- if (kernels.get(c).equals(this))
- return c;
- }
- return -1;
- }
-
- private void updateKernel() {
- if (kill == 0) {
- kernels.remove(this);
- }
- if (kill > 0) {
- kill--;
- }
- // we could be lot more precise if we would keep track of timestamps of
- // points
- // then we could remove all old points and rebuild the cluster on up to
- // date point base
- // BUT worse the effort??? so far we just want to avoid overlap with this,
- // so its more
- // konservative as needed. Only needs to change when we need a thighter
- // representation
- for (int m = 0; m < microClusters.size(); m++) {
- if (numGeneratedInstances - microClustersDecay.get(m) > decayHorizonOption.getValue()) {
- microClusters.remove(m);
- microClustersPoints.remove(m);
- microClustersDecay.remove(m);
- }
- }
-
- if (!points.isEmpty()
- && numGeneratedInstances - points.getFirst().getTimestamp() >= decayHorizonOption.getValue()) {
- // if(debug)
- // System.out.println("Cleaning up macro cluster "+generator.getId());
- points.removeFirst();
- }
-
- }
-
- private void addInstance(Instance instance) {
- DataPoint point = new DataPoint(instance, numGeneratedInstances);
- points.add(point);
-
- int minMicroIndex = -1;
- double minHullDist = Double.MAX_VALUE;
- boolean inserted = false;
- // we favour more recently build clusters so we can remove earlier cluster
- // sooner
- for (int m = microClusters.size() - 1; m >= 0; m--) {
- SphereCluster micro = microClusters.get(m);
- double hulldist = micro.getCenterDistance(point) - micro.getRadius();
- // point fits into existing cluster
- if (hulldist <= 0) {
- microClustersPoints.get(m).add(point);
- microClustersDecay.set(m, numGeneratedInstances);
- inserted = true;
- break;
- }
- // if not, check if its at least the closest cluster
- else {
- if (hulldist < minHullDist) {
- minMicroIndex = m;
- minHullDist = hulldist;
- }
- }
- }
- // Reseting index choice for alternative cluster building
- int alt = 1;
- if (alt == 1)
- minMicroIndex = -1;
- if (!inserted) {
- // add to closest cluster and expand cluster
- if (minMicroIndex != -1) {
- microClustersPoints.get(minMicroIndex).add(point);
- // we should keep the miniball instances and just check in
- // new points instead of rebuilding the whole thing
- SphereCluster s = new SphereCluster(microClustersPoints.get(minMicroIndex), numAttsOption.getValue());
- // check if current microcluster is bigger then generating cluster
- if (s.getRadius() > generator.getRadius()) {
- // remove previously added point
- microClustersPoints.get(minMicroIndex).remove(microClustersPoints.get(minMicroIndex).size() - 1);
- minMicroIndex = -1;
- }
- else {
- microClusters.set(minMicroIndex, s);
- microClustersDecay.set(minMicroIndex, numGeneratedInstances);
- }
- }
- // minMicroIndex might have been reset above
- // create new micro cluster
- if (minMicroIndex == -1) {
- ArrayList<DataPoint> microPoints = new ArrayList<DataPoint>();
- microPoints.add(point);
- SphereCluster s;
- if (alt == 0)
- s = new SphereCluster(microPoints, numAttsOption.getValue());
- else
- s = new SphereCluster(generator.getCenter(), generator.getRadius(), 1);
-
- microClusters.add(s);
- microClustersPoints.add(microPoints);
- microClustersDecay.add(numGeneratedInstances);
- int id = 0;
- while (id < kernels.size()) {
- if (kernels.get(id) == this)
- break;
- id++;
- }
- s.setGroundTruth(id);
- }
- }
-
- }
-
- private void move() {
- if (currentMovementSteps < totalMovementSteps) {
- currentMovementSteps++;
- if (moveVector == null) {
- return;
- }
- else {
- double[] center = generator.getCenter();
- boolean outofbounds = true;
- while (outofbounds) {
- double radius = generator.getRadius();
- outofbounds = false;
- center = generator.getCenter();
- for (int d = 0; d < center.length; d++) {
- center[d] += moveVector[d];
- if (center[d] - radius < 0 || center[d] + radius > 1) {
- outofbounds = true;
- setDesitnation(null);
- break;
- }
- }
- }
- generator.setCenter(center);
- }
- }
- else {
- if (!merging) {
- setDesitnation(null);
- isSplitting = false;
- }
- }
- }
-
- void setDesitnation(double[] destination) {
-
- if (destination == null) {
- destination = new double[numAttsOption.getValue()];
- for (int j = 0; j < numAttsOption.getValue(); j++) {
- destination[j] = instanceRandom.nextDouble();
- }
- }
- double[] center = generator.getCenter();
- int dim = center.length;
-
- double[] v = new double[dim];
-
- for (int d = 0; d < dim; d++) {
- v[d] = destination[d] - center[d];
- }
- setMoveVector(v);
- }
-
- void setMoveVector(double[] vector) {
- // we are ignoring the steps, otherwise we have to change
- // speed of the kernels, do we want that?
- moveVector = vector;
- int speedInPoints = speedOption.getValue();
- if (speedRangeOption.getValue() > 0)
- speedInPoints += (instanceRandom.nextBoolean() ? -1 : 1) * instanceRandom.nextInt(speedRangeOption.getValue());
- if (speedInPoints < 1)
- speedInPoints = speedOption.getValue();
-
- double length = 0;
- for (int d = 0; d < moveVector.length; d++) {
- length += Math.pow(vector[d], 2);
- }
- length = Math.sqrt(length);
-
- totalMovementSteps = (int) (length / (maxDistanceMoveThresholdByStep * kernelMovePointFrequency) * speedInPoints);
- for (int d = 0; d < moveVector.length; d++) {
- moveVector[d] /= (double) totalMovementSteps;
- }
-
- currentMovementSteps = 0;
- // if(debug){
- // System.out.println("Setting new direction for C"+generator.getId()+": distance "
- // +length+" in "+totalMovementSteps+" steps");
- // }
- }
-
- private String tryMerging(GeneratorCluster merge) {
- String message = "";
- double overlapDegree = generator.overlapRadiusDegree(merge.generator);
- if (overlapDegree > merge_threshold) {
- SphereCluster mcluster = merge.generator;
- double radius = Math.max(generator.getRadius(), mcluster.getRadius());
- generator.combine(mcluster);
-
- // //adjust radius, get bigger and bigger with high dim data
- generator.setRadius(radius);
- // double[] center = generator.getCenter();
- // double[] mcenter = mcluster.getCenter();
- // double weight = generator.getWeight();
- // double mweight = generator.getWeight();
- // // for (int i = 0; i < center.length; i++) {
- // // center[i] = (center[i] * weight + mcenter[i] * mweight) / (mweight
- // + weight);
- // // }
- // generator.setWeight(weight + mweight);
- message = "Clusters merging: " + mergeClusterB.generator.getId() + " into " + mergeClusterA.generator.getId();
-
- // clean up and restet merging stuff
- // mark kernel so it gets killed when it doesn't contain any more
- // instances
- merge.kill = decayHorizonOption.getValue();
- // set weight to 0 so no new instances will be created in the cluster
- mcluster.setWeight(0.0);
- normalizeWeights();
- numActiveKernels--;
- mergeClusterB = mergeClusterA = null;
- merging = false;
- mergeKernelsOverlapping = false;
- }
- else {
- if (overlapDegree > 0 && !mergeKernelsOverlapping) {
- mergeKernelsOverlapping = true;
- message = "Merge overlapping started";
- }
- }
- return message;
- }
-
- private String splitKernel() {
- isSplitting = true;
- // todo radius range
- double radius = kernelRadiiOption.getValue();
- double avgWeight = 1.0 / numClusterOption.getValue();
- double weight = avgWeight + avgWeight * densityRangeOption.getValue() * instanceRandom.nextDouble();
- SphereCluster spcluster = null;
-
- double[] center = generator.getCenter();
- spcluster = new SphereCluster(center, radius, weight);
-
- if (spcluster != null) {
- GeneratorCluster gc = new GeneratorCluster(clusterIdCounter++, spcluster);
- gc.isSplitting = true;
- kernels.add(gc);
- normalizeWeights();
- numActiveKernels++;
- return "Split from Kernel " + generator.getId();
- }
- else {
- System.out.println("Tried to split new kernel from C" + generator.getId() +
- ". Not enough room for new cluster, decrease average radii, number of clusters or enable overlap.");
- return "";
- }
- }
-
- private String fadeOut() {
- kill = decayHorizonOption.getValue();
- generator.setWeight(0.0);
- numActiveKernels--;
- normalizeWeights();
- return "Fading out C" + generator.getId();
- }
-
- }
-
- public RandomRBFGeneratorEvents() {
- noiseInClusterOption.set();
- // eventDeleteCreateOption.set();
- // eventMergeSplitOption.set();
- }
-
- public InstancesHeader getHeader() {
- return streamHeader;
- }
-
- public long estimatedRemainingInstances() {
- return -1;
- }
-
- public boolean hasMoreInstances() {
- return true;
- }
-
- public boolean isRestartable() {
- return true;
- }
-
- @Override
- public void prepareForUseImpl(TaskMonitor monitor, ObjectRepository repository) {
- monitor.setCurrentActivity("Preparing random RBF...", -1.0);
- generateHeader();
- restart();
- }
-
- public void restart() {
- instanceRandom = new Random(instanceRandomSeedOption.getValue());
- nextEventCounter = eventFrequencyOption.getValue();
- nextEventChoice = getNextEvent();
- numActiveKernels = 0;
- numGeneratedInstances = 0;
- clusterIdCounter = 0;
- mergeClusterA = mergeClusterB = null;
- kernels = new AutoExpandVector<GeneratorCluster>();
-
- initKernels();
- }
-
- protected void generateHeader() { // 2013/06/02: Noise label
- ArrayList<Attribute> attributes = new ArrayList<Attribute>();
- for (int i = 0; i < this.numAttsOption.getValue(); i++) {
- attributes.add(new Attribute("att" + (i + 1)));
- }
-
- ArrayList<String> classLabels = new ArrayList<String>();
- for (int i = 0; i < this.numClusterOption.getValue(); i++) {
- classLabels.add("class" + (i + 1));
- }
- if (noiseLevelOption.getValue() > 0)
- classLabels.add("noise"); // The last label = "noise"
-
- attributes.add(new Attribute("class", classLabels));
- streamHeader = new InstancesHeader(new Instances(getCLICreationString(InstanceStream.class), attributes, 0));
- streamHeader.setClassIndex(streamHeader.numAttributes() - 1);
- }
-
- protected void initKernels() {
- for (int i = 0; i < numClusterOption.getValue(); i++) {
- kernels.add(new GeneratorCluster(clusterIdCounter));
- numActiveKernels++;
- clusterIdCounter++;
- }
- normalizeWeights();
- }
-
- public InstanceExample nextInstance() {
- numGeneratedInstances++;
- eventScheduler();
-
- // make room for the classlabel
- double[] values_new = new double[numAttsOption.getValue()]; // +1
- double[] values = null;
- int clusterChoice = -1;
-
- if (instanceRandom.nextDouble() > noiseLevelOption.getValue()) {
- clusterChoice = chooseWeightedElement();
- values = kernels.get(clusterChoice).generator.sample(instanceRandom).toDoubleArray();
- }
- else {
- // get ranodm noise point
- values = getNoisePoint();
- }
-
- if (Double.isNaN(values[0])) {
- System.out.println("Instance corrupted:" + numGeneratedInstances);
- }
- System.arraycopy(values, 0, values_new, 0, values.length);
-
- Instance inst = new DenseInstance(1.0, values_new);
- inst.setDataset(getHeader());
- if (clusterChoice == -1) {
- // 2013/06/02 (Yunsu Kim)
- // Noise instance has the last class value instead of "-1"
- // Preventing ArrayIndexOutOfBoundsException in WriteStreamToARFFFile
- inst.setClassValue(numClusterOption.getValue());
- }
- else {
- inst.setClassValue(kernels.get(clusterChoice).generator.getId());
- // Do we need micro cluster representation if have overlapping clusters?
- // if(!overlappingOption.isSet())
- kernels.get(clusterChoice).addInstance(inst);
- }
- // System.out.println(numGeneratedInstances+": Overlap is"+updateOverlaps());
-
- return new InstanceExample(inst);
- }
-
- public Clustering getGeneratingClusters() {
- Clustering clustering = new Clustering();
- for (int c = 0; c < kernels.size(); c++) {
- clustering.add(kernels.get(c).generator);
- }
- return clustering;
- }
-
- public Clustering getMicroClustering() {
- Clustering clustering = new Clustering();
- int id = 0;
-
- for (int c = 0; c < kernels.size(); c++) {
- for (int m = 0; m < kernels.get(c).microClusters.size(); m++) {
- kernels.get(c).microClusters.get(m).setId(id);
- kernels.get(c).microClusters.get(m).setGroundTruth(kernels.get(c).generator.getId());
- clustering.add(kernels.get(c).microClusters.get(m));
- id++;
- }
- }
-
- // System.out.println("numMicroKernels "+clustering.size());
- return clustering;
- }
-
- /**************************** EVENTS ******************************************/
- private void eventScheduler() {
-
- for (int i = 0; i < kernels.size(); i++) {
- kernels.get(i).updateKernel();
- }
-
- nextEventCounter--;
- // only move kernels every 10 points, performance reasons????
- // should this be randomized as well???
- if (nextEventCounter % kernelMovePointFrequency == 0) {
- // move kernels
- for (int i = 0; i < kernels.size(); i++) {
- kernels.get(i).move();
- // overlapControl();
- }
- }
-
- if (eventFrequencyOption.getValue() == 0) {
- return;
- }
-
- String type = "";
- String message = "";
- boolean eventFinished = false;
- switch (nextEventChoice) {
- case 0:
- if (numActiveKernels > 1 && numActiveKernels > numClusterOption.getValue() - numClusterRangeOption.getValue()) {
- message = mergeKernels(nextEventCounter);
- type = "Merge";
- }
- if (mergeClusterA == null && mergeClusterB == null && message.startsWith("Clusters merging")) {
- eventFinished = true;
- }
- break;
- case 1:
- if (nextEventCounter <= 0) {
- if (numActiveKernels < numClusterOption.getValue() + numClusterRangeOption.getValue()) {
- type = "Split";
- message = splitKernel();
- }
- eventFinished = true;
- }
- break;
- case 2:
- if (nextEventCounter <= 0) {
- if (numActiveKernels > 1 && numActiveKernels > numClusterOption.getValue() - numClusterRangeOption.getValue()) {
- message = fadeOut();
- type = "Delete";
- }
- eventFinished = true;
- }
- break;
- case 3:
- if (nextEventCounter <= 0) {
- if (numActiveKernels < numClusterOption.getValue() + numClusterRangeOption.getValue()) {
- message = fadeIn();
- type = "Create";
- }
- eventFinished = true;
- }
- break;
-
- }
- if (eventFinished) {
- nextEventCounter = (int) (eventFrequencyOption.getValue() + (instanceRandom.nextBoolean() ? -1 : 1)
- * eventFrequencyOption.getValue() * eventFrequencyRange * instanceRandom.nextDouble());
- nextEventChoice = getNextEvent();
- // System.out.println("Next event choice: "+nextEventChoice);
- }
- if (!message.isEmpty()) {
- message += " (numKernels = " + numActiveKernels + " at " + numGeneratedInstances + ")";
- if (!type.equals("Merge") || message.startsWith("Clusters merging"))
- fireClusterChange(numGeneratedInstances, type, message);
- }
- }
-
- private int getNextEvent() {
- int choice = -1;
- boolean lowerLimit = numActiveKernels <= numClusterOption.getValue() - numClusterRangeOption.getValue();
- boolean upperLimit = numActiveKernels >= numClusterOption.getValue() + numClusterRangeOption.getValue();
-
- if (!lowerLimit || !upperLimit) {
- int mode = -1;
- if (eventDeleteCreateOption.isSet() && eventMergeSplitOption.isSet()) {
- mode = instanceRandom.nextInt(2);
- }
-
- if (mode == 0 || (mode == -1 && eventMergeSplitOption.isSet())) {
- // have we reached a limit? if not free choice
- if (!lowerLimit && !upperLimit)
- choice = instanceRandom.nextInt(2);
- else
- // we have a limit. if lower limit, choose split
- if (lowerLimit)
- choice = 1;
- // otherwise we reached upper level, choose merge
- else
- choice = 0;
- }
-
- if (mode == 1 || (mode == -1 && eventDeleteCreateOption.isSet())) {
- // have we reached a limit? if not free choice
- if (!lowerLimit && !upperLimit)
- choice = instanceRandom.nextInt(2) + 2;
- else
- // we have a limit. if lower limit, choose create
- if (lowerLimit)
- choice = 3;
- // otherwise we reached upper level, choose delete
- else
- choice = 2;
- }
- }
-
- return choice;
- }
-
- private String fadeOut() {
- int id = instanceRandom.nextInt(kernels.size());
- while (kernels.get(id).kill != -1)
- id = instanceRandom.nextInt(kernels.size());
-
- String message = kernels.get(id).fadeOut();
- return message;
- }
-
- private String fadeIn() {
- GeneratorCluster gc = new GeneratorCluster(clusterIdCounter++);
- kernels.add(gc);
- numActiveKernels++;
- normalizeWeights();
- return "Creating new cluster";
- }
-
- private String changeWeight(boolean increase) {
- double changeRate = 0.1;
- int id = instanceRandom.nextInt(kernels.size());
- while (kernels.get(id).kill != -1)
- id = instanceRandom.nextInt(kernels.size());
-
- int sign = 1;
- if (!increase)
- sign = -1;
- double weight_old = kernels.get(id).generator.getWeight();
- double delta = sign * numActiveKernels * instanceRandom.nextDouble() * changeRate;
- kernels.get(id).generator.setWeight(weight_old + delta);
-
- normalizeWeights();
-
- String message;
- if (increase)
- message = "Increase ";
- else
- message = "Decrease ";
- message += " weight on Cluster " + id + " from " + weight_old + " to " + (weight_old + delta);
- return message;
-
- }
-
- private String changeRadius(boolean increase) {
- double maxChangeRate = 0.1;
- int id = instanceRandom.nextInt(kernels.size());
- while (kernels.get(id).kill != -1)
- id = instanceRandom.nextInt(kernels.size());
-
- int sign = 1;
- if (!increase)
- sign = -1;
-
- double r_old = kernels.get(id).generator.getRadius();
- double r_new = r_old + sign * r_old * instanceRandom.nextDouble() * maxChangeRate;
- if (r_new >= 0.5)
- return "Radius to big";
- kernels.get(id).generator.setRadius(r_new);
-
- String message;
- if (increase)
- message = "Increase ";
- else
- message = "Decrease ";
- message += " radius on Cluster " + id + " from " + r_old + " to " + r_new;
- return message;
- }
-
- private String splitKernel() {
- int id = instanceRandom.nextInt(kernels.size());
- while (kernels.get(id).kill != -1)
- id = instanceRandom.nextInt(kernels.size());
-
- String message = kernels.get(id).splitKernel();
-
- return message;
- }
-
- private String mergeKernels(int steps) {
- if (numActiveKernels > 1 && ((mergeClusterA == null && mergeClusterB == null))) {
-
- // choose clusters to merge
- double diseredDist = steps / speedOption.getValue() * maxDistanceMoveThresholdByStep;
- double minDist = Double.MAX_VALUE;
- // System.out.println("DisredDist:"+(2*diseredDist));
- for (int i = 0; i < kernels.size(); i++) {
- for (int j = 0; j < i; j++) {
- if (kernels.get(i).kill != -1 || kernels.get(j).kill != -1) {
- continue;
- }
- else {
- double kernelDist = kernels.get(i).generator.getCenterDistance(kernels.get(j).generator);
- double d = kernelDist - 2 * diseredDist;
- // System.out.println("Dist:"+i+" / "+j+" "+d);
- if (Math.abs(d) < minDist &&
- (minDist != Double.MAX_VALUE || d > 0 || Math.abs(d) < 0.001)) {
- minDist = Math.abs(d);
- mergeClusterA = kernels.get(i);
- mergeClusterB = kernels.get(j);
- }
- }
- }
- }
-
- if (mergeClusterA != null && mergeClusterB != null) {
- double[] merge_point = mergeClusterA.generator.getCenter();
- double[] v = mergeClusterA.generator.getDistanceVector(mergeClusterB.generator);
- for (int i = 0; i < v.length; i++) {
- merge_point[i] = merge_point[i] + v[i] * 0.5;
- }
-
- mergeClusterA.merging = true;
- mergeClusterB.merging = true;
- mergeClusterA.setDesitnation(merge_point);
- mergeClusterB.setDesitnation(merge_point);
-
- if (debug) {
- System.out.println("Center1" + Arrays.toString(mergeClusterA.generator.getCenter()));
- System.out.println("Center2" + Arrays.toString(mergeClusterB.generator.getCenter()));
- System.out.println("Vector" + Arrays.toString(v));
-
- System.out.println("Try to merge cluster " + mergeClusterA.generator.getId() +
- " into " + mergeClusterB.generator.getId() +
- " at " + Arrays.toString(merge_point) +
- " time " + numGeneratedInstances);
- }
- return "Init merge";
- }
- }
-
- if (mergeClusterA != null && mergeClusterB != null) {
-
- // movekernels will move the kernels close to each other,
- // we just need to check and merge here if they are close enough
- return mergeClusterA.tryMerging(mergeClusterB);
- }
-
- return "";
- }
-
- /************************* TOOLS **************************************/
-
- public void getDescription(StringBuilder sb, int indent) {
-
- }
-
- private double[] getNoisePoint() {
- double[] sample = new double[numAttsOption.getValue()];
- boolean incluster = true;
- int counter = 20;
- while (incluster) {
- for (int j = 0; j < numAttsOption.getValue(); j++) {
- sample[j] = instanceRandom.nextDouble();
- }
- incluster = false;
- if (!noiseInClusterOption.isSet() && counter > 0) {
- counter--;
- for (int c = 0; c < kernels.size(); c++) {
- for (int m = 0; m < kernels.get(c).microClusters.size(); m++) {
- Instance inst = new DenseInstance(1, sample);
- if (kernels.get(c).microClusters.get(m).getInclusionProbability(inst) > 0) {
- incluster = true;
- break;
- }
- }
- if (incluster)
- break;
- }
- }
- }
-
- // double [] sample = new double [numAttsOption.getValue()];
- // for (int j = 0; j < numAttsOption.getValue(); j++) {
- // sample[j] = instanceRandom.nextDouble();
- // }
-
- return sample;
- }
-
- private int chooseWeightedElement() {
- double r = instanceRandom.nextDouble();
-
- // Determine index of choosen element
- int i = 0;
- while (r > 0.0) {
- r -= kernels.get(i).generator.getWeight();
- i++;
- }
- --i; // Overcounted once
- // System.out.println(i);
- return i;
- }
-
- private void normalizeWeights() {
- double sumWeights = 0.0;
- for (int i = 0; i < kernels.size(); i++) {
- sumWeights += kernels.get(i).generator.getWeight();
- }
- for (int i = 0; i < kernels.size(); i++) {
- kernels.get(i).generator.setWeight(kernels.get(i).generator.getWeight() / sumWeights);
- }
- }
-
- /*************** EVENT Listener *********************/
- // should go into the superclass of the generator, create new one for cluster
- // streams?
-
- /** Add a listener */
- synchronized public void addClusterChangeListener(ClusterEventListener l) {
- if (listeners == null)
- listeners = new Vector();
- listeners.addElement(l);
- }
-
- /** Remove a listener */
- synchronized public void removeClusterChangeListener(ClusterEventListener l) {
- if (listeners == null)
- listeners = new Vector();
- listeners.removeElement(l);
- }
-
- /** Fire a ClusterChangeEvent to all registered listeners */
- protected void fireClusterChange(long timestamp, String type, String message) {
- // if we have no listeners, do nothing...
- if (listeners != null && !listeners.isEmpty()) {
- // create the event object to send
- ClusterEvent event =
- new ClusterEvent(this, timestamp, type, message);
-
- // make a copy of the listener list in case
- // anyone adds/removes listeners
- Vector targets;
- synchronized (this) {
- targets = (Vector) listeners.clone();
- }
-
- // walk through the listener list and
- // call the sunMoved method in each
- Enumeration e = targets.elements();
- while (e.hasMoreElements()) {
- ClusterEventListener l = (ClusterEventListener) e.nextElement();
- l.changeCluster(event);
-
- }
- }
- }
-
- @Override
- public String getPurposeString() {
- return "Generates a random radial basis function stream.";
- }
-
- public String getParameterString() {
- return "";
- }
-
-}