From a68ac33d52f6ac18ed779b2a8217360cf0b957e5 Mon Sep 17 00:00:00 2001
From: Carl Philipp Klemm <philipp@uvos.xyz>
Date: Mon, 6 Nov 2023 13:35:29 +0100
Subject: [PATCH] componants: implement getDefaultRange

---
 componant/cap.cpp                      | 24 +++++++++++++----
 componant/componant.cpp                |  7 +++++
 componant/constantphase.cpp            | 26 ++++++++++++++-----
 componant/finitetr.cpp                 | 36 +++++++++++++++++++-------
 componant/inductor.cpp                 | 24 +++++++++++++----
 componant/resistor.cpp                 | 24 +++++++++++++----
 componant/warburg.cpp                  | 24 +++++++++++++----
 eisgenerator/componant/cap.h           |  3 ++-
 eisgenerator/componant/componant.h     |  3 ++-
 eisgenerator/componant/constantphase.h |  3 ++-
 eisgenerator/componant/finitetr.h      |  3 ++-
 eisgenerator/componant/inductor.h      |  3 ++-
 eisgenerator/componant/resistor.h      |  3 ++-
 eisgenerator/componant/warburg.h       |  3 ++-
 eisgenerator/eistype.h                 |  4 +++
 15 files changed, 148 insertions(+), 42 deletions(-)

diff --git a/componant/cap.cpp b/componant/cap.cpp
index ff4e349..05ab41e 100644
--- a/componant/cap.cpp
+++ b/componant/cap.cpp
@@ -20,15 +20,29 @@ Cap::Cap(std::string paramStr, size_t count, bool defaultToRange)
 
 	if(ranges.size() != paramCount())
 	{
-		ranges.clear();
+		ranges = getDefaultRange(defaultToRange);
 		if(defaultToRange)
-			ranges.push_back(Range(1e-10, 1e-4, count, true));
-		else
-			ranges.push_back(Range(1e-6, 1e-6, 1));
+		{
+			for(eis::Range& range : ranges)
+				range.count = count;
+		}
 		Log(Log::WARN)<<__func__<<" default range of "<<getComponantString(false)<<" will be used";
 	}
 }
 
+std::vector<eis::Range> Cap::getDefaultRange(bool range) const
+{
+	std::vector<eis::Range> out;
+
+	if(range)
+		out.push_back(Range(1e-10, 1e-4, 2, true));
+	else
+		out.push_back(Range(1e-6, 1e-6, 1));
+
+	assert(out.size() == paramCount());
+	return out;
+}
+
 std::complex<fvalue> Cap::execute(fvalue omega)
 {
 	assert(ranges.size() > 0);
@@ -40,7 +54,7 @@ char Cap::getComponantChar() const
 	return Cap::staticGetComponantChar();
 }
 
-size_t Cap::paramCount()
+size_t Cap::paramCount() const
 {
 	return 1;
 }
diff --git a/componant/componant.cpp b/componant/componant.cpp
index dcaed9a..d048782 100644
--- a/componant/componant.cpp
+++ b/componant/componant.cpp
@@ -28,6 +28,13 @@ std::vector<eis::Range> Componant::getParamRanges() const
 	return ranges;
 }
 
+std::vector<eis::Range> Componant::getDefaultRange(bool range) const
+{
+	(void)range;
+	assert(paramCount() == 0);
+	return std::vector<eis::Range>();
+}
+
 std::string Componant::getComponantString(bool currentValue) const
 {
 	std::stringstream out;
diff --git a/componant/constantphase.cpp b/componant/constantphase.cpp
index 89fed41..ca9ddf1 100644
--- a/componant/constantphase.cpp
+++ b/componant/constantphase.cpp
@@ -40,17 +40,31 @@ Cpe::Cpe(std::string paramStr, size_t count, bool defaultToRange)
 
 void Cpe::setDefaultParam(size_t count, bool defaultToRange)
 {
-	ranges.clear();
+	ranges = getDefaultRange(defaultToRange);
 	if(defaultToRange)
 	{
-		ranges.push_back(Range(1e-10, 1e-4, count, true));
-		ranges.push_back(Range(0.5, 0.9, count));
+		for(eis::Range& range : ranges)
+			range.count = count;
+	}
+}
+
+std::vector<eis::Range> Cpe::getDefaultRange(bool range) const
+{
+	std::vector<eis::Range> out;
+
+	if(range)
+	{
+		out.push_back(Range(1e-10, 1e-4, 2, true));
+		out.push_back(Range(0.5, 0.9, 2));
 	}
 	else
 	{
-		ranges.push_back(Range(1e-7, 1e-7, 1));
-		ranges.push_back(Range(0.9, 0.9, 1));
+		out.push_back(Range(1e-7, 1e-7, 1));
+		out.push_back(Range(0.9, 0.9, 1));
 	}
+
+	assert(out.size() == paramCount());
+	return out;
 }
 
 std::complex<fvalue> Cpe::execute(fvalue omega)
@@ -61,7 +75,7 @@ std::complex<fvalue> Cpe::execute(fvalue omega)
 	return std::complex<fvalue>(real, imag);
 }
 
