تاریخچه و فرگشت

نگره‌ی هنگرد

همچنین شناخته شده با: نظریه اصل موضوعی مجموعه‌ها نظریه مجموعه‌ها نگره هنگرد تسرملو-فرانکل نگره‌ی بنداشتی هنگردها
برابر انگلیک (انگلیسی): Axiomatic Set theory, ZFC Set theory Set theory

مانه

نگره‌‌ی هَنگَرد[=نظریه مجموعه‌ها] ، نگره‌‌ی انگارشی[=ریاضیاتی] گردایه‌های خوش‌آترمیده [=خوش‌تعریف]، که هنگرد‌ها نامیده می‌شوند، از براختهایی [=اشیایی] که هموند‌ها [=عضوها] یا بن‌پار‌های [=عنصرهای] هنگرد نامیده می‌شوند، است. نگره هنگرد ناب [=محض] تنها با هنگردها سر و کار دارد، براین‌پایه تنها هنگرد‌هایی بررسی می‌شوند که هموند‌های آنها نیز هنگرد‌ها اند.


1.∃𝐸 ∀𝑥(𝑥∉𝐸) ∃E ∀x(x∉E) forsome existsE forall x(x∉E)بنداشت هنگرد تهیaxiom
2.∀𝐴 ∀𝐵 [∀𝑥(𝑥∈𝐴⇔𝑥∈𝐵) ⇒𝐴=𝐵] ∀A ∀B [∀x(x∈A⇔x∈B) ⇒A=B] forall A forall B [forall x(x∈A⇔x∈B) ⇒A=B]بنداشت اُستَنِشیگیaxiom
3.∀𝐴 ∃𝐵 ∀𝑥(𝑥∈𝐵 ⇔ 𝑥∈𝐴 ∧ φ(𝑥)) ∀A ∃B ∀x(x∈B ⇔ x∈A ∧ φ(x)) forall A forsome existsB forall x(x∈B ⇔ x∈A ∧ φ(x))بنداشت جداسازیaxiom
4.∀𝑆 ∃𝑃 ∀𝑥(𝑥∈𝑃 ⇔ 𝑥⊂𝑆) ∀S ∃P ∀x(x∈P ⇔ x⊂S) forall S forsome existsP forall x(x∈P ⇔ x⊂S)بنداشت هنگرد توانیaxiom
5.∀𝐴 ∀𝐵 ∃𝐶 ∀𝑥(𝑥∈𝐶 ⇔ 𝑥=𝐴 ∨ 𝑥=𝐶) ∀A ∀B ∃C ∀x(x∈C ⇔ x=A ∨ x=C) forall A forall B forsome existsC forall x(x∈C ⇔ x=A ∨ x=C)بنداشت جفت‌سازیaxiom
6.∀𝑆 ∃𝑈 ∀𝑥[𝑥∈𝑈 ⇔ ∃𝐴(𝑥∈𝐴 ∧ 𝐴∈𝑆)] ∀S ∃U ∀x[x∈U ⇔ ∃A(x∈A ∧ A∈S)] forall S forsome existsU forall x[x∈U ⇔ forsome existsA(x∈A ∧ A∈S)]بنداشت یکایشaxiom
7.∀𝑆 [𝑆≠∅ ⇒ ∃𝑥(𝑥∈𝑆 ∧ 𝑥∩𝑆=∅)] ∀S [S≠∅ ⇒ ∃x(x∈S ∧ x∩S=∅)] forall S [S≠∅ ⇒ forsome existsx(x∈S ∧ x∩S=∅)]بنداشت بنیادaxiom
8.∀𝐴 ∃𝐵 ∀𝑦 [𝑦∈𝐵 ⇔ ∃𝑥 (𝑥∈𝐴 ∧ 𝑓(𝑥,𝑦))] ∀A ∃B ∀y [y∈B ⇔ ∃x (x∈A ∧ 𝑓(x,y))] forall A forsome existsB forall y [y∈B ⇔ forsome existsx (x∈A ∧ 𝑓(x,y))]بنداشت جایگزینیaxiom
9.∃𝐼 (∅∈𝐼 ∧ ∀𝑥 (𝑥∈𝐼 ⇒ 𝑥∪{𝑥}∈𝐼)) ∃I (∅∈I ∧ ∀x (x∈I ⇒ x∪{x}∈I)) forsome existsI (∅∈I ∧ forall x (x∈I ⇒ x∪{x}∈I))بنداشت بی‌پایانیaxiom
10.∀𝑋 [∅∉𝑋 ⇒ ∃𝑓 :𝑋→⋃𝑋 ∀𝐴∈𝑋 (𝑓(𝐴)∈𝐴)] ∀X [∅∉X ⇒ ∃𝑓 :X→⋃X ∀A∈X (𝑓(A)∈A)] forall X [∅∉X ⇒ forsome exists𝑓 :X→⋃X forall A∈X (𝑓(A)∈A)] بنداشت گزینشaxiom

