Search in sources :

Example 6 with ExpressionBindingException

use of cbit.vcell.parser.ExpressionBindingException in project vcell by virtualcell.

the class Kinetics method cleanupParameters.

/**
 * This method was created in VisualAge.
 */
private final void cleanupParameters() throws ModelException, ExpressionException, PropertyVetoException {
    if (bReading) {
        return;
    }
    // 
    if (fieldKineticsParameters != null) {
        for (int i = 0; i < fieldKineticsParameters.length; i++) {
            if (fieldKineticsParameters[i].getRole() == ROLE_UserDefined && !isReferenced(fieldKineticsParameters[i], 0)) {
                removeKineticsParameter(fieldKineticsParameters[i]);
                i--;
            }
        }
    }
    if (fieldUnresolvedParameters != null) {
        for (int i = 0; i < fieldUnresolvedParameters.length; i++) {
            if (!isReferenced(fieldUnresolvedParameters[i], 0)) {
                removeUnresolvedParameter(fieldUnresolvedParameters[i]);
                i--;
            }
        }
    }
    if (fieldProxyParameters != null) {
        for (int i = 0; i < fieldProxyParameters.length; i++) {
            if (!isReferenced(fieldProxyParameters[i], 0)) {
                removeProxyParameter(fieldProxyParameters[i]);
                i--;
            }
        }
    }
    if (fieldKineticsParameters != null) {
        for (int i = 0; i < fieldKineticsParameters.length; i++) {
            Expression exp = fieldKineticsParameters[i].getExpression();
            if (exp != null) {
                try {
                    exp.bindExpression(reactionStep);
                } catch (ExpressionBindingException e) {
                    System.out.println("error binding expression '" + exp.infix() + "': " + e.getMessage());
                }
            }
        }
    }
// resolveUndefinedUnits();
}
Also used : Expression(cbit.vcell.parser.Expression) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException)

Example 7 with ExpressionBindingException

use of cbit.vcell.parser.ExpressionBindingException in project vcell by virtualcell.

the class Model method refreshDependencies.

/**
 * Insert the method's description here.
 * Creation date: (5/22/00 10:50:08 PM)
 */