-size_t Cpe::paramCount()
+size_t Cpe::paramCount() const
 {
 	return 2;
 }
diff --git a/componant/finitetr.cpp b/componant/finitetr.cpp
index 13d2767..f1a89df 100644
--- a/componant/finitetr.cpp
+++ b/componant/finitetr.cpp
@@ -7,7 +7,6 @@
 #include "componant/resistor.h"
 #include "componant/cap.h"
 #include "log.h"
-#include "strops.h"
 
 using namespace eis;
 
@@ -33,19 +32,38 @@ void FiniteTransmitionline::setDefaultParam(size_t count, bool defaultToRange)
 	_R = 1000;
 	_n = 4;
 
-	ranges.clear();
+	ranges = getDefaultRange(defaultToRange);
+
 	if(defaultToRange)
 	{
-		ranges.push_back(Range(1e-10, 1e-4, count, true));
-		ranges.push_back(Range(1, 1e4, count, true));
-		ranges.push_back(Range(_n, _n, 1));
+		for(eis::Range& range : ranges)
+			range.count = count;
+	}
+}
+
+std::vector<eis::Range> FiniteTransmitionline::getDefaultRange(bool range) const
+{
+	const fvalue C = 1e-6;
+	const fvalue R = 1000;
+	const fvalue n = 4;
+
+	std::vector<eis::Range> out(paramCount());
+
+	if(range)
+	{
+		out[0] = Range(1e-10, 1e-4, 2, true);
+		out[1] = Range(1, 1e4, 2, true);
+		out[2] = Range(n, n, 1);
 	}
 	else
 	{
-		ranges.push_back(Range(_C, _C, 1));
-		ranges.push_back(Range(_R, _R, 1));
-		ranges.push_back(Range(_n, _n, 1));
+		out[0] = Range(C, C, 1);
+		out[1] = Range(R, R, 1);
+		out[2] = Range(n, n, 1);
 	}
+
+	assert(out.size() == paramCount());
+	return out;
 }
 
 FiniteTransmitionline::FiniteTransmitionline(std::string paramStr, size_t count, bool defaultToRange)
@@ -93,7 +111,7 @@ char FiniteTransmitionline::getComponantChar() const
 	return FiniteTransmitionline::staticGetComponantChar();
 }
 
-size_t FiniteTransmitionline::paramCount()
+size_t FiniteTransmitionline::paramCount() const
 {
 	return 3;
 }
diff --git a/componant/inductor.cpp b/componant/inductor.cpp
index d2d8ea1..b0b3f01 100644
--- a/componant/inductor.cpp
+++ b/componant/inductor.cpp
@@ -20,22 +20,36 @@ Inductor::Inductor(std::string paramStr, size_t count, bool defaultToRange)
 
 	if(ranges.size() != paramCount())
 	{
-		ranges.clear();
+		ranges = getDefaultRange(defaultToRange);
 		if(defaultToRange)
-			ranges.push_back(Range(1e-10, 1e-4, count, true));
-		else
-			ranges.push_back(Range(1e-6, 1e-6, 1));
+		{
+			for(eis::Range& range : ranges)
+				range.count = count;
+		}
 		Log(Log::WARN)<<__func__<<" default range of "<<getComponantString(false)<<" will be used";
 	}
 }
 
+std::vector<eis::Range> Inductor::getDefaultRange(bool range) const
+{
+	std::vector<eis::Range> out;
+
+	if(range)
+		out.push_back(Range(1e-10, 1e-4, 2, true));
+	else
+		out.push_back(Range(1e-6, 1e-6, 1));
+
+	assert(out.size() == paramCount());
+	return out;
+}
+
 std::complex<fvalue> Inductor::execute(fvalue omega)
 {
 	assert(ranges.size() == paramCount());
 	return std::complex<fvalue>(0, ranges[0][ranges[0].step]*omega);
 }
 
-size_t Inductor::paramCount()
+size_t Inductor::paramCount() const
 {
 	return 1;
 }
diff --git a/componant/resistor.cpp b/componant/resistor.cpp
index 17fdbe9..06d3701 100644
--- a/componant/resistor.cpp
+++ b/componant/resistor.cpp
@@ -20,15 +20,29 @@ Resistor::Resistor(std::string paramStr, size_t count, bool defaultToRange)
 
 	if(ranges.size() != paramCount())
 	{
-		ranges.clear();
+		ranges = getDefaultRange(defaultToRange);
 		if(defaultToRange)
-			ranges.push_back(Range(1, 1e4, count, true));
-		else
-			ranges.push_back(Range(100, 100, 1));
+		{
+			for(eis::Range& range : ranges)
+				range.count = count;
+		}
 		Log(Log::WARN)<<__func__<<" default range of "<<getComponantString(false)<<" will be used";
 	}
 }
 