در اینجا با یک نمونه کارکرد مدل نگاشت‌بازهازش را نشان می‌دهیم. در این نمونه می‌خواهیم میانگین سن مردان و زنان یک کشور را بدست آوریم. این کار را بسیار نزدیک به چارچوب نگاشت‌بازهازش هدوپ با رابه‌[=استریم]های جاوا انجام می‌دهیم.
در این نمونه برای همانندسازی گره‌های هدوپ (ماشین‌های جداگانه) که نگاشت یا بازهازش در آنها انجام می‌گیرد از ریسمانها بهره می‌بریم؛ گویی هر ریسمان یک گره هدوپ است. ریسمانها را همزمان بکار می‌اندازیم و پراسو هریک بخشی از داده را پردازش می‌کنند.

درونداد[=ورودی]

داده‌های هر شهر در فایلی به دیسار[=فرمت] 'شناسه، ژانه[=جنسیت]، زادروز' هستند:

100000, FEMALE, 1981-02-10
100001, MALE, 1973-02-08
100002, FEMALE, 1991-07-29
100003, MALE, 2006-07-26
100004, MALE, 1953-08-19
100005, FEMALE, 2012-07-08
. . .
. . .

کلاس‌های نگهداشت و ترابرد داده

public enum Gender {
    FEMALE, MALE
}

@Data
public class Person {           //  کلاس درونداد
    private String id;
    private Gender gender;
    private LocalDate dob;
}

@Data
public class GenderAge {        //  کلاس کلید/ارزش میانجی
    private Gender gender;
    private Long age;
}    

کلاس نگاشتگر

در نگرید به خت ۱۵

public class MapNode extends Thread {

    private final String dataFile;
    private List output;

    public MapNode(String dataFile) {
        this.dataFile = dataFile;
    }

    @Override
    public void run() {
        Stream fileStream = Files.lines(Path.of(dataFile));
        Stream inStream = fileStream.map(s -> new Person(s.split(",")[0], Gender.valueOf(s.split(",")[1]), LocalDate.parse(s.split(",")[2])));
        Stream outStream = inStream.
                map(p -> new GenderAge(p.getGender(), (long) Period.between(p.getDob(), LocalDate.now()).getYears()));
        output = outStream.collect(Collectors.toList());
    }

    public List getOutput() {
        return output;
    }
}

کلاس بازهازشگر

در نگرید به خت ۱۸

public class ReduceNode extends Thread {

    private final Gender gender;
    private List input;
    private GenderAge sum;

    public ReduceNode(Gender gender) {
        this.gender = gender;
    }

    public void setInput(List inputStream) {
        this.input = inputStream;
    }

    @Override
    public void run() {
        sum = input.stream().
                reduce(new GenderAge(gender, 0l), (a, b) -> new GenderAge(a.getGender(), a.getAge() + b.getAge()));
    }

    public float getAverage() {
        if (input.isEmpty()) {
            return 0f;
        }
        return sum.getAge().floatValue() / input.size();
    }
}

نگاشت

در گام نگاشت داده‌ی هر شهر که در فایل جداگانه‌ای نوشته شده است خوراک یک نگاشتگر خواهد شد. برای این نیاز است که به شمار شهرها نگاشتگر بسازیم:


List mappers = new ArrayList(NUMBER_OF_CITIES);
for (int i = 0; i < NUMBER_OF_CITIES; i++) {
    MapNode mapNode = new MapNode(String.format("City_%02d", i));
    mappers.add(mapNode);
}

ExecutorService es = Executors.newCachedThreadPool();
for (MapNode mapper : mappers) {
    es.execute(mapper);
}
es.shutdown();
while (!es.awaitTermination(60, TimeUnit.SECONDS));    

پخش‌کردن (Shuffling)

در این فراروند، داده‌هایی که در گام پیش (گام نگاشت) به‌ دیسه‌ی میانجی در آمده‌اند، برپایه کلیدشان جداسازی می‌شوند، داده‌های با کلید همسان باهم یکجا می‌شوند و به بازهازشگر پیونددار[=مربوطه] فرستاده می‌شوند.

    
Map<Gender, List<GenderAge>> shuffled = new HashMap();
for (MapNode mapper : mappers) {
    List<GenderAge> listF = new LinkedList();
    List<GenderAge> listM = new LinkedList();
    mapper.getOutput().stream().forEach(item -> ((item.getGender() == Gender.FEMALE) ? listF : listM).add(item));
    shuffled.get(Gender.FEMALE).addAll(listF);
    shuffled.get(Gender.MALE).addAll(listM);
}                

بازهازش (Reduce)

برای هر کلید یک گره بازهازش ساخته و با داده‌های گام پیش آنرا اجرا می‌کنیم

ReduceNode reduceNodeF = new ReduceNode(Gender.FEMALE);
ReduceNode reduceNodeM = new ReduceNode(Gender.MALE);

reduceNodeF.setInput(shuffled.get(Gender.FEMALE));
reduceNodeM.setInput(shuffled.get(Gender.MALE));
es = Executors.newCachedThreadPool();

es.execute(reduceNodeF);
es.execute(reduceNodeM);
es.shutdown();
while (!es.awaitTermination(5, TimeUnit.SECONDS));

برونداد

System.out.printf("Female Avg: %.1f\n",  reduceNodeF.getAverage());
System.out.printf("Male Avg: %.1f\n",  reduceNodeM.getAverage());


تاربرگ‌های پیموده‌شده در این نشست: هستی artificial intelligence نگره‌ی رایانش نگره‌ی هنگرد