diff --git a/src/main/java/com/autotune/analyzer/adapters/MultiResourceRecommendationAdapter.java b/src/main/java/com/autotune/analyzer/adapters/MultiResourceRecommendationAdapter.java new file mode 100644 index 0000000000..56ea55533c --- /dev/null +++ b/src/main/java/com/autotune/analyzer/adapters/MultiResourceRecommendationAdapter.java @@ -0,0 +1,28 @@ +package com.autotune.analyzer.adapters; + +import com.autotune.analyzer.recommendations.AcceleratorRecommendationItem; +import com.autotune.analyzer.recommendations.MultiResourceRecommendation; +import com.google.gson.*; +import java.lang.reflect.Type; +import java.util.List; + +/** + * Serializes MultiResourceRecommendation as array (unwraps the wrapper) + */ +public class MultiResourceRecommendationAdapter + implements JsonSerializer, JsonDeserializer { + + @Override + public JsonElement serialize(MultiResourceRecommendation src, Type typeOfSrc, JsonSerializationContext context) { + return context.serialize(src.getItems()); + } + + @Override + public MultiResourceRecommendation deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + Type listType = new com.google.gson.reflect.TypeToken>(){}.getType(); + List items = context.deserialize(json, listType); + return new MultiResourceRecommendation(items); + } +} + diff --git a/src/main/java/com/autotune/analyzer/recommendations/AcceleratorRecommendationItem.java b/src/main/java/com/autotune/analyzer/recommendations/AcceleratorRecommendationItem.java new file mode 100644 index 0000000000..19399b6a68 --- /dev/null +++ b/src/main/java/com/autotune/analyzer/recommendations/AcceleratorRecommendationItem.java @@ -0,0 +1,37 @@ +package com.autotune.analyzer.recommendations; + +public class AcceleratorRecommendationItem implements ResourceRecommendation { + private String model; + private String partition; + private Integer count; + private RecommendationConfigItem compute; + private RecommendationConfigItem memory; + + public AcceleratorRecommendationItem(String model, String partition, Integer count, RecommendationConfigItem compute, RecommendationConfigItem memory) { + this.model = model; + this.partition = partition; + this.count = count; + this.compute = compute; + this.memory = memory; + } + + public String getModel() { + return model; + } + + public String getPartition() { + return partition; + } + + public Integer getCount() { + return count; + } + + public RecommendationConfigItem getCompute() { + return compute; + } + + public RecommendationConfigItem getMemory() { + return memory; + } +} diff --git a/src/main/java/com/autotune/analyzer/recommendations/Config.java b/src/main/java/com/autotune/analyzer/recommendations/Config.java index b98ff30da7..20ff48bea3 100644 --- a/src/main/java/com/autotune/analyzer/recommendations/Config.java +++ b/src/main/java/com/autotune/analyzer/recommendations/Config.java @@ -22,23 +22,23 @@ import java.util.Map; public class Config { - private Map requests; - private Map limits; + private Map requests; + private Map limits; private List env; - public Map getRequests() { + public Map getRequests() { return requests; } - public void setRequests(Map requests) { + public void setRequests(Map requests) { this.requests = requests; } - public Map getLimits() { + public Map getLimits() { return limits; } - public void setLimits(Map limits) { + public void setLimits(Map limits) { this.limits = limits; } diff --git a/src/main/java/com/autotune/analyzer/recommendations/MultiResourceRecommendation.java b/src/main/java/com/autotune/analyzer/recommendations/MultiResourceRecommendation.java new file mode 100644 index 0000000000..2feb68bcd0 --- /dev/null +++ b/src/main/java/com/autotune/analyzer/recommendations/MultiResourceRecommendation.java @@ -0,0 +1,31 @@ +package com.autotune.analyzer.recommendations; + +import com.autotune.analyzer.adapters.MultiResourceRecommendationAdapter; +import com.google.gson.annotations.JsonAdapter; +import java.util.ArrayList; +import java.util.List; + +/** + * Represents multiple resource recommendations (Accelerators array) + * Custom adapter ensures it serializes as array, not object + */ +@JsonAdapter(MultiResourceRecommendationAdapter.class) +public final class MultiResourceRecommendation implements ResourceRecommendation { + private List items; + + public MultiResourceRecommendation() { + this.items = new ArrayList<>(); + } + + public MultiResourceRecommendation(List items) { + this.items = items; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } +} diff --git a/src/main/java/com/autotune/analyzer/recommendations/RecommendationConfigItem.java b/src/main/java/com/autotune/analyzer/recommendations/RecommendationConfigItem.java index d1c58ed504..c9651ce86c 100644 --- a/src/main/java/com/autotune/analyzer/recommendations/RecommendationConfigItem.java +++ b/src/main/java/com/autotune/analyzer/recommendations/RecommendationConfigItem.java @@ -15,7 +15,7 @@ *******************************************************************************/ package com.autotune.analyzer.recommendations; -public class RecommendationConfigItem { +public class RecommendationConfigItem implements ResourceRecommendation { private Double amount; private String format; private String errorMsg; diff --git a/src/main/java/com/autotune/analyzer/recommendations/ResourceRecommendation.java b/src/main/java/com/autotune/analyzer/recommendations/ResourceRecommendation.java new file mode 100644 index 0000000000..6c37b4840c --- /dev/null +++ b/src/main/java/com/autotune/analyzer/recommendations/ResourceRecommendation.java @@ -0,0 +1,4 @@ +package com.autotune.analyzer.recommendations; + +public interface ResourceRecommendation { +} diff --git a/src/main/java/com/autotune/analyzer/recommendations/engine/RecommendationEngine.java b/src/main/java/com/autotune/analyzer/recommendations/engine/RecommendationEngine.java index 1916487fe4..3590770708 100644 --- a/src/main/java/com/autotune/analyzer/recommendations/engine/RecommendationEngine.java +++ b/src/main/java/com/autotune/analyzer/recommendations/engine/RecommendationEngine.java @@ -617,7 +617,7 @@ public boolean populateRecommendation(Map.Entry termEntry, Config config = new Config(); // Create Request Map - HashMap requestsMap = new HashMap<>(); + HashMap requestsMap = new HashMap<>(); // Recommendation Item checks boolean isCpuRequestValid = true; boolean isMemoryRequestValid = true; @@ -668,7 +668,7 @@ public boolean populateRecommendation(Map.Entry termEntry, } // Create Limits Map - HashMap limitsMap = new HashMap<>(); + HashMap limitsMap = new HashMap<>(); // Recommendation Item checks (adding additional check for limits even though they are same as limits to maintain code to be flexible to add limits in future) boolean isCpuLimitValid = true; boolean isMemoryLimitValid = true; @@ -903,7 +903,7 @@ public boolean populateRecommendation(Map.Entry termEntry, // Alternative - CPU REQUEST VALUE // Accessing existing recommendation item - RecommendationConfigItem tempAccessedRecCPURequest = requestsMap.get(AnalyzerConstants.RecommendationItem.CPU); + RecommendationConfigItem tempAccessedRecCPURequest = (RecommendationConfigItem) requestsMap.get(AnalyzerConstants.RecommendationItem.CPU); if (null != tempAccessedRecCPURequest) { // Updating it with desired value tempAccessedRecCPURequest.setAmount(currentCpuRequestValue); @@ -943,7 +943,7 @@ public boolean populateRecommendation(Map.Entry termEntry, // Alternative - CPU LIMIT VALUE // Accessing existing recommendation item - RecommendationConfigItem tempAccessedRecCPULimit = limitsMap.get(AnalyzerConstants.RecommendationItem.CPU); + RecommendationConfigItem tempAccessedRecCPULimit = (RecommendationConfigItem) limitsMap.get(AnalyzerConstants.RecommendationItem.CPU); if (null != tempAccessedRecCPULimit) { // Updating it with desired value tempAccessedRecCPULimit.setAmount(currentCpuLimitValue); @@ -983,7 +983,7 @@ public boolean populateRecommendation(Map.Entry termEntry, // Alternative - MEMORY REQUEST VALUE // Accessing existing recommendation item - RecommendationConfigItem tempAccessedRecMemoryRequest = requestsMap.get(AnalyzerConstants.RecommendationItem.MEMORY); + RecommendationConfigItem tempAccessedRecMemoryRequest = (RecommendationConfigItem) requestsMap.get(AnalyzerConstants.RecommendationItem.MEMORY); if (null != tempAccessedRecMemoryRequest) { // Updating it with desired value tempAccessedRecMemoryRequest.setAmount(currentMemRequestValue); @@ -1023,7 +1023,7 @@ public boolean populateRecommendation(Map.Entry termEntry, // Alternative - MEMORY LIMIT VALUE // Accessing existing recommendation item - RecommendationConfigItem tempAccessedRecMemoryLimit = limitsMap.get(AnalyzerConstants.RecommendationItem.MEMORY); + RecommendationConfigItem tempAccessedRecMemoryLimit = (RecommendationConfigItem) limitsMap.get(AnalyzerConstants.RecommendationItem.MEMORY); if (null != tempAccessedRecMemoryLimit) { // Updating it with desired value tempAccessedRecMemoryLimit.setAmount(currentMemLimitValue);