parent
93aff6d876
commit
1b8b77c52f
@ -254,12 +254,8 @@ public class OptimizerRunnable implements Runnable {
|
||||
*
|
||||
* @param vLev
|
||||
*/
|
||||
public void setVerbosityLevel(int vLev) {
|
||||
if (vLev >= 0 && vLev < proc.getStatistics().getStatisticsParameter().getOutputVerbosity().getTags().length) {
|
||||
proc.getStatistics().getStatisticsParameter().getOutputVerbosity().setSelectedTag(vLev);
|
||||
} else {
|
||||
System.err.println("Invalid verbosity leveln in OptimizerRunnable.setVerbosityLevel!");
|
||||
}
|
||||
public void setVerbosityLevel(InterfaceStatisticsParameters.OutputVerbosity vLev) {
|
||||
proc.getStatistics().getStatisticsParameter().setOutputVerbosity(vLev);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -267,7 +263,7 @@ public class OptimizerRunnable implements Runnable {
|
||||
*
|
||||
* @param outp
|
||||
*/
|
||||
public void setOutputTo(int outp) {
|
||||
public void setOutputTo(InterfaceStatisticsParameters.OutputTo outp) {
|
||||
((StatisticsParameters) proc.getStatistics().getStatisticsParameter()).setOutputTo(outp);
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,7 @@ import eva2.optimization.operator.selection.SelectBestIndividuals;
|
||||
import eva2.optimization.operator.terminators.EvaluationTerminator;
|
||||
import eva2.optimization.operator.terminators.InterfaceTerminator;
|
||||
import eva2.optimization.population.Population;
|
||||
import eva2.optimization.statistics.InterfaceStatisticsParameters;
|
||||
import eva2.optimization.statistics.StatisticsParameters;
|
||||
import eva2.problems.*;
|
||||
import eva2.optimization.statistics.InterfaceTextListener;
|
||||
@ -814,7 +815,7 @@ public class PostProcess {
|
||||
*/
|
||||
private static void runPP(OptimizerRunnable rnbl) {
|
||||
rnbl.getOptimizationParameters().setDoPostProcessing(false);
|
||||
rnbl.setVerbosityLevel(StatisticsParameters.VERBOSITY_NONE);
|
||||
rnbl.setVerbosityLevel(InterfaceStatisticsParameters.OutputVerbosity.NONE);
|
||||
ppRunnables.add(rnbl);
|
||||
rnbl.run();
|
||||
rnbl.getOptimizationParameters().setDoPostProcessing(true);
|
||||
|
@ -200,7 +200,7 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
String startDate = getDateString();
|
||||
// open the result file:
|
||||
if (doFileOutput() // not "text-window only"
|
||||
&& (statisticsParameter.getOutputVerbosity().getSelectedTagID() > StatisticsParameters.VERBOSITY_NONE)) { // verbosity accordingly high
|
||||
&& (statisticsParameter.getOutputVerbosity() != InterfaceStatisticsParameters.OutputVerbosity.NONE)) { // verbosity accordingly high
|
||||
//!resFName.equalsIgnoreCase("none") && !resFName.equals("")) {
|
||||
String fnameBase = makeOutputFileName(statisticsParameter.getResultFilePrefix(), infoString, startDate);
|
||||
int cnt = 0;
|
||||
@ -233,7 +233,7 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
}
|
||||
|
||||
protected boolean doFileOutput() {
|
||||
return (statisticsParameter.getOutputTo().getSelectedTagID() != 1); // not "text-window only"
|
||||
return (statisticsParameter.getOutputTo() != InterfaceStatisticsParameters.OutputTo.WINDOW); // not "text-window only"
|
||||
}
|
||||
|
||||
private String makeOutputFileName(String prefix, String infoString, String startDate) {
|
||||
@ -648,7 +648,7 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
resultOut.print(s);
|
||||
}
|
||||
for (InterfaceTextListener l : textListeners) {
|
||||
if (statisticsParameter.getOutputTo().getSelectedTagID() >= 1) {
|
||||
if (statisticsParameter.getOutputTo() != InterfaceStatisticsParameters.OutputTo.FILE) {
|
||||
l.print(s);
|
||||
}
|
||||
}
|
||||
@ -1205,22 +1205,24 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
* @return
|
||||
*/
|
||||
private boolean printLineByVerbosity(int iteration) {
|
||||
return (statisticsParameter.getOutputVerbosity().getSelectedTagID() > StatisticsParameters.VERBOSITY_KTH_IT)
|
||||
|| ((statisticsParameter.getOutputVerbosity().getSelectedTagID() == StatisticsParameters.VERBOSITY_KTH_IT)
|
||||
return (statisticsParameter.getOutputVerbosity() == InterfaceStatisticsParameters.OutputVerbosity.ALL)
|
||||
|| ((statisticsParameter.getOutputVerbosity() == InterfaceStatisticsParameters.OutputVerbosity.KTH_IT)
|
||||
&& (isKthRun(iteration, statisticsParameter.getOutputVerbosityK())));
|
||||
}
|
||||
|
||||
private boolean printRunIntroVerbosity() {
|
||||
return (statisticsParameter.getOutputVerbosity().getSelectedTagID() >= StatisticsParameters.VERBOSITY_KTH_IT)
|
||||
|| (optRunsPerformed == 0 && (statisticsParameter.getOutputVerbosity().getSelectedTagID() >= StatisticsParameters.VERBOSITY_FINAL));
|
||||
return (statisticsParameter.getOutputVerbosity() == InterfaceStatisticsParameters.OutputVerbosity.ALL) ||
|
||||
(statisticsParameter.getOutputVerbosity() == InterfaceStatisticsParameters.OutputVerbosity.KTH_IT)
|
||||
|| (optRunsPerformed == 0 && (statisticsParameter.getOutputVerbosity() != InterfaceStatisticsParameters.OutputVerbosity.NONE));
|
||||
}
|
||||
|
||||
private boolean printRunStoppedVerbosity() {
|
||||
return (statisticsParameter.getOutputVerbosity().getSelectedTagID() >= StatisticsParameters.VERBOSITY_KTH_IT);
|
||||
return statisticsParameter.getOutputVerbosity() == InterfaceStatisticsParameters.OutputVerbosity.KTH_IT ||
|
||||
statisticsParameter.getOutputVerbosity() == InterfaceStatisticsParameters.OutputVerbosity.ALL;
|
||||
}
|
||||
|
||||
private boolean printFinalVerbosity() {
|
||||
return (statisticsParameter.getOutputVerbosity().getSelectedTagID() > StatisticsParameters.VERBOSITY_NONE);
|
||||
return (statisticsParameter.getOutputVerbosity() != InterfaceStatisticsParameters.OutputVerbosity.NONE);
|
||||
}
|
||||
|
||||
private boolean isKthRun(int i, int k) {
|
||||
@ -1240,7 +1242,8 @@ public abstract class AbstractStatistics implements InterfaceTextListener, Inter
|
||||
}
|
||||
|
||||
private boolean printHeaderByVerbosity() {
|
||||
return (statisticsParameter.getOutputVerbosity().getSelectedTagID() >= StatisticsParameters.VERBOSITY_KTH_IT);
|
||||
return (statisticsParameter.getOutputVerbosity() == InterfaceStatisticsParameters.OutputVerbosity.ALL) ||
|
||||
(statisticsParameter.getOutputVerbosity() == InterfaceStatisticsParameters.OutputVerbosity.KTH_IT);
|
||||
}
|
||||
|
||||
private static void divideMean(Double[] mean, double d) {
|
||||
|
@ -1,6 +1,5 @@
|
||||
package eva2.optimization.statistics;
|
||||
|
||||
import eva2.tools.SelectedTag;
|
||||
import eva2.tools.StringSelection;
|
||||
|
||||
/**
|
||||
@ -51,15 +50,43 @@ public interface InterfaceStatisticsParameters {
|
||||
|
||||
void setOutputAllFieldsAsText(boolean bShowFullText);
|
||||
|
||||
void setOutputVerbosity(SelectedTag sTag);
|
||||
void setOutputVerbosity(OutputVerbosity sTag);
|
||||
|
||||
SelectedTag getOutputVerbosity();
|
||||
OutputVerbosity getOutputVerbosity();
|
||||
|
||||
int getOutputVerbosityK();
|
||||
|
||||
void setOutputVerbosityK(int k);
|
||||
|
||||
void setOutputTo(SelectedTag sTag);
|
||||
void setOutputTo(OutputTo sTag);
|
||||
|
||||
SelectedTag getOutputTo();
|
||||
OutputTo getOutputTo();
|
||||
|
||||
public enum OutputVerbosity {
|
||||
NONE, FINAL, KTH_IT, ALL;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
switch (this) {
|
||||
case NONE: return "No output";
|
||||
case FINAL: return "Final Results";
|
||||
case KTH_IT: return "K-th iterations";
|
||||
case ALL: return "All iterations";
|
||||
default: return this.name();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum OutputTo {
|
||||
FILE, WINDOW, BOTH;
|
||||
|
||||
public String toString() {
|
||||
switch (this) {
|
||||
case FILE: return "File (current dir.)";
|
||||
case WINDOW: return "Text-window";
|
||||
case BOTH: return "Both file and text-window";
|
||||
default: return name();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -21,13 +21,13 @@ public class StatisticsDummy implements InterfaceStatistics, InterfaceTextListen
|
||||
public StatisticsDummy() {
|
||||
bestIndividualAllover = null;
|
||||
sParams = new StatisticsParameters();
|
||||
sParams.setOutputVerbosityK(StatisticsParameters.VERBOSITY_NONE);
|
||||
sParams.setOutputVerbosityK(0);
|
||||
}
|
||||
|
||||
public StatisticsDummy(boolean doConsoleOut) {
|
||||
bestIndividualAllover = null;
|
||||
sParams = new StatisticsParameters();
|
||||
sParams.setOutputVerbosityK(StatisticsParameters.VERBOSITY_NONE);
|
||||
sParams.setOutputVerbosityK(0);
|
||||
consoleOut = doConsoleOut;
|
||||
}
|
||||
|
||||
|
@ -33,15 +33,9 @@ import java.util.logging.Logger;
|
||||
@Description(value = "Configure statistics and output of the optimization run. Changes to the data selection state will not take effect during a run.")
|
||||
public class StatisticsParameters implements InterfaceStatisticsParameters, InterfaceNotifyOnInformers, Serializable {
|
||||
private static final Logger LOGGER = Logger.getLogger(StatisticsParameters.class.getName());
|
||||
public final static int VERBOSITY_NONE = 0;
|
||||
public final static int VERBOSITY_FINAL = 1;
|
||||
public final static int VERBOSITY_KTH_IT = 2;
|
||||
public final static int VERBOSITY_ALL = 3;
|
||||
SelectedTag outputVerbosity = new SelectedTag("No output", "Final results", "K-th iterations", "All iterations");
|
||||
public final static int OUTPUT_FILE = 0;
|
||||
public final static int OUTPUT_WINDOW = 1;
|
||||
public final static int OUTPUT_FILE_WINDOW = 2;
|
||||
SelectedTag outputTo = new SelectedTag("File (current dir.)", "Text-window", "Both file and text-window");
|
||||
|
||||
private OutputVerbosity outputVerbosity;
|
||||
private OutputTo outputTo;
|
||||
private int verbosityK = 10;
|
||||
private int textOutput = 0;
|
||||
private int multiRuns = 1;
|
||||
@ -88,8 +82,9 @@ public class StatisticsParameters implements InterfaceStatisticsParameters, Inte
|
||||
*/
|
||||
public StatisticsParameters() {
|
||||
name = "Statistics";
|
||||
outputVerbosity.setSelectedTag(VERBOSITY_KTH_IT);
|
||||
outputTo.setSelectedTag(1);
|
||||
|
||||
outputVerbosity = OutputVerbosity.KTH_IT;
|
||||
outputTo = OutputTo.WINDOW;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -99,8 +94,8 @@ public class StatisticsParameters implements InterfaceStatisticsParameters, Inte
|
||||
public String toString() {
|
||||
String ret = "\r\nStatisticsParameter (" + super.toString() + "):\r\nmultiRuns=" + multiRuns
|
||||
+ ", textOutput=" + textOutput
|
||||
+ ", verbosity= " + outputVerbosity.getSelectedString()
|
||||
+ "\nTo " + outputTo.getSelectedString()
|
||||
+ ", verbosity= " + outputVerbosity
|
||||
+ "\nTo " + outputTo
|
||||
+ ", " + BeanInspector.toString(graphSel.getStrings());
|
||||
return ret;
|
||||
}
|
||||
@ -202,17 +197,17 @@ public class StatisticsParameters implements InterfaceStatisticsParameters, Inte
|
||||
@Override
|
||||
public void setShowTextOutput(boolean show) {
|
||||
// activate if not activated
|
||||
if (show && outputTo.getSelectedTagID() == 0) {
|
||||
outputTo.setSelectedTag(2);
|
||||
if (show && outputTo == OutputTo.FILE) {
|
||||
outputTo = OutputTo.BOTH;
|
||||
} // deactivate if activated
|
||||
else if (!show && outputTo.getSelectedTagID() > 0) {
|
||||
outputTo.setSelectedTag(0);
|
||||
else if (!show) {
|
||||
outputTo = OutputTo.FILE;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowTextOutput() {
|
||||
return outputTo.getSelectedTagID() > 0;
|
||||
return outputTo == OutputTo.WINDOW || outputTo == OutputTo.BOTH;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -248,25 +243,17 @@ public class StatisticsParameters implements InterfaceStatisticsParameters, Inte
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setOutputVerbosity(SelectedTag sTag) {
|
||||
@Parameter(description = "Set the data output level.")
|
||||
public void setOutputVerbosity(OutputVerbosity sTag) {
|
||||
outputVerbosity = sTag;
|
||||
GenericObjectEditor.setHideProperty(this.getClass(), "outputVerbosityK", sTag.getSelectedTagID() != VERBOSITY_KTH_IT);
|
||||
}
|
||||
|
||||
public void setOutputVerbosity(int i) {
|
||||
outputVerbosity.setSelectedTag(i);
|
||||
GenericObjectEditor.setHideProperty(this.getClass(), "outputVerbosityK", outputVerbosity.getSelectedTagID() != VERBOSITY_KTH_IT);
|
||||
GenericObjectEditor.setHideProperty(this.getClass(), "outputVerbosityK", sTag != OutputVerbosity.KTH_IT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SelectedTag getOutputVerbosity() {
|
||||
public OutputVerbosity getOutputVerbosity() {
|
||||
return outputVerbosity;
|
||||
}
|
||||
|
||||
public String outputVerbosityTipText() {
|
||||
return "Set the data output level.";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOutputVerbosityK() {
|
||||
return verbosityK;
|
||||
@ -279,21 +266,16 @@ public class StatisticsParameters implements InterfaceStatisticsParameters, Inte
|
||||
}
|
||||
|
||||
@Override
|
||||
public SelectedTag getOutputTo() {
|
||||
public OutputTo getOutputTo() {
|
||||
return outputTo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setOutputTo(SelectedTag tag) {
|
||||
@Parameter(description = "Set the output destination; to deactivate output, set verbosity to none.")
|
||||
public void setOutputTo(OutputTo tag) {
|
||||
outputTo = tag;
|
||||
}
|
||||
|
||||
@Parameter(description = "Set the output destination; to deactivate output, set verbosity to none.")
|
||||
public void setOutputTo(int i) {
|
||||
outputTo.setSelectedTag(i);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public StringSelection getFieldSelection() {
|
||||
return graphSel;
|
||||
|
@ -17,8 +17,6 @@ import java.util.List;
|
||||
* @see AbstractStatistics
|
||||
*/
|
||||
public class StatisticsStandalone extends AbstractStatistics implements InterfaceStatistics, Serializable {
|
||||
private static final long serialVersionUID = -8451652609212653368L;
|
||||
|
||||
private ArrayList<ArrayList<Object[]>> resultData = null;
|
||||
private ArrayList<String> resultHeaderStrings = null;
|
||||
private boolean collectData = false;
|
||||
@ -30,19 +28,19 @@ public class StatisticsStandalone extends AbstractStatistics implements Interfac
|
||||
}
|
||||
|
||||
public StatisticsStandalone(String resultFileName) {
|
||||
this(resultFileName, 1, resultFileName == null ? StatisticsParameters.VERBOSITY_NONE : StatisticsParameters.VERBOSITY_FINAL, false);
|
||||
this(resultFileName, 1, resultFileName == null ? InterfaceStatisticsParameters.OutputVerbosity.NONE : InterfaceStatisticsParameters.OutputVerbosity.FINAL, false);
|
||||
}
|
||||
|
||||
public StatisticsStandalone(String resultFileName, int multiRuns, int verbosity, boolean outputAllFieldsAsText) {
|
||||
public StatisticsStandalone(String resultFileName, int multiRuns, InterfaceStatisticsParameters.OutputVerbosity verbosity, boolean outputAllFieldsAsText) {
|
||||
this(StatisticsParameters.getInstance(false));
|
||||
statisticsParameter.setMultiRuns(multiRuns);
|
||||
statisticsParameter.setOutputVerbosity(statisticsParameter.getOutputVerbosity().setSelectedTag(verbosity));
|
||||
statisticsParameter.setOutputVerbosity(verbosity);
|
||||
statisticsParameter.setResultFilePrefix(resultFileName);
|
||||
statisticsParameter.setOutputAllFieldsAsText(outputAllFieldsAsText);
|
||||
if (resultFileName == null) {
|
||||
statisticsParameter.getOutputTo().setSelectedTag(StatisticsParameters.OUTPUT_WINDOW);
|
||||
statisticsParameter.setOutputTo(InterfaceStatisticsParameters.OutputTo.WINDOW);
|
||||
} else {
|
||||
statisticsParameter.setOutputTo(statisticsParameter.getOutputTo().setSelectedTag(StatisticsParameters.OUTPUT_FILE));
|
||||
statisticsParameter.setOutputTo(InterfaceStatisticsParameters.OutputTo.FILE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,7 @@ import eva2.optimization.operator.selection.SelectBestIndividuals;
|
||||
import eva2.optimization.operator.terminators.EvaluationTerminator;
|
||||
import eva2.optimization.population.InterfaceSolutionSet;
|
||||
import eva2.optimization.population.Population;
|
||||
import eva2.optimization.statistics.InterfaceStatisticsParameters;
|
||||
import eva2.optimization.statistics.StatisticsStandalone;
|
||||
import eva2.optimization.strategies.GeneticAlgorithm;
|
||||
import eva2.optimization.strategies.InterfaceOptimizer;
|
||||
@ -88,7 +89,7 @@ public class ERPStarter {
|
||||
if (startGUI) {
|
||||
Main.initClientGUI(params, null, null, null);
|
||||
} else {
|
||||
OptimizerRunnable rnbl = new OptimizerRunnable(params, new StatisticsStandalone(outputFilePrefix, 1, 3, true), false);
|
||||
OptimizerRunnable rnbl = new OptimizerRunnable(params, new StatisticsStandalone(outputFilePrefix, 1, InterfaceStatisticsParameters.OutputVerbosity.ALL, true), false);
|
||||
// actually start the optimization
|
||||
OptimizerFactory.optimize(rnbl);
|
||||
|
||||
|
@ -13,6 +13,7 @@ import eva2.optimization.operator.terminators.PopulationMeasureTerminator.Change
|
||||
import eva2.optimization.operator.terminators.PopulationMeasureTerminator.DirectionTypeEnum;
|
||||
import eva2.optimization.operator.terminators.PopulationMeasureTerminator.StagnationTypeEnum;
|
||||
import eva2.optimization.population.Population;
|
||||
import eva2.optimization.statistics.InterfaceStatisticsParameters;
|
||||
import eva2.optimization.statistics.InterfaceTextListener;
|
||||
import eva2.optimization.strategies.InterfaceOptimizer;
|
||||
import eva2.util.annotation.Description;
|
||||
@ -40,7 +41,7 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf
|
||||
transient PrintStream dos = null;
|
||||
private double range[][] = null;
|
||||
private static String defTestOut = "matlabproblem-debug.log";
|
||||
int verbosityLevel = 0;
|
||||
InterfaceStatisticsParameters.OutputVerbosity verbosityLevel = InterfaceStatisticsParameters.OutputVerbosity.NONE;
|
||||
boolean outputAllStatsField = true;
|
||||
private MatlabEvalMediator handler = null;
|
||||
private MatlabProblemDataTypeEnum dataType = MatlabProblemDataTypeEnum.typeDouble;
|
||||
@ -216,14 +217,6 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf
|
||||
}
|
||||
}
|
||||
|
||||
public void setStatsOutput(int verboLevel) {
|
||||
if ((verboLevel >= 0) && (verboLevel <= 3)) {
|
||||
verbosityLevel = verboLevel;
|
||||
} else {
|
||||
System.err.println("Error, invalid verbosity level for statistics output!");
|
||||
}
|
||||
}
|
||||
|
||||
public String jmiInterfaceNameTipText() {
|
||||
return "Name of the JEInterface instance in Matlab";
|
||||
}
|
||||
@ -322,11 +315,11 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf
|
||||
log("Setting text listener, verbo " + verbosityLevel + "\n");
|
||||
runnable.setTextListener(this);
|
||||
runnable.setVerbosityLevel(verbosityLevel);
|
||||
if (verbosityLevel > 0) {
|
||||
runnable.setOutputTo(2);
|
||||
if (verbosityLevel != InterfaceStatisticsParameters.OutputVerbosity.NONE) {
|
||||
runnable.setOutputTo(InterfaceStatisticsParameters.OutputTo.BOTH);
|
||||
} // both file + window
|
||||
else {
|
||||
runnable.setOutputTo(1);
|
||||
runnable.setOutputTo(InterfaceStatisticsParameters.OutputTo.WINDOW);
|
||||
} // only window
|
||||
runnable.setOutputFullStatsToText(outputAllStatsField);
|
||||
|
||||
@ -535,7 +528,7 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf
|
||||
|
||||
@Override
|
||||
public void print(String str) {
|
||||
if (verbosityLevel > 0) {
|
||||
if (verbosityLevel != InterfaceStatisticsParameters.OutputVerbosity.NONE) {
|
||||
// matlab displays sysout output in the command window, so we simply use this channel
|
||||
System.out.print(str);
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package eva2.problems;
|
||||
import eva2.OptimizerRunnable;
|
||||
import eva2.gui.BeanInspector;
|
||||
import eva2.optimization.individuals.AbstractEAIndividual;
|
||||
import eva2.optimization.statistics.InterfaceStatisticsParameters;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
@ -45,7 +46,7 @@ final class WaitForEvARunnable implements Runnable {
|
||||
mp.log("reported results.\n");
|
||||
mp.notifyFinished();
|
||||
mp.log("notified finish.\n");
|
||||
if (mp.verbosityLevel > 0) {
|
||||
if (mp.verbosityLevel != InterfaceStatisticsParameters.OutputVerbosity.NONE) {
|
||||
System.out.println("Optimization finished: " + mp.getInfoString());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user