public void refreshDependencies() {
    removePropertyChangeListener(this);
    removeVetoableChangeListener(this);
    addVetoableChangeListener(this);
    addPropertyChangeListener(this);
    for (int i = 0; i < fieldStructures.length; i++) {
        fieldStructures[i].removePropertyChangeListener(this);
        fieldStructures[i].removeVetoableChangeListener(this);
        fieldStructures[i].addPropertyChangeListener(this);
        fieldStructures[i].addVetoableChangeListener(this);
        fieldStructures[i].getStructureSize().removePropertyChangeListener(this);
        fieldStructures[i].getStructureSize().removeVetoableChangeListener(this);
        fieldStructures[i].getStructureSize().addPropertyChangeListener(this);
        fieldStructures[i].getStructureSize().addVetoableChangeListener(this);
        if (fieldStructures[i] instanceof Membrane) {
            ((Membrane) fieldStructures[i]).getMembraneVoltage().removePropertyChangeListener(this);
            ((Membrane) fieldStructures[i]).getMembraneVoltage().removeVetoableChangeListener(this);
            ((Membrane) fieldStructures[i]).getMembraneVoltage().addPropertyChangeListener(this);
            ((Membrane) fieldStructures[i]).getMembraneVoltage().addVetoableChangeListener(this);
        }
        fieldStructures[i].setModel(this);
    }
    for (int i = 0; i < fieldSpecies.length; i++) {
        fieldSpecies[i].removeVetoableChangeListener(this);
        fieldSpecies[i].addVetoableChangeListener(this);
        fieldSpecies[i].refreshDependencies();
    }
    for (int i = 0; i < fieldSpeciesContexts.length; i++) {
        fieldSpeciesContexts[i].removePropertyChangeListener(this);
        fieldSpeciesContexts[i].removeVetoableChangeListener(this);
        fieldSpeciesContexts[i].addPropertyChangeListener(this);
        fieldSpeciesContexts[i].addVetoableChangeListener(this);
        fieldSpeciesContexts[i].setModel(this);
        fieldSpeciesContexts[i].refreshDependencies();
    }
    for (int i = 0; i < fieldReactionSteps.length; i++) {
        fieldReactionSteps[i].removePropertyChangeListener(this);
        fieldReactionSteps[i].removeVetoableChangeListener(this);
        fieldReactionSteps[i].getKinetics().removePropertyChangeListener(this);
        fieldReactionSteps[i].getKinetics().removeVetoableChangeListener(this);
        fieldReactionSteps[i].getKinetics().addPropertyChangeListener(this);
        fieldReactionSteps[i].getKinetics().addVetoableChangeListener(this);
        fieldReactionSteps[i].addPropertyChangeListener(this);
        fieldReactionSteps[i].addVetoableChangeListener(this);
        fieldReactionSteps[i].setModel(this);
        try {
            fieldReactionSteps[i].rebindAllToModel(this);
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
        fieldReactionSteps[i].refreshDependencies();
    }
    for (int i = 0; i < fieldModelParameters.length; i++) {
        fieldModelParameters[i].removeVetoableChangeListener(this);
        fieldModelParameters[i].removePropertyChangeListener(this);
        fieldModelParameters[i].addVetoableChangeListener(Parameter.PROPERTYNAME_NAME, this);
        fieldModelParameters[i].addPropertyChangeListener(this);
        try {
            fieldModelParameters[i].getExpression().bindExpression(this);
        } catch (ExpressionBindingException e) {
            e.printStackTrace(System.out);
            throw new RuntimeException("Error binding global parameter '" + fieldModelParameters[i].getName() + "' to model." + e.getMessage());
        }
    }
    for (int i = 0; i < getRbmModelContainer().getReactionRuleList().size(); i++) {
        ReactionRule reactionRule = getRbmModelContainer().getReactionRule(i);
        reactionRule.removePropertyChangeListener(this);
        reactionRule.removeVetoableChangeListener(this);
        reactionRule.getKineticLaw().removePropertyChangeListener(this);
        // reactionRule.getKineticLaw().removeVetoableChangeListener(this);
        reactionRule.getKineticLaw().addPropertyChangeListener(this);
        // reactionRule.getKineticLaw().addVetoableChangeListener(this);
        reactionRule.addPropertyChangeListener(this);
        reactionRule.addVetoableChangeListener(this);
        reactionRule.setModel(this);
        try {
            reactionRule.rebindAllToModel(this);
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
        reactionRule.refreshDependencies();
    }
    for (RbmObservable observable : getRbmModelContainer().getObservableList()) {
        observable.removePropertyChangeListener(this);
        observable.removeVetoableChangeListener(this);
        observable.addPropertyChangeListener(this);
        observable.addVetoableChangeListener(this);
        observable.setModel(this);
    }
    for (MolecularType molType : getRbmModelContainer().getMolecularTypeList()) {
        molType.removePropertyChangeListener(this);
        molType.removeVetoableChangeListener(this);
        molType.addPropertyChangeListener(this);
        molType.addVetoableChangeListener(this);
        molType.setModel(this);
    }
}
Also used : MolecularType(org.vcell.model.rbm.MolecularType) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) VCUnitException(cbit.vcell.units.VCUnitException) PropertyVetoException(java.beans.PropertyVetoException) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) ExpressionException(cbit.vcell.parser.ExpressionException)

Example 8 with ExpressionBindingException

use of cbit.vcell.parser.ExpressionBindingException in project vcell by virtualcell.

the class MathDescription method gatherIssues.

/**
 * This method was created in VisualAge.
 * @return boolean
 */
public void gatherIssues(IssueContext issueContext, List<Issue> issueList) {
    issueContext = issueContext.newChildContext(ContextType.MathDescription, this);
    setWarning(null);
    if (geometry == null) {
        Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_NoGeometry, VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_1, Issue.SEVERITY_ERROR);
        issueList.add(issue);
    }
    if (isSpatialStoch() && geometry.getDimension() != 3) {
        Issue issue = new Issue(geometry, issueContext, IssueCategory.Smoldyn_Geometry_3DWarning, "VCell spatial stochastic models only support 3D geometry.", Issue.SEVERITY_ERROR);
        issueList.add(issue);
    }
    // check Constant are really constants
    for (int i = 0; i < variableList.size(); i++) {
        Variable var = variableList.get(i);
        if (var instanceof Constant) {
            try {
                ((Constant) var).getExpression().evaluateConstant();
            } catch (Exception ex) {
                ex.printStackTrace(System.out);
                Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_Constant_NotANumber, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_CONSTANT, var.getExpression().infix()), Issue.SEVERITY_ERROR);
                issueList.add(issue);
            }
        }
    }
    // 
    // count number of variables of each type
    // 
    int volVarCount = 0;
    int memVarCount = 0;
    int filVarCount = 0;
    int volRegionVarCount = 0;
    int memRegionVarCount = 0;
    int filRegionVarCount = 0;
    int stochVarCount = 0;
    int pointVarCount = 0;
    for (int i = 0; i < variableList.size(); i++) {
        Variable var = variableList.get(i);
        if (var instanceof VolVariable) {
            volVarCount++;
        } else if (var instanceof MemVariable) {
            memVarCount++;
        } else if (var instanceof FilamentVariable) {
            filVarCount++;
        } else if (var instanceof VolumeRegionVariable) {
            volRegionVarCount++;
        } else if (var instanceof MembraneRegionVariable) {
            memRegionVarCount++;
        } else if (var instanceof FilamentRegionVariable) {
            filRegionVarCount++;
        } else if (var instanceof StochVolVariable) {
            stochVarCount++;
        } else if (var instanceof PointVariable) {
            pointVarCount++;
        }
    }
    // 
    for (int i = 0; i < subDomainList.size(); i++) {
        try {
            SubDomain subDomain = subDomainList.get(i);
            Enumeration<Equation> equEnum = subDomain.getEquations();
            while (equEnum.hasMoreElements()) {
                Equation equ = equEnum.nextElement();
                equ.checkValid(this, subDomain);
                equ.bind(this);
            }
            FastSystem fastSystem = subDomain.getFastSystem();
            if (fastSystem != null) {
                Enumeration<FastRate> frEnum = fastSystem.getFastRates();
                while (frEnum.hasMoreElements()) {
                    FastRate fr = frEnum.nextElement();
                    fr.bind(this);
                }
                Enumeration<FastInvariant> fiEnum = fastSystem.getFastInvariants();
                while (fiEnum.hasMoreElements()) {
                    FastInvariant fi = fiEnum.nextElement();
                    fi.bind(this);
                }
            }
            for (ParticleProperties pp : subDomain.getParticleProperties()) {
                pp.bind(this);
            }
            for (ParticleJumpProcess pjp : subDomain.getParticleJumpProcesses()) {
                pjp.bind(this);
                Expression rateDefinition = null;
                JumpProcessRateDefinition jprd = pjp.getParticleRateDefinition();
                if (jprd instanceof MacroscopicRateConstant) {
                    rateDefinition = MathUtilities.substituteFunctions(((MacroscopicRateConstant) jprd).getExpression(), this);
                } else if (jprd instanceof InteractionRadius) {
                    rateDefinition = MathUtilities.substituteFunctions(((InteractionRadius) jprd).getExpression(), this);
                } else {
                    new RuntimeException("The jump process rate definition is not supported");
                }
                String[] symbols = rateDefinition.getSymbols();
                if (symbols != null) {
                    for (String symbol : symbols) {
                        // throw exception for particle variables, particle variable cannot be referenced
                        Variable var = getVariable(symbol);
                        if (var instanceof ParticleVariable) {
                            throw new MathException("Stochastic variables can not be referenced in functions and equations.");
                        }
                        if (subDomain instanceof CompartmentSubDomain) {
                            if ((var instanceof MembraneRegionVariable || var instanceof MemVariable)) {
                                throw new MathException("Volume reaction: " + pjp.getName() + " cannot reference membrane variable: " + var.getName() + ".");
                            }
                        }
                    }
                }
            }
        } catch (ExpressionBindingException e) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_ExpressionBindingException, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        } catch (ExpressionException e) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_ExpressionException, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        } catch (MathException e) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_MathException, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
    }
    // 
    if (geometry.getDimension() == 0) {
        // 
        if (subDomainList.size() != 1) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_1, Issue.SEVERITY_ERROR);
            issueList.add(issue);
        } else if (subDomainList.size() == 1) {
            if (!(subDomainList.get(0) instanceof CompartmentSubDomain)) {
                Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_2, Issue.SEVERITY_ERROR);
                issueList.add(issue);
            }
            CompartmentSubDomain subDomain = (CompartmentSubDomain) subDomainList.get(0);
            // distinguish ODE model and stochastic model
            if (isNonSpatialStoch()) {
                if (stochVarCount == 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_StochasticModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_STOCHASTIC_MODEL_1, Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (subDomain.getJumpProcesses().size() == 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_StochasticModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_STOCHASTIC_MODEL_2, Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                // check variable initial condition
                for (VarIniCondition varIniCondition : subDomain.getVarIniConditions()) {
                    Expression iniExp = varIniCondition.getIniVal();
                    try {
                        iniExp.bindExpression(this);
                    } catch (Exception ex) {
                        ex.printStackTrace(System.out);
                        setWarning(ex.getMessage());
                    }
                }
                // check probability rate
                for (JumpProcess jumpProcess : subDomain.getJumpProcesses()) {
                    Expression probExp = jumpProcess.getProbabilityRate();
                    try {
                        probExp.bindExpression(this);
                    } catch (Exception ex) {
                        ex.printStackTrace(System.out);
                        setWarning(ex.getMessage());
                    }
                }
            } else if (isRuleBased()) {
            } else {
                // ODE model
                // 
                // Check that all equations are ODEs
                // 
                int odeCount = 0;
                Enumeration<Equation> enum_equ = subDomain.getEquations();
                while (enum_equ.hasMoreElements()) {
                    Equation equ = enum_equ.nextElement();
                    if (equ instanceof OdeEquation) {
                        odeCount++;
                    } else {
                        Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_3, Issue.SEVERITY_ERROR);
                        issueList.add(issue);
                    }
                }
                if (odeCount == 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_4, Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (volVarCount != odeCount) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_5, Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (memVarCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.MembraneVariable), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (filVarCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.FilamentVariable), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (volRegionVarCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.VolumeRegionVariable), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (memRegionVarCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.MembraneRegionVariable), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (filRegionVarCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.FilamentRegionVariable), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            }
        }
    // 
    // spatial (PDE and ODE)
    // 
    } else {
        // 
        // Check that the number of CompartmentSubdomains equals the number of VolumeSubVolumes in the Geometry
        // Check that the number of FilamentSubdomains equals the number of Filaments in the Geometry
        // 
        int compartmentCount = 0;
        int membraneCount = 0;
        int filamentCount = 0;
        int pointCount = 0;
        for (int i = 0; i < subDomainList.size(); i++) {
            SubDomain subDomain = (SubDomain) subDomainList.get(i);
            if (subDomain instanceof CompartmentSubDomain) {
                if (geometry.getGeometrySpec().getSubVolume(subDomain.getName()) == null) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_1, subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                compartmentCount++;
            } else if (subDomain instanceof MembraneSubDomain) {
                membraneCount++;
            } else if (subDomain instanceof FilamentSubDomain) {
                filamentCount++;
            } else if (subDomain instanceof PointSubDomain) {
                pointCount++;
            } else {
                Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_2, subDomain.getName()), Issue.SEVERITY_ERROR);
                issueList.add(issue);
            }
        }
        if (geometry.getGeometrySpec().getNumSubVolumes() != compartmentCount) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_3, geometry.getGeometrySpec().getNumSubVolumes(), compartmentCount), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
        if (geometry.getGeometrySpec().getFilamentGroup().getFilamentCount() != filamentCount) {
        // setWarning("Spatial model, there are "+geometry.getGeometrySpec().getFilamentGroup().getFilamentCount()+" filaments in geometry, but "+filamentCount+" "+VCML.FilamentSubDomain+"'s, must be equal");
        // return false;
        }
        if (filamentCount == 0 && (filVarCount > 0 || filRegionVarCount > 0)) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_4, Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
        if (membraneCount == 0 && (memVarCount > 0 || memRegionVarCount > 0)) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_5, Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
        // 
        for (int i = 0; i < subDomainList.size(); i++) {
            SubDomain subDomain1 = (SubDomain) subDomainList.get(i);
            for (int j = 0; j < subDomainList.size(); j++) {
                if (i != j) {
                    SubDomain subDomain2 = (SubDomain) subDomainList.get(j);
                    if (subDomain1.getName().equals(subDomain2.getName())) {
                        Issue issue = new Issue(subDomain1, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_6, subDomain1.getName(), subDomain2.getName()), Issue.SEVERITY_ERROR);
                        issueList.add(issue);
                    }
                    if (subDomain1 instanceof MembraneSubDomain && subDomain2 instanceof MembraneSubDomain) {
                        MembraneSubDomain memSubDomain1 = (MembraneSubDomain) subDomain1;
                        MembraneSubDomain memSubDomain2 = (MembraneSubDomain) subDomain2;
                        if ((memSubDomain1.getInsideCompartment() == memSubDomain2.getInsideCompartment() && memSubDomain1.getOutsideCompartment() == memSubDomain2.getOutsideCompartment()) || (memSubDomain1.getInsideCompartment() == memSubDomain2.getOutsideCompartment() && memSubDomain1.getOutsideCompartment() == memSubDomain2.getInsideCompartment())) {
                            Issue issue = new Issue(subDomain1, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_7, memSubDomain1.getInsideCompartment().getName(), memSubDomain1.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
                            issueList.add(issue);
                        }
                    }
                }
            }
        }
        // check periodic boundary conditons
        for (int i = 0; i < subDomainList.size(); i++) {
            SubDomain subDomain = (SubDomain) subDomainList.get(i);
            if (subDomain instanceof CompartmentSubDomain) {
                CompartmentSubDomain compartmentSubDomain = (CompartmentSubDomain) subDomain;
                BoundaryConditionType bctM = compartmentSubDomain.getBoundaryConditionXm();
                BoundaryConditionType bctP = compartmentSubDomain.getBoundaryConditionXp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Xm", "Xp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                bctM = compartmentSubDomain.getBoundaryConditionYm();
                bctP = compartmentSubDomain.getBoundaryConditionYp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Ym", "Yp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                bctM = compartmentSubDomain.getBoundaryConditionZm();
                bctP = compartmentSubDomain.getBoundaryConditionZp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Zm", "Zp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            } else if (subDomain instanceof MembraneSubDomain) {
                MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain;
                BoundaryConditionType bctM = membraneSubDomain.getBoundaryConditionXm();
                BoundaryConditionType bctP = membraneSubDomain.getBoundaryConditionXp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Xm", "Xp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                bctM = membraneSubDomain.getBoundaryConditionYm();
                bctP = membraneSubDomain.getBoundaryConditionYp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Ym", "Yp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                bctM = membraneSubDomain.getBoundaryConditionZm();
                bctP = membraneSubDomain.getBoundaryConditionZp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Zm", "Zp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            }
        }
        try {
            if (geometry.getGeometrySpec().getDimension() > 0) {
                // 
                // Check that there is a MembraneSubdomain for each unique subVolume-subVolume interface in Geometry
                // each ResolvedSurfaceLocation is an instance of a subVolume-subVolume interface (one-to-one with region boundaries).
                // 
                GeometricRegion[] regions = geometry.getGeometrySurfaceDescription().getGeometricRegions();
                // }
                if (regions == null) {
                    Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_2, Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                } else {
                    for (int i = 0; i < regions.length; i++) {
                        if (regions[i] instanceof SurfaceGeometricRegion) {
                            SurfaceGeometricRegion surfaceRegion = (SurfaceGeometricRegion) regions[i];
                            SubVolume subVolume1 = ((VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[0]).getSubVolume();
                            CompartmentSubDomain compartment1 = getCompartmentSubDomain(subVolume1.getName());
                            if (compartment1 == null) {
                                Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_3, getGeometry().getName(), subVolume1.getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                            SubVolume subVolume2 = ((VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[1]).getSubVolume();
                            CompartmentSubDomain compartment2 = getCompartmentSubDomain(subVolume2.getName());
                            if (compartment2 == null) {
                                Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_3, getGeometry().getName(), subVolume2.getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                            MembraneSubDomain membraneSubDomain = getMembraneSubDomain(compartment1, compartment2);
                            if (compartment2 != null && compartment1 != null && membraneSubDomain == null) {
                                Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_4, compartment1.getName(), compartment2.getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                        }
                    }
                    // 
                    for (int i = 0; i < subDomainList.size(); i++) {
                        if (subDomainList.get(i) instanceof MembraneSubDomain) {
                            MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomainList.get(i);
                            boolean bFoundSurfaceInGeometry = false;
                            for (int j = 0; j < regions.length; j++) {
                                if (regions[j] instanceof SurfaceGeometricRegion) {
                                    SurfaceGeometricRegion surfaceRegion = (SurfaceGeometricRegion) regions[j];
                                    VolumeGeometricRegion volumeRegion1 = (VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[0];
                                    VolumeGeometricRegion volumeRegion2 = (VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[1];
                                    String memInsideName = membraneSubDomain.getInsideCompartment().getName();
                                    String memOutsideName = membraneSubDomain.getOutsideCompartment().getName();
                                    if ((memInsideName.equals(volumeRegion1.getSubVolume().getName()) && memOutsideName.equals(volumeRegion2.getSubVolume().getName())) || (memInsideName.equals(volumeRegion2.getSubVolume().getName()) && memOutsideName.equals(volumeRegion1.getSubVolume().getName()))) {
                                        bFoundSurfaceInGeometry = true;
                                        break;
                                    }
                                }
                            }
                            if (!bFoundSurfaceInGeometry) {
                                Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_5, membraneSubDomain.getInsideCompartment().getName(), membraneSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                        }
                    }
                }
            }
        // }catch (GeometryException e){
        // e.printStackTrace(System.out);
        // setWarning("error validating MathDescription: "+e.getMessage());
        // return false;
        // }catch (ImageException e){
        // e.printStackTrace(System.out);
        // setWarning("error validating MathDescription: "+e.getMessage());
        // return false;
        // }catch (ExpressionException e){
        // e.printStackTrace(System.out);
        // setWarning("error validating MathDescription: "+e.getMessage());
        // return false;
        } catch (Exception e) {
            e.printStackTrace(System.out);
            Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
        // 
        for (int i = 0; i < variableList.size(); i++) {
            Variable var = variableList.get(i);
            String varName = var.getName();
            if (var instanceof VolVariable) {
                VolVariable volVar = (VolVariable) var;
                int pdeRefCount = 0;
                int odeRefCount = 0;
                int steadyPdeCount = 0;
                int measureCount = 0;
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    Equation equ = subDomain.getEquation(volVar);
                    if (equ instanceof PdeEquation) {
                        if (((PdeEquation) equ).isSteady()) {
                            steadyPdeCount++;
                        } else {
                            pdeRefCount++;
                        }
                        // 
                        for (int k = 0; k < subDomainList.size(); k++) {
                            SubDomain subDomain2 = subDomainList.get(k);
                            if (subDomain2 instanceof MembraneSubDomain) {
                                MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain2;
                                if (membraneSubDomain.getInsideCompartment() == subDomain || membraneSubDomain.getOutsideCompartment() == subDomain) {
                                    JumpCondition jumpCondition = membraneSubDomain.getJumpCondition(volVar);
                                    BoundaryConditionValue boundaryValue = ((PdeEquation) equ).getBoundaryConditionValue(membraneSubDomain.getName());
                                    // if PDE variable does not have jump condition OR boundaryValue (neither or both are not allowed), its an error.
                                    if ((jumpCondition == null && boundaryValue == null) || (jumpCondition != null && boundaryValue != null)) {
                                        Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_10, varName, subDomain.getName(), membraneSubDomain.getName()), Issue.SEVERITY_ERROR);
                                        issueList.add(issue);
                                    }
                                    if (boundaryValue != null && (subDomain.getBoundaryConditionSpec(membraneSubDomain.getName()) == null)) {
                                        Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_10A, varName, subDomain.getName(), membraneSubDomain.getName(), membraneSubDomain.getName(), subDomain.getName()), Issue.SEVERITY_ERROR);
                                        issueList.add(issue);
                                    }
                                }
                            }
                        }
                    } else if (equ instanceof OdeEquation) {
                        odeRefCount++;
                    } else if (equ instanceof MeasureEquation) {
                        measureCount++;
                    }
                    // 
                    if (subDomain instanceof MembraneSubDomain) {
                        MembraneSubDomain memSubDomain = (MembraneSubDomain) subDomain;
                        JumpCondition jumpCondition = memSubDomain.getJumpCondition(volVar);
                        if (jumpCondition != null) {
                            boolean bInsidePresent = (memSubDomain.getInsideCompartment().getEquation(volVar) instanceof PdeEquation);
                            boolean bOutsidePresent = (memSubDomain.getOutsideCompartment().getEquation(volVar) instanceof PdeEquation);
                            if (!bInsidePresent && !bOutsidePresent) {
                                Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_11, varName, memSubDomain.getName(), memSubDomain.getInsideCompartment().getName(), memSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                            // 
                            if (!bInsidePresent && !jumpCondition.getInFluxExpression().isZero()) {
                                Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_12, varName, memSubDomain.getName(), memSubDomain.getInsideCompartment().getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                            if (!bOutsidePresent && !jumpCondition.getOutFluxExpression().isZero()) {
                                Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_13, varName, memSubDomain.getName(), memSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                        }
                    }
                }
                if (odeRefCount > 0 && pdeRefCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_14, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (steadyPdeCount > 0 && pdeRefCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_15, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (odeRefCount == 0 && pdeRefCount == 0 && steadyPdeCount == 0 && measureCount == 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_16, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            } else // 
            if (var instanceof MemVariable) {
                int pdeRefCount = 0;
                int odeRefCount = 0;
                int steadyPdeCount = 0;
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    Equation equ = subDomain.getEquation(var);
                    if (equ instanceof PdeEquation) {
                        if (((PdeEquation) equ).isSteady()) {
                            steadyPdeCount++;
                        } else {
                            pdeRefCount++;
                        }
                    } else if (equ instanceof OdeEquation) {
                        odeRefCount++;
                    }
                }
                if (odeRefCount > 0 && pdeRefCount > 0) {
                    Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_14, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (steadyPdeCount > 0 && pdeRefCount > 0) {
                    Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_15, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (odeRefCount == 0 && pdeRefCount == 0 && steadyPdeCount == 0) {
                    Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_16, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            } else // 
            if (var instanceof FilamentVariable) {
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    if (subDomain instanceof FilamentSubDomain) {
                        Equation equ = subDomain.getEquation(var);
                        if (!(equ instanceof OdeEquation)) {
                            Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_21, varName, subDomain.getName()), Issue.SEVERITY_ERROR);
                            issueList.add(issue);
                        }
                    }
                }
            } else // 
            if (var instanceof VolumeRegionVariable) {
                VolumeRegionVariable volRegionVar = (VolumeRegionVariable) var;
                int count = 0;
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    if (subDomain instanceof CompartmentSubDomain) {
                        Equation equ = subDomain.getEquation(volRegionVar);
                        if (equ instanceof VolumeRegionEquation) {
                            count++;
                            // 
                            for (int k = 0; k < subDomainList.size(); k++) {
                                SubDomain subDomain2 = subDomainList.get(k);
                                if (subDomain2 instanceof MembraneSubDomain) {
                                    MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain2;
                                    if (membraneSubDomain.getInsideCompartment() == subDomain || membraneSubDomain.getOutsideCompartment() == subDomain) {
                                        if (membraneSubDomain.getJumpCondition(volRegionVar) == null) {
                                            Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_17, varName, subDomain.getName(), membraneSubDomain.getName()), Issue.SEVERITY_ERROR);
                                            issueList.add(issue);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (count == 0) {
                    Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_18, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            } else // 
            if (var instanceof MembraneRegionVariable) {
                int count = 0;
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    if (subDomain instanceof MembraneSubDomain) {
                        Equation equ = subDomain.getEquation(var);
                        if (equ instanceof MembraneRegionEquation) {
                            count++;
                        }
                    }
                }
                if (count == 0) {
                    Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_19, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            } else // 
            if (var instanceof FilamentRegionVariable) {
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    if (subDomain instanceof FilamentSubDomain) {
                        Equation equ = subDomain.getEquation(var);
                        if (!(equ instanceof FilamentRegionEquation)) {
                            Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_20, varName, subDomain.getName()), Issue.SEVERITY_ERROR);
                            issueList.add(issue);
                        }
                    }
                }
            }
        }
    }
    if (eventList.size() > 0 && isSpatial()) {
        Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_22, Issue.SEVERITY_ERROR);
        issueList.add(issue);
    }
    for (Event event : eventList) {
        try {
            event.bind(this);
        } catch (ExpressionBindingException e) {
            Issue issue = new Issue(event, issueContext, IssueCategory.MathDescription_SpatialModel_Event, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
    }
    for (DataGenerator dataGenerator : postProcessingBlock.getDataGeneratorList()) {
        try {
            dataGenerator.bind(this);
        } catch (ExpressionBindingException e) {
            Issue issue = new Issue(dataGenerator, issueContext, IssueCategory.MathDescription_SpatialModel_PostProcessingBlock, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
    }
}
Also used : Issue(org.vcell.util.Issue) ExpressionException(cbit.vcell.parser.ExpressionException) SubVolume(cbit.vcell.geometry.SubVolume) VolumeGeometricRegion(cbit.vcell.geometry.surface.VolumeGeometricRegion) VolumeGeometricRegion(cbit.vcell.geometry.surface.VolumeGeometricRegion) SurfaceGeometricRegion(cbit.vcell.geometry.surface.SurfaceGeometricRegion) GeometricRegion(cbit.vcell.geometry.surface.GeometricRegion) SurfaceGeometricRegion(cbit.vcell.geometry.surface.SurfaceGeometricRegion) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) NoSuchElementException(java.util.NoSuchElementException) ExpressionException(cbit.vcell.parser.ExpressionException) BoundaryConditionValue(cbit.vcell.math.PdeEquation.BoundaryConditionValue) Expression(cbit.vcell.parser.Expression) ChangeEvent(javax.swing.event.ChangeEvent)

Example 9 with ExpressionBindingException

use of cbit.vcell.parser.ExpressionBindingException in project vcell by virtualcell.

the class MathUtilities method substituteModelParameters.

/**
 * This method was created in VisualAge.
 * @return cbit.vcell.parser.Expression
 * @param exp cbit.vcell.parser.Expression
 * @exception java.lang.Exception The exception description.
 */
public static Expression substituteModelParameters(Expression exp, SymbolTable symbolTable) throws ExpressionException {
    Expression exp2 = new Expression(exp);
    // 
    // do until no more functions to substitute
    // 
    int count = 0;
    boolean bSubstituted = true;
    while (bSubstituted) {
        bSubstituted = false;
        if (count++ > 30) {
            throw new ExpressionBindingException("infinite loop in eliminating function nesting");
        }
        String[] symbols = exp2.getSymbols();
        if (symbols != null) {
            for (int i = 0; i < symbols.length; i++) {
                SymbolTableEntry ste = exp2.getSymbolBinding(symbols[i]);
                if (ste != null && !(ste instanceof SymbolTableFunctionEntry)) {
                    Expression steExp = ste.getExpression();
                    if (steExp != null) {
                        exp2.substituteInPlace(new Expression(ste.getName()), steExp);
                        bSubstituted = true;
                    }
                }
            }
        }
    }
    exp2.bindExpression(symbolTable);
    return exp2;
}
Also used : SymbolTableEntry(cbit.vcell.parser.SymbolTableEntry) Expression(cbit.vcell.parser.Expression) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) SymbolTableFunctionEntry(cbit.vcell.parser.SymbolTableFunctionEntry)

Example 10 with ExpressionBindingException

use of cbit.vcell.parser.ExpressionBindingException in project vcell by virtualcell.

the class MathUtilities method getRequiredVariablesExplicit.

/**
 * This method was created by a SmartGuide.
 * @return java.util.Enumeration
 * @param exp cbit.vcell.parser.Expression
 */
private static Enumeration<Variable> getRequiredVariablesExplicit(Expression exp, SymbolTable symbolTable) throws ExpressionException {
    Vector<Variable> requiredVarList = new Vector<Variable>();
    if (exp != null) {
        String[] identifiers = exp.getSymbols();
        if (lg.isDebugEnabled()) {
            lg.debug("from expression " + exp + " parsing identifiers " + Arrays.toString(identifiers));
        }
        if (identifiers != null) {
            for (int i = 0; i < identifiers.length; i++) {
                String id = identifiers[i];
                // 
                // look for globally bound variables
                // 
                SymbolTableEntry entry = symbolTable.getEntry(id);
                // 
                if (entry == null) {
                    entry = ReservedMathSymbolEntries.getReservedVariableEntry(id);
                    if (lg.isDebugEnabled()) {
                        lg.debug("id " + id + "not in symbol table looked for reserved symbols,found = " + (entry != null));
                    }
                } else if (lg.isDebugEnabled()) {
                    lg.debug("symbolTable.getEntry( ) returned " + entry + " for " + id);
                }
                // 
                if (entry == null) {
                    SymbolTableEntry ste = exp.getSymbolBinding(id);
                    if (ste instanceof PseudoConstant) {
                        entry = ste;
                    }
                    if (entry == null) {
                        ExpressionBindingException ebe = new ExpressionBindingException("unresolved symbol " + id + " in expression " + exp);
                        lg.debug("found " + ste + "but it's not a PseudoConstant; throwing ", ebe);
                        throw ebe;
                    }
                }
                if (!(entry instanceof Variable)) {
                    throw new RuntimeException("MathUtilities.getRequiredVariablesExplicit() only gets required math variable. Use math side symbol table, e.g. MathDescription, SimulationSymbolTable, etc.");
                }
                requiredVarList.addElement((Variable) entry);
            }
        }
    }
    return requiredVarList.elements();
}
Also used : SymbolTableEntry(cbit.vcell.parser.SymbolTableEntry) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) Vector(java.util.Vector)

Aggregations

ExpressionBindingException (cbit.vcell.parser.ExpressionBindingException)37 Expression (cbit.vcell.parser.Expression)26 ExpressionException (cbit.vcell.parser.ExpressionException)16 PropertyVetoException (java.beans.PropertyVetoException)15 Vector (java.util.Vector)8 MathException (cbit.vcell.math.MathException)7 SymbolTableEntry (cbit.vcell.parser.SymbolTableEntry)7 VCUnitDefinition (cbit.vcell.units.VCUnitDefinition)7 ArrayList (java.util.ArrayList)7 VCUnitException (cbit.vcell.units.VCUnitException)6 LocalParameter (cbit.vcell.mapping.ParameterContext.LocalParameter)5 ModelParameter (cbit.vcell.model.Model.ModelParameter)5 SpeciesContext (cbit.vcell.model.SpeciesContext)5 Issue (org.vcell.util.Issue)5 ModelException (cbit.vcell.model.ModelException)4 ModelUnitSystem (cbit.vcell.model.ModelUnitSystem)4 Structure (cbit.vcell.model.Structure)4 Element (org.jdom.Element)4 ScopedExpression (cbit.gui.ScopedExpression)3 SubVolume (cbit.vcell.geometry.SubVolume)3