Skip to content

Commit

Permalink
Add gudpy inelasticity optimiser
Browse files Browse the repository at this point in the history
  • Loading branch information
rhinoella committed Jun 17, 2024
1 parent 2191772 commit 4953fcd
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 55 deletions.
50 changes: 0 additions & 50 deletions gudpy/core/gudpy.py
Original file line number Diff line number Diff line change
Expand Up @@ -591,56 +591,6 @@ def iterate(self, purge) -> typ.Tuple[int, str]:
return self.exitcode


class InelasiticityIterator(GudrunIterator):
def __init__(
self,
gudrunFile: GudrunFile,
iterator: iterators.Iterator,
):

super().__init__(
gudrunFile=gudrunFile,
iterator=iterator
)

def singleIteration(
self,
gudrunFile: GudrunFile,
gudrun: Gudrun,
purge: Purge,
) -> typ.Tuple[int, str]: # (exitcode, error)
modGfFile = self.iterator.performIteration(gudrunFile)
exitcode = gudrun.gudrun(modGfFile, purge, self.iterator)
if exitcode:
return exitcode
return 0

def iterate(self, purge) -> typ.Tuple[int, str]:
# If the iterator requires a prelimenary run
if self.iterator.requireDefault:
exitcode = self.gudrunObjects[0].gudrun(
self.gudrunFile, purge, self.iterator)
if exitcode: # An exit code != 0 indicates failure
self.exitcode = (exitcode, self.gudrunObjects[0].error)
return self.exitcode

# Iterate through gudrun objects
for gudrun in self.gudrunObjects:
if gudrun.output:
# If object has already been run, skip
continue
exitcode = self.singleIteration(
self.gudrunFile, gudrun, purge)
if exitcode: # An exit code != 0 indicates failure
self.exitcode = (exitcode, gudrun.error)
return self.exitcode

self.result = self.iterator.result

self.exitcode = (0, "")
return self.exitcode


class CompositionIterator:
def __init__(
self,
Expand Down
2 changes: 1 addition & 1 deletion gudpy/core/iterators.py
Original file line number Diff line number Diff line change
Expand Up @@ -568,7 +568,7 @@ def performIteration(self, gudrunFile):
self.iterationCount += 1
else:
self.QIteration(gudrunFile)
self.nCurrent += 1
self.nCurrent += 1
return gudrunFile

def organiseOutput(self, gudrunFile, exclude=[]):
Expand Down
54 changes: 51 additions & 3 deletions gudpy/core/optimise.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import skopt
import os
import tempfile
import copy
from scipy.optimize import minimize
import shutil

import gudpy_cli as cli
from core import data
Expand All @@ -12,9 +14,55 @@
from core.sample import Sample


class ParameterOptimisation:
def __init__(self):
pass
class InelasticityOptimisation:
def __init__(
self,
gudrunFile: GudrunFile,
):
self.originalGudrunFile = copy.deepcopy(gudrunFile)
self.gudrunIterators = gudpy.GudrunIterator(
gudrunFile, iterators.InelasticitySubtraction(3))
self.samples = {}
self.results = {}

for sample in gudrunFile.runSamples():
if not sample.mse:
continue

self.mse[sample.name]["initial"] = copy.deepcopy(sample)

def optimise(self, purge: gudpy.Purge):
for i, gudrun in enumerate(self.gudrunIterators.gudrunObjects):
exitcode = self.gudrunIterators.singleIteration(
self.gudrunIterators.gudrunFile, gudrun, purge)
if exitcode: # An exit code != 0 indicates failure
self.exitcode = (exitcode, gudrun.error)
return self.exitcode
if self.gudrunIterators.iterator.iterationType == "QIteration":
for sample in self.gudrunIterators.gudrunFile.runSamples():
self.mse[sample.name][i] = copy.deepcopy(sample)

for sample in self.originalGudrunFile.runSamples():
self.results[sample.name]["bestSample"] = (
self.mse[sample.name]["initial"]
)
self.results[sample.name]["bestIt"] = "initial"
for iteration, sample in self.mse[sample.name]:
if sample.mse < self.results[sample.name]["bestSample"]:
self.results[sample.name]["bestSample"] = sample
self.results[sample.name]["bestIt"] = iteration

return self.results

def exportResults(self, path):
utils.makeDir(path)
for sample in self.originalGudrunFile.runSamples():
bestMint = (
self.results[sample.name]["bestSample"].dataFiles[0].mintFile
)
shutil.copyfile(bestMint, os.path.join(
path, f"{sample.name}.mint01"
))


class BayesianOptimisation:
Expand Down
26 changes: 25 additions & 1 deletion gudpy/core/sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
)
from core import utils
from core import config
from core import data


