diff --git a/src/eva2/OptimizerFactory.java b/src/eva2/OptimizerFactory.java index e787b51c..82a1d116 100644 --- a/src/eva2/OptimizerFactory.java +++ b/src/eva2/OptimizerFactory.java @@ -1,11 +1,11 @@ package eva2; +import eva2.optimization.OptimizationParameters; import eva2.optimization.enums.DEType; import eva2.optimization.enums.MutateESCrossoverType; import eva2.optimization.enums.PSOTopology; import eva2.optimization.enums.PostProcessMethod; import eva2.optimization.individuals.*; -import eva2.optimization.OptimizationParameters; import eva2.optimization.operator.archiving.ArchivingNSGAII; import eva2.optimization.operator.archiving.InformationRetrievalInserting; import eva2.optimization.operator.archiving.InterfaceArchiving; diff --git a/src/eva2/OptimizerRunnable.java b/src/eva2/OptimizerRunnable.java index c87e5a7c..0a03738b 100644 --- a/src/eva2/OptimizerRunnable.java +++ b/src/eva2/OptimizerRunnable.java @@ -1,12 +1,12 @@ package eva2; -import eva2.optimization.OptimizationStateListener; import eva2.optimization.InterfaceOptimizationParameters; +import eva2.optimization.OptimizationStateListener; +import eva2.optimization.Processor; import eva2.optimization.individuals.IndividualInterface; import eva2.optimization.individuals.InterfaceDataTypeBinary; import eva2.optimization.individuals.InterfaceDataTypeDouble; import eva2.optimization.individuals.InterfaceDataTypeInteger; -import eva2.optimization.Processor; import eva2.optimization.operator.postprocess.InterfacePostProcessParams; import eva2.optimization.operator.postprocess.PostProcessParams; import eva2.optimization.operator.terminators.InterfaceTerminator; @@ -222,7 +222,7 @@ public class OptimizerRunnable implements Runnable { } } - public double[] getDoubleSolution() { + public double[] getDoubleSolution() { IndividualInterface indy = getResult(); if (indy instanceof InterfaceDataTypeDouble) { return ((InterfaceDataTypeDouble) indy).getDoubleData(); diff --git a/src/eva2/cli/Main.java b/src/eva2/cli/Main.java index f2940d60..547ea89c 100644 --- a/src/eva2/cli/Main.java +++ b/src/eva2/cli/Main.java @@ -2,9 +2,9 @@ package eva2.cli; import eva2.EvAInfo; import eva2.optimization.InterfaceOptimizationParameters; -import eva2.optimization.individuals.IndividualInterface; import eva2.optimization.OptimizationParameters; import eva2.optimization.Processor; +import eva2.optimization.individuals.IndividualInterface; import eva2.optimization.operator.terminators.InterfaceTerminator; import eva2.optimization.population.Population; import eva2.optimization.population.PopulationInterface; @@ -18,7 +18,10 @@ import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import java.lang.reflect.Modifier; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; /** * diff --git a/src/eva2/cli/OptimizationLogger.java b/src/eva2/cli/OptimizationLogger.java index c917cfc1..6b7020f6 100644 --- a/src/eva2/cli/OptimizationLogger.java +++ b/src/eva2/cli/OptimizationLogger.java @@ -1,7 +1,7 @@ package eva2.cli; -import eva2.optimization.OptimizationStateListener; import eva2.optimization.InterfaceOptimizationParameters; +import eva2.optimization.OptimizationStateListener; import eva2.optimization.population.InterfacePopulationChangedEventListener; import java.io.OutputStream; diff --git a/src/eva2/examples/TerminatorExample.java b/src/eva2/examples/TerminatorExample.java index 2f79d80a..4d552f99 100644 --- a/src/eva2/examples/TerminatorExample.java +++ b/src/eva2/examples/TerminatorExample.java @@ -17,21 +17,27 @@ public class TerminatorExample { double[] sol; // A combined terminator for fitness and phenotype convergence CombinedTerminator convT = new CombinedTerminator( - // fitness-based stagnation period, absolute threshold, consider stagnation - // in both direction (per dim.) or w.r.t. minimization only - new FitnessConvergenceTerminator(0.0001, 1000, StagnationTypeEnum.fitnessCallBased, ChangeTypeEnum.absoluteChange, DirectionTypeEnum.decrease), - new PhenotypeConvergenceTerminator(0.0001, 1000, StagnationTypeEnum.fitnessCallBased, ChangeTypeEnum.absoluteChange, DirectionTypeEnum.bidirectional), - true); + // fitness-based stagnation period, absolute threshold, consider stagnation + // in both direction (per dim.) or w.r.t. minimization only + new FitnessConvergenceTerminator(0.0001, 1000, StagnationTypeEnum.fitnessCallBased, ChangeTypeEnum.absoluteChange, DirectionTypeEnum.decrease), + new PhenotypeConvergenceTerminator(0.0001, 1000, StagnationTypeEnum.fitnessCallBased, ChangeTypeEnum.absoluteChange, DirectionTypeEnum.bidirectional), + true + ); + // Adding an evaluation terminator with OR to the convergence criterion OptimizerFactory.setTerminator(new CombinedTerminator( - new EvaluationTerminator(20000), - convT, - false)); + new EvaluationTerminator(20000), + convT, + false + )); + sol = OptimizerFactory.optimizeToDouble(OptimizerFactory.PSO, f1, null); + System.out.println(OptimizerFactory.lastEvalsPerformed() + " evals performed. " + OptimizerFactory.terminatedBecause() + " Found solution: "); + for (int i = 0; i < f1.getProblemDimension(); i++) { System.out.print(sol[i] + " "); } diff --git a/src/eva2/examples/TestingCbnPostProc.java b/src/eva2/examples/TestingCbnPostProc.java index 1e313ad5..0d6136e5 100644 --- a/src/eva2/examples/TestingCbnPostProc.java +++ b/src/eva2/examples/TestingCbnPostProc.java @@ -1,8 +1,8 @@ package eva2.examples; import eva2.OptimizerFactory; -import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.OptimizationParameters; +import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.operator.postprocess.PostProcessParams; import eva2.optimization.operator.terminators.EvaluationTerminator; import eva2.problems.FM0Problem; diff --git a/src/eva2/examples/TestingPlusCmaEs.java b/src/eva2/examples/TestingPlusCmaEs.java index 5d45725e..cb7a95f1 100644 --- a/src/eva2/examples/TestingPlusCmaEs.java +++ b/src/eva2/examples/TestingPlusCmaEs.java @@ -1,8 +1,8 @@ package eva2.examples; import eva2.OptimizerFactory; -import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.OptimizationParameters; +import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.operator.crossover.CrossoverESDefault; import eva2.optimization.operator.mutation.MutateESCovarianceMatrixAdaption; import eva2.optimization.operator.terminators.EvaluationTerminator; diff --git a/src/eva2/gui/MainFrame.java b/src/eva2/gui/MainFrame.java index 6b69862d..a8249fae 100644 --- a/src/eva2/gui/MainFrame.java +++ b/src/eva2/gui/MainFrame.java @@ -1,10 +1,13 @@ package eva2.gui; import eva2.EvAInfo; +import eva2.optimization.InterfaceOptimizationParameters; import eva2.optimization.OptimizationParameters; import eva2.optimization.OptimizationStateListener; -import eva2.optimization.InterfaceOptimizationParameters; -import eva2.optimization.modules.*; +import eva2.optimization.modules.AbstractModuleAdapter; +import eva2.optimization.modules.GenericModuleAdapter; +import eva2.optimization.modules.ModuleAdapter; +import eva2.optimization.modules.OptimizationModuleAdapter; import eva2.optimization.statistics.AbstractStatistics; import eva2.optimization.statistics.InterfaceStatisticsListener; import eva2.optimization.statistics.InterfaceStatisticsParameters; diff --git a/src/eva2/gui/StandaloneOptimization.java b/src/eva2/gui/StandaloneOptimization.java index a0c52a6a..ef530987 100644 --- a/src/eva2/gui/StandaloneOptimization.java +++ b/src/eva2/gui/StandaloneOptimization.java @@ -1,11 +1,11 @@ package eva2.gui; import eva2.gui.plot.Plot; +import eva2.optimization.OptimizationParameters; import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.individuals.ESIndividualDoubleData; import eva2.optimization.individuals.GAIndividualDoubleData; import eva2.optimization.individuals.InterfaceDataTypeDouble; -import eva2.optimization.OptimizationParameters; import eva2.optimization.operator.crossover.CrossoverGAGINPoint; import eva2.optimization.operator.mutation.InterfaceMutation; import eva2.optimization.operator.mutation.MutateESFixedStepSize; diff --git a/src/eva2/optimization/InterfaceProcessor.java b/src/eva2/optimization/InterfaceProcessor.java index c063d0a3..eaa7a196 100644 --- a/src/eva2/optimization/InterfaceProcessor.java +++ b/src/eva2/optimization/InterfaceProcessor.java @@ -1,8 +1,5 @@ package eva2.optimization; -import eva2.optimization.OptimizationStateListener; - - /** * Interface for Optimization Processor. */ diff --git a/src/eva2/optimization/OptimizationParameters.java b/src/eva2/optimization/OptimizationParameters.java index 1becfa03..6d822ad5 100644 --- a/src/eva2/optimization/OptimizationParameters.java +++ b/src/eva2/optimization/OptimizationParameters.java @@ -47,7 +47,7 @@ public class OptimizationParameters extends AbstractOptimizationParameters imple FileInputStream fileStream = new FileInputStream(yamlFile); instance = (OptimizationParameters) new Yaml().load(fileStream); } catch (Exception ex) { - LOGGER.log(Level.WARNING, "Could not load OptimizationParameters.yml.", ex); + LOGGER.log(Level.INFO, "Could not load OptimizationParameters.yml.", ex); } if (instance == null) { @@ -56,6 +56,14 @@ public class OptimizationParameters extends AbstractOptimizationParameters imple return instance; } + /** + * Default instructor that sets up a default optimizer, problem and terminator. + * + * Currently defaults to: + * - Differential Evolution + * - F1Problem + * - EvaluationTerminator with 5000 evaluations + */ public OptimizationParameters() { super(new DifferentialEvolution(), new F1Problem(), new EvaluationTerminator(5000)); } diff --git a/src/eva2/optimization/mocco/MOCCOParameterizeGDF.java b/src/eva2/optimization/mocco/MOCCOParameterizeGDF.java index ab450147..3b9dff50 100644 --- a/src/eva2/optimization/mocco/MOCCOParameterizeGDF.java +++ b/src/eva2/optimization/mocco/MOCCOParameterizeGDF.java @@ -1,10 +1,10 @@ package eva2.optimization.mocco; +import eva2.gui.MOCCOStandalone; import eva2.gui.PropertyDoubleArray; import eva2.gui.PropertyEditorProvider; import eva2.gui.editor.GenericObjectEditor; -import eva2.gui.MOCCOStandalone; import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.operator.moso.MOSOWeightedFitness; import eva2.optimization.operator.terminators.InterfaceTerminator; diff --git a/src/eva2/optimization/mocco/MOCCOParameterizeMO.java b/src/eva2/optimization/mocco/MOCCOParameterizeMO.java index 9787e40d..3497cc2d 100644 --- a/src/eva2/optimization/mocco/MOCCOParameterizeMO.java +++ b/src/eva2/optimization/mocco/MOCCOParameterizeMO.java @@ -1,9 +1,9 @@ package eva2.optimization.mocco; +import eva2.gui.MOCCOStandalone; import eva2.gui.PropertyEditorProvider; import eva2.gui.editor.GenericObjectEditor; -import eva2.gui.MOCCOStandalone; import eva2.optimization.operator.terminators.InterfaceTerminator; import eva2.optimization.population.Population; import eva2.optimization.strategies.GeneticAlgorithm; diff --git a/src/eva2/optimization/mocco/MOCCOParameterizeRefPoint.java b/src/eva2/optimization/mocco/MOCCOParameterizeRefPoint.java index bba86a24..1e3860a5 100644 --- a/src/eva2/optimization/mocco/MOCCOParameterizeRefPoint.java +++ b/src/eva2/optimization/mocco/MOCCOParameterizeRefPoint.java @@ -1,9 +1,9 @@ package eva2.optimization.mocco; +import eva2.gui.MOCCOStandalone; import eva2.gui.PropertyEditorProvider; import eva2.gui.editor.GenericObjectEditor; -import eva2.gui.MOCCOStandalone; import eva2.optimization.operator.migration.SOBestMigration; import eva2.optimization.operator.moso.MOSOLpMetric; import eva2.optimization.operator.terminators.InterfaceTerminator; diff --git a/src/eva2/optimization/mocco/MOCCOParameterizeSO.java b/src/eva2/optimization/mocco/MOCCOParameterizeSO.java index e3ff420c..f39a2735 100644 --- a/src/eva2/optimization/mocco/MOCCOParameterizeSO.java +++ b/src/eva2/optimization/mocco/MOCCOParameterizeSO.java @@ -1,9 +1,9 @@ package eva2.optimization.mocco; +import eva2.gui.MOCCOStandalone; import eva2.gui.PropertyEditorProvider; import eva2.gui.editor.GenericObjectEditor; -import eva2.gui.MOCCOStandalone; import eva2.optimization.operator.terminators.InterfaceTerminator; import eva2.optimization.strategies.GeneticAlgorithm; import eva2.optimization.strategies.InterfaceOptimizer; diff --git a/src/eva2/optimization/mocco/MOCCOParameterizeSTEP.java b/src/eva2/optimization/mocco/MOCCOParameterizeSTEP.java index fc590793..cb386c9a 100644 --- a/src/eva2/optimization/mocco/MOCCOParameterizeSTEP.java +++ b/src/eva2/optimization/mocco/MOCCOParameterizeSTEP.java @@ -1,10 +1,10 @@ package eva2.optimization.mocco; +import eva2.gui.MOCCOStandalone; import eva2.gui.PropertyDoubleArray; import eva2.gui.PropertyEditorProvider; import eva2.gui.editor.GenericObjectEditor; -import eva2.gui.MOCCOStandalone; import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.operator.moso.MOSOWeightedFitness; import eva2.optimization.operator.terminators.InterfaceTerminator; diff --git a/src/eva2/optimization/mocco/MOCCOParameterizeTchebycheff.java b/src/eva2/optimization/mocco/MOCCOParameterizeTchebycheff.java index c1d51673..df170e25 100644 --- a/src/eva2/optimization/mocco/MOCCOParameterizeTchebycheff.java +++ b/src/eva2/optimization/mocco/MOCCOParameterizeTchebycheff.java @@ -1,9 +1,9 @@ package eva2.optimization.mocco; +import eva2.gui.MOCCOStandalone; import eva2.gui.PropertyEditorProvider; import eva2.gui.editor.GenericObjectEditor; -import eva2.gui.MOCCOStandalone; import eva2.optimization.operator.migration.SOBestMigration; import eva2.optimization.operator.moso.MOSOWeightedLPTchebycheff; import eva2.optimization.operator.terminators.InterfaceTerminator; diff --git a/src/eva2/optimization/mocco/paretofrontviewer/MOCCOViewer.java b/src/eva2/optimization/mocco/paretofrontviewer/MOCCOViewer.java index 6708d3d0..21995d62 100644 --- a/src/eva2/optimization/mocco/paretofrontviewer/MOCCOViewer.java +++ b/src/eva2/optimization/mocco/paretofrontviewer/MOCCOViewer.java @@ -1,10 +1,10 @@ package eva2.optimization.mocco.paretofrontviewer; +import eva2.gui.MOCCOStandalone; import eva2.gui.plot.FunctionArea; import eva2.gui.plot.GraphPointSet; import eva2.gui.plot.InterfaceDPointWithContent; -import eva2.gui.MOCCOStandalone; import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.population.Population; import eva2.problems.InterfaceMultiObjectiveDeNovoProblem; diff --git a/src/eva2/optimization/modules/AbstractModuleAdapter.java b/src/eva2/optimization/modules/AbstractModuleAdapter.java index f41d3459..6e676369 100644 --- a/src/eva2/optimization/modules/AbstractModuleAdapter.java +++ b/src/eva2/optimization/modules/AbstractModuleAdapter.java @@ -1,9 +1,9 @@ package eva2.optimization.modules; +import eva2.optimization.InterfaceOptimizationParameters; import eva2.optimization.InterfaceProcessor; import eva2.optimization.OptimizationStateListener; -import eva2.optimization.InterfaceOptimizationParameters; import eva2.optimization.Processor; import java.io.Serializable; diff --git a/src/eva2/optimization/operator/postprocess/PostProcess.java b/src/eva2/optimization/operator/postprocess/PostProcess.java index f2df2b18..525d04eb 100644 --- a/src/eva2/optimization/operator/postprocess/PostProcess.java +++ b/src/eva2/optimization/operator/postprocess/PostProcess.java @@ -5,10 +5,10 @@ import eva2.OptimizerRunnable; import eva2.gui.BeanInspector; import eva2.gui.plot.Plot; import eva2.gui.plot.TopoPlot; +import eva2.optimization.OptimizationParameters; import eva2.optimization.enums.ESMutationInitialSigma; import eva2.optimization.enums.PostProcessMethod; import eva2.optimization.individuals.*; -import eva2.optimization.OptimizationParameters; import eva2.optimization.operator.cluster.ClusteringDensityBased; import eva2.optimization.operator.cluster.InterfaceClustering; import eva2.optimization.operator.crossover.CrossoverESDefault; diff --git a/src/eva2/optimization/statistics/OptimizationJobList.java b/src/eva2/optimization/statistics/OptimizationJobList.java index 290ae825..a0241f84 100644 --- a/src/eva2/optimization/statistics/OptimizationJobList.java +++ b/src/eva2/optimization/statistics/OptimizationJobList.java @@ -3,11 +3,11 @@ package eva2.optimization.statistics; import eva2.gui.JParaPanel; import eva2.gui.PropertySelectableList; import eva2.gui.editor.ArrayEditor; +import eva2.optimization.AbstractOptimizationParameters; +import eva2.optimization.InterfaceOptimizationParameters; import eva2.optimization.enums.StatisticsOnSingleDataSet; import eva2.optimization.enums.StatisticsOnTwoSampledData; -import eva2.optimization.InterfaceOptimizationParameters; import eva2.optimization.modules.AbstractModuleAdapter; -import eva2.optimization.AbstractOptimizationParameters; import eva2.optimization.modules.GenericModuleAdapter; import eva2.optimization.modules.ModuleAdapter; import eva2.optimization.tools.FileTools; diff --git a/src/eva2/optimization/statistics/StatisticsParameters.java b/src/eva2/optimization/statistics/StatisticsParameters.java index 79a75b58..20b8d1ee 100644 --- a/src/eva2/optimization/statistics/StatisticsParameters.java +++ b/src/eva2/optimization/statistics/StatisticsParameters.java @@ -12,7 +12,10 @@ import eva2.util.annotation.Parameter; import eva2.yaml.BeanSerializer; import org.yaml.snakeyaml.Yaml; -import java.io.*; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/src/eva2/optimization/strategies/ANPSO.java b/src/eva2/optimization/strategies/ANPSO.java index c8b7cf84..cf308b1b 100644 --- a/src/eva2/optimization/strategies/ANPSO.java +++ b/src/eva2/optimization/strategies/ANPSO.java @@ -2,10 +2,10 @@ package eva2.optimization.strategies; import eva2.OptimizerFactory; import eva2.gui.editor.GenericObjectEditor; +import eva2.optimization.OptimizationParameters; import eva2.optimization.enums.PSOTopology; import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.individuals.InterfaceDataTypeDouble; -import eva2.optimization.OptimizationParameters; import eva2.optimization.operator.nichepso.deactivation.StandardDeactivationStrategy; import eva2.optimization.operator.paramcontrol.LinearParamAdaption; import eva2.optimization.operator.paramcontrol.ParamAdaption; diff --git a/src/eva2/optimization/strategies/NichePSO.java b/src/eva2/optimization/strategies/NichePSO.java index 3a15b01e..8da3399e 100644 --- a/src/eva2/optimization/strategies/NichePSO.java +++ b/src/eva2/optimization/strategies/NichePSO.java @@ -3,10 +3,10 @@ package eva2.optimization.strategies; import eva2.OptimizerFactory; import eva2.gui.editor.GenericObjectEditor; import eva2.gui.plot.TopoPlot; +import eva2.optimization.OptimizationParameters; import eva2.optimization.enums.PSOTopology; import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.individuals.InterfaceDataTypeDouble; -import eva2.optimization.OptimizationParameters; import eva2.optimization.operator.nichepso.absorption.EuclideanDiversityAbsorptionStrategy; import eva2.optimization.operator.nichepso.absorption.InterfaceAbsorptionStrategy; import eva2.optimization.operator.nichepso.absorption.StandardAbsorptionStrategy; diff --git a/src/eva2/optimization/strategies/ScatterSearch.java b/src/eva2/optimization/strategies/ScatterSearch.java index 59292cfd..9247e3be 100644 --- a/src/eva2/optimization/strategies/ScatterSearch.java +++ b/src/eva2/optimization/strategies/ScatterSearch.java @@ -4,9 +4,9 @@ import eva2.OptimizerFactory; import eva2.OptimizerRunnable; import eva2.gui.BeanInspector; import eva2.gui.editor.GenericObjectEditor; +import eva2.optimization.OptimizationParameters; import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.individuals.InterfaceDataTypeDouble; -import eva2.optimization.OptimizationParameters; import eva2.optimization.operator.distancemetric.PhenotypeMetric; import eva2.optimization.operator.postprocess.PostProcess; import eva2.optimization.operator.terminators.EvaluationTerminator; diff --git a/src/eva2/problems/ERPStarter.java b/src/eva2/problems/ERPStarter.java index 7ef320f3..d73dacaa 100644 --- a/src/eva2/problems/ERPStarter.java +++ b/src/eva2/problems/ERPStarter.java @@ -4,8 +4,8 @@ import eva2.OptimizerFactory; import eva2.OptimizerRunnable; import eva2.gui.BeanInspector; import eva2.gui.MainFrame; -import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.OptimizationParameters; +import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.operator.crossover.CrossoverESDefault; import eva2.optimization.operator.moso.MOSONoConvert; import eva2.optimization.operator.moso.MOSOWeightedFitness; diff --git a/src/eva2/problems/FLensProblem.java b/src/eva2/problems/FLensProblem.java index fac641b1..a7aee9c7 100644 --- a/src/eva2/problems/FLensProblem.java +++ b/src/eva2/problems/FLensProblem.java @@ -3,10 +3,10 @@ package eva2.problems; import eva2.gui.JEFrame; import eva2.gui.StandaloneOptimization; +import eva2.optimization.OptimizationParameters; import eva2.optimization.individuals.AbstractEAIndividual; import eva2.optimization.individuals.ESIndividualDoubleData; import eva2.optimization.individuals.InterfaceDataTypeDouble; -import eva2.optimization.OptimizationParameters; import eva2.optimization.population.Population; import eva2.optimization.strategies.InterfaceOptimizer; import eva2.tools.math.RNG; diff --git a/src/eva2/util/annotation/Parameter.java b/src/eva2/util/annotation/Parameter.java index 243fd7b2..a73c239b 100644 --- a/src/eva2/util/annotation/Parameter.java +++ b/src/eva2/util/annotation/Parameter.java @@ -1,6 +1,9 @@ package eva2.util.annotation; -import java.lang.annotation.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD)