package jetbrains.mps.baseLanguage.math.typesystem; /*Generated by MPS */ import jetbrains.mps.lang.typesystem.dependencies.InferenceMethod; import jetbrains.mps.typesystem.inference.TypeCheckingContext; import java.util.List; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; import jetbrains.mps.typesystem.inference.EquationInfo; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import java.util.ArrayList; import jetbrains.mps.errors.messageTargets.MessageTarget; import jetbrains.mps.errors.messageTargets.NodeMessageTarget; import jetbrains.mps.errors.IErrorReporter; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import jetbrains.mps.smodel.SModelUtil_new; import org.jetbrains.mps.openapi.model.SNodeAccessUtil; import jetbrains.mps.lang.typesystem.runtime.HUtil; public class DimensionUtil { @InferenceMethod public static void checkDim(final TypeCheckingContext typeCheckingContext, final List<SNode> components, final int n, final List<SNode> types, final boolean row, final SNode node) { if (n == ListSequence.fromList(components).count()) { final SNode T_typevar_757772128652074250 = typeCheckingContext.createNewRuntimeTypesVariable(); int s = 0; int f = 0; boolean cbd = true; boolean cbc = true; for (SNode type : ListSequence.fromList(types)) { { SNode matchedNode_48zlf8_a0f0a0a = type; { boolean matches_48zlf8_a0a5a0a0 = false; { SNode matchingNode_48zlf8_a0a5a0a0 = type; if (matchingNode_48zlf8_a0a5a0a0 != null) { matches_48zlf8_a0a5a0a0 = matchingNode_48zlf8_a0a5a0a0.getConcept().isSubConceptOf(MetaAdapterFactory.getConcept(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, "jetbrains.mps.baseLanguage.math.structure.MatrixType")); } } if (matches_48zlf8_a0a5a0a0) { if (row) { if (SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dacL, "rows")) == 0) { cbd = false; } if (SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dadL, "columns")) == 0) { cbc = false; } if (cbd && f != 0 && f != SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dacL, "rows"))) { reportError(typeCheckingContext, node); } if (f == 0) { f = SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dacL, "rows")); } if (s == 0) { s = SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dadL, "columns")); } else { s += SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dadL, "columns")); } } else { if (SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dadL, "columns")) == 0) { cbd = false; } if (SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dacL, "rows")) == 0) { cbc = false; } if (cbd && f != 0 && f != SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dadL, "columns"))) { reportError(typeCheckingContext, node); } if (f == 0) { f = SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dadL, "columns")); } if (s == 0) { s = SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dacL, "rows")); } else { s += SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dacL, "rows")); } } { SNode _nodeToCheck_1029348928467 = null; EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:47d0f24b-df34-4ea0-aa7e-7c2eb0f88f31(jetbrains.mps.baseLanguage.math.typesystem)", "757772128652074322", 0, null); typeCheckingContext.createLessThanInequality((SNode) SLinkOperations.getTarget(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getContainmentLink(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62684653L, "elementType")), (SNode) typeCheckingContext.getRepresentative(T_typevar_757772128652074250), false, true, _info_12389875345); } } else { boolean matches_48zlf8_b0a5a0a0 = false; { SNode matchingNode_48zlf8_b0a5a0a0 = type; if (matchingNode_48zlf8_b0a5a0a0 != null) { matches_48zlf8_b0a5a0a0 = matchingNode_48zlf8_b0a5a0a0.getConcept().isSubConceptOf(MetaAdapterFactory.getConcept(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, "jetbrains.mps.baseLanguage.math.structure.VectorType")); } } if (matches_48zlf8_b0a5a0a0) { if (row) { if (SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, 0x42d5783a6268466eL, "height")) == 0) { cbd = false; } if (cbd && f != 0 && f != SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, 0x42d5783a6268466eL, "height"))) { reportError(typeCheckingContext, node); } if (f == 0) { f = SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, 0x42d5783a6268466eL, "height")); } if (s == 0) { s = 1; } else { s += 1; } } else { if (SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, 0x42d5783a6268466eL, "height")) == 0) { cbc = false; } if (cbd && f != 0 && f != 1) { reportError(typeCheckingContext, node); } if (f == 0) { f = 1; } if (s == 0) { s = SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, 0x42d5783a6268466eL, "height")); } else { s += SPropertyOperations.getInteger(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, 0x42d5783a6268466eL, "height")); } } { SNode _nodeToCheck_1029348928467 = null; EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:47d0f24b-df34-4ea0-aa7e-7c2eb0f88f31(jetbrains.mps.baseLanguage.math.typesystem)", "757772128652075446", 0, null); typeCheckingContext.createLessThanInequality((SNode) SLinkOperations.getTarget(matchedNode_48zlf8_a0f0a0a, MetaAdapterFactory.getContainmentLink(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, 0x42d5783a6268466fL, "elementType")), (SNode) typeCheckingContext.getRepresentative(T_typevar_757772128652074250), false, true, _info_12389875345); } } else { { SNode _nodeToCheck_1029348928467 = null; EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:47d0f24b-df34-4ea0-aa7e-7c2eb0f88f31(jetbrains.mps.baseLanguage.math.typesystem)", "757772128652104638", 0, null); typeCheckingContext.createLessThanInequality((SNode) type, (SNode) typeCheckingContext.getRepresentative(T_typevar_757772128652074250), false, true, _info_12389875345); } if (row) { if (cbd && f != 0 && f != 1) { reportError(typeCheckingContext, node); } if (f == 0) { f = 1; } if (s == 0) { s = 1; } else { s += 1; } } else { if (cbd && f != 0 && f != 1) { reportError(typeCheckingContext, node); } if (f == 0) { f = 1; } if (s == 0) { s = 1; } else { s += 1; } } } } } } } SNode result = MathTypeUtil.qMatrix(typeCheckingContext.getRepresentative(T_typevar_757772128652074250)); if (row) { if (cbc) { SPropertyOperations.set(result, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dadL, "columns"), "" + (s)); } if (cbd) { SPropertyOperations.set(result, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dacL, "rows"), "" + (f)); } } else { if (cbc) { SPropertyOperations.set(result, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dacL, "rows"), "" + (s)); } if (cbd) { SPropertyOperations.set(result, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dadL, "columns"), "" + (f)); } } if (SPropertyOperations.getInteger(result, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dadL, "columns")) == 1) { { SNode _nodeToCheck_1029348928467 = node; EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:47d0f24b-df34-4ea0-aa7e-7c2eb0f88f31(jetbrains.mps.baseLanguage.math.typesystem)", "6389121991274973498", 0, null); typeCheckingContext.createEquation((SNode) typeCheckingContext.typeOf(_nodeToCheck_1029348928467, "r:47d0f24b-df34-4ea0-aa7e-7c2eb0f88f31(jetbrains.mps.baseLanguage.math.typesystem)", "6389121991274973494", true), (SNode) _quotation_createNode_48zlf8_a0a0i0a0a(typeCheckingContext.getRepresentative(T_typevar_757772128652074250), "" + SPropertyOperations.getInteger(result, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dacL, "rows"))), _info_12389875345); } } else { { SNode _nodeToCheck_1029348928467 = node; EquationInfo _info_12389875345 = new EquationInfo(_nodeToCheck_1029348928467, null, "r:47d0f24b-df34-4ea0-aa7e-7c2eb0f88f31(jetbrains.mps.baseLanguage.math.typesystem)", "6389121991274973487", 0, null); typeCheckingContext.createEquation((SNode) typeCheckingContext.typeOf(_nodeToCheck_1029348928467, "r:47d0f24b-df34-4ea0-aa7e-7c2eb0f88f31(jetbrains.mps.baseLanguage.math.typesystem)", "6389121991274973491", true), (SNode) result, _info_12389875345); } } } else { { final SNode t1 = typeCheckingContext.typeOf(ListSequence.fromList(components).getElement(n), "r:47d0f24b-df34-4ea0-aa7e-7c2eb0f88f31(jetbrains.mps.baseLanguage.math.typesystem)", "757772128652013457", true); typeCheckingContext.whenConcrete(t1, new Runnable() { public void run() { List<SNode> types2 = new ArrayList<SNode>(); ListSequence.fromList(types2).addSequence(ListSequence.fromList(types)); ListSequence.fromList(types2).addElement(typeCheckingContext.getExpandedNode(t1)); checkDim(typeCheckingContext, components, n + 1, types2, row, node); } }, "r:47d0f24b-df34-4ea0-aa7e-7c2eb0f88f31(jetbrains.mps.baseLanguage.math.typesystem)", "757772128651891776", false, false); } } } @InferenceMethod public static void reportError(final TypeCheckingContext typeCheckingContext, SNode n) { { MessageTarget errorTarget = new NodeMessageTarget(); IErrorReporter _reporter_2309309498 = typeCheckingContext.reportTypeError(n, "Invalid matrix dimensions", "r:47d0f24b-df34-4ea0-aa7e-7c2eb0f88f31(jetbrains.mps.baseLanguage.math.typesystem)", "7676695779583019339", null, errorTarget); } } public static int dimr(SNode t) { { SNode matchedNode_48zlf8_a0c = t; { boolean matches_48zlf8_a0a2 = false; { SNode matchingNode_48zlf8_a0a2 = t; if (matchingNode_48zlf8_a0a2 != null) { matches_48zlf8_a0a2 = matchingNode_48zlf8_a0a2.getConcept().isSubConceptOf(MetaAdapterFactory.getConcept(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, "jetbrains.mps.baseLanguage.math.structure.MatrixType")); } } if (matches_48zlf8_a0a2) { return SPropertyOperations.getInteger(matchedNode_48zlf8_a0c, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dacL, "rows")); } else { boolean matches_48zlf8_b0a2 = false; { SNode matchingNode_48zlf8_b0a2 = t; if (matchingNode_48zlf8_b0a2 != null) { matches_48zlf8_b0a2 = matchingNode_48zlf8_b0a2.getConcept().isSubConceptOf(MetaAdapterFactory.getConcept(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, "jetbrains.mps.baseLanguage.math.structure.VectorType")); } } if (matches_48zlf8_b0a2) { return SPropertyOperations.getInteger(matchedNode_48zlf8_a0c, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, 0x42d5783a6268466eL, "height")); } else return 0; } } } } public static int dimc(SNode t) { { SNode matchedNode_48zlf8_a0d = t; { boolean matches_48zlf8_a0a3 = false; { SNode matchingNode_48zlf8_a0a3 = t; if (matchingNode_48zlf8_a0a3 != null) { matches_48zlf8_a0a3 = matchingNode_48zlf8_a0a3.getConcept().isSubConceptOf(MetaAdapterFactory.getConcept(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, "jetbrains.mps.baseLanguage.math.structure.MatrixType")); } } if (matches_48zlf8_a0a3) { return SPropertyOperations.getInteger(matchedNode_48zlf8_a0d, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f776L, 0x42d5783a62683dadL, "columns")); } else { boolean matches_48zlf8_b0a3 = false; { SNode matchingNode_48zlf8_b0a3 = t; if (matchingNode_48zlf8_b0a3 != null) { matches_48zlf8_b0a3 = matchingNode_48zlf8_b0a3.getConcept().isSubConceptOf(MetaAdapterFactory.getConcept(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, "jetbrains.mps.baseLanguage.math.structure.VectorType")); } } if (matches_48zlf8_b0a3) { return 1; } else return 0; } } } } private static SNode _quotation_createNode_48zlf8_a0a0i0a0a(Object parameter_1, Object parameter_2) { PersistenceFacade facade = PersistenceFacade.getInstance(); SNode quotedNode_3 = null; SNode quotedNode_4 = null; quotedNode_3 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, "jetbrains.mps.baseLanguage.math"), 0x42d5783a6267f775L, "VectorType"), null, null, false); SNodeAccessUtil.setProperty(quotedNode_3, MetaAdapterFactory.getProperty(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, 0x42d5783a6268466eL, "height"), (String) parameter_2); quotedNode_4 = (SNode) parameter_1; if (quotedNode_4 != null) { quotedNode_3.addChild(MetaAdapterFactory.getContainmentLink(0x3304fc6e7c6b401eL, 0xa016b944934bb21fL, 0x42d5783a6267f775L, 0x42d5783a6268466fL, "elementType"), HUtil.copyIfNecessary(quotedNode_4)); } return quotedNode_3; } }