// You must implement the following filter functions in the same partial class in ./ExternalFiltersAndSequencesActionsExternalFunctionsImpl.cs
        //public static void Filter_f1(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv, GRGEN_LIBGR.IMatchesExact<Rule_filterBase.IMatch_filterBase> matches)
        //public static void Filter_nomnomnom(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv, GRGEN_LIBGR.IMatchesExact<Rule_filterBase.IMatch_filterBase> matches)
        //public static void Filter_f2(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv, GRGEN_LIBGR.IMatchesExact<Rule_filterBass.IMatch_filterBass> matches)
        //public static void Filter_f3(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv, GRGEN_LIBGR.IMatchesExact<Rule_filterBass.IMatch_filterBass> matches)
        //public static void Filter_f4(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv, GRGEN_LIBGR.IMatchesExact<Rule_filterHass.IMatch_filterHass> matches)

        // ------------------------------------------------------

        // The following filter functions are automatically generated, you don't need to supply any further implementation
        public static void Filter_filterBase_auto(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv, GRGEN_LIBGR.IMatchesExact<Rule_filterBase.IMatch_filterBase> matches)
        {
            if(matches.Count<2)
            	return;
            List<Rule_filterBase.IMatch_filterBase> matchesArray = matches.ToList();
            for(int i = 0; i < matchesArray.Count; ++i)
            {
                if(matchesArray[i] == null)
                	continue;
                for(int j = i + 1; j < matchesArray.Count; ++j)
                {
                    if(matchesArray[j] == null)
                    	continue;
                    if(GRGEN_LIBGR.SymmetryChecker.AreSymmetric(matchesArray[i], matchesArray[j], procEnv.graph))
                    	matchesArray[j] = null;
                }
            }
            matches.FromList();
        }
 public static void Filter_f4(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv, GRGEN_LIBGR.IMatchesExact<Rule_filterHass.IMatch_filterHass> matches, System.Int32 i, System.String s)
 {
     // inspect matches carefully and manipulate as needed, depending on input parameters
     // transforming to a List<IMatch> for easier manipulation and back to an IMatchesExact if needed
     List<Rule_filterHass.IMatch_filterHass> matchesArray = matches.ToList();
     for(int j = 0; j < matchesArray.Count; ++j)
     {
         Rule_filterHass.IMatch_filterHass match = matchesArray[j];
         if(match.node_n.i < i)
         {
             matchesArray[j] = null; // setting to null is an efficient way to delete, better than List.RemoveAt
         }
         if(match.node_n.s != s)
         {
             match.node_n.s = s;
         }
     }
     matches.FromList();
 }
 public static void Filter_f3(GRGEN_LGSP.LGSPGraphProcessingEnvironment procEnv, GRGEN_LIBGR.IMatchesExact<Rule_filterBass.IMatch_filterBass> matches)
 {
     // inspect matches carefully and manipulate as needed, 
     // transforming to a List<IMatch> for easier manipulation and back to an IMatchesExact if needed
     List<Rule_filterBass.IMatch_filterBass> matchesArray = matches.ToList();
     matchesArray.Reverse();
     Rule_filterBass.IMatch_filterBass match = matchesArray[matchesArray.Count-1];
     matchesArray[matchesArray.Count - 1] = null; // setting to null is an efficient way to delete, better than List.RemoveAt
     ++match.node_n.i;
     matchesArray.Add(match);
     matchesArray.Reverse();
     matches.FromList();
 }