//-------------------------------------------------------------------------
        public virtual void test_load_all_curves()
        {
            ListMultimap <LocalDate, RatesCurveGroup> allGroups = RatesCurvesCsvLoader.loadAllDates(ResourceLocator.of(GROUPS_1), ResourceLocator.of(SETTINGS_1), ImmutableList.of(ResourceLocator.of(CURVES_1), ResourceLocator.of(CURVES_2), ResourceLocator.of(CURVES_3)));

            assertEquals(allGroups.size(), 2);
            assertCurves(allGroups.get(CURVE_DATE));

            IList <RatesCurveGroup> curves3 = allGroups.get(CURVE_DATE_CURVES_3);

            assertEquals(curves3.Count, 1);
            RatesCurveGroup group = curves3[0];

            // All curve points are set to 0 in test data to ensure these are really different curve instances
            Curve usdDisc = group.findDiscountCurve(Currency.USD).get();
            InterpolatedNodalCurve usdDiscNodal = (InterpolatedNodalCurve)usdDisc;

            assertEquals(usdDiscNodal.Metadata.CurveName, CurveName.of("USD-Disc"));
            assertTrue(usdDiscNodal.YValues.equalZeroWithTolerance(0d));

            Curve usd3ml = group.findForwardCurve(IborIndices.USD_LIBOR_3M).get();
            InterpolatedNodalCurve usd3mlNodal = (InterpolatedNodalCurve)usd3ml;

            assertEquals(usd3mlNodal.Metadata.CurveName, CurveName.of("USD-3ML"));
            assertTrue(usd3mlNodal.YValues.equalZeroWithTolerance(0d));
        }
        //-------------------------------------------------------------------------
        /// <summary>
        /// Loads one or more CSV format curve files for a specific date.
        /// <para>
        /// Only those quotes that match the specified date will be loaded.
        /// </para>
        /// <para>
        /// If the files contain a duplicate entry an exception will be thrown.
        ///
        /// </para>
        /// </summary>
        /// <param name="marketDataDate">  the curve date to load </param>
        /// <param name="groupsResource">  the curve groups CSV resource </param>
        /// <param name="settingsResource">  the curve settings CSV resource </param>
        /// <param name="curveValueResources">  the CSV resources for curves </param>
        /// <returns> the loaded curves, mapped by an identifying key </returns>
        /// <exception cref="IllegalArgumentException"> if the files contain a duplicate entry </exception>
        public static ImmutableList <LegalEntityCurveGroup> load(LocalDate marketDataDate, ResourceLocator groupsResource, ResourceLocator settingsResource, ICollection <ResourceLocator> curveValueResources)
        {
            ICollection <CharSource> curveCharSources           = curveValueResources.Select(r => r.CharSource).ToList();
            ListMultimap <LocalDate, LegalEntityCurveGroup> map = parse(d => marketDataDate.Equals(d), groupsResource.CharSource, settingsResource.CharSource, curveCharSources);

            return(ImmutableList.copyOf(map.get(marketDataDate)));
        }
        // creates the tasks for a single target
        private static IList <CalculationTask> createTargetTasks <T1>(CalculationTarget resolvedTarget, int rowIndex, CalculationFunction <T1> function, IList <Column> columns)
        {
            // create the cells and group them
            ListMultimap <CalculationParameters, CalculationTaskCell> grouped = ArrayListMultimap.create();

            for (int colIndex = 0; colIndex < columns.Count; colIndex++)
            {
                Column  column  = columns[colIndex];
                Measure measure = column.Measure;

                ReportingCurrency   reportingCurrency = column.ReportingCurrency.orElse(ReportingCurrency.NATURAL);
                CalculationTaskCell cell = CalculationTaskCell.of(rowIndex, colIndex, measure, reportingCurrency);
                // group to find cells that can be shared, with same mappings and params (minus reporting currency)
                CalculationParameters @params = column.Parameters.filter(resolvedTarget, measure);
                grouped.put(@params, cell);
            }

            // build tasks
            ImmutableList.Builder <CalculationTask> taskBuilder = ImmutableList.builder();
            foreach (CalculationParameters @params in grouped.Keys)
            {
                taskBuilder.add(CalculationTask.of(resolvedTarget, function, @params, grouped.get(@params)));
            }
            return(taskBuilder.build());
        }