class Sample:
Expand Down Expand Up @@ -145,17 +146,40 @@ def __init__(self):
self.containers = []

self.yamlignore = {
"yamlignore"
"yamlignore",
}

self.outputFolder = ""
self.sampleFile = ""
self.selfScatteringFilePath = ""

self._referenceDataFile = ""

@property
def gudFile(self):
return self.dataFiles[0].gudFile

@property
def referenceDataFile(self):
return self._referenceDataFile

@referenceDataFile.setter
def referenceDataFile(self, path):
self._referenceDataFile = path
self.referenceData = data.NpDataSet(path)

@property
def referenceData(self):
return data.NpDataSet(self._referenceDataFile)

@property
def mse(self):
if not self.dataFiles[0].mintFile or self.referenceData:
return None
expData = data.NpDataSet(self.dataFiles[0].mintFile)
mse = data.meanSquaredError(self.referenceData, expData)
return mse

def pathName(self):
return utils.replace_unwanted_chars(self.name).translate(
{ord(x): '' for x in r'/\!*~,&|[]'}
Expand Down
4 changes: 4 additions & 0 deletions gudpy/test/TestData/NIMROD-water/good_water/good_water.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ sampleBackgrounds:
outputFolder: ''
sampleFile: ''
selfScatteringFilePath: ''
_referenceDataFile: "",
- name: D2O,_Can_N10
periodNumber: 1
dataFiles:
Expand Down Expand Up @@ -344,6 +345,7 @@ sampleBackgrounds:
outputFolder: ''
sampleFile: ''
selfScatteringFilePath: ''
_referenceDataFile: "",
- name: HDO,_Can_N6
periodNumber: 1
dataFiles:
Expand Down Expand Up @@ -441,6 +443,7 @@ sampleBackgrounds:
outputFolder: ''
sampleFile: ''
selfScatteringFilePath: ''
_referenceDataFile: "",
- name: Null_Water,_Can_N8
periodNumber: 1
dataFiles:
Expand Down Expand Up @@ -538,5 +541,6 @@ sampleBackgrounds:
outputFolder: ''
sampleFile: ''
selfScatteringFilePath: ''
_referenceDataFile: "",
outputFolder: ''
GUI: {useComponents: false}
7 changes: 7 additions & 0 deletions gudpy/test/test_gudpy_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,7 @@ def setUp(self) -> None:
"outputFolder": '',
"sampleFile": '',
"selfScatteringFilePath": '',
"_referenceDataFile": "",
"yamlignore": {
"yamlignore",
}
Expand Down Expand Up @@ -524,6 +525,7 @@ def setUp(self) -> None:
"outputFolder": '',
"sampleFile": '',
"selfScatteringFilePath": '',
"_referenceDataFile": "",
"yamlignore": {
"yamlignore"
}
Expand Down Expand Up @@ -582,6 +584,7 @@ def setUp(self) -> None:
"outputFolder": '',
"sampleFile": '',
"selfScatteringFilePath": '',
"_referenceDataFile": "",
"yamlignore": {
"yamlignore"
}
Expand Down Expand Up @@ -641,6 +644,7 @@ def setUp(self) -> None:
"outputFolder": '',
"sampleFile": '',
"selfScatteringFilePath": '',
"_referenceDataFile": "",
"yamlignore": {
"yamlignore"
}
Expand Down Expand Up @@ -1312,6 +1316,8 @@ def testLoadMissingSampleAttributesSeq(self):
expectedSampleA.pop("outputFolder", None)
expectedSampleA.pop("sampleFile", None)
expectedSampleA.pop("selfScatteringFilePath", None)
expectedSampleA.pop("_referenceDataFile", None)

expectedSampleA.pop("yamlignore", None)

self.goodSampleBackground.samples[0].dataFiles = DataFiles([], "")
Expand Down Expand Up @@ -1366,6 +1372,7 @@ def testLoadMissingSampleAttributesRand(self):
expectedSampleA.pop("outputFolder", None)
expectedSampleA.pop("sampleFile", None)
expectedSampleA.pop("selfScatteringFilePath", None)
expectedSampleA.pop("_referenceDataFile", None)
expectedSampleA.pop("yamlignore", None)

self.goodSampleBackground.samples[0].dataFiles = DataFiles([], "")
Expand Down

0 comments on commit 4953fcd

Please sign in to comment.