+std::vector<eis::Range> Resistor::getDefaultRange(bool range) const
+{
+	std::vector<eis::Range> out;
+
+	if(range)
+		out.push_back(Range(1, 1e4, 2, true));
+	else
+		out.push_back(Range(100, 100, 1));
+
+	assert(out.size() == paramCount());
+	return out;
+}
+
 std::complex<fvalue> Resistor::execute(fvalue omega)
 {
 	(void)omega;
@@ -36,7 +50,7 @@ std::complex<fvalue> Resistor::execute(fvalue omega)
 	return std::complex<fvalue>(ranges[0].stepValue(), 0);
 }
 
-size_t Resistor::paramCount()
+size_t Resistor::paramCount() const
 {
 	return 1;
 }
diff --git a/componant/warburg.cpp b/componant/warburg.cpp
index 4471230..c5b58a9 100644
--- a/componant/warburg.cpp
+++ b/componant/warburg.cpp
@@ -20,15 +20,29 @@ Warburg::Warburg(std::string paramStr, size_t count, bool defaultToRange)
 
 	if(ranges.size() != paramCount())
 	{
-		ranges.clear();
+		ranges = getDefaultRange(defaultToRange);
 		if(defaultToRange)
-			ranges.push_back(Range(10, 100, count, true));
-		else
-			ranges.push_back(Range(50, 50, 1));
+		{
+			for(eis::Range& range : ranges)
+				range.count = count;
+		}
 		Log(Log::WARN)<<__func__<<" default range of "<<getComponantString(false)<<" will be used";
 	}
 }
 
+std::vector<eis::Range> Warburg::getDefaultRange(bool range) const
+{
+	std::vector<eis::Range> out;
+
+	if(range)
+		out.push_back(Range(10, 100, 2, true));
+	else
+		out.push_back(Range(50, 50, 1));
+
+	assert(out.size() == paramCount());
+	return out;
+}
+
 std::complex<fvalue> Warburg::execute(fvalue omega)
 {
 	assert(ranges.size() == paramCount());
@@ -36,7 +50,7 @@ std::complex<fvalue> Warburg::execute(fvalue omega)
 	return std::complex<fvalue>(N, 0-N);
 }
 
-size_t Warburg::paramCount()
+size_t Warburg::paramCount() const
 {
 	return 1;
 }
diff --git a/eisgenerator/componant/cap.h b/eisgenerator/componant/cap.h
index 7807059..31038c2 100644
--- a/eisgenerator/componant/cap.h
+++ b/eisgenerator/componant/cap.h
@@ -13,12 +13,13 @@ public:
 	Cap(std::string paramStr, size_t count = 10, bool defaultToRange = false);
 	Cap(fvalue c = 1e-6);
 	virtual std::complex<fvalue> execute(fvalue omega) override;
-	virtual size_t paramCount() override;
+	virtual size_t paramCount() const override;
 	virtual char getComponantChar() const override;
 	static constexpr char staticGetComponantChar(){return 'c';}
 	virtual std::string componantName() const override {return "Capacitor";}
 	virtual std::string getCode(std::vector<std::string>& parameters) override;
 	virtual std::string getTorchScript(std::vector<std::string>& parameters) override;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual ~Cap() = default;
 };
 
diff --git a/eisgenerator/componant/componant.h b/eisgenerator/componant/componant.h
index 5b8432d..93e33e0 100644
--- a/eisgenerator/componant/componant.h
+++ b/eisgenerator/componant/componant.h
@@ -26,7 +26,8 @@ class Componant
 		virtual void setParamRanges(const std::vector<eis::Range>& ranges);
 		virtual std::vector<eis::Range>& getParamRanges();
 		virtual std::vector<eis::Range> getParamRanges() const;
-		virtual size_t paramCount(){return 0;}
+		virtual std::vector<eis::Range> getDefaultRange(bool range = true) const;
+		virtual size_t paramCount() const {return 0;};
 		virtual ~Componant() = default;
 		virtual char getComponantChar() const = 0;
 		virtual std::string getComponantString(bool currentValue = true) const;
diff --git a/eisgenerator/componant/constantphase.h b/eisgenerator/componant/constantphase.h
index 15e3acf..e4252f5 100644
--- a/eisgenerator/componant/constantphase.h
+++ b/eisgenerator/componant/constantphase.h
@@ -16,11 +16,12 @@ public:
 	Cpe(fvalue q, fvalue alpha);
 	Cpe();
 	virtual std::complex<fvalue> execute(fvalue omega) override;
