diff --git a/vcell-core/src/main/java/cbit/vcell/solver/SolverDescription.java b/vcell-core/src/main/java/cbit/vcell/solver/SolverDescription.java index d35fc5e25b..cc70e70f26 100644 --- a/vcell-core/src/main/java/cbit/vcell/solver/SolverDescription.java +++ b/vcell-core/src/main/java/cbit/vcell/solver/SolverDescription.java @@ -13,14 +13,7 @@ import java.io.IOException; import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; import org.apache.commons.io.IOUtils; @@ -116,7 +109,12 @@ public enum SolverDescription { Smoldyn(TimeStep.CONSTANT, ErrorTol.NO, TimeSpecCreated.UNIFORM, "Smoldyn","Smoldyn (Spatial Stochastic Simulator)","Smoldyn (Spatial Stochastic Simulator)", SolverLongDesc.SMOLDYN, 1,SupportedTimeSpec.UNIFORM, - new SolverFeature[]{SolverFeature.Feature_Spatial, SolverFeature.Feature_Stochastic, SolverFeature.Feature_PeriodicBoundaryCondition, SolverFeature.Feature_DataProcessingInstructions}, + new SolverFeature[]{ + SolverFeature.Feature_Spatial, + SolverFeature.Feature_Stochastic, + SolverFeature.Feature_PeriodicBoundaryCondition, + SolverFeature.Feature_DataProcessingInstructions, + SolverFeature.Feature_Smoldyn}, SolverExecutable.Smoldyn, "KISAO:0000057", false), Chombo(TimeStep.CONSTANT, ErrorTol.NO, TimeSpecCreated.UNIFORM, "EBChombo","EBChombo, Semi-Implicit (Fixed Time Step), Experimental","Chombo Standalone", @@ -188,6 +186,7 @@ public enum SolverFeature { Feature_Hybrid("Hybrid: both Deterministic and Stochastic"), Feature_Moving("Moving Membrane"), Feature_Springs("Spring connected Sites"), + Feature_Smoldyn("Requires Smoldyn"), ; private final String name; @@ -199,6 +198,18 @@ public final String getName() { } } + // useful for debugging, makes easy to know which is the current SolverFeatureSet we're dealing with + public class SolverFeatureSetRegistry { + private static final Map nameRegistry = new LinkedHashMap<>(); + + public static void registerSolverFeatureSet(Object obj, String name) { + nameRegistry.put(obj, name); + } + public static String getSolverFeatureSetName(Object obj) { + return nameRegistry.get(obj); + } + } + /* * Spatial solvers */ @@ -207,42 +218,56 @@ public final String getName() { new SupportedProblemRequirements() { public boolean supports(ProblemRequirements desc) { return desc.isSpatialHybrid() && !desc.isMovingMembrane(); }}, FiniteVolumeStandalone,50); + static { SolverFeatureSetRegistry.registerSolverFeatureSet(SpatialHybridFeatureSet, "SpatialHybridFeatureSet"); } public static final SolverFeatureSet SpatialStochasticFeatureSet = new SolverFeatureSet ( - new SolverFeature[] { SolverFeature.Feature_Spatial, SolverFeature.Feature_Stochastic }, - new SupportedProblemRequirements() { public boolean supports(ProblemRequirements desc) { - return desc.isSpatialStoch() && !desc.isSpatialHybrid(); }}, + new SolverFeature[] { SolverFeature.Feature_Spatial, SolverFeature.Feature_Stochastic, SolverFeature.Feature_Smoldyn }, + new SupportedProblemRequirements() { + public boolean supports(ProblemRequirements desc) { + boolean ret = desc.isSpatialStoch() && !desc.isSpatialHybrid() && !desc.isLangevin(); + return ret; + } + }, Smoldyn,40); + static { SolverFeatureSetRegistry.registerSolverFeatureSet(SpatialStochasticFeatureSet, "SpatialStochasticFeatureSet"); } public static final SolverFeatureSet PdeFastSystemFeatureSet = new SolverFeatureSet ( new SolverFeature[] { SolverFeature.Feature_Spatial, SolverFeature.Feature_Deterministic, SolverFeature.Feature_FastSystem }, new SupportedProblemRequirements() { public boolean supports(ProblemRequirements desc) { return desc.isSpatial() && !desc.isSpatialHybrid() && desc.hasFastSystems( ) && !desc.isSpatialStoch(); }}, FiniteVolumeStandalone,30); + static { SolverFeatureSetRegistry.registerSolverFeatureSet(PdeFastSystemFeatureSet, "PdeFastSystemFeatureSet"); } public static final SolverFeatureSet PdeFeatureSetWithDirichletAtMembrane = new SolverFeatureSet( new SolverFeature[] { SolverFeature.Feature_DirichletAtMembraneBoundary }, new SupportedProblemRequirements() { public boolean supports(ProblemRequirements s) { return s.isSpatial() && !s.isSpatialHybrid( ) && s.hasDirichletAtMembrane() && !s.hasFastSystems() && !s.isSpatialStoch(); }}, Chombo,20); + static { SolverFeatureSetRegistry.registerSolverFeatureSet(PdeFeatureSetWithDirichletAtMembrane, "PdeFeatureSetWithDirichletAtMembrane"); } public static final SolverFeatureSet PdeFeatureSetWithoutDirichletAtMembrane = new SolverFeatureSet( new SolverFeature[] { SolverFeature.Feature_Spatial, SolverFeature.Feature_Deterministic }, new SupportedProblemRequirements() { public boolean supports(ProblemRequirements s) { - return s.isSpatial() && !s.isSpatialHybrid() && !s.isMovingMembrane() && !s.hasDirichletAtMembrane() && !s.hasFastSystems() && !s.isSpatialStoch(); }}, + boolean ret = s.isSpatial() && !s.isSpatialHybrid() && !s.isMovingMembrane() && !s.hasDirichletAtMembrane() && !s.hasFastSystems() && !s.isSpatialStoch() && !s.isLangevin(); + return ret; + }}, SundialsPDE,10); + static { SolverFeatureSetRegistry.registerSolverFeatureSet(PdeFeatureSetWithoutDirichletAtMembrane, "PdeFeatureSetWithoutDirichletAtMembrane"); } // public static final SolverFeatureSet ComsolFeatureSet = new SolverFeatureSet( // new SolverFeature[] { SolverFeature.Feature_Spatial,SolverFeature.Feature_Deterministic }, // new SupportedProblemRequirements() { public boolean supports(ProblemRequirements s) { // return s.isSpatial() && !s.isSpatialHybrid() && !s.hasFastSystems() && !s.isSpatialStoch(); }}, // Comsol,30); -// +// static { VariableNameRegistry.registerVariable(ComsolFeatureSet, "ComsolFeatureSet"); } + public static final SolverFeatureSet MovingBoundaryFeatureSet = new SolverFeatureSet( new SolverFeature[] { SolverFeature.Feature_Moving,SolverFeature.Feature_Spatial,SolverFeature.Feature_Deterministic }, new SupportedProblemRequirements() { public boolean supports(ProblemRequirements s) { - return s.isSpatial() && !s.isSpatialHybrid() && s.isMovingMembrane() && !s.hasFastSystems() && !s.isSpatialStoch(); }}, + boolean ret = s.isSpatial() && !s.isSpatialHybrid() && s.isMovingMembrane() && !s.hasFastSystems() && !s.isSpatialStoch(); + return ret; }}, MovingBoundary,30); + static { SolverFeatureSetRegistry.registerSolverFeatureSet(MovingBoundaryFeatureSet, "MovingBoundaryFeatureSet"); } /* * rule-based solvers @@ -251,11 +276,14 @@ public final String getName() { new SolverFeature[] { SolverFeature.Feature_NonSpatial, SolverFeature.Feature_Rulebased }, new SupportedProblemRequirements() { public boolean supports(ProblemRequirements desc) { return desc.isRuleBased(); }}, NFSim,100); - + static { SolverFeatureSetRegistry.registerSolverFeatureSet(RulebasedFeatureSet, "RulebasedFeatureSet"); } + public static final SolverFeatureSet LangevinFeatureSet = new SolverFeatureSet ( new SolverFeature[] { SolverFeature.Feature_Spatial, SolverFeature.Feature_Rulebased, SolverFeature.Feature_Springs }, - new SupportedProblemRequirements() { public boolean supports(ProblemRequirements desc) { return (desc.isLangevin()); }}, + new SupportedProblemRequirements() { public boolean supports(ProblemRequirements desc) { + return (desc.isLangevin()); }}, Langevin,200); + static { SolverFeatureSetRegistry.registerSolverFeatureSet(LangevinFeatureSet, "LangevinFeatureSet"); } /* * Non-spatial solvers @@ -264,18 +292,21 @@ public final String getName() { new SolverFeature[] { SolverFeature.Feature_NonSpatial, SolverFeature.Feature_Stochastic}, new SupportedProblemRequirements() { public boolean supports(ProblemRequirements desc) { return desc.isNonSpatialStoch() && !desc.isRuleBased(); }}, StochGibson,100); + static { SolverFeatureSetRegistry.registerSolverFeatureSet(NonSpatialStochasticFeatureSet, "NonSpatialStochasticFeatureSet"); } public static final SolverFeatureSet OdeFeatureSet = new SolverFeatureSet( new SolverFeature[] { SolverFeature.Feature_NonSpatial, SolverFeature.Feature_Deterministic}, new SupportedProblemRequirements() { public boolean supports(ProblemRequirements desc) { return !desc.isSpatial() && !desc.hasFastSystems() && !desc.isNonSpatialStoch() && !desc.isRuleBased(); }}, CombinedSundials,10); + static { SolverFeatureSetRegistry.registerSolverFeatureSet(OdeFeatureSet, "OdeFeatureSet"); } public static final SolverFeatureSet OdeFastSystemFeatureSet = new SolverFeatureSet( new SolverFeature[] { SolverFeature.Feature_NonSpatial, SolverFeature.Feature_Deterministic, SolverFeature.Feature_FastSystem}, new SupportedProblemRequirements() { public boolean supports(ProblemRequirements desc) { return !desc.isSpatial() && desc.hasFastSystems() && !desc.isNonSpatialStoch() && !desc.isRuleBased(); }}, CombinedSundials,10); + static { SolverFeatureSetRegistry.registerSolverFeatureSet(OdeFastSystemFeatureSet, "OdeFastSystemFeatureSet"); } //this one is not like the others public static final Collection DiscontinutiesFeatures = Arrays.asList(new SolverFeature[]{ @@ -658,8 +689,11 @@ public static Collection getSupportingSolverDescriptions(Prob ProblemRequirements.Checker.validate(mathDescription); Collection solvers = new HashSet( ); for (SolverFeatureSet sfs : SolverFeatureSet.getSets()) { + System.out.println(SolverFeatureSetRegistry.getSolverFeatureSetName(sfs)); if (sfs.supports(mathDescription)) { - solvers.addAll(getSolverDescriptions(sfs.getSolverFeatures())); + List solverFeatures = sfs.getSolverFeatures(); + Collection solverDescriptions = getSolverDescriptions(solverFeatures); + solvers.addAll(solverDescriptions); } } if (!solvers.isEmpty( )) {