Skip to content

Commit 4bacf18

Browse files
authored
SF-3656 Fix argument out of range error when using two training sources (#3597)
1 parent 2b8c17d commit 4bacf18

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

src/SIL.XForge.Scripture/Services/MachineProjectService.cs

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,11 +1286,40 @@ .. corporaSyncInfo
12861286
{
12871287
for (int j = 0; j < trainingCorpusConfig.SourceFilters?.Count; j++)
12881288
{
1289-
if (trainingCorpusConfig.TargetFilters?[j] is not null)
1289+
if (trainingCorpusConfig.TargetFilters is not null)
12901290
{
1291-
trainingCorpusConfig.TargetFilters[j].ScriptureRange = trainingCorpusConfig
1292-
.SourceFilters[j]
1293-
.ScriptureRange;
1291+
if (
1292+
trainingCorpusConfig.TargetFilters.Count > j
1293+
&& trainingCorpusConfig.TargetFilters[j] is not null
1294+
)
1295+
{
1296+
// Set the scripture range for the matching target filter
1297+
trainingCorpusConfig.TargetFilters[j].ScriptureRange = trainingCorpusConfig
1298+
.SourceFilters[j]
1299+
.ScriptureRange;
1300+
}
1301+
else if (trainingCorpusConfig.TargetFilters[0] is not null)
1302+
{
1303+
// There is no matching target filter, so update the first target filter.
1304+
// Merge the two scripture ranges by getting the distinct book names.
1305+
// This will also preserve any chapter ranges that are specified.
1306+
trainingCorpusConfig.TargetFilters[0].ScriptureRange = string.Join(
1307+
';',
1308+
string.Join(
1309+
';',
1310+
trainingCorpusConfig.TargetFilters[0].ScriptureRange ?? string.Empty,
1311+
trainingCorpusConfig.SourceFilters[j].ScriptureRange ?? string.Empty
1312+
)
1313+
.Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
1314+
.Distinct()
1315+
);
1316+
1317+
// Ensure that the scripture range is null if it is empty, so that all books will be trained on
1318+
if (string.IsNullOrWhiteSpace(trainingCorpusConfig.TargetFilters[0].ScriptureRange))
1319+
{
1320+
trainingCorpusConfig.TargetFilters[0].ScriptureRange = null;
1321+
}
1322+
}
12941323
}
12951324
}
12961325
}

test/SIL.XForge.Scripture.Tests/Services/MachineProjectServiceTests.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public class MachineProjectServiceTests
5050
private const string Corpus02 = "corpus02";
5151
private const string Corpus03 = "corpus03";
5252
private const string Corpus04 = "corpus04";
53+
private const string Corpus05 = "corpus04";
5354
private const string Data01 = "data01";
5455
private const string File01 = "file01";
5556
private const string File02 = "file02";
@@ -1908,6 +1909,7 @@ public void GetTranslationBuildConfig_TranslationScriptureRangesAndTrainingScrip
19081909
const string project01ScriptureRange = "MAT;MRK";
19091910
// No scripture range is supported for target pre-translate translation (project02)
19101911
const string project03ScriptureRange = "LUK;JHN";
1912+
const string project04ScriptureRange = "ACT;ROM";
19111913
var buildConfig = new BuildConfig
19121914
{
19131915
TranslationScriptureRanges =
@@ -1917,6 +1919,7 @@ public void GetTranslationBuildConfig_TranslationScriptureRangesAndTrainingScrip
19171919
TrainingScriptureRanges =
19181920
[
19191921
new ProjectScriptureRange { ProjectId = Project03, ScriptureRange = project03ScriptureRange },
1922+
new ProjectScriptureRange { ProjectId = Project04, ScriptureRange = project04ScriptureRange },
19201923
],
19211924
};
19221925
List<ServalCorpusSyncInfo> corporaSyncInfo =
@@ -1945,6 +1948,13 @@ public void GetTranslationBuildConfig_TranslationScriptureRangesAndTrainingScrip
19451948
new ServalCorpusSyncInfo
19461949
{
19471950
CorpusId = Corpus04,
1951+
IsSource = true,
1952+
ParallelCorpusId = ParallelCorpus02,
1953+
ProjectId = Project04,
1954+
},
1955+
new ServalCorpusSyncInfo
1956+
{
1957+
CorpusId = Corpus05,
19481958
IsSource = false,
19491959
ParallelCorpusId = ParallelCorpus02,
19501960
ProjectId = Project02,
@@ -1973,7 +1983,7 @@ public void GetTranslationBuildConfig_TranslationScriptureRangesAndTrainingScrip
19731983
.ScriptureRange
19741984
);
19751985
Assert.AreEqual(
1976-
project03ScriptureRange,
1986+
string.Join(';', project03ScriptureRange, project04ScriptureRange),
19771987
actual
19781988
.TrainOn!.Single(c => c.ParallelCorpusId == ParallelCorpus02)
19791989
.TargetFilters!.Single(f => f.CorpusId == Corpus04)

0 commit comments

Comments
 (0)