-	virtual size_t paramCount() override;
+	virtual size_t paramCount() const override;
 	virtual char getComponantChar() const override;
 	static constexpr char staticGetComponantChar(){return 'p';}
 	virtual std::string componantName() const override {return "ConstantPhase";}
 	virtual ~Cpe() = default;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual std::string getCode(std::vector<std::string>& parameters) override;
 	virtual std::string getTorchScript(std::vector<std::string>& parameters) override;
 };
diff --git a/eisgenerator/componant/finitetr.h b/eisgenerator/componant/finitetr.h
index ca4afde..dfd4277 100644
--- a/eisgenerator/componant/finitetr.h
+++ b/eisgenerator/componant/finitetr.h
@@ -21,7 +21,8 @@ public:
 	FiniteTransmitionline(std::string paramStr, size_t count = 10, bool defaultToRange = false);
 	FiniteTransmitionline(const FiniteTransmitionline& in);
 	virtual std::complex<fvalue> execute(fvalue omega) override;
-	virtual size_t paramCount();
+	virtual size_t paramCount() const override;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual ~FiniteTransmitionline();
 	virtual char getComponantChar() const override;
 	virtual std::string componantName() const override {return "FiniteTransmitionline";}
diff --git a/eisgenerator/componant/inductor.h b/eisgenerator/componant/inductor.h
index a6e7129..e4afd6c 100644
--- a/eisgenerator/componant/inductor.h
+++ b/eisgenerator/componant/inductor.h
@@ -13,11 +13,12 @@ public:
 	Inductor(std::string paramStr, size_t count = 10, bool defaultToRange = false);
 	Inductor(fvalue L = 1e-6);
 	virtual std::complex<fvalue> execute(fvalue omega) override;
-	virtual size_t paramCount() override;
+	virtual size_t paramCount() const override;
 	virtual char getComponantChar() const override;
 	static constexpr char staticGetComponantChar(){return 'l';}
 	virtual std::string componantName() const override {return "Inductor";}
 	virtual std::string getCode(std::vector<std::string>& parameters) override;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual std::string getTorchScript(std::vector<std::string>& parameters) override;
 	virtual ~Inductor() = default;
 };
diff --git a/eisgenerator/componant/resistor.h b/eisgenerator/componant/resistor.h
index 154c01b..2657534 100644
--- a/eisgenerator/componant/resistor.h
+++ b/eisgenerator/componant/resistor.h
@@ -11,11 +11,12 @@ public:
 	Resistor(fvalue r);
 	Resistor(std::string paramStr, size_t count = 10, bool defaultToRange = false);
 	virtual std::complex<fvalue> execute(fvalue omega)  override;
-	virtual size_t paramCount() override;
+	virtual size_t paramCount() const override;
 	virtual char getComponantChar() const override;
 	static constexpr char staticGetComponantChar(){return 'r';}
 	virtual std::string componantName() const override {return "Resistor";}
 	virtual std::string getCode(std::vector<std::string>& parameters) override;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual std::string getTorchScript(std::vector<std::string>& parameters) override;
 	virtual ~Resistor() = default;
 };
diff --git a/eisgenerator/componant/warburg.h b/eisgenerator/componant/warburg.h
index 4dfa02d..7529bf7 100644
--- a/eisgenerator/componant/warburg.h
+++ b/eisgenerator/componant/warburg.h
@@ -13,11 +13,12 @@ public:
 	Warburg(std::string paramStr, size_t count = 10, bool defaultToRange = false);
 	Warburg(fvalue a = 2e4);
 	virtual std::complex<fvalue> execute(fvalue omega) override;
-	virtual size_t paramCount() override;
+	virtual size_t paramCount() const override;
 	virtual char getComponantChar() const override;
 	static constexpr char staticGetComponantChar(){return 'w';}
 	virtual std::string componantName() const override {return "Warburg";}
 	virtual std::string getCode(std::vector<std::string>& parameters) override;
+	virtual std::vector<eis::Range> getDefaultRange(bool range = true) const override;
 	virtual std::string getTorchScript(std::vector<std::string>& parameters) override;
 	virtual ~Warburg() = default;
 };
diff --git a/eisgenerator/eistype.h b/eisgenerator/eistype.h
index e13f252..09aa1ae 100644
--- a/eisgenerator/eistype.h
+++ b/eisgenerator/eistype.h
@@ -84,6 +84,10 @@ public:
 	{
 		return at(step);
 	}
+	fvalue center() const
+	{
+		return (start+end)/2;
+	}
 	fvalue at(size_t index) const
 	{
 		assert(index < count || (index == 0 && count == 0));
-- 
GitLab